@sanity/cli 5.9.0-next.8 → 6.0.0-alpha.11
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/LICENSE +1 -1
- package/README.md +3212 -2
- package/bin/run.cmd +3 -0
- package/bin/run.js +33 -0
- package/codemods/deskRename.js +115 -96
- package/codemods/partsTypeDirective.js +7 -7
- package/codemods/reactIconsV3.js +78 -51
- package/dist/SanityHelp.js +43 -0
- package/dist/SanityHelp.js.map +1 -0
- package/dist/actions/auth/authServer.js +153 -0
- package/dist/actions/auth/authServer.js.map +1 -0
- package/dist/actions/auth/getProviderName.js +15 -0
- package/dist/actions/auth/getProviderName.js.map +1 -0
- package/dist/actions/auth/login/getProvider.js +54 -0
- package/dist/actions/auth/login/getProvider.js.map +1 -0
- package/dist/actions/auth/login/getSSOProvider.js +30 -0
- package/dist/actions/auth/login/getSSOProvider.js.map +1 -0
- package/dist/actions/auth/login/login.js +101 -0
- package/dist/actions/auth/login/login.js.map +1 -0
- package/dist/actions/auth/login/promptProviders.js +23 -0
- package/dist/actions/auth/login/promptProviders.js.map +1 -0
- package/dist/actions/auth/login/samlProviderToLoginProvider.js +15 -0
- package/dist/actions/auth/login/samlProviderToLoginProvider.js.map +1 -0
- package/dist/actions/auth/types.js +7 -0
- package/dist/actions/auth/types.js.map +1 -0
- package/dist/actions/backup/archiveDir.js +43 -0
- package/dist/actions/backup/archiveDir.js.map +1 -0
- package/dist/actions/backup/assertDatasetExist.js +16 -0
- package/dist/actions/backup/assertDatasetExist.js.map +1 -0
- package/dist/actions/backup/backupDownloadDebug.js +4 -0
- package/dist/actions/backup/backupDownloadDebug.js.map +1 -0
- package/dist/actions/backup/cleanupTmpDir.js +19 -0
- package/dist/actions/backup/cleanupTmpDir.js.map +1 -0
- package/dist/actions/backup/constants.js +3 -0
- package/dist/actions/backup/constants.js.map +1 -0
- package/dist/actions/backup/downloadAsset.js +54 -0
- package/dist/actions/backup/downloadAsset.js.map +1 -0
- package/dist/actions/backup/downloadDocument.js +32 -0
- package/dist/actions/backup/downloadDocument.js.map +1 -0
- package/dist/actions/backup/fetchNextBackupPage.js +48 -0
- package/dist/actions/backup/fetchNextBackupPage.js.map +1 -0
- package/dist/actions/backup/progressSpinner.js +40 -0
- package/dist/actions/backup/progressSpinner.js.map +1 -0
- package/dist/actions/build/buildApp.js +159 -0
- package/dist/actions/build/buildApp.js.map +1 -0
- package/dist/actions/build/buildDebug.js +4 -0
- package/dist/actions/build/buildDebug.js.map +1 -0
- package/dist/actions/build/buildStaticFiles.js +82 -0
- package/dist/actions/build/buildStaticFiles.js.map +1 -0
- package/dist/actions/build/buildStudio.js +202 -0
- package/dist/actions/build/buildStudio.js.map +1 -0
- package/dist/actions/build/buildVendorDependencies.js +179 -0
- package/dist/actions/build/buildVendorDependencies.js.map +1 -0
- package/dist/actions/build/checkRequiredDependencies.js +122 -0
- package/dist/actions/build/checkRequiredDependencies.js.map +1 -0
- package/dist/actions/build/checkStudioDependencyVersions.js +154 -0
- package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -0
- package/dist/actions/build/createExternalFromImportMap.js +11 -0
- package/dist/actions/build/createExternalFromImportMap.js.map +1 -0
- package/dist/actions/build/decorateIndexWithAutoGeneratedWarning.js +13 -0
- package/dist/actions/build/decorateIndexWithAutoGeneratedWarning.js.map +1 -0
- package/dist/actions/build/decorateIndexWithBridgeScript.js +17 -0
- package/dist/actions/build/decorateIndexWithBridgeScript.js.map +1 -0
- package/dist/actions/build/determineBasePath.js +20 -0
- package/dist/actions/build/determineBasePath.js.map +1 -0
- package/dist/actions/build/generateWebManifest.js +27 -0
- package/dist/actions/build/generateWebManifest.js.map +1 -0
- package/dist/actions/build/getAppEnvVars.js +9 -0
- package/dist/actions/build/getAppEnvVars.js.map +1 -0
- package/dist/actions/build/getAutoUpdatesImportMap.js +57 -0
- package/dist/actions/build/getAutoUpdatesImportMap.js.map +1 -0
- package/dist/actions/build/getEntryModule.js +46 -0
- package/dist/actions/build/getEntryModule.js.map +1 -0
- package/dist/actions/build/getPossibleDocumentComponentLocations.js +11 -0
- package/dist/actions/build/getPossibleDocumentComponentLocations.js.map +1 -0
- package/dist/actions/build/getStudioEnvVars.js +9 -0
- package/dist/actions/build/getStudioEnvVars.js.map +1 -0
- package/dist/actions/build/getStudioEnvironmentVariables.js +58 -0
- package/dist/actions/build/getStudioEnvironmentVariables.js.map +1 -0
- package/dist/actions/build/getViteConfig.js +180 -0
- package/dist/actions/build/getViteConfig.js.map +1 -0
- package/dist/actions/build/normalizeBasePath.js +9 -0
- package/dist/actions/build/normalizeBasePath.js.map +1 -0
- package/dist/actions/build/renderDocument.js +54 -0
- package/dist/actions/build/renderDocument.js.map +1 -0
- package/dist/actions/build/renderDocument.worker.js +9 -0
- package/dist/actions/build/renderDocument.worker.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js +59 -0
- package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js +61 -0
- package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js +165 -0
- package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/components/Favicons.js +28 -0
- package/dist/actions/build/renderDocumentWorker/components/Favicons.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js +177 -0
- package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/components/NoJavascript.js +51 -0
- package/dist/actions/build/renderDocumentWorker/components/NoJavascript.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js +41 -0
- package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js +55 -0
- package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +31 -0
- package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js +30 -0
- package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js.map +1 -0
- package/dist/actions/build/renderDocumentWorker/types.js +5 -0
- package/dist/actions/build/renderDocumentWorker/types.js.map +1 -0
- package/dist/actions/build/shouldAutoUpdate.js +35 -0
- package/dist/actions/build/shouldAutoUpdate.js.map +1 -0
- package/dist/actions/build/types.js +3 -0
- package/dist/actions/build/types.js.map +1 -0
- package/dist/actions/build/writeFavicons.js +26 -0
- package/dist/actions/build/writeFavicons.js.map +1 -0
- package/dist/actions/build/writeSanityRuntime.js +61 -0
- package/dist/actions/build/writeSanityRuntime.js.map +1 -0
- package/dist/actions/build/writeWebManifest.js +12 -0
- package/dist/actions/build/writeWebManifest.js.map +1 -0
- package/dist/actions/codemods/deskRename.js +18 -0
- package/dist/actions/codemods/deskRename.js.map +1 -0
- package/dist/actions/codemods/index.js +10 -0
- package/dist/actions/codemods/index.js.map +1 -0
- package/dist/actions/codemods/partsTypeDirective.js +27 -0
- package/dist/actions/codemods/partsTypeDirective.js.map +1 -0
- package/dist/actions/codemods/reactIconsV3.js +30 -0
- package/dist/actions/codemods/reactIconsV3.js.map +1 -0
- package/dist/actions/codemods/types.js +3 -0
- package/dist/actions/codemods/types.js.map +1 -0
- package/dist/actions/cors/filterAndValidateOrigin.js +38 -0
- package/dist/actions/cors/filterAndValidateOrigin.js.map +1 -0
- package/dist/actions/dataset/create.js +46 -0
- package/dist/actions/dataset/create.js.map +1 -0
- package/dist/actions/dataset/determineDatasetAclMode.js +36 -0
- package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -0
- package/dist/actions/dataset/processAliasName.js +20 -0
- package/dist/actions/dataset/processAliasName.js.map +1 -0
- package/dist/actions/dataset/validateDatasetAliasName.js +28 -0
- package/dist/actions/dataset/validateDatasetAliasName.js.map +1 -0
- package/dist/actions/dataset/validateDatasetName.js +39 -0
- package/dist/actions/dataset/validateDatasetName.js.map +1 -0
- package/dist/actions/debug/gatherDebugInfo.js +104 -0
- package/dist/actions/debug/gatherDebugInfo.js.map +1 -0
- package/dist/actions/debug/getGlobalConfigLocation.js +7 -0
- package/dist/actions/debug/getGlobalConfigLocation.js.map +1 -0
- package/dist/actions/debug/types.js +3 -0
- package/dist/actions/debug/types.js.map +1 -0
- package/dist/actions/deploy/checkDir.js +31 -0
- package/dist/actions/deploy/checkDir.js.map +1 -0
- package/dist/actions/deploy/createStudioUserApplication.js +59 -0
- package/dist/actions/deploy/createStudioUserApplication.js.map +1 -0
- package/dist/actions/deploy/createUserApplicationForApp.js +56 -0
- package/dist/actions/deploy/createUserApplicationForApp.js.map +1 -0
- package/dist/actions/deploy/deployApp.js +162 -0
- package/dist/actions/deploy/deployApp.js.map +1 -0
- package/dist/actions/deploy/deployDebug.js +4 -0
- package/dist/actions/deploy/deployDebug.js.map +1 -0
- package/dist/actions/deploy/deployStudio.js +134 -0
- package/dist/actions/deploy/deployStudio.js.map +1 -0
- package/dist/actions/deploy/findUserApplicationForApp.js +110 -0
- package/dist/actions/deploy/findUserApplicationForApp.js.map +1 -0
- package/dist/actions/deploy/findUserApplicationForStudio.js +143 -0
- package/dist/actions/deploy/findUserApplicationForStudio.js.map +1 -0
- package/dist/actions/deploy/types.js +3 -0
- package/dist/actions/deploy/types.js.map +1 -0
- package/dist/actions/dev/devAction.js +7 -0
- package/dist/actions/dev/devAction.js.map +1 -0
- package/dist/actions/dev/devDebug.js +4 -0
- package/dist/actions/dev/devDebug.js.map +1 -0
- package/dist/actions/dev/getCoreAppUrl.js +10 -0
- package/dist/actions/dev/getCoreAppUrl.js.map +1 -0
- package/dist/actions/dev/getDevServerConfig.js +28 -0
- package/dist/actions/dev/getDevServerConfig.js.map +1 -0
- package/dist/actions/dev/startAppDevServer.js +57 -0
- package/dist/actions/dev/startAppDevServer.js.map +1 -0
- package/dist/actions/dev/startStudioDevServer.js +154 -0
- package/dist/actions/dev/startStudioDevServer.js.map +1 -0
- package/dist/actions/dev/types.js +3 -0
- package/dist/actions/dev/types.js.map +1 -0
- package/dist/actions/docs/normalizeDocsPath.js +15 -0
- package/dist/actions/docs/normalizeDocsPath.js.map +1 -0
- package/dist/actions/documents/constants.js +3 -0
- package/dist/actions/documents/constants.js.map +1 -0
- package/dist/actions/documents/editor.js +26 -0
- package/dist/actions/documents/editor.js.map +1 -0
- package/dist/actions/documents/types.js +3 -0
- package/dist/actions/documents/types.js.map +1 -0
- package/dist/actions/documents/validate.js +60 -0
- package/dist/actions/documents/validate.js.map +1 -0
- package/dist/actions/documents/validateDocuments.worker.js +251 -0
- package/dist/actions/documents/validateDocuments.worker.js.map +1 -0
- package/dist/actions/documents/validation/reporters/index.js +10 -0
- package/dist/actions/documents/validation/reporters/index.js.map +1 -0
- package/dist/actions/documents/validation/reporters/jsonReporter.js +25 -0
- package/dist/actions/documents/validation/reporters/jsonReporter.js.map +1 -0
- package/dist/actions/documents/validation/reporters/ndjsonReporter.js +18 -0
- package/dist/actions/documents/validation/reporters/ndjsonReporter.js.map +1 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js +62 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map +1 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/index.js +3 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/index.js.map +1 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/prettyReporter.js +92 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/prettyReporter.js.map +1 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/util.js +45 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/util.js.map +1 -0
- package/dist/actions/exec/configClient.worker.js +9 -0
- package/dist/actions/exec/configClient.worker.js.map +1 -0
- package/dist/actions/exec/execScript.js +77 -0
- package/dist/actions/exec/execScript.js.map +1 -0
- package/dist/actions/exec/registerBrowserEnv.worker.js +17 -0
- package/dist/actions/exec/registerBrowserEnv.worker.js.map +1 -0
- package/dist/actions/graphql/SchemaError.js +37 -0
- package/dist/actions/graphql/SchemaError.js.map +1 -0
- package/dist/actions/graphql/extractFromSanitySchema.js +659 -0
- package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -0
- package/dist/actions/graphql/gen1/generateTypeFilters.js +226 -0
- package/dist/actions/graphql/gen1/generateTypeFilters.js.map +1 -0
- package/dist/actions/graphql/gen1/generateTypeQueries.js +85 -0
- package/dist/actions/graphql/gen1/generateTypeQueries.js.map +1 -0
- package/dist/actions/graphql/gen1/index.js +19 -0
- package/dist/actions/graphql/gen1/index.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/booleanFilters.js +26 -0
- package/dist/actions/graphql/gen2/filters/booleanFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/dateFilters.js +46 -0
- package/dist/actions/graphql/gen2/filters/dateFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/dateTimeFilters.js +46 -0
- package/dist/actions/graphql/gen2/filters/dateTimeFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/documentFilters.js +21 -0
- package/dist/actions/graphql/gen2/filters/documentFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/floatFilters.js +46 -0
- package/dist/actions/graphql/gen2/filters/floatFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/idFilters.js +44 -0
- package/dist/actions/graphql/gen2/filters/idFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/integerFilters.js +46 -0
- package/dist/actions/graphql/gen2/filters/integerFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/filters/stringFilters.js +49 -0
- package/dist/actions/graphql/gen2/filters/stringFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/generateTypeFilters.js +85 -0
- package/dist/actions/graphql/gen2/generateTypeFilters.js.map +1 -0
- package/dist/actions/graphql/gen2/generateTypeQueries.js +107 -0
- package/dist/actions/graphql/gen2/generateTypeQueries.js.map +1 -0
- package/dist/actions/graphql/gen2/generateTypeSortings.js +70 -0
- package/dist/actions/graphql/gen2/generateTypeSortings.js.map +1 -0
- package/dist/actions/graphql/gen2/index.js +22 -0
- package/dist/actions/graphql/gen2/index.js.map +1 -0
- package/dist/actions/graphql/gen3/filters/documentFilters.js +21 -0
- package/dist/actions/graphql/gen3/filters/documentFilters.js.map +1 -0
- package/dist/actions/graphql/gen3/generateTypeFilters.js +101 -0
- package/dist/actions/graphql/gen3/generateTypeFilters.js.map +1 -0
- package/dist/actions/graphql/gen3/generateTypeQueries.js +104 -0
- package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -0
- package/dist/actions/graphql/gen3/generateTypeSortings.js +70 -0
- package/dist/actions/graphql/gen3/generateTypeSortings.js.map +1 -0
- package/dist/actions/graphql/gen3/index.js +31 -0
- package/dist/actions/graphql/gen3/index.js.map +1 -0
- package/dist/actions/graphql/gen3/utils.js +12 -0
- package/dist/actions/graphql/gen3/utils.js.map +1 -0
- package/dist/actions/graphql/getGraphQLAPIs.js +65 -0
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -0
- package/dist/actions/graphql/getGraphQLAPIs.worker.js +126 -0
- package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -0
- package/dist/actions/graphql/graphqlDebug.js +4 -0
- package/dist/actions/graphql/graphqlDebug.js.map +1 -0
- package/dist/actions/graphql/helpUrls.js +3 -0
- package/dist/actions/graphql/helpUrls.js.map +1 -0
- package/dist/actions/graphql/helpers.js +11 -0
- package/dist/actions/graphql/helpers.js.map +1 -0
- package/dist/actions/graphql/resolveApiGeneration.js +43 -0
- package/dist/actions/graphql/resolveApiGeneration.js.map +1 -0
- package/dist/actions/graphql/types.js +3 -0
- package/dist/actions/graphql/types.js.map +1 -0
- package/dist/actions/hook/constants.js +3 -0
- package/dist/actions/hook/constants.js.map +1 -0
- package/dist/actions/hook/formatFailure.js +29 -0
- package/dist/actions/hook/formatFailure.js.map +1 -0
- package/dist/actions/hook/types.js +3 -0
- package/dist/actions/hook/types.js.map +1 -0
- package/dist/actions/init/bootstrapLocalTemplate.js +137 -0
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -0
- package/dist/actions/init/bootstrapRemoteTemplate.js +109 -0
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -0
- package/dist/actions/init/bootstrapTemplate.js +32 -0
- package/dist/actions/init/bootstrapTemplate.js.map +1 -0
- package/dist/actions/init/checkNextJsReactCompatibility.js +21 -0
- package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -0
- package/dist/actions/init/constants.js +3 -0
- package/dist/actions/init/constants.js.map +1 -0
- package/dist/actions/init/countNestedFolders.js +6 -0
- package/dist/actions/init/countNestedFolders.js.map +1 -0
- package/dist/actions/init/createAppCliConfig.js +19 -0
- package/dist/actions/init/createAppCliConfig.js.map +1 -0
- package/dist/actions/init/createCliConfig.js +27 -0
- package/dist/actions/init/createCliConfig.js.map +1 -0
- package/dist/actions/init/createPackageManifest.js +86 -0
- package/dist/actions/init/createPackageManifest.js.map +1 -0
- package/dist/actions/init/createStudioConfig.js +41 -0
- package/dist/actions/init/createStudioConfig.js.map +1 -0
- package/dist/actions/init/determineAppTemplate.js +16 -0
- package/dist/actions/init/determineAppTemplate.js.map +1 -0
- package/dist/actions/init/env/createOrAppendEnvVars.js +25 -0
- package/dist/actions/init/env/createOrAppendEnvVars.js.map +1 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.js +42 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.js.map +1 -0
- package/dist/actions/init/env/writeEnvVarsToFile.js +49 -0
- package/dist/actions/init/env/writeEnvVarsToFile.js.map +1 -0
- package/dist/actions/init/fetchPostInitPrompt.js +30 -0
- package/dist/actions/init/fetchPostInitPrompt.js.map +1 -0
- package/dist/actions/init/git.js +65 -0
- package/dist/actions/init/git.js.map +1 -0
- package/dist/actions/init/processTemplate.js +56 -0
- package/dist/actions/init/processTemplate.js.map +1 -0
- package/dist/actions/init/remoteTemplate.js +211 -0
- package/dist/actions/init/remoteTemplate.js.map +1 -0
- package/dist/actions/init/resolvePackageManager.js +20 -0
- package/dist/actions/init/resolvePackageManager.js.map +1 -0
- package/dist/actions/init/templates/appQuickstart.js +28 -0
- package/dist/actions/init/templates/appQuickstart.js.map +1 -0
- package/dist/actions/init/templates/appSanityUi.js +30 -0
- package/dist/actions/init/templates/appSanityUi.js.map +1 -0
- package/dist/actions/init/templates/blog.js +4 -0
- package/dist/actions/init/templates/blog.js.map +1 -0
- package/dist/actions/init/templates/clean.js +4 -0
- package/dist/actions/init/templates/clean.js.map +1 -0
- package/dist/actions/init/templates/getStarted.js +35 -0
- package/dist/actions/init/templates/getStarted.js.map +1 -0
- package/dist/actions/init/templates/index.js +23 -0
- package/dist/actions/init/templates/index.js.map +1 -0
- package/dist/actions/init/templates/moviedb.js +34 -0
- package/dist/actions/init/templates/moviedb.js.map +1 -0
- package/dist/actions/init/templates/nextjs/index.js +213 -0
- package/dist/actions/init/templates/nextjs/index.js.map +1 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.js +247 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.js.map +1 -0
- package/dist/actions/init/templates/quickstart.js +4 -0
- package/dist/actions/init/templates/quickstart.js.map +1 -0
- package/dist/actions/init/templates/shopify.js +77 -0
- package/dist/actions/init/templates/shopify.js.map +1 -0
- package/dist/actions/init/templates/shopifyOnline.js +49 -0
- package/dist/actions/init/templates/shopifyOnline.js.map +1 -0
- package/dist/actions/init/types.js +3 -0
- package/dist/actions/init/types.js.map +1 -0
- package/dist/actions/init/updateInitialTemplateMetadata.js +17 -0
- package/dist/actions/init/updateInitialTemplateMetadata.js.map +1 -0
- package/dist/actions/manifest/SchemaIcon.js +21 -0
- package/dist/actions/manifest/SchemaIcon.js.map +1 -0
- package/dist/actions/manifest/extractAppManifest.js +51 -0
- package/dist/actions/manifest/extractAppManifest.js.map +1 -0
- package/dist/actions/manifest/extractManifest.js +93 -0
- package/dist/actions/manifest/extractManifest.js.map +1 -0
- package/dist/actions/manifest/extractWorkspaceManifest.js +406 -0
- package/dist/actions/manifest/extractWorkspaceManifest.js.map +1 -0
- package/dist/actions/manifest/purifyConfig.js +307 -0
- package/dist/actions/manifest/purifyConfig.js.map +1 -0
- package/dist/actions/manifest/schemaTypeHelpers.js +110 -0
- package/dist/actions/manifest/schemaTypeHelpers.js.map +1 -0
- package/dist/actions/manifest/types.js +5 -0
- package/dist/actions/manifest/types.js.map +1 -0
- package/dist/actions/mcp/detectAvailableEditors.js +75 -0
- package/dist/actions/mcp/detectAvailableEditors.js.map +1 -0
- package/dist/actions/mcp/editorConfigs.js +147 -0
- package/dist/actions/mcp/editorConfigs.js.map +1 -0
- package/dist/actions/mcp/promptForMCPSetup.js +24 -0
- package/dist/actions/mcp/promptForMCPSetup.js.map +1 -0
- package/dist/actions/mcp/setupMCP.js +88 -0
- package/dist/actions/mcp/setupMCP.js.map +1 -0
- package/dist/actions/mcp/types.js +3 -0
- package/dist/actions/mcp/types.js.map +1 -0
- package/dist/actions/mcp/writeMCPConfig.js +41 -0
- package/dist/actions/mcp/writeMCPConfig.js.map +1 -0
- package/dist/actions/media/__tests__/createMockClient.js +32 -0
- package/dist/actions/media/__tests__/createMockClient.js.map +1 -0
- package/dist/actions/media/getMediaLibraryConfig.js +5 -0
- package/dist/actions/media/getMediaLibraryConfig.js.map +1 -0
- package/dist/actions/media/importAspects.js +112 -0
- package/dist/actions/media/importAspects.js.map +1 -0
- package/dist/actions/media/importMedia.js +213 -0
- package/dist/actions/media/importMedia.js.map +1 -0
- package/dist/actions/media/importMediaDebug.js +4 -0
- package/dist/actions/media/importMediaDebug.js.map +1 -0
- package/dist/actions/organizations/getOrganization.js +67 -0
- package/dist/actions/organizations/getOrganization.js.map +1 -0
- package/dist/actions/organizations/getOrganizationChoices.js +23 -0
- package/dist/actions/organizations/getOrganizationChoices.js.map +1 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js +9 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js.map +1 -0
- package/dist/actions/organizations/hasProjectAttachGrant.js +24 -0
- package/dist/actions/organizations/hasProjectAttachGrant.js.map +1 -0
- package/dist/actions/organizations/validateOrganizationName.js +10 -0
- package/dist/actions/organizations/validateOrganizationName.js.map +1 -0
- package/dist/actions/preview/getPreviewServerConfig.js +16 -0
- package/dist/actions/preview/getPreviewServerConfig.js.map +1 -0
- package/dist/actions/preview/previewAction.js +20 -0
- package/dist/actions/preview/previewAction.js.map +1 -0
- package/dist/actions/preview/types.js +3 -0
- package/dist/actions/preview/types.js.map +1 -0
- package/dist/actions/projects/getManageUrl.js +7 -0
- package/dist/actions/projects/getManageUrl.js.map +1 -0
- package/dist/actions/projects/validateProjectName.js +11 -0
- package/dist/actions/projects/validateProjectName.js.map +1 -0
- package/dist/actions/schema/deleteSchemaAction.js +101 -0
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -0
- package/dist/actions/schema/deploySchemas.js +98 -0
- package/dist/actions/schema/deploySchemas.js.map +1 -0
- package/dist/actions/schema/extractSanitySchema.worker.js +38 -0
- package/dist/actions/schema/extractSanitySchema.worker.js.map +1 -0
- package/dist/actions/schema/extractSchema.js +77 -0
- package/dist/actions/schema/extractSchema.js.map +1 -0
- package/dist/actions/schema/formatSchemaValidation.js +74 -0
- package/dist/actions/schema/formatSchemaValidation.js.map +1 -0
- package/dist/actions/schema/listSchemas.js +119 -0
- package/dist/actions/schema/listSchemas.js.map +1 -0
- package/dist/actions/schema/metafile.js +51 -0
- package/dist/actions/schema/metafile.js.map +1 -0
- package/dist/actions/schema/schemaStoreTypes.js +19 -0
- package/dist/actions/schema/schemaStoreTypes.js.map +1 -0
- package/dist/actions/schema/types.js +9 -0
- package/dist/actions/schema/types.js.map +1 -0
- package/dist/actions/schema/utils/debug.js +6 -0
- package/dist/actions/schema/utils/debug.js.map +1 -0
- package/dist/actions/schema/utils/extractValidationFromSchemaError.js +12 -0
- package/dist/actions/schema/utils/extractValidationFromSchemaError.js.map +1 -0
- package/dist/actions/schema/utils/manifestExtractor.js +33 -0
- package/dist/actions/schema/utils/manifestExtractor.js.map +1 -0
- package/dist/actions/schema/utils/manifestReader.js +71 -0
- package/dist/actions/schema/utils/manifestReader.js.map +1 -0
- package/dist/actions/schema/utils/schemaStoreOutStrings.js +11 -0
- package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -0
- package/dist/actions/schema/utils/schemaStoreValidation.js +108 -0
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
- package/dist/actions/schema/utils/workspaceSchemaId.js +23 -0
- package/dist/actions/schema/utils/workspaceSchemaId.js.map +1 -0
- package/dist/actions/schema/validateAction.js +71 -0
- package/dist/actions/schema/validateAction.js.map +1 -0
- package/dist/actions/schema/validateSchema.worker.js +124 -0
- package/dist/actions/schema/validateSchema.worker.js.map +1 -0
- package/dist/actions/telemetry/getLearnMoreMessage.js +15 -0
- package/dist/actions/telemetry/getLearnMoreMessage.js.map +1 -0
- package/dist/actions/telemetry/getStatusDisplay.js +26 -0
- package/dist/actions/telemetry/getStatusDisplay.js.map +1 -0
- package/dist/actions/telemetry/getStatusMessage.js +36 -0
- package/dist/actions/telemetry/getStatusMessage.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.js +48 -0
- package/dist/actions/telemetry/resolveConsent.js.map +1 -0
- package/dist/actions/telemetry/setConsent.js +83 -0
- package/dist/actions/telemetry/setConsent.js.map +1 -0
- package/dist/actions/telemetry/telemetryDebug.js +4 -0
- package/dist/actions/telemetry/telemetryDebug.js.map +1 -0
- package/dist/actions/telemetry/telemetryDisclosure.js +33 -0
- package/dist/actions/telemetry/telemetryDisclosure.js.map +1 -0
- package/dist/actions/telemetry/telemetryLearnMoreMessage.js +15 -0
- package/dist/actions/telemetry/telemetryLearnMoreMessage.js.map +1 -0
- package/dist/actions/tokens/constants.js +5 -0
- package/dist/actions/tokens/constants.js.map +1 -0
- package/dist/actions/tokens/types.js +3 -0
- package/dist/actions/tokens/types.js.map +1 -0
- package/dist/actions/tokens/validateRole.js +23 -0
- package/dist/actions/tokens/validateRole.js.map +1 -0
- package/dist/actions/undeploy/getStudioOrAppUserApplication.js +36 -0
- package/dist/actions/undeploy/getStudioOrAppUserApplication.js.map +1 -0
- package/dist/actions/users/getMembersForProject.js +47 -0
- package/dist/actions/users/getMembersForProject.js.map +1 -0
- package/dist/actions/users/getPendingInvitations.js +15 -0
- package/dist/actions/users/getPendingInvitations.js.map +1 -0
- package/dist/actions/users/types.js +3 -0
- package/dist/actions/users/types.js.map +1 -0
- package/dist/actions/users/usersDebug.js +4 -0
- package/dist/actions/users/usersDebug.js.map +1 -0
- package/dist/actions/users/validateEmail.js +14 -0
- package/dist/actions/users/validateEmail.js.map +1 -0
- package/dist/actions/versions/buildPackageArray.js +44 -0
- package/dist/actions/versions/buildPackageArray.js.map +1 -0
- package/dist/actions/versions/filterSanityModules.js +20 -0
- package/dist/actions/versions/filterSanityModules.js.map +1 -0
- package/dist/actions/versions/findSanityModulesVersions.js +47 -0
- package/dist/actions/versions/findSanityModulesVersions.js.map +1 -0
- package/dist/actions/versions/getFormatters.js +30 -0
- package/dist/actions/versions/getFormatters.js.map +1 -0
- package/dist/actions/versions/tryFindLatestVersion.js +21 -0
- package/dist/actions/versions/tryFindLatestVersion.js.map +1 -0
- package/dist/actions/versions/types.js +5 -0
- package/dist/actions/versions/types.js.map +1 -0
- package/dist/actions/versions/versionsDebug.js +4 -0
- package/dist/actions/versions/versionsDebug.js.map +1 -0
- package/dist/commands/backup/disable.js +94 -0
- package/dist/commands/backup/disable.js.map +1 -0
- package/dist/commands/backup/download.js +291 -0
- package/dist/commands/backup/download.js.map +1 -0
- package/dist/commands/backup/enable.js +99 -0
- package/dist/commands/backup/enable.js.map +1 -0
- package/dist/commands/backup/list.js +187 -0
- package/dist/commands/backup/list.js.map +1 -0
- package/dist/commands/build.js +82 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/codemod.js +141 -0
- package/dist/commands/codemod.js.map +1 -0
- package/dist/commands/cors/add.js +154 -0
- package/dist/commands/cors/add.js.map +1 -0
- package/dist/commands/cors/delete.js +90 -0
- package/dist/commands/cors/delete.js.map +1 -0
- package/dist/commands/cors/list.js +40 -0
- package/dist/commands/cors/list.js.map +1 -0
- package/dist/commands/dataset/alias/create.js +118 -0
- package/dist/commands/dataset/alias/create.js.map +1 -0
- package/dist/commands/dataset/alias/delete.js +88 -0
- package/dist/commands/dataset/alias/delete.js.map +1 -0
- package/dist/commands/dataset/alias/link.js +137 -0
- package/dist/commands/dataset/alias/link.js.map +1 -0
- package/dist/commands/dataset/alias/unlink.js +98 -0
- package/dist/commands/dataset/alias/unlink.js.map +1 -0
- package/dist/commands/dataset/copy.js +369 -0
- package/dist/commands/dataset/copy.js.map +1 -0
- package/dist/commands/dataset/create.js +106 -0
- package/dist/commands/dataset/create.js.map +1 -0
- package/dist/commands/dataset/delete.js +104 -0
- package/dist/commands/dataset/delete.js.map +1 -0
- package/dist/commands/dataset/export.js +271 -0
- package/dist/commands/dataset/export.js.map +1 -0
- package/dist/commands/dataset/import.js +3 -0
- package/dist/commands/dataset/import.js.map +1 -0
- package/dist/commands/dataset/list.js +50 -0
- package/dist/commands/dataset/list.js.map +1 -0
- package/dist/commands/dataset/visibility/get.js +55 -0
- package/dist/commands/dataset/visibility/get.js.map +1 -0
- package/dist/commands/dataset/visibility/set.js +88 -0
- package/dist/commands/dataset/visibility/set.js.map +1 -0
- package/dist/commands/debug.js +93 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/deploy.js +115 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.js +65 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/docs/browse.js +15 -0
- package/dist/commands/docs/browse.js.map +1 -0
- package/dist/commands/docs/read.js +81 -0
- package/dist/commands/docs/read.js.map +1 -0
- package/dist/commands/docs/search.js +111 -0
- package/dist/commands/docs/search.js.map +1 -0
- package/dist/commands/documents/create.js +338 -0
- package/dist/commands/documents/create.js.map +1 -0
- package/dist/commands/documents/delete.js +104 -0
- package/dist/commands/documents/delete.js.map +1 -0
- package/dist/commands/documents/get.js +85 -0
- package/dist/commands/documents/get.js.map +1 -0
- package/dist/commands/documents/query.js +105 -0
- package/dist/commands/documents/query.js.map +1 -0
- package/dist/commands/documents/validate.js +142 -0
- package/dist/commands/documents/validate.js.map +1 -0
- package/dist/commands/exec.js +54 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/graphql/deploy.js +429 -0
- package/dist/commands/graphql/deploy.js.map +1 -0
- package/dist/commands/graphql/list.js +53 -0
- package/dist/commands/graphql/list.js.map +1 -0
- package/dist/commands/graphql/undeploy.js +143 -0
- package/dist/commands/graphql/undeploy.js.map +1 -0
- package/dist/commands/hook/attempt.js +66 -0
- package/dist/commands/hook/attempt.js.map +1 -0
- package/dist/commands/hook/create.js +46 -0
- package/dist/commands/hook/create.js.map +1 -0
- package/dist/commands/hook/delete.js +86 -0
- package/dist/commands/hook/delete.js.map +1 -0
- package/dist/commands/hook/list.js +46 -0
- package/dist/commands/hook/list.js.map +1 -0
- package/dist/commands/hook/logs.js +184 -0
- package/dist/commands/hook/logs.js.map +1 -0
- package/dist/commands/init.js +1389 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.js +43 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/learn.js +15 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/login.js +50 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +37 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/manage.js +29 -0
- package/dist/commands/manage.js.map +1 -0
- package/dist/commands/manifest/extract.js +43 -0
- package/dist/commands/manifest/extract.js.map +1 -0
- package/dist/commands/mcp/configure.js +28 -0
- package/dist/commands/mcp/configure.js.map +1 -0
- package/dist/commands/media/create-aspect.js +88 -0
- package/dist/commands/media/create-aspect.js.map +1 -0
- package/dist/commands/media/delete-aspect.js +85 -0
- package/dist/commands/media/delete-aspect.js.map +1 -0
- package/dist/commands/media/deploy-aspect.js +151 -0
- package/dist/commands/media/deploy-aspect.js.map +1 -0
- package/dist/commands/media/export.js +210 -0
- package/dist/commands/media/export.js.map +1 -0
- package/dist/commands/media/import.js +160 -0
- package/dist/commands/media/import.js.map +1 -0
- package/dist/commands/openapi/get.js +83 -0
- package/dist/commands/openapi/get.js.map +1 -0
- package/dist/commands/openapi/list.js +80 -0
- package/dist/commands/openapi/list.js.map +1 -0
- package/dist/commands/preview.js +60 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/projects/create.js +181 -0
- package/dist/commands/projects/create.js.map +1 -0
- package/dist/commands/projects/list.js +76 -0
- package/dist/commands/projects/list.js.map +1 -0
- package/dist/commands/schema/delete.js +91 -0
- package/dist/commands/schema/delete.js.map +1 -0
- package/dist/commands/schema/deploy.js +98 -0
- package/dist/commands/schema/deploy.js.map +1 -0
- package/dist/commands/schema/extract.js +46 -0
- package/dist/commands/schema/extract.js.map +1 -0
- package/dist/commands/schema/list.js +104 -0
- package/dist/commands/schema/list.js.map +1 -0
- package/dist/commands/schema/validate.js +73 -0
- package/dist/commands/schema/validate.js.map +1 -0
- package/dist/commands/telemetry/disable.js +33 -0
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.js +33 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/status.js +25 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/commands/tokens/add.js +135 -0
- package/dist/commands/tokens/add.js.map +1 -0
- package/dist/commands/tokens/delete.js +107 -0
- package/dist/commands/tokens/delete.js.map +1 -0
- package/dist/commands/tokens/list.js +92 -0
- package/dist/commands/tokens/list.js.map +1 -0
- package/dist/commands/undeploy.js +93 -0
- package/dist/commands/undeploy.js.map +1 -0
- package/dist/commands/users/invite.js +100 -0
- package/dist/commands/users/invite.js.map +1 -0
- package/dist/commands/users/list.js +101 -0
- package/dist/commands/users/list.js.map +1 -0
- package/dist/commands/versions.js +27 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/config/createCliConfig.js +9 -0
- package/dist/config/createCliConfig.js.map +1 -0
- package/dist/config/defineCliConfig.js +5 -0
- package/dist/config/defineCliConfig.js.map +1 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
- package/dist/hooks/prerun/injectEnvVariables.js +31 -0
- package/dist/hooks/prerun/injectEnvVariables.js.map +1 -0
- package/dist/hooks/prerun/setupTelemetry.js +72 -0
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -0
- package/dist/hooks/prerun/warnings.js +6 -0
- package/dist/hooks/prerun/warnings.js.map +1 -0
- package/dist/index.d.ts +2326 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/init/nextjs.js +56 -0
- package/dist/prompts/init/nextjs.js.map +1 -0
- package/dist/prompts/init/promptForTypescript.js +9 -0
- package/dist/prompts/init/promptForTypescript.js.map +1 -0
- package/dist/prompts/promptForDataset.js +32 -0
- package/dist/prompts/promptForDataset.js.map +1 -0
- package/dist/prompts/promptForDatasetAclMode.js +27 -0
- package/dist/prompts/promptForDatasetAclMode.js.map +1 -0
- package/dist/prompts/promptForDatasetAliasName.js +17 -0
- package/dist/prompts/promptForDatasetAliasName.js.map +1 -0
- package/dist/prompts/promptForDatasetName.js +20 -0
- package/dist/prompts/promptForDatasetName.js.map +1 -0
- package/dist/prompts/promptForDefaultConfig.js +12 -0
- package/dist/prompts/promptForDefaultConfig.js.map +1 -0
- package/dist/prompts/promptForMediaLibrary.js +37 -0
- package/dist/prompts/promptForMediaLibrary.js.map +1 -0
- package/dist/prompts/promptForOrganizationName.js +11 -0
- package/dist/prompts/promptForOrganizationName.js.map +1 -0
- package/dist/prompts/promptForProjectName.js +11 -0
- package/dist/prompts/promptForProjectName.js.map +1 -0
- package/dist/prompts/selectDataset.js +12 -0
- package/dist/prompts/selectDataset.js.map +1 -0
- package/dist/prompts/selectMediaLibrary.js +34 -0
- package/dist/prompts/selectMediaLibrary.js.map +1 -0
- package/dist/server/devServer.js +53 -0
- package/dist/server/devServer.js.map +1 -0
- package/dist/server/gracefulServerDeath.js +12 -0
- package/dist/server/gracefulServerDeath.js.map +1 -0
- package/dist/server/previewServer.js +93 -0
- package/dist/server/previewServer.js.map +1 -0
- package/dist/server/serverDebug.js +4 -0
- package/dist/server/serverDebug.js.map +1 -0
- package/dist/server/vite/plugin-sanity-basepath-redirect.js +25 -0
- package/dist/server/vite/plugin-sanity-basepath-redirect.js.map +1 -0
- package/dist/server/vite/plugin-sanity-build-entries.js +65 -0
- package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -0
- package/dist/server/vite/plugin-sanity-favicons.js +72 -0
- package/dist/server/vite/plugin-sanity-favicons.js.map +1 -0
- package/dist/server/vite/plugin-sanity-runtime-rewrite.js +18 -0
- package/dist/server/vite/plugin-sanity-runtime-rewrite.js.map +1 -0
- package/dist/services/auth.js +13 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/backup.js +51 -0
- package/dist/services/backup.js.map +1 -0
- package/dist/services/cors.js +38 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/datasetAliases.js +64 -0
- package/dist/services/datasetAliases.js.map +1 -0
- package/dist/services/datasets.js +153 -0
- package/dist/services/datasets.js.map +1 -0
- package/dist/services/docs.js +46 -0
- package/dist/services/docs.js.map +1 -0
- package/dist/services/documents.js +56 -0
- package/dist/services/documents.js.map +1 -0
- package/dist/services/getProjectFeatures.js +16 -0
- package/dist/services/getProjectFeatures.js.map +1 -0
- package/dist/services/getUrlHeaders.js +36 -0
- package/dist/services/getUrlHeaders.js.map +1 -0
- package/dist/services/graphql.js +96 -0
- package/dist/services/graphql.js.map +1 -0
- package/dist/services/hooks.js +59 -0
- package/dist/services/hooks.js.map +1 -0
- package/dist/services/mcp.js +50 -0
- package/dist/services/mcp.js.map +1 -0
- package/dist/services/mediaLibraries.js +74 -0
- package/dist/services/mediaLibraries.js.map +1 -0
- package/dist/services/organizations.js +42 -0
- package/dist/services/organizations.js.map +1 -0
- package/dist/services/plans.js +37 -0
- package/dist/services/plans.js.map +1 -0
- package/dist/services/projects.js +119 -0
- package/dist/services/projects.js.map +1 -0
- package/dist/services/schemas.js +40 -0
- package/dist/services/schemas.js.map +1 -0
- package/dist/services/telemetry.js +80 -0
- package/dist/services/telemetry.js.map +1 -0
- package/dist/services/tokens.js +72 -0
- package/dist/services/tokens.js.map +1 -0
- package/dist/services/user.js +35 -0
- package/dist/services/user.js.map +1 -0
- package/dist/services/userApplications.js +164 -0
- package/dist/services/userApplications.js.map +1 -0
- package/dist/studioDependencies.js +24 -0
- package/dist/studioDependencies.js.map +1 -0
- package/dist/telemetry/build.telemetry.js +13 -0
- package/dist/telemetry/build.telemetry.js.map +1 -0
- package/dist/telemetry/cli.telemetry.js +8 -0
- package/dist/telemetry/cli.telemetry.js.map +1 -0
- package/dist/telemetry/extractSchema.telemetry.js +8 -0
- package/dist/telemetry/extractSchema.telemetry.js.map +1 -0
- package/dist/telemetry/init.telemetry.js +8 -0
- package/dist/telemetry/init.telemetry.js.map +1 -0
- package/dist/telemetry/login.telemetry.js +8 -0
- package/dist/telemetry/login.telemetry.js.map +1 -0
- package/dist/telemetry/mcp.telemetry.js +8 -0
- package/dist/telemetry/mcp.telemetry.js.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/typings/deepSortObject.d.js +2 -0
- package/dist/typings/deepSortObject.d.js.map +1 -0
- package/dist/util/absolutify.js +26 -0
- package/dist/util/absolutify.js.map +1 -0
- package/dist/util/appId.js +58 -0
- package/dist/util/appId.js.map +1 -0
- package/dist/util/canLaunchBrowser.js +14 -0
- package/dist/util/canLaunchBrowser.js.map +1 -0
- package/dist/util/cliClient.js +41 -0
- package/dist/util/cliClient.js.map +1 -0
- package/dist/util/compareDependencyVersions.js +73 -0
- package/dist/util/compareDependencyVersions.js.map +1 -0
- package/dist/util/copy.js +37 -0
- package/dist/util/copy.js.map +1 -0
- package/dist/util/copyDir.js +63 -0
- package/dist/util/copyDir.js.map +1 -0
- package/dist/util/detectRuntime.js +20 -0
- package/dist/util/detectRuntime.js.map +1 -0
- package/dist/util/determineIsApp.js +9 -0
- package/dist/util/determineIsApp.js.map +1 -0
- package/dist/util/dirIsEmptyOrNonExistent.js +18 -0
- package/dist/util/dirIsEmptyOrNonExistent.js.map +1 -0
- package/dist/util/ensureTrailingSlash.js +12 -0
- package/dist/util/ensureTrailingSlash.js.map +1 -0
- package/dist/util/errorMessages.js +6 -0
- package/dist/util/errorMessages.js.map +1 -0
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js +88 -0
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -0
- package/dist/util/findNdjsonEntry.js +21 -0
- package/dist/util/findNdjsonEntry.js.map +1 -0
- package/dist/util/formatSize.js +10 -0
- package/dist/util/formatSize.js.map +1 -0
- package/dist/util/frameworkPort.js +61 -0
- package/dist/util/frameworkPort.js.map +1 -0
- package/dist/util/fsUtils.js +34 -0
- package/dist/util/fsUtils.js.map +1 -0
- package/dist/util/getCliVersion.js +28 -0
- package/dist/util/getCliVersion.js.map +1 -0
- package/dist/util/getErrorMessage.js +19 -0
- package/dist/util/getErrorMessage.js.map +1 -0
- package/dist/util/getLocalPackageVersion.js +32 -0
- package/dist/util/getLocalPackageVersion.js.map +1 -0
- package/dist/util/getProjectDefaults.js +77 -0
- package/dist/util/getProjectDefaults.js.map +1 -0
- package/dist/util/getSanityEnv.js +3 -0
- package/dist/util/getSanityEnv.js.map +1 -0
- package/dist/util/getSharedServerConfig.js +31 -0
- package/dist/util/getSharedServerConfig.js.map +1 -0
- package/dist/util/getWorkspace.js +18 -0
- package/dist/util/getWorkspace.js.map +1 -0
- package/dist/util/humanFileSize.js +12 -0
- package/dist/util/humanFileSize.js.map +1 -0
- package/dist/util/importStudioConfig.js +40 -0
- package/dist/util/importStudioConfig.js.map +1 -0
- package/dist/util/isPathDirName.js +6 -0
- package/dist/util/isPathDirName.js.map +1 -0
- package/dist/util/isSanityDocumentish.js +20 -0
- package/dist/util/isSanityDocumentish.js.map +1 -0
- package/dist/util/loadEnv.js +3 -0
- package/dist/util/loadEnv.js.map +1 -0
- package/dist/util/moduleFormatUtils.js +18 -0
- package/dist/util/moduleFormatUtils.js.map +1 -0
- package/dist/util/packageManager/installPackages.js +87 -0
- package/dist/util/packageManager/installPackages.js.map +1 -0
- package/dist/util/packageManager/packageManagerChoice.js +181 -0
- package/dist/util/packageManager/packageManagerChoice.js.map +1 -0
- package/dist/util/packageManager/upgradePackages.js +69 -0
- package/dist/util/packageManager/upgradePackages.js.map +1 -0
- package/dist/util/parseArguments.js +42 -0
- package/dist/util/parseArguments.js.map +1 -0
- package/dist/util/pluralize.js +11 -0
- package/dist/util/pluralize.js.map +1 -0
- package/dist/util/readModuleVersion.js +15 -0
- package/dist/util/readModuleVersion.js.map +1 -0
- package/dist/util/readPackageJson.js +44 -0
- package/dist/util/readPackageJson.js.map +1 -0
- package/dist/util/readPackageManifest.js +46 -0
- package/dist/util/readPackageManifest.js.map +1 -0
- package/dist/util/readdirRecursive.js +24 -0
- package/dist/util/readdirRecursive.js.map +1 -0
- package/dist/util/resolveLatestVersions.js +21 -0
- package/dist/util/resolveLatestVersions.js.map +1 -0
- package/dist/util/toInt.js +9 -0
- package/dist/util/toInt.js.map +1 -0
- package/dist/util/trimHashFromVersion.js +8 -0
- package/dist/util/trimHashFromVersion.js.map +1 -0
- package/dist/util/uniqBy.js +14 -0
- package/dist/util/uniqBy.js.map +1 -0
- package/dist/util/validation/validateDocumentsUtils.js +33 -0
- package/dist/util/validation/validateDocumentsUtils.js.map +1 -0
- package/dist/util/warnAboutMissingAppId.js +15 -0
- package/dist/util/warnAboutMissingAppId.js.map +1 -0
- package/dist/util/warnOnNonProductionEnvironment.js +18 -0
- package/dist/util/warnOnNonProductionEnvironment.js.map +1 -0
- package/dist/util/workerChannels.js +172 -0
- package/dist/util/workerChannels.js.map +1 -0
- package/oclif.config.js +21 -0
- package/oclif.manifest.json +4154 -0
- package/package.json +138 -98
- package/templates/app-quickstart/src/App.css +3 -1
- package/templates/app-quickstart/src/App.tsx +1 -1
- package/templates/app-sanity-ui/src/App.tsx +2 -2
- package/templates/app-sanity-ui/src/ExampleComponent.tsx +2 -1
- package/templates/get-started/plugins/sanity-plugin-tutorial/GetStartedTutorial.tsx +3 -3
- package/templates/get-started/plugins/sanity-plugin-tutorial/index.ts +2 -2
- package/templates/shopify/components/hotspots/ProductTooltip.tsx +1 -1
- package/templates/shopify/components/icons/Shopify.tsx +0 -2
- package/templates/shopify/components/inputs/CollectionHidden.tsx +0 -1
- package/templates/shopify/components/media/ColorTheme.tsx +1 -1
- package/templates/shopify/constants.ts +4 -4
- package/templates/shopify/plugins/customDocumentActions/index.ts +2 -2
- package/templates/shopify/plugins/customDocumentActions/shopifyDelete.tsx +1 -1
- package/templates/shopify/schemaTypes/documents/collection.tsx +1 -2
- package/templates/shopify/schemaTypes/documents/page.ts +1 -1
- package/templates/shopify/schemaTypes/documents/product.tsx +1 -1
- package/templates/shopify/schemaTypes/documents/productVariant.tsx +2 -3
- package/templates/shopify/schemaTypes/objects/customProductOption/customProductOptionColorObjectType.tsx +0 -1
- package/templates/shopify/schemaTypes/objects/hotspot/productHotspotsType.tsx +1 -3
- package/templates/shopify/schemaTypes/objects/module/collectionReferenceType.tsx +0 -1
- package/templates/shopify/schemaTypes/objects/shopify/placeholderStringType.ts +2 -3
- package/templates/shopify/schemaTypes/objects/shopify/productWithVariantType.tsx +1 -1
- package/templates/shopify/schemaTypes/objects/shopify/shopifyCollectionType.ts +1 -2
- package/templates/shopify/schemaTypes/objects/shopify/shopifyProductType.ts +1 -2
- package/templates/shopify/schemaTypes/portableText/portableTextType.tsx +7 -7
- package/templates/shopify/schemaTypes/singletons/homeType.ts +8 -8
- package/templates/shopify/structure/collectionStructure.ts +4 -1
- package/templates/shopify/structure/colorThemeStructure.ts +1 -1
- package/templates/shopify/structure/homeStructure.ts +2 -2
- package/templates/shopify/structure/index.ts +1 -1
- package/templates/shopify/structure/pageStructure.ts +2 -2
- package/templates/shopify/structure/productStructure.ts +7 -7
- package/templates/shopify/structure/settingStructure.ts +1 -1
- package/templates/shopify/utils/defineStructure.ts +1 -1
- package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/index.ts +1 -1
- package/templates/shopify-online-storefront/plugins/shopifyDocumentActions/shopifyDelete.tsx +1 -1
- package/templates/shopify-online-storefront/structure/collectionStructure.ts +4 -1
- package/templates/shopify-online-storefront/structure/productStructure.ts +4 -4
- package/templates/shopify-online-storefront/utils/defineStructure.ts +1 -1
- package/bin/dev.js +0 -30
- package/bin/sanity +0 -14
- package/lib/_chunks-cjs/cli.js +0 -70870
- package/lib/_chunks-cjs/cli.js.map +0 -1
- package/lib/_chunks-cjs/cliWorker.js +0 -19
- package/lib/_chunks-cjs/cliWorker.js.map +0 -1
- package/lib/_chunks-cjs/generateAction.js +0 -128
- package/lib/_chunks-cjs/generateAction.js.map +0 -1
- package/lib/_chunks-cjs/getCliConfig.js +0 -89
- package/lib/_chunks-cjs/getCliConfig.js.map +0 -1
- package/lib/_chunks-cjs/index.js +0 -31
- package/lib/_chunks-cjs/index.js.map +0 -1
- package/lib/_chunks-cjs/journeyConfig.js +0 -113
- package/lib/_chunks-cjs/journeyConfig.js.map +0 -1
- package/lib/_chunks-cjs/loadEnv.js +0 -347
- package/lib/_chunks-cjs/loadEnv.js.map +0 -1
- package/lib/_chunks-dts/types.d.ts +0 -432
- package/lib/cli.d.ts +0 -7
- package/lib/cli.js +0 -10
- package/lib/cli.js.map +0 -1
- package/lib/index.d.ts +0 -44
- package/lib/index.js +0 -46
- package/lib/index.js.map +0 -1
- package/lib/run.d.ts +0 -1
- package/lib/run.js +0 -8
- package/lib/run.js.map +0 -1
- package/lib/workers/getAndWriteJourneySchema.d.ts +0 -1
- package/lib/workers/getAndWriteJourneySchema.js +0 -4
- package/lib/workers/getAndWriteJourneySchema.js.map +0 -1
- package/lib/workers/getCliConfig.d.ts +0 -1
- package/lib/workers/getCliConfig.js +0 -10
- package/lib/workers/getCliConfig.js.map +0 -1
- package/lib/workers/typegenGenerate.d.ts +0 -18
- package/lib/workers/typegenGenerate.js +0 -47
- package/lib/workers/typegenGenerate.js.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
import fs, { mkdtemp } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { text } from 'node:stream/consumers';
|
|
7
|
+
import { pipeline } from 'node:stream/promises';
|
|
8
|
+
import { styleText } from 'node:util';
|
|
9
|
+
import gunzipMaybe from 'gunzip-maybe';
|
|
10
|
+
// @ts-expect-error `peek-stream` module currently untyped
|
|
11
|
+
import isTar from 'is-tar';
|
|
12
|
+
// @ts-expect-error `peek-stream` module currently untyped
|
|
13
|
+
import peek from 'peek-stream';
|
|
14
|
+
import { catchError, EMPTY, filter, from, map, mergeMap, mergeWith, of, switchMap, tap, zip } from 'rxjs';
|
|
15
|
+
import tar from 'tar-fs';
|
|
16
|
+
import { glob } from 'tinyglobby';
|
|
17
|
+
import { findNdjsonEntry } from '../../util/findNdjsonEntry.js';
|
|
18
|
+
import { importMediaDebug } from './importMediaDebug.js';
|
|
19
|
+
const DEFAULT_CONCURRENCY = 6;
|
|
20
|
+
export function importer(options) {
|
|
21
|
+
return resolveSource(options).pipe(mergeMap(({ aspectsNdjsonPath, files, images, workingPath })=>{
|
|
22
|
+
const fileCount = files.length + images.length;
|
|
23
|
+
if (fileCount === 0) {
|
|
24
|
+
throw new Error('No assets to import');
|
|
25
|
+
}
|
|
26
|
+
const context = {
|
|
27
|
+
...options,
|
|
28
|
+
ndjson: ()=>createReadStream(aspectsNdjsonPath),
|
|
29
|
+
workingPath
|
|
30
|
+
};
|
|
31
|
+
return from(files).pipe(switchMap((file)=>zip(of('file'), of(file))), mergeWith(from(images).pipe(switchMap((file)=>zip(of('image'), of(file))))), fetchExistingAssets(context), uploadAsset(context), resolveAspectData(context), setAspects(context), map((asset)=>({
|
|
32
|
+
asset,
|
|
33
|
+
fileCount
|
|
34
|
+
})));
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/ export function resolveSource({ sourcePath }) {
|
|
40
|
+
return from(fs.stat(sourcePath)).pipe(switchMap((stats)=>{
|
|
41
|
+
return stats.isDirectory() ? of(sourcePath) : from(mkdtemp(path.join(tmpdir(), 'sanity-media-library-import'))).pipe(switchMap((tempPath)=>{
|
|
42
|
+
return from(pipeline(createReadStream(sourcePath), gunzipMaybe(), untarMaybe(tempPath))).pipe(map(()=>tempPath));
|
|
43
|
+
}));
|
|
44
|
+
}), switchMap((importSourcePath)=>{
|
|
45
|
+
return from(glob([
|
|
46
|
+
'**/data.ndjson'
|
|
47
|
+
], {
|
|
48
|
+
absolute: true,
|
|
49
|
+
cwd: importSourcePath,
|
|
50
|
+
deep: 2
|
|
51
|
+
})).pipe(map(([aspectsNdjsonPath])=>({
|
|
52
|
+
aspectsNdjsonPath,
|
|
53
|
+
importSourcePath,
|
|
54
|
+
workingPath: aspectsNdjsonPath === undefined ? importSourcePath : path.dirname(aspectsNdjsonPath)
|
|
55
|
+
})));
|
|
56
|
+
}), tap(({ aspectsNdjsonPath, importSourcePath })=>{
|
|
57
|
+
if (aspectsNdjsonPath === undefined) {
|
|
58
|
+
throw new Error(`No ${styleText('bold', 'data.ndjson')} file found in import source ${styleText('bold', importSourcePath)}`);
|
|
59
|
+
}
|
|
60
|
+
importMediaDebug(`[Found NDJSON file] ${aspectsNdjsonPath}`);
|
|
61
|
+
}), switchMap(({ aspectsNdjsonPath, workingPath })=>{
|
|
62
|
+
return from(Promise.all([
|
|
63
|
+
glob([
|
|
64
|
+
'files/*'
|
|
65
|
+
], {
|
|
66
|
+
cwd: workingPath
|
|
67
|
+
}),
|
|
68
|
+
glob([
|
|
69
|
+
'images/*'
|
|
70
|
+
], {
|
|
71
|
+
cwd: workingPath
|
|
72
|
+
})
|
|
73
|
+
])).pipe(map(([files, images])=>({
|
|
74
|
+
aspectsNdjsonPath,
|
|
75
|
+
files,
|
|
76
|
+
images,
|
|
77
|
+
workingPath
|
|
78
|
+
})));
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Untar the stream if its contents appear to be tarred.
|
|
83
|
+
*
|
|
84
|
+
* @internal
|
|
85
|
+
*/ function untarMaybe(outputPath) {
|
|
86
|
+
// @ts-expect-error `peek-stream` module currently untyped
|
|
87
|
+
return peek({
|
|
88
|
+
maxBuffer: 300,
|
|
89
|
+
newline: false
|
|
90
|
+
}, (data, swap)=>{
|
|
91
|
+
if (isTar(data)) {
|
|
92
|
+
return swap(null, tar.extract(outputPath));
|
|
93
|
+
}
|
|
94
|
+
return swap(null);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Fetch the ids of all asset documents that reference the input asset.
|
|
99
|
+
* The input asset is identified by its SHA-1 hash.
|
|
100
|
+
*
|
|
101
|
+
* @internal
|
|
102
|
+
*/ function fetchAssetsByHash({ client, type }) {
|
|
103
|
+
return switchMap((hash)=>client.observable.fetch(`*[
|
|
104
|
+
_type == "sanity.asset" &&
|
|
105
|
+
currentVersion._ref == *[
|
|
106
|
+
_type == $type &&
|
|
107
|
+
sha1hash == $hash
|
|
108
|
+
][0]._id
|
|
109
|
+
]._id`, {
|
|
110
|
+
hash,
|
|
111
|
+
type: [
|
|
112
|
+
'sanity',
|
|
113
|
+
`${type}Asset`
|
|
114
|
+
].join('.')
|
|
115
|
+
}, {
|
|
116
|
+
tag: 'asset.getId'
|
|
117
|
+
}).pipe(switchMap((assetIds)=>zip(of(hash), of(assetIds)))));
|
|
118
|
+
}
|
|
119
|
+
function fetchExistingAssets({ client, workingPath }) {
|
|
120
|
+
return mergeMap(([type, asset])=>{
|
|
121
|
+
const createSha1Hash = createHash('sha1');
|
|
122
|
+
const sha1hash = text(createReadStream(path.join(workingPath, asset)).pipe(createSha1Hash).setEncoding('hex'));
|
|
123
|
+
return from(sha1hash).pipe(tap((hash)=>importMediaDebug(`[Asset ${asset}] Checking for ${type} asset with hash ${hash}`)), fetchAssetsByHash({
|
|
124
|
+
client,
|
|
125
|
+
type
|
|
126
|
+
}), map(([hash, assetIds])=>{
|
|
127
|
+
if (assetIds.length === 0) {
|
|
128
|
+
return [
|
|
129
|
+
type,
|
|
130
|
+
asset,
|
|
131
|
+
hash
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
assetIds,
|
|
136
|
+
isExistingAsset: true,
|
|
137
|
+
originalFilename: asset,
|
|
138
|
+
sha1Hash: hash
|
|
139
|
+
};
|
|
140
|
+
}));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Find the first matching entry in the provided NDJSON stream and attach it to the asset object.
|
|
145
|
+
*
|
|
146
|
+
* @internal
|
|
147
|
+
*/ function resolveAspectData({ ndjson }) {
|
|
148
|
+
return mergeMap((resolvedAsset)=>from(findNdjsonEntry(ndjson(), (line)=>typeof line === 'object' && line !== null && 'filename' in line && line.filename === resolvedAsset.originalFilename)).pipe(map((aspectsFromImport)=>({
|
|
149
|
+
...resolvedAsset,
|
|
150
|
+
aspects: aspectsFromImport?.aspects
|
|
151
|
+
}))));
|
|
152
|
+
}
|
|
153
|
+
// TODO: Batch mutations to reduce HTTP request count.
|
|
154
|
+
export function setAspects({ client, replaceAspects }) {
|
|
155
|
+
return mergeMap((asset)=>{
|
|
156
|
+
const { aspects, assetIds, isExistingAsset } = asset;
|
|
157
|
+
if (isExistingAsset && !replaceAspects) {
|
|
158
|
+
importMediaDebug(`[Asset ${asset.originalFilename}] Skipping replacement of existing aspects`);
|
|
159
|
+
return of(asset);
|
|
160
|
+
}
|
|
161
|
+
if (aspects === undefined) {
|
|
162
|
+
importMediaDebug(`[Asset ${asset.originalFilename}] No aspects to import`);
|
|
163
|
+
return of(asset);
|
|
164
|
+
}
|
|
165
|
+
const transaction = client.observable.transaction();
|
|
166
|
+
for (const assetId of assetIds){
|
|
167
|
+
transaction.patch(assetId, {
|
|
168
|
+
set: {
|
|
169
|
+
aspects
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
importMediaDebug(`[Asset ${asset.originalFilename}] Setting aspects on asset documents ${JSON.stringify(assetIds)}`);
|
|
174
|
+
return transaction.commit({
|
|
175
|
+
tag: 'asset.setAspects',
|
|
176
|
+
visibility: 'async'
|
|
177
|
+
}).pipe(map(()=>asset));
|
|
178
|
+
}, DEFAULT_CONCURRENCY);
|
|
179
|
+
}
|
|
180
|
+
function uploadAsset({ client, workingPath }) {
|
|
181
|
+
return mergeMap((maybeResolvedAsset)=>{
|
|
182
|
+
if ('assetIds' in maybeResolvedAsset) {
|
|
183
|
+
importMediaDebug(`[Asset ${maybeResolvedAsset.originalFilename}] Skipping upload of existing asset with hash ${maybeResolvedAsset.sha1Hash}`);
|
|
184
|
+
return of(maybeResolvedAsset);
|
|
185
|
+
}
|
|
186
|
+
const [type, asset, hash] = maybeResolvedAsset;
|
|
187
|
+
importMediaDebug(`[Asset ${asset}] Uploading new asset`);
|
|
188
|
+
return client.observable.assets.upload(type, createReadStream(path.join(workingPath, asset)), {
|
|
189
|
+
tag: 'asset.upload'
|
|
190
|
+
}).pipe(catchError((error)=>{
|
|
191
|
+
// An asset matching the hash was not found during previous steps, but appears to exist upon upload.
|
|
192
|
+
//
|
|
193
|
+
// This may occur if:
|
|
194
|
+
// - The asset was uploaded by another client since the check was performed.
|
|
195
|
+
// - The asset instance document exists, but is not referenced by any asset document.
|
|
196
|
+
if (error.statusCode === 409) {
|
|
197
|
+
importMediaDebug(`[Asset ${asset}] Cannot overwrite existing ${type} asset with hash ${hash}`);
|
|
198
|
+
return EMPTY;
|
|
199
|
+
}
|
|
200
|
+
return EMPTY;
|
|
201
|
+
}), filter((response)=>response.type === 'response'), tap(()=>importMediaDebug(`[Asset ${asset}] Finished uploading new asset`)), // TODO: The `client.assets.upload` method should return `MediaLibraryUploadResponse` when operating on Media Library resources. When that occurs, this type assertion can be removed.
|
|
202
|
+
map((response)=>response.body), map((result)=>({
|
|
203
|
+
assetIds: [
|
|
204
|
+
result.asset._id
|
|
205
|
+
],
|
|
206
|
+
isExistingAsset: false,
|
|
207
|
+
originalFilename: asset,
|
|
208
|
+
sha1Hash: hash
|
|
209
|
+
})));
|
|
210
|
+
}, DEFAULT_CONCURRENCY);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=importMedia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/media/importMedia.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\nimport {createReadStream, type ReadStream} from 'node:fs'\nimport fs, {mkdtemp} from 'node:fs/promises'\nimport {tmpdir} from 'node:os'\nimport path from 'node:path'\nimport {text} from 'node:stream/consumers'\nimport {pipeline} from 'node:stream/promises'\nimport {styleText} from 'node:util'\n\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type SanityClient} from '@sanity/client'\nimport {type FileAsset, type ImageAsset, type SanityDocument} from '@sanity/types'\nimport gunzipMaybe from 'gunzip-maybe'\n// @ts-expect-error `peek-stream` module currently untyped\nimport isTar from 'is-tar'\n// @ts-expect-error `peek-stream` module currently untyped\nimport peek from 'peek-stream'\nimport {\n catchError,\n EMPTY,\n filter,\n from,\n map,\n mergeMap,\n mergeWith,\n type Observable,\n of,\n type OperatorFunction,\n switchMap,\n tap,\n zip,\n} from 'rxjs'\nimport tar from 'tar-fs'\nimport {glob} from 'tinyglobby'\n\nimport {findNdjsonEntry} from '../../util/findNdjsonEntry.js'\nimport {importMediaDebug} from './importMediaDebug.js'\n\nconst DEFAULT_CONCURRENCY = 6\n\ninterface MediaLibraryUploadResult {\n asset: SanityDocument & {\n _type: 'sanity.asset'\n aspects: unknown\n assetType: FileAsset['_type'] | ImageAsset['_type']\n }\n assetInstance: FileAsset | ImageAsset\n}\n\ninterface MediaLibraryUploadResponse {\n body: MediaLibraryUploadResult\n type: 'response'\n}\n\nexport interface State {\n /**\n * The last asset processed.\n */\n asset: AssetWithAspects\n /**\n * The count of input files.\n */\n fileCount: number\n}\n\ninterface ResolvedAsset {\n /**\n * The ids of the `sanity.asset` documents that currently refer to the asset.\n *\n * These documents contain aspects, and reference an asset instance document.\n */\n assetIds: string[]\n isExistingAsset: boolean\n /**\n * The original filename of the asset as it appears in the import source.\n *\n * Note: Currently includes `images/` or `files/` prefix.\n */\n originalFilename: string\n sha1Hash: string\n}\n\nexport type AssetWithAspects<Asset extends ResolvedAsset = ResolvedAsset> = Asset & {\n aspects: unknown | undefined\n}\n\ninterface Options {\n client: SanityClient\n replaceAspects: boolean\n sourcePath: string\n spinner: ReturnType<typeof spinner>\n}\n\ninterface Context extends Options {\n ndjson: () => ReadStream\n workingPath: string\n}\n\nexport function importer(options: Options): Observable<State> {\n return resolveSource(options).pipe(\n mergeMap(({aspectsNdjsonPath, files, images, workingPath}) => {\n const fileCount = files.length + images.length\n\n if (fileCount === 0) {\n throw new Error('No assets to import')\n }\n\n const context: Context = {\n ...options,\n ndjson: () => createReadStream(aspectsNdjsonPath),\n workingPath,\n }\n\n return from(files).pipe(\n switchMap((file) => zip(of<'file'>('file'), of(file))),\n mergeWith(from(images).pipe(switchMap((file) => zip(of<'image'>('image'), of(file))))),\n fetchExistingAssets(context),\n uploadAsset(context),\n resolveAspectData(context),\n setAspects(context),\n map((asset) => ({\n asset,\n fileCount,\n })),\n )\n }),\n )\n}\n\n/**\n * @internal\n */\nexport function resolveSource({sourcePath}: Pick<Context, 'sourcePath'>): Observable<{\n aspectsNdjsonPath: string\n files: string[]\n images: string[]\n workingPath: string\n}> {\n return from(fs.stat(sourcePath)).pipe(\n switchMap((stats) => {\n return stats.isDirectory()\n ? of(sourcePath)\n : from(mkdtemp(path.join(tmpdir(), 'sanity-media-library-import'))).pipe(\n switchMap((tempPath) => {\n return from(\n pipeline(createReadStream(sourcePath), gunzipMaybe(), untarMaybe(tempPath)),\n ).pipe(map(() => tempPath))\n }),\n )\n }),\n switchMap((importSourcePath) => {\n return from(\n glob(['**/data.ndjson'], {\n absolute: true,\n cwd: importSourcePath,\n deep: 2,\n }),\n ).pipe(\n map(([aspectsNdjsonPath]) => ({\n aspectsNdjsonPath,\n importSourcePath,\n workingPath:\n aspectsNdjsonPath === undefined ? importSourcePath : path.dirname(aspectsNdjsonPath),\n })),\n )\n }),\n tap(({aspectsNdjsonPath, importSourcePath}) => {\n if (aspectsNdjsonPath === undefined) {\n throw new Error(\n `No ${styleText('bold', 'data.ndjson')} file found in import source ${styleText('bold', importSourcePath)}`,\n )\n }\n importMediaDebug(`[Found NDJSON file] ${aspectsNdjsonPath}`)\n }),\n switchMap(({aspectsNdjsonPath, workingPath}) => {\n return from(\n Promise.all([\n glob(['files/*'], {\n cwd: workingPath,\n }),\n glob(['images/*'], {\n cwd: workingPath,\n }),\n ]),\n ).pipe(\n map(([files, images]) => ({\n aspectsNdjsonPath,\n files,\n images,\n workingPath,\n })),\n )\n }),\n )\n}\n\n/**\n * Untar the stream if its contents appear to be tarred.\n *\n * @internal\n */\nfunction untarMaybe(outputPath: string) {\n // @ts-expect-error `peek-stream` module currently untyped\n return peek({maxBuffer: 300, newline: false}, (data, swap) => {\n if (isTar(data)) {\n return swap(null, tar.extract(outputPath))\n }\n\n return swap(null)\n })\n}\n\n/**\n * Fetch the ids of all asset documents that reference the input asset.\n * The input asset is identified by its SHA-1 hash.\n *\n * @internal\n */\nfunction fetchAssetsByHash({\n client,\n type,\n}: {\n client: SanityClient\n type: 'file' | 'image'\n}): OperatorFunction<string, [hash: string, assetIds: string[]]> {\n return switchMap((hash) =>\n client.observable\n .fetch<string[]>(\n `*[\n _type == \"sanity.asset\" &&\n currentVersion._ref == *[\n _type == $type &&\n sha1hash == $hash\n ][0]._id\n ]._id`,\n {\n hash,\n type: ['sanity', `${type}Asset`].join('.'),\n },\n {\n tag: 'asset.getId',\n },\n )\n .pipe(switchMap((assetIds) => zip(of(hash), of(assetIds)))),\n )\n}\n\nfunction fetchExistingAssets({\n client,\n workingPath,\n}: Context): OperatorFunction<\n [type: 'file' | 'image', asset: string],\n [type: 'file' | 'image', asset: string, hash: string] | ResolvedAsset\n> {\n return mergeMap(([type, asset]) => {\n const createSha1Hash = createHash('sha1')\n\n const sha1hash = text(\n createReadStream(path.join(workingPath, asset)).pipe(createSha1Hash).setEncoding('hex'),\n )\n\n return from(sha1hash).pipe(\n tap((hash) =>\n importMediaDebug(`[Asset ${asset}] Checking for ${type} asset with hash ${hash}`),\n ),\n fetchAssetsByHash({client, type}),\n map<\n [string, string[]],\n [type: 'file' | 'image', asset: string, hash: string] | ResolvedAsset\n >(([hash, assetIds]) => {\n if (assetIds.length === 0) {\n return [type, asset, hash]\n }\n\n return {\n assetIds,\n isExistingAsset: true,\n originalFilename: asset,\n sha1Hash: hash,\n }\n }),\n )\n })\n}\n\n/**\n * Find the first matching entry in the provided NDJSON stream and attach it to the asset object.\n *\n * @internal\n */\nfunction resolveAspectData({ndjson}: Context): OperatorFunction<ResolvedAsset, AssetWithAspects> {\n return mergeMap((resolvedAsset) =>\n from(\n findNdjsonEntry<{aspects: unknown}>(\n ndjson(),\n (line) =>\n typeof line === 'object' &&\n line !== null &&\n 'filename' in line &&\n line.filename === resolvedAsset.originalFilename,\n ),\n ).pipe(\n map((aspectsFromImport) => ({\n ...resolvedAsset,\n aspects: aspectsFromImport?.aspects,\n })),\n ),\n )\n}\n\n// TODO: Batch mutations to reduce HTTP request count.\nexport function setAspects({\n client,\n replaceAspects,\n}: Pick<Context, 'client' | 'replaceAspects'>): OperatorFunction<\n AssetWithAspects,\n AssetWithAspects\n> {\n return mergeMap((asset) => {\n const {aspects, assetIds, isExistingAsset} = asset\n\n if (isExistingAsset && !replaceAspects) {\n importMediaDebug(`[Asset ${asset.originalFilename}] Skipping replacement of existing aspects`)\n return of(asset)\n }\n\n if (aspects === undefined) {\n importMediaDebug(`[Asset ${asset.originalFilename}] No aspects to import`)\n return of(asset)\n }\n\n const transaction = client.observable.transaction()\n for (const assetId of assetIds) {\n transaction.patch(assetId, {set: {aspects}})\n }\n\n importMediaDebug(\n `[Asset ${asset.originalFilename}] Setting aspects on asset documents ${JSON.stringify(assetIds)}`,\n )\n\n return transaction\n .commit({\n tag: 'asset.setAspects',\n visibility: 'async',\n })\n .pipe(map(() => asset))\n }, DEFAULT_CONCURRENCY)\n}\n\nfunction uploadAsset({\n client,\n workingPath,\n}: Context): OperatorFunction<\n [type: 'file' | 'image', asset: string, hash: string] | ResolvedAsset,\n ResolvedAsset\n> {\n return mergeMap((maybeResolvedAsset) => {\n if ('assetIds' in maybeResolvedAsset) {\n importMediaDebug(\n `[Asset ${maybeResolvedAsset.originalFilename}] Skipping upload of existing asset with hash ${maybeResolvedAsset.sha1Hash}`,\n )\n return of(maybeResolvedAsset)\n }\n\n const [type, asset, hash] = maybeResolvedAsset\n importMediaDebug(`[Asset ${asset}] Uploading new asset`)\n\n return client.observable.assets\n .upload(type, createReadStream(path.join(workingPath, asset)), {\n tag: 'asset.upload',\n })\n .pipe(\n catchError((error) => {\n // An asset matching the hash was not found during previous steps, but appears to exist upon upload.\n //\n // This may occur if:\n // - The asset was uploaded by another client since the check was performed.\n // - The asset instance document exists, but is not referenced by any asset document.\n if (error.statusCode === 409) {\n importMediaDebug(\n `[Asset ${asset}] Cannot overwrite existing ${type} asset with hash ${hash}`,\n )\n return EMPTY\n }\n return EMPTY\n }),\n filter((response) => response.type === 'response'),\n tap(() => importMediaDebug(`[Asset ${asset}] Finished uploading new asset`)),\n // TODO: The `client.assets.upload` method should return `MediaLibraryUploadResponse` when operating on Media Library resources. When that occurs, this type assertion can be removed.\n map((response) => (response as unknown as MediaLibraryUploadResponse).body),\n map<MediaLibraryUploadResult, ResolvedAsset>((result) => ({\n assetIds: [result.asset._id],\n isExistingAsset: false,\n originalFilename: asset,\n sha1Hash: hash,\n })),\n )\n }, DEFAULT_CONCURRENCY)\n}\n"],"names":["createHash","createReadStream","fs","mkdtemp","tmpdir","path","text","pipeline","styleText","gunzipMaybe","isTar","peek","catchError","EMPTY","filter","from","map","mergeMap","mergeWith","of","switchMap","tap","zip","tar","glob","findNdjsonEntry","importMediaDebug","DEFAULT_CONCURRENCY","importer","options","resolveSource","pipe","aspectsNdjsonPath","files","images","workingPath","fileCount","length","Error","context","ndjson","file","fetchExistingAssets","uploadAsset","resolveAspectData","setAspects","asset","sourcePath","stat","stats","isDirectory","join","tempPath","untarMaybe","importSourcePath","absolute","cwd","deep","undefined","dirname","Promise","all","outputPath","maxBuffer","newline","data","swap","extract","fetchAssetsByHash","client","type","hash","observable","fetch","tag","assetIds","createSha1Hash","sha1hash","setEncoding","isExistingAsset","originalFilename","sha1Hash","resolvedAsset","line","filename","aspectsFromImport","aspects","replaceAspects","transaction","assetId","patch","set","JSON","stringify","commit","visibility","maybeResolvedAsset","assets","upload","error","statusCode","response","body","result","_id"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/media/importMediaDebug.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\n\nexport const importMediaDebug = subdebug('media:import')\n"],"names":["subdebug","importMediaDebug"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AAEzC,OAAO,MAAMC,mBAAmBD,SAAS,gBAAe"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { select, spinner } from '@sanity/cli-core/ux';
|
|
3
|
+
import { promptForOrganizationName } from '../../prompts/promptForOrganizationName.js';
|
|
4
|
+
import { createOrganization, listOrganizations } from '../../services/organizations.js';
|
|
5
|
+
import { getOrganizationChoices } from './getOrganizationChoices.js';
|
|
6
|
+
import { getOrganizationsWithAttachGrantInfo } from './getOrganizationsWithAttachGrantInfo.js';
|
|
7
|
+
const debug = subdebug('getOrganizationId');
|
|
8
|
+
const promptAndCreateNewOrganization = async (user)=>{
|
|
9
|
+
const organizationName = await promptForOrganizationName(user);
|
|
10
|
+
const spin = spinner('Creating organization').start();
|
|
11
|
+
const newOrganization = await createOrganization(organizationName);
|
|
12
|
+
spin.succeed();
|
|
13
|
+
return newOrganization;
|
|
14
|
+
};
|
|
15
|
+
export async function getOrganization({ isUnattended, output, requestedId, user }) {
|
|
16
|
+
// Get available organizations
|
|
17
|
+
const spin = spinner('Loading organizations').start();
|
|
18
|
+
let organizations;
|
|
19
|
+
try {
|
|
20
|
+
organizations = await listOrganizations();
|
|
21
|
+
spin.succeed();
|
|
22
|
+
} catch (error) {
|
|
23
|
+
spin.fail();
|
|
24
|
+
debug('Error retrieving organization list', error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
// If organization is specified, validate it
|
|
28
|
+
if (requestedId) {
|
|
29
|
+
const org = organizations.find((o)=>o.id === requestedId || o.slug === requestedId);
|
|
30
|
+
if (org) return org;
|
|
31
|
+
throw new Error(`Organization "${requestedId}" not found or you don't have access to it`);
|
|
32
|
+
}
|
|
33
|
+
// If the user has no organizations, prompt them to create one with the same name as
|
|
34
|
+
// their user, but allow them to customize it if they want
|
|
35
|
+
if (organizations.length === 0) {
|
|
36
|
+
output.log('You need to create an organization to create projects.');
|
|
37
|
+
return promptAndCreateNewOrganization(user);
|
|
38
|
+
}
|
|
39
|
+
// If the user has organizations, let them choose from them, but also allow them to
|
|
40
|
+
// create a new one in case they do not have access to any of them, or they want to
|
|
41
|
+
// create a personal/other organization.
|
|
42
|
+
debug(`User has ${organizations.length} organization(s), checking attach access`);
|
|
43
|
+
const withGrantInfo = await getOrganizationsWithAttachGrantInfo(organizations);
|
|
44
|
+
const withAttach = withGrantInfo.filter(({ hasAttachGrant })=>hasAttachGrant);
|
|
45
|
+
debug('User has attach access to %d organizations.', withAttach.length);
|
|
46
|
+
const organizationChoices = getOrganizationChoices(withAttach);
|
|
47
|
+
// In unattended mode use defaults without prompting
|
|
48
|
+
if (isUnattended) {
|
|
49
|
+
// Use the first organization with attach permissions
|
|
50
|
+
return withAttach.length > 0 ? withAttach[0].organization : undefined;
|
|
51
|
+
}
|
|
52
|
+
// If the user only has a single organization (and they have attach access to it),
|
|
53
|
+
// we'll default to that one. Otherwise, we'll default to the organization with the
|
|
54
|
+
// same name as the user if it exists.
|
|
55
|
+
const defaultOrganizationId = withAttach.length === 1 ? withAttach[0].organization.id : organizations.find((org)=>org.name === user?.name)?.id;
|
|
56
|
+
const chosenOrg = await select({
|
|
57
|
+
choices: organizationChoices,
|
|
58
|
+
default: defaultOrganizationId || undefined,
|
|
59
|
+
message: 'Select organization:'
|
|
60
|
+
});
|
|
61
|
+
if (chosenOrg === '-new-') {
|
|
62
|
+
return promptAndCreateNewOrganization(user);
|
|
63
|
+
}
|
|
64
|
+
return organizations.find((org)=>org.id === chosenOrg);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=getOrganization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/getOrganization.ts"],"sourcesContent":["import {Output, type SanityOrgUser, subdebug} from '@sanity/cli-core'\nimport {select, spinner} from '@sanity/cli-core/ux'\n\nimport {promptForOrganizationName} from '../../prompts/promptForOrganizationName.js'\nimport {\n createOrganization,\n listOrganizations,\n type ProjectOrganization,\n} from '../../services/organizations.js'\nimport {getOrganizationChoices} from './getOrganizationChoices.js'\nimport {getOrganizationsWithAttachGrantInfo} from './getOrganizationsWithAttachGrantInfo.js'\n\nconst debug = subdebug('getOrganizationId')\n\ninterface GetOrganizationOptions {\n isUnattended: boolean\n output: Output\n requestedId: string | undefined\n user: SanityOrgUser\n}\n\nconst promptAndCreateNewOrganization = async (user: SanityOrgUser) => {\n const organizationName = await promptForOrganizationName(user)\n const spin = spinner('Creating organization').start()\n const newOrganization = await createOrganization(organizationName)\n spin.succeed()\n return newOrganization\n}\n\nexport async function getOrganization({\n isUnattended,\n output,\n requestedId,\n user,\n}: GetOrganizationOptions) {\n // Get available organizations\n const spin = spinner('Loading organizations').start()\n let organizations: ProjectOrganization[]\n try {\n organizations = await listOrganizations()\n spin.succeed()\n } catch (error) {\n spin.fail()\n debug('Error retrieving organization list', error)\n throw error\n }\n\n // If organization is specified, validate it\n if (requestedId) {\n const org = organizations.find((o) => o.id === requestedId || o.slug === requestedId)\n if (org) return org\n\n throw new Error(`Organization \"${requestedId}\" not found or you don't have access to it`)\n }\n\n // If the user has no organizations, prompt them to create one with the same name as\n // their user, but allow them to customize it if they want\n if (organizations.length === 0) {\n output.log('You need to create an organization to create projects.')\n return promptAndCreateNewOrganization(user)\n }\n\n // If the user has organizations, let them choose from them, but also allow them to\n // create a new one in case they do not have access to any of them, or they want to\n // create a personal/other organization.\n debug(`User has ${organizations.length} organization(s), checking attach access`)\n const withGrantInfo = await getOrganizationsWithAttachGrantInfo(organizations)\n const withAttach = withGrantInfo.filter(({hasAttachGrant}) => hasAttachGrant)\n\n debug('User has attach access to %d organizations.', withAttach.length)\n const organizationChoices = getOrganizationChoices(withAttach)\n\n // In unattended mode use defaults without prompting\n if (isUnattended) {\n // Use the first organization with attach permissions\n return withAttach.length > 0 ? withAttach[0].organization : undefined\n }\n\n // If the user only has a single organization (and they have attach access to it),\n // we'll default to that one. Otherwise, we'll default to the organization with the\n // same name as the user if it exists.\n const defaultOrganizationId =\n withAttach.length === 1\n ? withAttach[0].organization.id\n : organizations.find((org) => org.name === user?.name)?.id\n\n const chosenOrg = await select({\n choices: organizationChoices,\n default: defaultOrganizationId || undefined,\n message: 'Select organization:',\n })\n\n if (chosenOrg === '-new-') {\n return promptAndCreateNewOrganization(user)\n }\n\n return organizations.find((org) => org.id === chosenOrg)\n}\n"],"names":["subdebug","select","spinner","promptForOrganizationName","createOrganization","listOrganizations","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","debug","promptAndCreateNewOrganization","user","organizationName","spin","start","newOrganization","succeed","getOrganization","isUnattended","output","requestedId","organizations","error","fail","org","find","o","id","slug","Error","length","log","withGrantInfo","withAttach","filter","hasAttachGrant","organizationChoices","organization","undefined","defaultOrganizationId","name","chosenOrg","choices","default","message"],"mappings":"AAAA,SAAoCA,QAAQ,QAAO,mBAAkB;AACrE,SAAQC,MAAM,EAAEC,OAAO,QAAO,sBAAqB;AAEnD,SAAQC,yBAAyB,QAAO,6CAA4C;AACpF,SACEC,kBAAkB,EAClBC,iBAAiB,QAEZ,kCAAiC;AACxC,SAAQC,sBAAsB,QAAO,8BAA6B;AAClE,SAAQC,mCAAmC,QAAO,2CAA0C;AAE5F,MAAMC,QAAQR,SAAS;AASvB,MAAMS,iCAAiC,OAAOC;IAC5C,MAAMC,mBAAmB,MAAMR,0BAA0BO;IACzD,MAAME,OAAOV,QAAQ,yBAAyBW,KAAK;IACnD,MAAMC,kBAAkB,MAAMV,mBAAmBO;IACjDC,KAAKG,OAAO;IACZ,OAAOD;AACT;AAEA,OAAO,eAAeE,gBAAgB,EACpCC,YAAY,EACZC,MAAM,EACNC,WAAW,EACXT,IAAI,EACmB;IACvB,8BAA8B;IAC9B,MAAME,OAAOV,QAAQ,yBAAyBW,KAAK;IACnD,IAAIO;IACJ,IAAI;QACFA,gBAAgB,MAAMf;QACtBO,KAAKG,OAAO;IACd,EAAE,OAAOM,OAAO;QACdT,KAAKU,IAAI;QACTd,MAAM,sCAAsCa;QAC5C,MAAMA;IACR;IAEA,4CAA4C;IAC5C,IAAIF,aAAa;QACf,MAAMI,MAAMH,cAAcI,IAAI,CAAC,CAACC,IAAMA,EAAEC,EAAE,KAAKP,eAAeM,EAAEE,IAAI,KAAKR;QACzE,IAAII,KAAK,OAAOA;QAEhB,MAAM,IAAIK,MAAM,CAAC,cAAc,EAAET,YAAY,0CAA0C,CAAC;IAC1F;IAEA,oFAAoF;IACpF,0DAA0D;IAC1D,IAAIC,cAAcS,MAAM,KAAK,GAAG;QAC9BX,OAAOY,GAAG,CAAC;QACX,OAAOrB,+BAA+BC;IACxC;IAEA,mFAAmF;IACnF,mFAAmF;IACnF,wCAAwC;IACxCF,MAAM,CAAC,SAAS,EAAEY,cAAcS,MAAM,CAAC,wCAAwC,CAAC;IAChF,MAAME,gBAAgB,MAAMxB,oCAAoCa;IAChE,MAAMY,aAAaD,cAAcE,MAAM,CAAC,CAAC,EAACC,cAAc,EAAC,GAAKA;IAE9D1B,MAAM,+CAA+CwB,WAAWH,MAAM;IACtE,MAAMM,sBAAsB7B,uBAAuB0B;IAEnD,qDAAqD;IACrD,IAAIf,cAAc;QAChB,qDAAqD;QACrD,OAAOe,WAAWH,MAAM,GAAG,IAAIG,UAAU,CAAC,EAAE,CAACI,YAAY,GAAGC;IAC9D;IAEA,kFAAkF;IAClF,mFAAmF;IACnF,sCAAsC;IACtC,MAAMC,wBACJN,WAAWH,MAAM,KAAK,IAClBG,UAAU,CAAC,EAAE,CAACI,YAAY,CAACV,EAAE,GAC7BN,cAAcI,IAAI,CAAC,CAACD,MAAQA,IAAIgB,IAAI,KAAK7B,MAAM6B,OAAOb;IAE5D,MAAMc,YAAY,MAAMvC,OAAO;QAC7BwC,SAASN;QACTO,SAASJ,yBAAyBD;QAClCM,SAAS;IACX;IAEA,IAAIH,cAAc,SAAS;QACzB,OAAO/B,+BAA+BC;IACxC;IAEA,OAAOU,cAAcI,IAAI,CAAC,CAACD,MAAQA,IAAIG,EAAE,KAAKc;AAChD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function getOrganizationChoices(withGrantInfo) {
|
|
2
|
+
const choices = withGrantInfo.map(({ hasAttachGrant, organization })=>({
|
|
3
|
+
disabled: hasAttachGrant ? false : 'Insufficient permissions',
|
|
4
|
+
name: `${organization.name} [${organization.id}]`,
|
|
5
|
+
value: organization.id
|
|
6
|
+
}));
|
|
7
|
+
choices.push({
|
|
8
|
+
disabled: true,
|
|
9
|
+
name: '─────────',
|
|
10
|
+
value: '---separator---'
|
|
11
|
+
}, {
|
|
12
|
+
disabled: false,
|
|
13
|
+
name: 'Create new organization',
|
|
14
|
+
value: '-new-'
|
|
15
|
+
}, {
|
|
16
|
+
disabled: true,
|
|
17
|
+
name: '─────────',
|
|
18
|
+
value: '---separator2---'
|
|
19
|
+
});
|
|
20
|
+
return choices;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=getOrganizationChoices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/getOrganizationChoices.ts"],"sourcesContent":["import {type OrganizationWithGrant} from '../../services/organizations.js'\n\nexport function getOrganizationChoices(withGrantInfo: OrganizationWithGrant[]): Array<{\n disabled: boolean | string\n name: string\n value: string\n}> {\n const choices = withGrantInfo.map(({hasAttachGrant, organization}) => ({\n disabled: hasAttachGrant ? false : 'Insufficient permissions',\n name: `${organization.name} [${organization.id}]`,\n value: organization.id,\n }))\n\n choices.push(\n {disabled: true, name: '─────────', value: '---separator---'},\n {disabled: false, name: 'Create new organization', value: '-new-'},\n {disabled: true, name: '─────────', value: '---separator2---'},\n )\n\n return choices\n}\n"],"names":["getOrganizationChoices","withGrantInfo","choices","map","hasAttachGrant","organization","disabled","name","id","value","push"],"mappings":"AAEA,OAAO,SAASA,uBAAuBC,aAAsC;IAK3E,MAAMC,UAAUD,cAAcE,GAAG,CAAC,CAAC,EAACC,cAAc,EAAEC,YAAY,EAAC,GAAM,CAAA;YACrEC,UAAUF,iBAAiB,QAAQ;YACnCG,MAAM,GAAGF,aAAaE,IAAI,CAAC,EAAE,EAAEF,aAAaG,EAAE,CAAC,CAAC,CAAC;YACjDC,OAAOJ,aAAaG,EAAE;QACxB,CAAA;IAEAN,QAAQQ,IAAI,CACV;QAACJ,UAAU;QAAMC,MAAM;QAAaE,OAAO;IAAiB,GAC5D;QAACH,UAAU;QAAOC,MAAM;QAA2BE,OAAO;IAAO,GACjE;QAACH,UAAU;QAAMC,MAAM;QAAaE,OAAO;IAAkB;IAG/D,OAAOP;AACT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { hasProjectAttachGrant } from './hasProjectAttachGrant.js';
|
|
2
|
+
export async function getOrganizationsWithAttachGrantInfo(organizations) {
|
|
3
|
+
return Promise.all(organizations.map(async (organization)=>({
|
|
4
|
+
hasAttachGrant: await hasProjectAttachGrant(organization.id),
|
|
5
|
+
organization
|
|
6
|
+
})));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=getOrganizationsWithAttachGrantInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/getOrganizationsWithAttachGrantInfo.ts"],"sourcesContent":["import {type OrganizationWithGrant, type ProjectOrganization} from '../../services/organizations.js'\nimport {hasProjectAttachGrant} from './hasProjectAttachGrant.js'\n\nexport async function getOrganizationsWithAttachGrantInfo(\n organizations: ProjectOrganization[],\n): Promise<OrganizationWithGrant[]> {\n return Promise.all(\n organizations.map(async (organization) => ({\n hasAttachGrant: await hasProjectAttachGrant(organization.id),\n organization,\n })),\n )\n}\n"],"names":["hasProjectAttachGrant","getOrganizationsWithAttachGrantInfo","organizations","Promise","all","map","organization","hasAttachGrant","id"],"mappings":"AACA,SAAQA,qBAAqB,QAAO,6BAA4B;AAEhE,OAAO,eAAeC,oCACpBC,aAAoC;IAEpC,OAAOC,QAAQC,GAAG,CAChBF,cAAcG,GAAG,CAAC,OAAOC,eAAkB,CAAA;YACzCC,gBAAgB,MAAMP,sBAAsBM,aAAaE,EAAE;YAC3DF;QACF,CAAA;AAEJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { getOrganizationGrants } from '../../services/organizations.js';
|
|
3
|
+
const debug = subdebug('organizations');
|
|
4
|
+
export async function hasProjectAttachGrant(orgId) {
|
|
5
|
+
const requiredGrantGroup = 'sanity.organization.projects';
|
|
6
|
+
const requiredGrant = 'attach';
|
|
7
|
+
try {
|
|
8
|
+
const grants = await getOrganizationGrants(orgId);
|
|
9
|
+
const group = grants[requiredGrantGroup] || [];
|
|
10
|
+
return group.some((resource)=>resource.grants && resource.grants.some((grant)=>grant.name === requiredGrant));
|
|
11
|
+
} catch (err) {
|
|
12
|
+
// If we get a 401, it means we don't have access to this organization
|
|
13
|
+
// probably because of implicit membership
|
|
14
|
+
if ('statusCode' in err && err.statusCode === 401) {
|
|
15
|
+
debug('No access to organization %s (401)', orgId);
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
// For other errors, log them but still return false
|
|
19
|
+
debug('Error checking grants for organization %s: %s', orgId, err.message);
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=hasProjectAttachGrant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/hasProjectAttachGrant.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\n\nimport {getOrganizationGrants} from '../../services/organizations.js'\n\nconst debug = subdebug('organizations')\n\nexport async function hasProjectAttachGrant(orgId: string) {\n const requiredGrantGroup = 'sanity.organization.projects'\n const requiredGrant = 'attach'\n\n try {\n const grants = await getOrganizationGrants(orgId)\n const group: {grants: {name: string}[]}[] = grants[requiredGrantGroup] || []\n return group.some(\n (resource) =>\n resource.grants && resource.grants.some((grant) => grant.name === requiredGrant),\n )\n } catch (err) {\n // If we get a 401, it means we don't have access to this organization\n // probably because of implicit membership\n if ('statusCode' in err && err.statusCode === 401) {\n debug('No access to organization %s (401)', orgId)\n return false\n }\n // For other errors, log them but still return false\n debug('Error checking grants for organization %s: %s', orgId, err.message)\n return false\n }\n}\n"],"names":["subdebug","getOrganizationGrants","debug","hasProjectAttachGrant","orgId","requiredGrantGroup","requiredGrant","grants","group","some","resource","grant","name","err","statusCode","message"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AAEzC,SAAQC,qBAAqB,QAAO,kCAAiC;AAErE,MAAMC,QAAQF,SAAS;AAEvB,OAAO,eAAeG,sBAAsBC,KAAa;IACvD,MAAMC,qBAAqB;IAC3B,MAAMC,gBAAgB;IAEtB,IAAI;QACF,MAAMC,SAAS,MAAMN,sBAAsBG;QAC3C,MAAMI,QAAsCD,MAAM,CAACF,mBAAmB,IAAI,EAAE;QAC5E,OAAOG,MAAMC,IAAI,CACf,CAACC,WACCA,SAASH,MAAM,IAAIG,SAASH,MAAM,CAACE,IAAI,CAAC,CAACE,QAAUA,MAAMC,IAAI,KAAKN;IAExE,EAAE,OAAOO,KAAK;QACZ,sEAAsE;QACtE,0CAA0C;QAC1C,IAAI,gBAAgBA,OAAOA,IAAIC,UAAU,KAAK,KAAK;YACjDZ,MAAM,sCAAsCE;YAC5C,OAAO;QACT;QACA,oDAAoD;QACpDF,MAAM,iDAAiDE,OAAOS,IAAIE,OAAO;QACzE,OAAO;IACT;AACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function validateOrganizationName(input) {
|
|
2
|
+
if (!input || input.trim() === '') {
|
|
3
|
+
return 'Organization name cannot be empty';
|
|
4
|
+
} else if (input.length > 100) {
|
|
5
|
+
return 'Organization name cannot be longer than 100 characters';
|
|
6
|
+
}
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=validateOrganizationName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/validateOrganizationName.ts"],"sourcesContent":["export function validateOrganizationName(input: string): string | true {\n if (!input || input.trim() === '') {\n return 'Organization name cannot be empty'\n } else if (input.length > 100) {\n return 'Organization name cannot be longer than 100 characters'\n }\n return true\n}\n"],"names":["validateOrganizationName","input","trim","length"],"mappings":"AAAA,OAAO,SAASA,yBAAyBC,KAAa;IACpD,IAAI,CAACA,SAASA,MAAMC,IAAI,OAAO,IAAI;QACjC,OAAO;IACT,OAAO,IAAID,MAAME,MAAM,GAAG,KAAK;QAC7B,OAAO;IACT;IACA,OAAO;AACT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getSharedServerConfig } from '../../util/getSharedServerConfig.js';
|
|
2
|
+
export function getPreviewServerConfig(options) {
|
|
3
|
+
const { cliConfig, flags, rootDir, workDir } = options;
|
|
4
|
+
const baseConfig = getSharedServerConfig({
|
|
5
|
+
cliConfig,
|
|
6
|
+
flags,
|
|
7
|
+
workDir
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
...baseConfig,
|
|
11
|
+
root: rootDir,
|
|
12
|
+
workDir
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=getPreviewServerConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/preview/getPreviewServerConfig.ts"],"sourcesContent":["import {type CliConfig} from '@sanity/cli-core'\n\nimport {\n getSharedServerConfig,\n type GetSharedServerConfigResult,\n} from '../../util/getSharedServerConfig.js'\nimport {type PreviewFlags} from './types.js'\n\ninterface GetPreviewServerConfigOptions {\n flags: PreviewFlags\n rootDir: string\n workDir: string\n\n cliConfig?: CliConfig\n}\n\ninterface GetPreviewServerConfigResult extends GetSharedServerConfigResult {\n root: string\n workDir: string\n}\n\nexport function getPreviewServerConfig(\n options: GetPreviewServerConfigOptions,\n): GetPreviewServerConfigResult {\n const {cliConfig, flags, rootDir, workDir} = options\n const baseConfig = getSharedServerConfig({cliConfig, flags, workDir})\n\n return {\n ...baseConfig,\n root: rootDir,\n workDir,\n }\n}\n"],"names":["getSharedServerConfig","getPreviewServerConfig","options","cliConfig","flags","rootDir","workDir","baseConfig","root"],"mappings":"AAEA,SACEA,qBAAqB,QAEhB,sCAAqC;AAgB5C,OAAO,SAASC,uBACdC,OAAsC;IAEtC,MAAM,EAACC,SAAS,EAAEC,KAAK,EAAEC,OAAO,EAAEC,OAAO,EAAC,GAAGJ;IAC7C,MAAMK,aAAaP,sBAAsB;QAACG;QAAWC;QAAOE;IAAO;IAEnE,OAAO;QACL,GAAGC,UAAU;QACbC,MAAMH;QACNC;IACF;AACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { gracefulServerDeath } from '../../server/gracefulServerDeath.js';
|
|
2
|
+
import { startPreviewServer } from '../../server/previewServer.js';
|
|
3
|
+
import { getPreviewServerConfig } from './getPreviewServerConfig.js';
|
|
4
|
+
export async function previewAction(options) {
|
|
5
|
+
const { cliConfig, flags, outDir, workDir } = options;
|
|
6
|
+
const config = getPreviewServerConfig({
|
|
7
|
+
cliConfig,
|
|
8
|
+
flags,
|
|
9
|
+
rootDir: outDir,
|
|
10
|
+
workDir
|
|
11
|
+
});
|
|
12
|
+
try {
|
|
13
|
+
const server = await startPreviewServer(config);
|
|
14
|
+
return server;
|
|
15
|
+
} catch (err) {
|
|
16
|
+
throw gracefulServerDeath('preview', config.httpHost, config.httpPort, err);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=previewAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/preview/previewAction.ts"],"sourcesContent":["import {type CliConfig} from '@sanity/cli-core'\n\nimport {gracefulServerDeath} from '../../server/gracefulServerDeath.js'\nimport {startPreviewServer} from '../../server/previewServer.js'\nimport {getPreviewServerConfig} from './getPreviewServerConfig.js'\nimport {type PreviewFlags} from './types.js'\n\ninterface PreviewActionOptions {\n cliConfig: CliConfig\n flags: PreviewFlags\n outDir: string\n workDir: string\n}\n\nexport async function previewAction(options: PreviewActionOptions) {\n const {cliConfig, flags, outDir, workDir} = options\n\n const config = getPreviewServerConfig({cliConfig, flags, rootDir: outDir, workDir})\n\n try {\n const server = await startPreviewServer(config)\n return server\n } catch (err) {\n throw gracefulServerDeath('preview', config.httpHost, config.httpPort, err)\n }\n}\n"],"names":["gracefulServerDeath","startPreviewServer","getPreviewServerConfig","previewAction","options","cliConfig","flags","outDir","workDir","config","rootDir","server","err","httpHost","httpPort"],"mappings":"AAEA,SAAQA,mBAAmB,QAAO,sCAAqC;AACvE,SAAQC,kBAAkB,QAAO,gCAA+B;AAChE,SAAQC,sBAAsB,QAAO,8BAA6B;AAUlE,OAAO,eAAeC,cAAcC,OAA6B;IAC/D,MAAM,EAACC,SAAS,EAAEC,KAAK,EAAEC,MAAM,EAAEC,OAAO,EAAC,GAAGJ;IAE5C,MAAMK,SAASP,uBAAuB;QAACG;QAAWC;QAAOI,SAASH;QAAQC;IAAO;IAEjF,IAAI;QACF,MAAMG,SAAS,MAAMV,mBAAmBQ;QACxC,OAAOE;IACT,EAAE,OAAOC,KAAK;QACZ,MAAMZ,oBAAoB,WAAWS,OAAOI,QAAQ,EAAEJ,OAAOK,QAAQ,EAAEF;IACzE;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/preview/types.ts"],"sourcesContent":["import {type PreviewCommand} from '../../commands/preview.js'\n\nexport type PreviewFlags = PreviewCommand['flags']\n"],"names":[],"mappings":"AAEA,WAAkD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/projects/getManageUrl.ts"],"sourcesContent":["import {getSanityUrl} from '@sanity/cli-core'\n\nexport function getManageUrl(projectId: string | undefined): string {\n const sanityUrl = getSanityUrl()\n return projectId ? `${sanityUrl}/manage/project/${projectId}` : `${sanityUrl}/manage/`\n}\n"],"names":["getSanityUrl","getManageUrl","projectId","sanityUrl"],"mappings":"AAAA,SAAQA,YAAY,QAAO,mBAAkB;AAE7C,OAAO,SAASC,aAAaC,SAA6B;IACxD,MAAMC,YAAYH;IAClB,OAAOE,YAAY,GAAGC,UAAU,gBAAgB,EAAED,WAAW,GAAG,GAAGC,UAAU,QAAQ,CAAC;AACxF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function validateProjectName(input) {
|
|
2
|
+
if (!input || input.trim() === '') {
|
|
3
|
+
return 'Project name cannot be empty';
|
|
4
|
+
}
|
|
5
|
+
if (input.length > 80) {
|
|
6
|
+
return 'Project name cannot be longer than 80 characters';
|
|
7
|
+
}
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=validateProjectName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/projects/validateProjectName.ts"],"sourcesContent":["export function validateProjectName(input: string): string | true {\n if (!input || input.trim() === '') {\n return 'Project name cannot be empty'\n }\n if (input.length > 80) {\n return 'Project name cannot be longer than 80 characters'\n }\n return true\n}\n"],"names":["validateProjectName","input","trim","length"],"mappings":"AAAA,OAAO,SAASA,oBAAoBC,KAAa;IAC/C,IAAI,CAACA,SAASA,MAAMC,IAAI,OAAO,IAAI;QACjC,OAAO;IACT;IACA,IAAID,MAAME,MAAM,GAAG,IAAI;QACrB,OAAO;IACT;IACA,OAAO;AACT"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { styleText } from 'node:util';
|
|
2
|
+
import { deleteSchema } from '../../services/schemas.js';
|
|
3
|
+
import { isDefined } from '../manifest/schemaTypeHelpers.js';
|
|
4
|
+
import { ensureManifestExtractSatisfied } from './utils/manifestExtractor.js';
|
|
5
|
+
import { createManifestReader } from './utils/manifestReader.js';
|
|
6
|
+
import { getDatasetsOutString, getStringList } from './utils/schemaStoreOutStrings.js';
|
|
7
|
+
import { filterLogReadProjectIdMismatch } from './utils/schemaStoreValidation.js';
|
|
8
|
+
// Native implementation instead of lodash/uniq
|
|
9
|
+
function uniq(array) {
|
|
10
|
+
return [
|
|
11
|
+
...new Set(array)
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
class DeleteIdError extends Error {
|
|
15
|
+
dataset;
|
|
16
|
+
id;
|
|
17
|
+
constructor(id, dataset, options){
|
|
18
|
+
super(options?.cause?.message, options);
|
|
19
|
+
this.name = 'DeleteIdError';
|
|
20
|
+
this.id = id;
|
|
21
|
+
this.dataset = dataset;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Deletes all stored schemas matching --ids in workspace datasets.
|
|
26
|
+
*
|
|
27
|
+
* Workspaces are determined by on-disk manifest file – not directly from sanity.config.
|
|
28
|
+
* All schema store actions require a manifest to exist, so we regenerate it by default.
|
|
29
|
+
* Manifest generation can be optionally disabled with --no-manifest-extract.
|
|
30
|
+
* In this case the command uses and existing file or throws when missing.
|
|
31
|
+
*/ export async function deleteSchemaAction(options) {
|
|
32
|
+
const { dataset, extractManifest, ids, manifestDir, output, projectId, verbose, workDir } = options;
|
|
33
|
+
if (!await ensureManifestExtractSatisfied({
|
|
34
|
+
extractManifest,
|
|
35
|
+
manifestDir,
|
|
36
|
+
output,
|
|
37
|
+
schemaRequired: true,
|
|
38
|
+
workDir
|
|
39
|
+
})) {
|
|
40
|
+
return 'failure';
|
|
41
|
+
}
|
|
42
|
+
const manifest = await createManifestReader({
|
|
43
|
+
manifestDir,
|
|
44
|
+
output,
|
|
45
|
+
workDir
|
|
46
|
+
}).getManifest();
|
|
47
|
+
const workspaces = manifest.workspaces.filter((workspace)=>!dataset || workspace.dataset === dataset).filter((workspace)=>filterLogReadProjectIdMismatch(workspace, projectId, output));
|
|
48
|
+
const datasets = uniq(workspaces.map((w)=>w.dataset));
|
|
49
|
+
const results = await Promise.allSettled(datasets.flatMap((targetDataset)=>{
|
|
50
|
+
return ids.map(async ({ schemaId })=>{
|
|
51
|
+
try {
|
|
52
|
+
const deletedSchema = await deleteSchema(targetDataset, projectId, schemaId);
|
|
53
|
+
return {
|
|
54
|
+
dataset: targetDataset,
|
|
55
|
+
deleted: deletedSchema.deleted,
|
|
56
|
+
schemaId
|
|
57
|
+
};
|
|
58
|
+
} catch (err) {
|
|
59
|
+
throw new DeleteIdError(schemaId, targetDataset, {
|
|
60
|
+
cause: err
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}));
|
|
65
|
+
const deletedIds = results.filter((r)=>r.status === 'fulfilled').filter((r)=>r.value.deleted).map((r)=>r.value);
|
|
66
|
+
const notFound = uniq(results.filter((r)=>r.status === 'fulfilled').filter((r)=>!r.value.deleted).filter((r)=>!deletedIds.map(({ schemaId })=>schemaId).includes(r.value.schemaId)).map((r)=>r.value.schemaId));
|
|
67
|
+
const deleteFailureIds = uniq(results.filter((r)=>r.status === 'rejected').map((result)=>{
|
|
68
|
+
const error = result.reason;
|
|
69
|
+
if (error instanceof DeleteIdError) {
|
|
70
|
+
output.warn(styleText('red', [
|
|
71
|
+
`Failed to delete schema "${error.id}" in dataset "${error.dataset}":`,
|
|
72
|
+
error.message
|
|
73
|
+
].join('\n')));
|
|
74
|
+
if (verbose) output.warn(error);
|
|
75
|
+
return error.id;
|
|
76
|
+
}
|
|
77
|
+
//hubris inc: given the try-catch wrapping the full promise "this should never happen"
|
|
78
|
+
throw error;
|
|
79
|
+
}));
|
|
80
|
+
// Compare unique schema IDs deleted vs requested (not total deletions across datasets)
|
|
81
|
+
const uniqueDeletedSchemaIds = uniq(deletedIds.map(({ schemaId })=>schemaId));
|
|
82
|
+
const success = uniqueDeletedSchemaIds.length === ids.length;
|
|
83
|
+
if (success) {
|
|
84
|
+
output.log(`Successfully deleted ${uniqueDeletedSchemaIds.length}/${ids.length} schemas`);
|
|
85
|
+
} else {
|
|
86
|
+
output.error([
|
|
87
|
+
`Deleted ${uniqueDeletedSchemaIds.length}/${ids.length} schemas.`,
|
|
88
|
+
deletedIds.length > 0 ? `Successfully deleted ids:\n${deletedIds.map(({ dataset: targetDataset, schemaId })=>`- "${schemaId}" (in ${getDatasetsOutString([
|
|
89
|
+
targetDataset
|
|
90
|
+
])})`).join('\n')}` : undefined,
|
|
91
|
+
notFound.length > 0 ? `Ids not found in ${getDatasetsOutString(datasets)}:\n${getStringList(notFound)}` : undefined,
|
|
92
|
+
...deleteFailureIds.length > 0 ? [
|
|
93
|
+
`Failed to delete ids:\n${getStringList(deleteFailureIds)}`,
|
|
94
|
+
'Check logs for errors.'
|
|
95
|
+
] : []
|
|
96
|
+
].filter((item)=>isDefined(item)).join('\n'));
|
|
97
|
+
}
|
|
98
|
+
return success ? 'success' : 'failure';
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=deleteSchemaAction.js.map
|