@sanity/cli 6.0.0-alpha.9 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +602 -258
- package/bin/run.js +2 -0
- package/dist/SanityHelp.js +51 -23
- package/dist/SanityHelp.js.map +1 -1
- package/dist/actions/auth/authServer.js +28 -22
- package/dist/actions/auth/authServer.js.map +1 -1
- package/dist/actions/auth/login/getProvider.js +49 -38
- package/dist/actions/auth/login/getProvider.js.map +1 -1
- package/dist/actions/auth/login/getSSOProvider.js +25 -19
- package/dist/actions/auth/login/getSSOProvider.js.map +1 -1
- package/dist/actions/auth/login/login.js +12 -33
- package/dist/actions/auth/login/login.js.map +1 -1
- package/dist/actions/auth/types.js.map +1 -1
- package/dist/actions/backup/downloadAsset.js +9 -9
- package/dist/actions/backup/downloadAsset.js.map +1 -1
- package/dist/actions/backup/downloadDocument.js +8 -8
- package/dist/actions/backup/downloadDocument.js.map +1 -1
- package/dist/actions/build/buildApp.js +55 -18
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStaticFiles.js +3 -2
- package/dist/actions/build/buildStaticFiles.js.map +1 -1
- package/dist/actions/build/buildStudio.js +72 -44
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/actions/build/buildVendorDependencies.js +18 -52
- package/dist/actions/build/buildVendorDependencies.js.map +1 -1
- package/dist/actions/build/checkRequiredDependencies.js +13 -8
- package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
- package/dist/actions/build/checkStudioDependencyVersions.js +19 -17
- package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
- package/dist/actions/build/createExternalFromImportMap.js +1 -1
- package/dist/actions/build/createExternalFromImportMap.js.map +1 -1
- package/dist/actions/build/determineBasePath.js +5 -2
- package/dist/actions/build/determineBasePath.js.map +1 -1
- package/dist/actions/build/getViteConfig.js +47 -4
- package/dist/actions/build/getViteConfig.js.map +1 -1
- package/dist/actions/build/handlePrereleaseVersions.js +44 -0
- package/dist/actions/build/handlePrereleaseVersions.js.map +1 -0
- package/dist/actions/build/renderDocument.js +6 -10
- package/dist/actions/build/renderDocument.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js +4 -4
- package/dist/actions/build/renderDocumentWorker/components/BasicDocument.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js +3 -3
- package/dist/actions/build/renderDocumentWorker/components/DefaultDocument.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js +1 -0
- package/dist/actions/build/renderDocumentWorker/components/GlobalErrorHandler.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js +2 -2
- package/dist/actions/build/renderDocumentWorker/getDocumentComponent.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +1 -1
- package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +1 -1
- package/dist/actions/build/shouldAutoUpdate.js +2 -0
- package/dist/actions/build/shouldAutoUpdate.js.map +1 -1
- package/dist/actions/build/types.js.map +1 -1
- package/dist/actions/build/writeFavicons.js +3 -5
- package/dist/actions/build/writeFavicons.js.map +1 -1
- package/dist/actions/build/writeSanityRuntime.js +4 -3
- package/dist/actions/build/writeSanityRuntime.js.map +1 -1
- package/dist/actions/codemods/reactIconsV3.js +2 -2
- package/dist/actions/codemods/reactIconsV3.js.map +1 -1
- package/dist/actions/dataset/create.js +7 -1
- package/dist/actions/dataset/create.js.map +1 -1
- package/dist/actions/dataset/determineDatasetAclMode.js.map +1 -1
- package/dist/actions/dataset/resolveDataset.js +26 -0
- package/dist/actions/dataset/resolveDataset.js.map +1 -0
- package/dist/actions/debug/formatters.js +22 -0
- package/dist/actions/debug/formatters.js.map +1 -0
- package/dist/actions/deploy/createStudioUserApplication.js +17 -4
- package/dist/actions/deploy/createStudioUserApplication.js.map +1 -1
- package/dist/actions/deploy/deployApp.js +41 -15
- package/dist/actions/deploy/deployApp.js.map +1 -1
- package/dist/actions/deploy/deployStudio.js +92 -44
- package/dist/actions/deploy/deployStudio.js.map +1 -1
- package/dist/actions/deploy/deployStudioSchemasAndManifests.js +55 -0
- package/dist/actions/deploy/deployStudioSchemasAndManifests.js.map +1 -0
- package/dist/actions/deploy/deployStudioSchemasAndManifests.worker.js +120 -0
- package/dist/actions/deploy/deployStudioSchemasAndManifests.worker.js.map +1 -0
- package/dist/actions/deploy/findUserApplicationForStudio.js +35 -12
- package/dist/actions/deploy/findUserApplicationForStudio.js.map +1 -1
- package/dist/actions/deploy/types.js +10 -1
- package/dist/actions/deploy/types.js.map +1 -1
- package/dist/actions/deploy/urlUtils.js +21 -0
- package/dist/actions/deploy/urlUtils.js.map +1 -0
- package/dist/actions/dev/getDashboardAppUrl.js +48 -0
- package/dist/actions/dev/getDashboardAppUrl.js.map +1 -0
- package/dist/actions/dev/getDevServerConfig.js +7 -3
- package/dist/actions/dev/getDevServerConfig.js.map +1 -1
- package/dist/actions/dev/startAppDevServer.js +3 -3
- package/dist/actions/dev/startAppDevServer.js.map +1 -1
- package/dist/actions/dev/startStudioDevServer.js +14 -14
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/doctor/checks/cliInstallation.js +56 -0
- package/dist/actions/doctor/checks/cliInstallation.js.map +1 -0
- package/dist/actions/doctor/checks/index.js +16 -0
- package/dist/actions/doctor/checks/index.js.map +1 -0
- package/dist/actions/doctor/runDoctorChecks.js +56 -0
- package/dist/actions/doctor/runDoctorChecks.js.map +1 -0
- package/dist/actions/doctor/types.js +3 -0
- package/dist/actions/doctor/types.js.map +1 -0
- package/dist/actions/documents/types.js.map +1 -1
- package/dist/actions/documents/validate.js +11 -2
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/documents/validateDocuments.worker.js +4 -4
- package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
- package/dist/actions/documents/validation/reporters/jsonReporter.js +1 -1
- package/dist/actions/documents/validation/reporters/jsonReporter.js.map +1 -1
- package/dist/actions/documents/validation/reporters/ndjsonReporter.js +1 -1
- package/dist/actions/documents/validation/reporters/ndjsonReporter.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js +108 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js.map +1 -0
- package/dist/actions/graphql/SchemaError.js +4 -26
- package/dist/actions/graphql/SchemaError.js.map +1 -1
- package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js +540 -0
- package/dist/actions/graphql/__tests__/fixtures/many-self-refs.js.map +1 -0
- package/dist/actions/graphql/__tests__/fixtures/test-studio.js +1143 -0
- package/dist/actions/graphql/__tests__/fixtures/test-studio.js.map +1 -0
- package/dist/actions/graphql/__tests__/fixtures/union-refs.js +591 -0
- package/dist/actions/graphql/__tests__/fixtures/union-refs.js.map +1 -0
- package/dist/actions/graphql/__tests__/helpers.js +23 -0
- package/dist/actions/graphql/__tests__/helpers.js.map +1 -0
- package/dist/actions/graphql/extractFromSanitySchema.js +5 -5
- package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
- package/dist/actions/graphql/extractGraphQLAPIs.js +150 -0
- package/dist/actions/graphql/extractGraphQLAPIs.js.map +1 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js +12 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js.map +1 -0
- package/dist/actions/graphql/gen1/generateTypeFilters.js +1 -1
- package/dist/actions/graphql/gen1/generateTypeFilters.js.map +1 -1
- package/dist/actions/graphql/gen1/generateTypeQueries.js +2 -1
- package/dist/actions/graphql/gen1/generateTypeQueries.js.map +1 -1
- package/dist/actions/graphql/gen1/index.js +5 -5
- package/dist/actions/graphql/gen1/index.js.map +1 -1
- package/dist/actions/graphql/gen2/generateTypeQueries.js +1 -1
- package/dist/actions/graphql/gen2/generateTypeQueries.js.map +1 -1
- package/dist/actions/graphql/gen2/index.js +6 -6
- package/dist/actions/graphql/gen2/index.js.map +1 -1
- package/dist/actions/graphql/gen3/generateTypeQueries.js +3 -4
- package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
- package/dist/actions/graphql/gen3/index.js +6 -7
- package/dist/actions/graphql/gen3/index.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +15 -57
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.worker.js +75 -106
- package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
- package/dist/actions/graphql/helpers.js +13 -0
- package/dist/actions/graphql/helpers.js.map +1 -1
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js +187 -0
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -0
- package/dist/actions/graphql/types.js +1 -1
- package/dist/actions/graphql/types.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.js +10 -8
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/bootstrapRemoteTemplate.js +6 -5
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -1
- package/dist/actions/init/bootstrapTemplate.js.map +1 -1
- package/dist/actions/init/checkNextJsReactCompatibility.js +1 -1
- package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
- package/dist/actions/init/createAppCliConfig.js.map +1 -1
- package/dist/actions/init/createCliConfig.js.map +1 -1
- package/dist/actions/init/createPackageManifest.js +21 -9
- package/dist/actions/init/createPackageManifest.js.map +1 -1
- package/dist/actions/init/remoteTemplate.js +1 -2
- package/dist/actions/init/remoteTemplate.js.map +1 -1
- package/dist/actions/init/sdkAppDependencies.js +19 -0
- package/dist/actions/init/sdkAppDependencies.js.map +1 -0
- package/dist/actions/init/studioDependencies.js.map +1 -0
- package/dist/actions/init/templates/appQuickstart.js +1 -22
- package/dist/actions/init/templates/appQuickstart.js.map +1 -1
- package/dist/actions/init/templates/appSanityUi.js +3 -22
- package/dist/actions/init/templates/appSanityUi.js.map +1 -1
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/manifest/SchemaIcon.js +6 -4
- package/dist/actions/manifest/SchemaIcon.js.map +1 -1
- package/dist/actions/manifest/blockTypeTransformer.js +67 -0
- package/dist/actions/manifest/blockTypeTransformer.js.map +1 -0
- package/dist/actions/manifest/debug.js +4 -0
- package/dist/actions/manifest/debug.js.map +1 -0
- package/dist/actions/manifest/extractAppManifest.js +39 -22
- package/dist/actions/manifest/extractAppManifest.js.map +1 -1
- package/dist/actions/manifest/extractManifest.js +27 -78
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/manifest/extractManifest.worker.js +30 -0
- package/dist/actions/manifest/extractManifest.worker.js.map +1 -0
- package/dist/actions/manifest/extractWorkspaceManifest.js +31 -372
- package/dist/actions/manifest/extractWorkspaceManifest.js.map +1 -1
- package/dist/actions/manifest/iconResolver.js +30 -0
- package/dist/actions/manifest/iconResolver.js.map +1 -0
- package/dist/actions/manifest/referenceTransformer.js +51 -0
- package/dist/actions/manifest/referenceTransformer.js.map +1 -0
- package/dist/actions/manifest/schemaTypeHelpers.js +2 -2
- package/dist/actions/manifest/schemaTypeHelpers.js.map +1 -1
- package/dist/actions/manifest/schemaTypeTransformer.js +168 -0
- package/dist/actions/manifest/schemaTypeTransformer.js.map +1 -0
- package/dist/actions/manifest/transformerUtils.js +40 -0
- package/dist/actions/manifest/transformerUtils.js.map +1 -0
- package/dist/actions/manifest/types.js +5 -0
- package/dist/actions/manifest/types.js.map +1 -1
- package/dist/actions/manifest/validationTransformer.js +84 -0
- package/dist/actions/manifest/validationTransformer.js.map +1 -0
- package/dist/actions/manifest/writeManifestFile.js +30 -0
- package/dist/actions/manifest/writeManifestFile.js.map +1 -0
- package/dist/actions/manifest/writeWorkspaceFiles.js +30 -0
- package/dist/actions/manifest/writeWorkspaceFiles.js.map +1 -0
- package/dist/actions/mcp/detectAvailableEditors.js +16 -4
- package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
- package/dist/actions/mcp/editorConfigs.js +64 -6
- package/dist/actions/mcp/editorConfigs.js.map +1 -1
- package/dist/actions/mcp/setupMCP.js.map +1 -1
- package/dist/actions/mcp/writeMCPConfig.js +27 -15
- package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
- package/dist/actions/media/buildNdjsonIndex.js +32 -0
- package/dist/actions/media/buildNdjsonIndex.js.map +1 -0
- package/dist/actions/media/importAspects.js +2 -11
- package/dist/actions/media/importAspects.js.map +1 -1
- package/dist/actions/media/importMedia.js +22 -18
- package/dist/actions/media/importMedia.js.map +1 -1
- package/dist/actions/organizations/findOrganizationByUserName.js +5 -0
- package/dist/actions/organizations/findOrganizationByUserName.js.map +1 -0
- package/dist/actions/organizations/getOrganization.js +3 -2
- package/dist/actions/organizations/getOrganization.js.map +1 -1
- package/dist/actions/organizations/getOrganizationChoices.js +27 -19
- package/dist/actions/organizations/getOrganizationChoices.js.map +1 -1
- package/dist/actions/organizations/types.js +3 -0
- package/dist/actions/organizations/types.js.map +1 -0
- package/dist/actions/projects/getManageUrl.js +1 -2
- package/dist/actions/projects/getManageUrl.js.map +1 -1
- package/dist/actions/schema/deleteSchemaAction.js +14 -30
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
- package/dist/actions/schema/deploySchemas.js +22 -91
- package/dist/actions/schema/deploySchemas.js.map +1 -1
- package/dist/actions/schema/extractSanitySchema.worker.js +0 -5
- package/dist/actions/schema/extractSanitySchema.worker.js.map +1 -1
- package/dist/actions/schema/extractSanityWorkspace.worker.js +24 -0
- package/dist/actions/schema/extractSanityWorkspace.worker.js.map +1 -0
- package/dist/actions/schema/extractSchema.js +8 -40
- package/dist/actions/schema/extractSchema.js.map +1 -1
- package/dist/actions/schema/extractSchemaWatcher.js +128 -0
- package/dist/actions/schema/extractSchemaWatcher.js.map +1 -0
- package/dist/actions/schema/formatSchemaValidation.js +5 -1
- package/dist/actions/schema/formatSchemaValidation.js.map +1 -1
- package/dist/actions/schema/getExtractOptions.js +16 -0
- package/dist/actions/schema/getExtractOptions.js.map +1 -0
- package/dist/actions/schema/listSchemas.js +53 -56
- package/dist/actions/schema/listSchemas.js.map +1 -1
- package/dist/actions/schema/matchSchemaPattern.js +22 -0
- package/dist/actions/schema/matchSchemaPattern.js.map +1 -0
- package/dist/actions/schema/runSchemaExtraction.js +39 -0
- package/dist/actions/schema/runSchemaExtraction.js.map +1 -0
- package/dist/actions/schema/types.js +8 -0
- package/dist/actions/schema/types.js.map +1 -1
- package/dist/actions/schema/uniqueWorkspaces.worker.js +24 -0
- package/dist/actions/schema/uniqueWorkspaces.worker.js.map +1 -0
- package/dist/actions/schema/updateWorkspaceSchema.js +63 -0
- package/dist/actions/schema/updateWorkspaceSchema.js.map +1 -0
- package/dist/actions/schema/uploadSchemaToLexicon.js +87 -0
- package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -0
- package/dist/actions/schema/utils/SchemaExtractionError.js +10 -0
- package/dist/actions/schema/utils/SchemaExtractionError.js.map +1 -0
- package/dist/actions/schema/utils/schemaStoreValidation.js +1 -15
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -1
- package/dist/actions/schema/validateSchema.worker.js +1 -8
- package/dist/actions/schema/validateSchema.worker.js.map +1 -1
- package/dist/actions/schema/watchExtractSchema.js +72 -0
- package/dist/actions/schema/watchExtractSchema.js.map +1 -0
- package/dist/actions/telemetry/isTrueish.js +10 -0
- package/dist/actions/telemetry/isTrueish.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.js +2 -1
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.js +2 -1
- package/dist/actions/telemetry/setConsent.js.map +1 -1
- package/dist/actions/users/getMembersForProject.js.map +1 -1
- package/dist/actions/users/getPendingInvitations.js +1 -1
- package/dist/actions/users/getPendingInvitations.js.map +1 -1
- package/dist/actions/users/types.js.map +1 -1
- package/dist/actions/versions/filterSanityModules.js.map +1 -1
- package/dist/actions/versions/findSanityModulesVersions.js +2 -3
- package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
- package/dist/actions/versions/getFormatters.js +1 -1
- package/dist/actions/versions/getFormatters.js.map +1 -1
- package/dist/actions/versions/tryFindLatestVersion.js +1 -1
- package/dist/actions/versions/tryFindLatestVersion.js.map +1 -1
- package/dist/commands/backup/disable.js +22 -7
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/download.js +19 -10
- package/dist/commands/backup/download.js.map +1 -1
- package/dist/commands/backup/enable.js +22 -7
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +20 -8
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/build.js +2 -5
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/cors/add.js +20 -7
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +22 -7
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +22 -7
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/alias/create.js +26 -7
- package/dist/commands/dataset/alias/create.js.map +1 -1
- package/dist/commands/dataset/alias/delete.js +20 -7
- package/dist/commands/dataset/alias/delete.js.map +1 -1
- package/dist/commands/dataset/alias/link.js +20 -7
- package/dist/commands/dataset/alias/link.js.map +1 -1
- package/dist/commands/dataset/alias/unlink.js +20 -7
- package/dist/commands/dataset/alias/unlink.js.map +1 -1
- package/dist/commands/dataset/copy.js +45 -30
- package/dist/commands/dataset/copy.js.map +1 -1
- package/dist/commands/dataset/create.js +32 -7
- package/dist/commands/dataset/create.js.map +1 -1
- package/dist/commands/dataset/delete.js +16 -7
- package/dist/commands/dataset/delete.js.map +1 -1
- package/dist/commands/dataset/embeddings/disable.js +77 -0
- package/dist/commands/dataset/embeddings/disable.js.map +1 -0
- package/dist/commands/dataset/embeddings/enable.js +141 -0
- package/dist/commands/dataset/embeddings/enable.js.map +1 -0
- package/dist/commands/dataset/embeddings/status.js +72 -0
- package/dist/commands/dataset/embeddings/status.js.map +1 -0
- package/dist/commands/dataset/export.js +25 -16
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/import.js +306 -1
- package/dist/commands/dataset/import.js.map +1 -1
- package/dist/commands/dataset/list.js +22 -7
- package/dist/commands/dataset/list.js.map +1 -1
- package/dist/commands/dataset/visibility/get.js +18 -7
- package/dist/commands/dataset/visibility/get.js.map +1 -1
- package/dist/commands/dataset/visibility/set.js +22 -7
- package/dist/commands/dataset/visibility/set.js.map +1 -1
- package/dist/commands/debug.js +4 -2
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/deploy.js +22 -11
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +2 -4
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +125 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/documents/create.js +19 -12
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +19 -12
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +17 -12
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +26 -18
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +32 -10
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/deploy.js +58 -30
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +15 -7
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +37 -19
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/attempt.js +22 -7
- package/dist/commands/hook/attempt.js.map +1 -1
- package/dist/commands/hook/create.js +23 -8
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +22 -7
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +22 -7
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/hook/logs.js +21 -8
- package/dist/commands/hook/logs.js.map +1 -1
- package/dist/commands/init.js +46 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +19 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +8 -6
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/manage.js +0 -1
- package/dist/commands/manage.js.map +1 -1
- package/dist/commands/manifest/extract.js +14 -10
- package/dist/commands/manifest/extract.js.map +1 -1
- package/dist/commands/mcp/configure.js +1 -1
- package/dist/commands/mcp/configure.js.map +1 -1
- package/dist/commands/media/create-aspect.js +4 -4
- package/dist/commands/media/create-aspect.js.map +1 -1
- package/dist/commands/media/delete-aspect.js +9 -7
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/deploy-aspect.js +22 -9
- package/dist/commands/media/deploy-aspect.js.map +1 -1
- package/dist/commands/media/export.js +9 -7
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +10 -8
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/preview.js +2 -4
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/projects/list.js +2 -1
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schema/delete.js +33 -34
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.js +19 -30
- package/dist/commands/schema/deploy.js.map +1 -1
- package/dist/commands/schema/extract.js +32 -4
- package/dist/commands/schema/extract.js.map +1 -1
- package/dist/commands/schema/list.js +10 -31
- package/dist/commands/schema/list.js.map +1 -1
- package/dist/commands/tokens/add.js +24 -7
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/tokens/delete.js +20 -7
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +20 -7
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +24 -7
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +76 -33
- package/dist/commands/users/list.js.map +1 -1
- package/dist/commands/versions.js +1 -1
- package/dist/commands/versions.js.map +1 -1
- package/dist/config/createCliConfig.js +1 -2
- package/dist/config/createCliConfig.js.map +1 -1
- package/dist/exports/_internal.d.ts +132 -0
- package/dist/exports/_internal.js +4 -0
- package/dist/exports/_internal.js.map +1 -0
- package/dist/exports/index.d.ts +113 -0
- package/dist/exports/index.js +6 -0
- package/dist/exports/index.js.map +1 -0
- package/dist/hooks/init/checkForUpdates.js +14 -0
- package/dist/hooks/init/checkForUpdates.js.map +1 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -1
- package/dist/hooks/prerun/injectEnvVariables.js +9 -1
- package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
- package/dist/hooks/prerun/setupTelemetry.js +9 -3
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/prompts/promptForProject.js +64 -0
- package/dist/prompts/promptForProject.js.map +1 -0
- package/dist/{actions/auth/login/promptProviders.js → prompts/promptForProviders.js} +3 -3
- package/dist/prompts/promptForProviders.js.map +1 -0
- package/dist/prompts/selectMediaLibrary.js +1 -1
- package/dist/prompts/selectMediaLibrary.js.map +1 -1
- package/dist/server/devServer.js +4 -2
- package/dist/server/devServer.js.map +1 -1
- package/dist/server/previewServer.js +2 -2
- package/dist/server/previewServer.js.map +1 -1
- package/dist/server/vite/plugin-schema-extraction.js +201 -0
- package/dist/server/vite/plugin-schema-extraction.js.map +1 -0
- package/dist/server/vite/plugin-typegen.js +217 -0
- package/dist/server/vite/plugin-typegen.js.map +1 -0
- package/dist/services/auth.js +42 -3
- package/dist/services/auth.js.map +1 -1
- package/dist/services/datasets.js +7 -5
- package/dist/services/datasets.js.map +1 -1
- package/dist/services/docs.js +2 -2
- package/dist/services/docs.js.map +1 -1
- package/dist/services/embeddings.js +25 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/getUrlHeaders.js +7 -18
- package/dist/services/getUrlHeaders.js.map +1 -1
- package/dist/services/grants.js +13 -0
- package/dist/services/grants.js.map +1 -0
- package/dist/services/graphql.js +1 -1
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/projects.js +4 -2
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.js +1 -1
- package/dist/services/schemas.js.map +1 -1
- package/dist/services/telemetry.js +2 -1
- package/dist/services/telemetry.js.map +1 -1
- package/dist/services/userApplications.js +21 -6
- package/dist/services/userApplications.js.map +1 -1
- package/dist/telemetry/extractSchema.telemetry.js +10 -0
- package/dist/telemetry/extractSchema.telemetry.js.map +1 -1
- package/dist/types/grants.js +3 -0
- package/dist/types/grants.js.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/util/checkProjectPermissions.js +21 -0
- package/dist/util/checkProjectPermissions.js.map +1 -0
- package/dist/util/cliClient.js +5 -3
- package/dist/util/cliClient.js.map +1 -1
- package/dist/util/compareDependencyVersions.js +74 -38
- package/dist/util/compareDependencyVersions.js.map +1 -1
- package/dist/util/createExpiringConfig.js +64 -0
- package/dist/util/createExpiringConfig.js.map +1 -0
- package/dist/util/detectFramework.js +135 -0
- package/dist/util/detectFramework.js.map +1 -0
- package/dist/util/errorMessages.js +0 -1
- package/dist/util/errorMessages.js.map +1 -1
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js +1 -2
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -1
- package/dist/util/getCliVersion.js +1 -1
- package/dist/util/getCliVersion.js.map +1 -1
- package/dist/util/getLocalPackageVersion.js +31 -23
- package/dist/util/getLocalPackageVersion.js.map +1 -1
- package/dist/util/getProjectDefaults.js.map +1 -1
- package/dist/util/getSharedServerConfig.js +1 -0
- package/dist/util/getSharedServerConfig.js.map +1 -1
- package/dist/util/getWorkspace.js +1 -1
- package/dist/util/getWorkspace.js.map +1 -1
- package/dist/util/isSchemaError.js +11 -0
- package/dist/util/isSchemaError.js.map +1 -0
- package/dist/util/isTar.js +8 -0
- package/dist/util/isTar.js.map +1 -0
- package/dist/util/packageManager/getPeerDependencies.js +44 -0
- package/dist/util/packageManager/getPeerDependencies.js.map +1 -0
- package/dist/util/packageManager/installationInfo/analyzeIssues.js +225 -0
- package/dist/util/packageManager/installationInfo/analyzeIssues.js.map +1 -0
- package/dist/util/packageManager/installationInfo/commands.js +73 -0
- package/dist/util/packageManager/installationInfo/commands.js.map +1 -0
- package/dist/util/packageManager/installationInfo/detectCliInstallation.js +66 -0
- package/dist/util/packageManager/installationInfo/detectCliInstallation.js.map +1 -0
- package/dist/util/packageManager/installationInfo/detectGlobals.js +295 -0
- package/dist/util/packageManager/installationInfo/detectGlobals.js.map +1 -0
- package/dist/util/packageManager/installationInfo/detectPackages.js +190 -0
- package/dist/util/packageManager/installationInfo/detectPackages.js.map +1 -0
- package/dist/util/packageManager/installationInfo/detectWorkspace.js +192 -0
- package/dist/util/packageManager/installationInfo/detectWorkspace.js.map +1 -0
- package/dist/util/packageManager/installationInfo/index.js +4 -0
- package/dist/util/packageManager/installationInfo/index.js.map +1 -0
- package/dist/util/packageManager/installationInfo/readJsonFile.js +14 -0
- package/dist/util/packageManager/installationInfo/readJsonFile.js.map +1 -0
- package/dist/util/packageManager/installationInfo/resolveVersionRange.js +42 -0
- package/dist/util/packageManager/installationInfo/resolveVersionRange.js.map +1 -0
- package/dist/util/packageManager/installationInfo/types.js +3 -0
- package/dist/util/packageManager/installationInfo/types.js.map +1 -0
- package/dist/util/packageManager/packageManagerChoice.js +1 -20
- package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
- package/dist/util/packageManager/upgradePackages.js +4 -1
- package/dist/util/packageManager/upgradePackages.js.map +1 -1
- package/dist/util/promiseRaceWithTimeout.js +28 -0
- package/dist/util/promiseRaceWithTimeout.js.map +1 -0
- package/dist/util/readdirRecursive.js.map +1 -1
- package/dist/util/resolveLatestVersions.js +2 -2
- package/dist/util/resolveLatestVersions.js.map +1 -1
- package/dist/util/sharedFlags.js +54 -0
- package/dist/util/sharedFlags.js.map +1 -0
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js +30 -0
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/createTelemetryStore.js +95 -0
- package/dist/util/telemetry/createTelemetryStore.js.map +1 -0
- package/dist/util/telemetry/createTraceId.js +10 -0
- package/dist/util/telemetry/createTraceId.js.map +1 -0
- package/dist/util/telemetry/findTelemetryFiles.js +35 -0
- package/dist/util/telemetry/findTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/flushTelemetryFiles.js +118 -0
- package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js +30 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js.map +1 -0
- package/dist/util/telemetry/logger.js +59 -0
- package/dist/util/telemetry/logger.js.map +1 -0
- package/dist/util/telemetry/readNDJSON.js +28 -0
- package/dist/util/telemetry/readNDJSON.js.map +1 -0
- package/dist/util/telemetry/telemetryStoreDebug.js +7 -0
- package/dist/util/telemetry/telemetryStoreDebug.js.map +1 -0
- package/dist/util/telemetry/trace.js +150 -0
- package/dist/util/telemetry/trace.js.map +1 -0
- package/dist/util/toForwardSlashes.js +8 -0
- package/dist/util/toForwardSlashes.js.map +1 -0
- package/dist/util/update/fetchLatestVersion.js +21 -0
- package/dist/util/update/fetchLatestVersion.js.map +1 -0
- package/dist/util/update/getUpdateCommand.js +20 -0
- package/dist/util/update/getUpdateCommand.js.map +1 -0
- package/dist/util/update/isInstalledUsingYarn.js +17 -0
- package/dist/util/update/isInstalledUsingYarn.js.map +1 -0
- package/dist/util/update/showNotificationUpdate.js +31 -0
- package/dist/util/update/showNotificationUpdate.js.map +1 -0
- package/dist/util/update/updateChecker.js +60 -0
- package/dist/util/update/updateChecker.js.map +1 -0
- package/dist/util/update/updateCheckerDebug.js +4 -0
- package/dist/util/update/updateCheckerDebug.js.map +1 -0
- package/oclif.config.js +1 -0
- package/oclif.manifest.json +900 -107
- package/package.json +72 -71
- package/static/favicons/apple-touch-icon.png +0 -0
- package/static/favicons/favicon-192.png +0 -0
- package/static/favicons/favicon-512.png +0 -0
- package/static/favicons/favicon-96.png +0 -0
- package/static/favicons/favicon.ico +0 -0
- package/static/favicons/favicon.svg +12 -0
- package/dist/actions/auth/login/promptProviders.js.map +0 -1
- package/dist/actions/dev/getCoreAppUrl.js +0 -10
- package/dist/actions/dev/getCoreAppUrl.js.map +0 -1
- package/dist/actions/schema/schemaStoreTypes.js +0 -19
- package/dist/actions/schema/schemaStoreTypes.js.map +0 -1
- package/dist/actions/schema/utils/manifestExtractor.js +0 -33
- package/dist/actions/schema/utils/manifestExtractor.js.map +0 -1
- package/dist/actions/schema/utils/manifestReader.js +0 -71
- package/dist/actions/schema/utils/manifestReader.js.map +0 -1
- package/dist/index.d.ts +0 -2326
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/studioDependencies.js.map +0 -1
- package/dist/typings/deepSortObject.d.js +0 -2
- package/dist/typings/deepSortObject.d.js.map +0 -1
- package/dist/util/findNdjsonEntry.js +0 -21
- package/dist/util/findNdjsonEntry.js.map +0 -1
- package/dist/util/importStudioConfig.js +0 -40
- package/dist/util/importStudioConfig.js.map +0 -1
- package/dist/util/readModuleVersion.js +0 -15
- package/dist/util/readModuleVersion.js.map +0 -1
- package/dist/util/readPackageJson.js +0 -44
- package/dist/util/readPackageJson.js.map +0 -1
- package/dist/util/readPackageManifest.js +0 -46
- package/dist/util/readPackageManifest.js.map +0 -1
- package/dist/util/uniqBy.js +0 -14
- package/dist/util/uniqBy.js.map +0 -1
- package/dist/util/workerChannels.js +0 -172
- package/dist/util/workerChannels.js.map +0 -1
- /package/dist/{studioDependencies.js → actions/init/studioDependencies.js} +0 -0
package/bin/run.js
CHANGED
|
@@ -21,9 +21,11 @@ function isSupportedNodeVersion(major, minor, patch) {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
if (!isSupportedNodeVersion(majorVersion, minorVersion, patchVersion)) {
|
|
24
|
+
// eslint-disable-next-line no-console
|
|
24
25
|
console.error(
|
|
25
26
|
`${err}Node.js version >=20.19.1 <22 or >=22.12 required. You are running ${process.version}`,
|
|
26
27
|
)
|
|
28
|
+
// eslint-disable-next-line no-console
|
|
27
29
|
console.error('')
|
|
28
30
|
process.exit(1)
|
|
29
31
|
}
|
package/dist/SanityHelp.js
CHANGED
|
@@ -1,42 +1,70 @@
|
|
|
1
1
|
import { Help } from '@oclif/core';
|
|
2
|
-
|
|
2
|
+
import { getBinCommand, getRunningPackageManager } from '@sanity/cli-core/package-manager';
|
|
3
|
+
// Running `oclif readme`, we don't want to apply the `prefixBinName` transformation,
|
|
4
|
+
// as it will include whatever pm was used to spawn the script in the generated readme.
|
|
5
|
+
// argv will contain something like [nodeBinPath, oclifBinPath, 'readme', …] so check
|
|
6
|
+
// for 'readme' with a preceeding argument that includes 'oclif' to be sure.
|
|
7
|
+
const IS_README_GENERATION = (process.argv[process.argv.indexOf('readme') - 1] ?? '').includes('oclif');
|
|
8
|
+
/**
|
|
9
|
+
* Custom Help class for Sanity CLI that overrides the default help formatting to
|
|
10
|
+
* prefix the bin name (e.g., `npx sanity`, `yarn sanity`, etc.) in the help text,
|
|
11
|
+
* and to replace `sanity init` references with the appropriate `create` command
|
|
12
|
+
* for the detected package manager when needed.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/ export default class SanityHelp extends Help {
|
|
3
16
|
formatCommand(command) {
|
|
4
|
-
|
|
17
|
+
let help = super.formatCommand(command);
|
|
5
18
|
// When `sanity init` is called, but originates from the `create-sanity`
|
|
6
19
|
// package/binary (eg the one used by `npm create sanity@latest` etc), we want to
|
|
7
|
-
// customize the help text to show that command instead of `sanity init`.
|
|
8
|
-
// future we may also want to consider prefixing with `npx` etc for non-init
|
|
9
|
-
// commands - but leaving that for another day.
|
|
20
|
+
// customize the help text to show that command instead of `sanity init`.
|
|
10
21
|
const isFromCreate = process.argv.includes('--from-create') && command.id === 'init';
|
|
11
|
-
if (
|
|
12
|
-
|
|
22
|
+
if (isFromCreate) {
|
|
23
|
+
help = replaceInitWithCreateCommand(help);
|
|
13
24
|
}
|
|
14
|
-
|
|
15
|
-
const flagSeparator = needsFlagSeparator() ? ' --' : '';
|
|
16
|
-
// First replace all `sanity init` references that ends with a newline with the
|
|
17
|
-
// create variant that does not include any flag separator (eg `--`). Then replace
|
|
18
|
-
// the other references that do. Most package managers do not require the `--`
|
|
19
|
-
// separator, but npm does. Only include it if we need to, as the commands look
|
|
20
|
-
// cleaner without it.
|
|
21
|
-
return help.replaceAll(/(\s+)sanity(\s+)init(\s*)\n/g, `$1${createCmd}$2\n`).replaceAll(/(\s+)sanity(\s+)init/g, `$1${createCmd}${flagSeparator}`);
|
|
25
|
+
return prefixBinName(help);
|
|
22
26
|
}
|
|
27
|
+
formatRoot() {
|
|
28
|
+
return prefixBinName(super.formatRoot());
|
|
29
|
+
}
|
|
30
|
+
formatTopic(topic) {
|
|
31
|
+
return prefixBinName(super.formatTopic(topic));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @internal
|
|
36
|
+
*/ export function prefixBinName(help) {
|
|
37
|
+
if (IS_README_GENERATION) return help;
|
|
38
|
+
const binCommand = getBinCommand();
|
|
39
|
+
if (binCommand === 'sanity') return help;
|
|
40
|
+
return help.replaceAll('$ sanity', `$ ${binCommand}`);
|
|
23
41
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Replace `sanity init` references in help text with the equivalent `create` command
|
|
44
|
+
* for the detected package manager. Lines ending in just `sanity init\n` (no flags)
|
|
45
|
+
* are replaced without a flag separator, while lines with flags get the separator
|
|
46
|
+
* (eg `--` for npm) so the flags are forwarded correctly.
|
|
47
|
+
*
|
|
48
|
+
* @internal
|
|
49
|
+
*/ export function replaceInitWithCreateCommand(help) {
|
|
50
|
+
const createCmd = guessCreateCommand();
|
|
51
|
+
const flagSeparator = needsFlagSeparator() ? ' --' : '';
|
|
52
|
+
// First replace all `sanity init` references that ends with a newline with the
|
|
53
|
+
// create variant that does not include any flag separator (eg `--`). Then replace
|
|
54
|
+
// the other references that do. Most package managers do not require the `--`
|
|
55
|
+
// separator, but npm does. Only include it if we need to, as the commands look
|
|
56
|
+
// cleaner without it.
|
|
57
|
+
return help.replaceAll(/(\s+)sanity\s+init\s*\n/g, `$1${createCmd}\n`).replaceAll(/(\s+)sanity(\s+)init/g, `$1${createCmd}${flagSeparator}`);
|
|
30
58
|
}
|
|
31
59
|
function guessCreateCommand() {
|
|
32
|
-
const pm =
|
|
60
|
+
const pm = getRunningPackageManager();
|
|
33
61
|
if (pm === 'yarn') return `yarn create sanity`;
|
|
34
62
|
if (pm === 'bun') return `bun create sanity@latest`;
|
|
35
63
|
if (pm === 'pnpm') return `pnpm create sanity@latest`;
|
|
36
64
|
return `npm create sanity@latest`;
|
|
37
65
|
}
|
|
38
66
|
function needsFlagSeparator() {
|
|
39
|
-
const pm =
|
|
67
|
+
const pm = getRunningPackageManager();
|
|
40
68
|
return pm === 'npm' || !pm;
|
|
41
69
|
}
|
|
42
70
|
|
package/dist/SanityHelp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SanityHelp.ts"],"sourcesContent":["import {Command, Help} from '@oclif/core'\n\nexport default class SanityHelp extends Help {\n protected formatCommand(command: Command.Loadable): string {\n
|
|
1
|
+
{"version":3,"sources":["../src/SanityHelp.ts"],"sourcesContent":["import {Command, Help, Interfaces} from '@oclif/core'\nimport {getBinCommand, getRunningPackageManager} from '@sanity/cli-core/package-manager'\n\n// Running `oclif readme`, we don't want to apply the `prefixBinName` transformation,\n// as it will include whatever pm was used to spawn the script in the generated readme.\n// argv will contain something like [nodeBinPath, oclifBinPath, 'readme', …] so check\n// for 'readme' with a preceeding argument that includes 'oclif' to be sure.\nconst IS_README_GENERATION = (process.argv[process.argv.indexOf('readme') - 1] ?? '').includes(\n 'oclif',\n)\n\n/**\n * Custom Help class for Sanity CLI that overrides the default help formatting to\n * prefix the bin name (e.g., `npx sanity`, `yarn sanity`, etc.) in the help text,\n * and to replace `sanity init` references with the appropriate `create` command\n * for the detected package manager when needed.\n *\n * @internal\n */\nexport default class SanityHelp extends Help {\n protected formatCommand(command: Command.Loadable): string {\n let help = super.formatCommand(command)\n\n // When `sanity init` is called, but originates from the `create-sanity`\n // package/binary (eg the one used by `npm create sanity@latest` etc), we want to\n // customize the help text to show that command instead of `sanity init`.\n const isFromCreate = process.argv.includes('--from-create') && command.id === 'init'\n if (isFromCreate) {\n help = replaceInitWithCreateCommand(help)\n }\n\n return prefixBinName(help)\n }\n\n protected formatRoot(): string {\n return prefixBinName(super.formatRoot())\n }\n\n protected formatTopic(topic: Interfaces.Topic): string {\n return prefixBinName(super.formatTopic(topic))\n }\n}\n\n/**\n * @internal\n */\nexport function prefixBinName(help: string): string {\n if (IS_README_GENERATION) return help\n const binCommand = getBinCommand()\n if (binCommand === 'sanity') return help\n return help.replaceAll('$ sanity', `$ ${binCommand}`)\n}\n\n/**\n * Replace `sanity init` references in help text with the equivalent `create` command\n * for the detected package manager. Lines ending in just `sanity init\\n` (no flags)\n * are replaced without a flag separator, while lines with flags get the separator\n * (eg `--` for npm) so the flags are forwarded correctly.\n *\n * @internal\n */\nexport function replaceInitWithCreateCommand(help: string): string {\n const createCmd = guessCreateCommand()\n const flagSeparator = needsFlagSeparator() ? ' --' : ''\n\n // First replace all `sanity init` references that ends with a newline with the\n // create variant that does not include any flag separator (eg `--`). Then replace\n // the other references that do. Most package managers do not require the `--`\n // separator, but npm does. Only include it if we need to, as the commands look\n // cleaner without it.\n return help\n .replaceAll(/(\\s+)sanity\\s+init\\s*\\n/g, `$1${createCmd}\\n`)\n .replaceAll(/(\\s+)sanity(\\s+)init/g, `$1${createCmd}${flagSeparator}`)\n}\n\nfunction guessCreateCommand() {\n const pm = getRunningPackageManager()\n if (pm === 'yarn') return `yarn create sanity`\n if (pm === 'bun') return `bun create sanity@latest`\n if (pm === 'pnpm') return `pnpm create sanity@latest`\n return `npm create sanity@latest`\n}\n\nfunction needsFlagSeparator() {\n const pm = getRunningPackageManager()\n return pm === 'npm' || !pm\n}\n"],"names":["Help","getBinCommand","getRunningPackageManager","IS_README_GENERATION","process","argv","indexOf","includes","SanityHelp","formatCommand","command","help","isFromCreate","id","replaceInitWithCreateCommand","prefixBinName","formatRoot","formatTopic","topic","binCommand","replaceAll","createCmd","guessCreateCommand","flagSeparator","needsFlagSeparator","pm"],"mappings":"AAAA,SAAiBA,IAAI,QAAmB,cAAa;AACrD,SAAQC,aAAa,EAAEC,wBAAwB,QAAO,mCAAkC;AAExF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,4EAA4E;AAC5E,MAAMC,uBAAuB,AAACC,CAAAA,QAAQC,IAAI,CAACD,QAAQC,IAAI,CAACC,OAAO,CAAC,YAAY,EAAE,IAAI,EAAC,EAAGC,QAAQ,CAC5F;AAGF;;;;;;;CAOC,GACD,eAAe,MAAMC,mBAAmBR;IAC5BS,cAAcC,OAAyB,EAAU;QACzD,IAAIC,OAAO,KAAK,CAACF,cAAcC;QAE/B,wEAAwE;QACxE,iFAAiF;QACjF,yEAAyE;QACzE,MAAME,eAAeR,QAAQC,IAAI,CAACE,QAAQ,CAAC,oBAAoBG,QAAQG,EAAE,KAAK;QAC9E,IAAID,cAAc;YAChBD,OAAOG,6BAA6BH;QACtC;QAEA,OAAOI,cAAcJ;IACvB;IAEUK,aAAqB;QAC7B,OAAOD,cAAc,KAAK,CAACC;IAC7B;IAEUC,YAAYC,KAAuB,EAAU;QACrD,OAAOH,cAAc,KAAK,CAACE,YAAYC;IACzC;AACF;AAEA;;CAEC,GACD,OAAO,SAASH,cAAcJ,IAAY;IACxC,IAAIR,sBAAsB,OAAOQ;IACjC,MAAMQ,aAAalB;IACnB,IAAIkB,eAAe,UAAU,OAAOR;IACpC,OAAOA,KAAKS,UAAU,CAAC,YAAY,CAAC,EAAE,EAAED,YAAY;AACtD;AAEA;;;;;;;CAOC,GACD,OAAO,SAASL,6BAA6BH,IAAY;IACvD,MAAMU,YAAYC;IAClB,MAAMC,gBAAgBC,uBAAuB,QAAQ;IAErD,+EAA+E;IAC/E,kFAAkF;IAClF,8EAA8E;IAC9E,+EAA+E;IAC/E,sBAAsB;IACtB,OAAOb,KACJS,UAAU,CAAC,4BAA4B,CAAC,EAAE,EAAEC,UAAU,EAAE,CAAC,EACzDD,UAAU,CAAC,yBAAyB,CAAC,EAAE,EAAEC,YAAYE,eAAe;AACzE;AAEA,SAASD;IACP,MAAMG,KAAKvB;IACX,IAAIuB,OAAO,QAAQ,OAAO,CAAC,kBAAkB,CAAC;IAC9C,IAAIA,OAAO,OAAO,OAAO,CAAC,wBAAwB,CAAC;IACnD,IAAIA,OAAO,QAAQ,OAAO,CAAC,yBAAyB,CAAC;IACrD,OAAO,CAAC,wBAAwB,CAAC;AACnC;AAEA,SAASD;IACP,MAAMC,KAAKvB;IACX,OAAOuB,OAAO,SAAS,CAACA;AAC1B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
2
|
import os from 'node:os';
|
|
3
|
-
import { subdebug } from '@sanity/cli-core';
|
|
3
|
+
import { getSanityUrl, subdebug } from '@sanity/cli-core';
|
|
4
|
+
import { getTokenDetails } from '../../services/auth.js';
|
|
4
5
|
const debug = subdebug('auth');
|
|
5
6
|
const callbackPorts = [
|
|
6
7
|
4321,
|
|
@@ -30,13 +31,11 @@ const platformNames = {
|
|
|
30
31
|
*
|
|
31
32
|
* If we fail to bind to the first port, we retry with the next port in the list.
|
|
32
33
|
*
|
|
33
|
-
* @param
|
|
34
|
+
* @param providerUrl - The URL of the login provider
|
|
34
35
|
* @returns Resolves with HTTP server instance, a login URL to send user to, and a `token` promise
|
|
35
36
|
* @internal
|
|
36
|
-
*/ export function startServerForTokenCallback(
|
|
37
|
-
const
|
|
38
|
-
const { apiHost } = client.config();
|
|
39
|
-
const domain = apiHost.includes('.sanity.work') ? 'www.sanity.work' : 'www.sanity.io';
|
|
37
|
+
*/ export function startServerForTokenCallback(providerUrl) {
|
|
38
|
+
const sanityUrl = getSanityUrl();
|
|
40
39
|
const attemptPorts = [
|
|
41
40
|
...callbackPorts
|
|
42
41
|
];
|
|
@@ -52,7 +51,8 @@ const platformNames = {
|
|
|
52
51
|
const server = createServer(async function onCallbackServerRequest(req, res) {
|
|
53
52
|
function failLoginRequest(code = '') {
|
|
54
53
|
res.writeHead(303, 'See Other', {
|
|
55
|
-
|
|
54
|
+
Connection: 'close',
|
|
55
|
+
Location: `${sanityUrl}/login/error${code ? `?error=${code}` : ''}`
|
|
56
56
|
});
|
|
57
57
|
res.end();
|
|
58
58
|
server.close();
|
|
@@ -60,6 +60,7 @@ const platformNames = {
|
|
|
60
60
|
const url = new URL(req.url || '/', `http://localhost:${callbackPort}`);
|
|
61
61
|
if (url.pathname !== callbackEndpoint) {
|
|
62
62
|
res.writeHead(404, 'Not Found', {
|
|
63
|
+
Connection: 'close',
|
|
63
64
|
'Content-Type': 'text/plain'
|
|
64
65
|
});
|
|
65
66
|
res.write('404 Not Found');
|
|
@@ -69,25 +70,26 @@ const platformNames = {
|
|
|
69
70
|
const absoluteTokenUrl = url.searchParams.get('url');
|
|
70
71
|
if (!absoluteTokenUrl) {
|
|
71
72
|
failLoginRequest();
|
|
73
|
+
rejectToken(new Error('Missing callback URL'));
|
|
72
74
|
return;
|
|
73
75
|
}
|
|
74
76
|
const tokenUrl = new URL(absoluteTokenUrl);
|
|
75
77
|
if (!tokenUrl.searchParams.has('sid')) {
|
|
76
78
|
failLoginRequest('NO_SESSION_ID');
|
|
79
|
+
rejectToken(new Error('Missing session ID in callback'));
|
|
77
80
|
return;
|
|
78
81
|
}
|
|
79
82
|
let token;
|
|
80
83
|
try {
|
|
81
|
-
token = await
|
|
82
|
-
uri: `/auth/fetch${tokenUrl.search}`
|
|
83
|
-
});
|
|
84
|
+
token = await getTokenDetails(tokenUrl.search);
|
|
84
85
|
} catch (err) {
|
|
85
86
|
failLoginRequest('UNRESOLVED_SESSION');
|
|
86
87
|
rejectToken(err instanceof Error ? err : new Error(`Unknown error: ${err}`));
|
|
87
88
|
return;
|
|
88
89
|
}
|
|
89
90
|
res.writeHead(303, 'See Other', {
|
|
90
|
-
|
|
91
|
+
Connection: 'close',
|
|
92
|
+
Location: `${sanityUrl}/login/success`
|
|
91
93
|
});
|
|
92
94
|
res.end();
|
|
93
95
|
server.close();
|
|
@@ -96,7 +98,8 @@ const platformNames = {
|
|
|
96
98
|
server.on('listening', function onCallbackListen() {
|
|
97
99
|
// Once the server is successfully listening on a port, we can return the promise.
|
|
98
100
|
// We'll then await the _token promise_, while the server is running in the background.
|
|
99
|
-
const
|
|
101
|
+
const callbackUrl = getCallbackUrl(server);
|
|
102
|
+
const loginUrl = getLoginUrl(providerUrl, callbackUrl);
|
|
100
103
|
resolve({
|
|
101
104
|
loginUrl,
|
|
102
105
|
server,
|
|
@@ -121,22 +124,16 @@ const platformNames = {
|
|
|
121
124
|
});
|
|
122
125
|
}
|
|
123
126
|
/**
|
|
124
|
-
* Get the login URL to send the user to for the given
|
|
127
|
+
* Get the login URL to send the user to for the given auth provider.
|
|
125
128
|
*
|
|
126
129
|
* The generated URL will include a label for the session that includes the
|
|
127
130
|
* hostname and platform of the current computer, to help identify the session.
|
|
128
131
|
*
|
|
129
|
-
* @param server - The local auth token server
|
|
130
132
|
* @param providerUrl - The URL of the login provider
|
|
133
|
+
* @param callbackUrl - The callback URL for the local auth token server
|
|
131
134
|
* @returns The login URL
|
|
132
135
|
* @internal
|
|
133
|
-
*/ function getLoginUrl(
|
|
134
|
-
const serverUrl = server.address();
|
|
135
|
-
if (!serverUrl || typeof serverUrl === 'string') {
|
|
136
|
-
// Note: `serverUrl` is string only when binding to unix sockets,
|
|
137
|
-
// thus we can safely assume Something Is Wrong™ if it's a string
|
|
138
|
-
throw new Error('Failed to start auth callback server');
|
|
139
|
-
}
|
|
136
|
+
*/ function getLoginUrl(providerUrl, callbackUrl) {
|
|
140
137
|
// Build a login URL that redirects back back to OAuth flow on success
|
|
141
138
|
const loginUrl = new URL(providerUrl);
|
|
142
139
|
// Prefer `MacOS` over `darwin` etc
|
|
@@ -146,8 +143,17 @@ const platformNames = {
|
|
|
146
143
|
const hostname = os.hostname().replaceAll(/\.(local|lan)$/g, '');
|
|
147
144
|
loginUrl.searchParams.set('type', 'token');
|
|
148
145
|
loginUrl.searchParams.set('label', `${hostname} / ${platform}`);
|
|
149
|
-
loginUrl.searchParams.set('origin',
|
|
146
|
+
loginUrl.searchParams.set('origin', callbackUrl.href);
|
|
150
147
|
return loginUrl;
|
|
151
148
|
}
|
|
149
|
+
function getCallbackUrl(server) {
|
|
150
|
+
const serverUrl = server.address();
|
|
151
|
+
if (!serverUrl || typeof serverUrl === 'string') {
|
|
152
|
+
// Note: `serverUrl` is string only when binding to unix sockets,
|
|
153
|
+
// thus we can safely assume Something Is Wrong™ if it's a string
|
|
154
|
+
throw new Error('Failed to start auth callback server');
|
|
155
|
+
}
|
|
156
|
+
return new URL(callbackEndpoint, `http://localhost:${serverUrl.port}`);
|
|
157
|
+
}
|
|
152
158
|
|
|
153
159
|
//# sourceMappingURL=authServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/auth/authServer.ts"],"sourcesContent":["import {createServer, type Server} from 'node:http'\nimport os from 'node:os'\n\nimport {subdebug} from '@sanity/cli-core'\nimport {type
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/auth/authServer.ts"],"sourcesContent":["import {createServer, type Server} from 'node:http'\nimport os from 'node:os'\n\nimport {getSanityUrl, subdebug} from '@sanity/cli-core'\n\nimport {getTokenDetails} from '../../services/auth.js'\nimport {type TokenDetails} from './types.js'\n\nconst debug = subdebug('auth')\nconst callbackPorts = [4321, 4000, 3003, 1234, 8080, 13_333]\nconst callbackEndpoint = '/callback'\n\nconst platformNames: Record<string, string | undefined> = {\n aix: 'AIX',\n android: 'Android',\n darwin: 'MacOS',\n freebsd: 'FreeBSD',\n linux: 'Linux',\n openbsd: 'OpenBSD',\n sunos: 'SunOS',\n win32: 'Windows',\n}\n\n/**\n * Start a local HTTP server and wait for a request to the auth callback endpoint.\n * This happens by the user being sent to a login page with a callback URL that points to\n * this local server. This request includes a short-lived \"SID\" (session ID) that we then\n * do a request to the `/auth/fetch` endpoint with to get the actual auth token,\n * invalidating the SID in the process.\n *\n * If we fail to bind to the first port, we retry with the next port in the list.\n *\n * @param providerUrl - The URL of the login provider\n * @returns Resolves with HTTP server instance, a login URL to send user to, and a `token` promise\n * @internal\n */\nexport function startServerForTokenCallback(\n providerUrl: string,\n): Promise<{loginUrl: URL; server: Server; token: Promise<TokenDetails>}> {\n const sanityUrl = getSanityUrl()\n\n const attemptPorts = [...callbackPorts]\n let callbackPort = attemptPorts.shift()\n\n // note: replace with `Promise.withResolvers()` when minimum Node.js is 22+\n let resolveToken: (resolvedToken: PromiseLike<TokenDetails> | TokenDetails) => void\n let rejectToken: (reason: Error) => void\n const tokenPromise = new Promise<TokenDetails>((resolve, reject) => {\n resolveToken = resolve\n rejectToken = reject\n })\n\n return new Promise((resolve, reject) => {\n const server = createServer(async function onCallbackServerRequest(req, res) {\n function failLoginRequest(code = '') {\n res.writeHead(303, 'See Other', {\n Connection: 'close',\n Location: `${sanityUrl}/login/error${code ? `?error=${code}` : ''}`,\n })\n res.end()\n server.close()\n }\n\n const url = new URL(req.url || '/', `http://localhost:${callbackPort}`)\n if (url.pathname !== callbackEndpoint) {\n res.writeHead(404, 'Not Found', {Connection: 'close', 'Content-Type': 'text/plain'})\n res.write('404 Not Found')\n res.end()\n return\n }\n\n const absoluteTokenUrl = url.searchParams.get('url')\n if (!absoluteTokenUrl) {\n failLoginRequest()\n rejectToken(new Error('Missing callback URL'))\n return\n }\n\n const tokenUrl = new URL(absoluteTokenUrl)\n if (!tokenUrl.searchParams.has('sid')) {\n failLoginRequest('NO_SESSION_ID')\n rejectToken(new Error('Missing session ID in callback'))\n return\n }\n\n let token: TokenDetails\n try {\n token = await getTokenDetails(tokenUrl.search)\n } catch (err) {\n failLoginRequest('UNRESOLVED_SESSION')\n rejectToken(err instanceof Error ? err : new Error(`Unknown error: ${err}`))\n return\n }\n\n res.writeHead(303, 'See Other', {\n Connection: 'close',\n Location: `${sanityUrl}/login/success`,\n })\n res.end()\n server.close()\n resolveToken(token)\n })\n\n server.on('listening', function onCallbackListen() {\n // Once the server is successfully listening on a port, we can return the promise.\n // We'll then await the _token promise_, while the server is running in the background.\n const callbackUrl = getCallbackUrl(server)\n const loginUrl = getLoginUrl(providerUrl, callbackUrl)\n resolve({loginUrl, server, token: tokenPromise})\n })\n\n server.on('error', function onCallbackServerError(err) {\n if ('code' in err && err.code === 'EADDRINUSE') {\n callbackPort = attemptPorts.shift()\n if (!callbackPort) {\n reject(new Error('Failed to find port number to bind auth callback server to'))\n return\n }\n\n debug('Port busy, trying %d', callbackPort)\n server.listen(callbackPort)\n } else {\n reject(err)\n }\n })\n\n debug('Starting callback server on port %d', callbackPort)\n server.listen(callbackPort)\n })\n}\n\n/**\n * Get the login URL to send the user to for the given auth provider.\n *\n * The generated URL will include a label for the session that includes the\n * hostname and platform of the current computer, to help identify the session.\n *\n * @param providerUrl - The URL of the login provider\n * @param callbackUrl - The callback URL for the local auth token server\n * @returns The login URL\n * @internal\n */\nfunction getLoginUrl(providerUrl: string, callbackUrl: URL): URL {\n // Build a login URL that redirects back back to OAuth flow on success\n const loginUrl = new URL(providerUrl)\n\n // Prefer `MacOS` over `darwin` etc\n const platformName = os.platform()\n const platform = platformName in platformNames ? platformNames[platformName] : platformName\n\n // Prefer `espens-macbook` over `espens-macbook.local`\n const hostname = os.hostname().replaceAll(/\\.(local|lan)$/g, '')\n\n loginUrl.searchParams.set('type', 'token')\n loginUrl.searchParams.set('label', `${hostname} / ${platform}`)\n loginUrl.searchParams.set('origin', callbackUrl.href)\n\n return loginUrl\n}\n\nfunction getCallbackUrl(server: Server): URL {\n const serverUrl = server.address()\n if (!serverUrl || typeof serverUrl === 'string') {\n // Note: `serverUrl` is string only when binding to unix sockets,\n // thus we can safely assume Something Is Wrong™ if it's a string\n throw new Error('Failed to start auth callback server')\n }\n\n return new URL(callbackEndpoint, `http://localhost:${serverUrl.port}`)\n}\n"],"names":["createServer","os","getSanityUrl","subdebug","getTokenDetails","debug","callbackPorts","callbackEndpoint","platformNames","aix","android","darwin","freebsd","linux","openbsd","sunos","win32","startServerForTokenCallback","providerUrl","sanityUrl","attemptPorts","callbackPort","shift","resolveToken","rejectToken","tokenPromise","Promise","resolve","reject","server","onCallbackServerRequest","req","res","failLoginRequest","code","writeHead","Connection","Location","end","close","url","URL","pathname","write","absoluteTokenUrl","searchParams","get","Error","tokenUrl","has","token","search","err","on","onCallbackListen","callbackUrl","getCallbackUrl","loginUrl","getLoginUrl","onCallbackServerError","listen","platformName","platform","hostname","replaceAll","set","href","serverUrl","address","port"],"mappings":"AAAA,SAAQA,YAAY,QAAoB,YAAW;AACnD,OAAOC,QAAQ,UAAS;AAExB,SAAQC,YAAY,EAAEC,QAAQ,QAAO,mBAAkB;AAEvD,SAAQC,eAAe,QAAO,yBAAwB;AAGtD,MAAMC,QAAQF,SAAS;AACvB,MAAMG,gBAAgB;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAO;AAC5D,MAAMC,mBAAmB;AAEzB,MAAMC,gBAAoD;IACxDC,KAAK;IACLC,SAAS;IACTC,QAAQ;IACRC,SAAS;IACTC,OAAO;IACPC,SAAS;IACTC,OAAO;IACPC,OAAO;AACT;AAEA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASC,4BACdC,WAAmB;IAEnB,MAAMC,YAAYjB;IAElB,MAAMkB,eAAe;WAAId;KAAc;IACvC,IAAIe,eAAeD,aAAaE,KAAK;IAErC,2EAA2E;IAC3E,IAAIC;IACJ,IAAIC;IACJ,MAAMC,eAAe,IAAIC,QAAsB,CAACC,SAASC;QACvDL,eAAeI;QACfH,cAAcI;IAChB;IAEA,OAAO,IAAIF,QAAQ,CAACC,SAASC;QAC3B,MAAMC,SAAS7B,aAAa,eAAe8B,wBAAwBC,GAAG,EAAEC,GAAG;YACzE,SAASC,iBAAiBC,OAAO,EAAE;gBACjCF,IAAIG,SAAS,CAAC,KAAK,aAAa;oBAC9BC,YAAY;oBACZC,UAAU,GAAGlB,UAAU,YAAY,EAAEe,OAAO,CAAC,OAAO,EAAEA,MAAM,GAAG,IAAI;gBACrE;gBACAF,IAAIM,GAAG;gBACPT,OAAOU,KAAK;YACd;YAEA,MAAMC,MAAM,IAAIC,IAAIV,IAAIS,GAAG,IAAI,KAAK,CAAC,iBAAiB,EAAEnB,cAAc;YACtE,IAAImB,IAAIE,QAAQ,KAAKnC,kBAAkB;gBACrCyB,IAAIG,SAAS,CAAC,KAAK,aAAa;oBAACC,YAAY;oBAAS,gBAAgB;gBAAY;gBAClFJ,IAAIW,KAAK,CAAC;gBACVX,IAAIM,GAAG;gBACP;YACF;YAEA,MAAMM,mBAAmBJ,IAAIK,YAAY,CAACC,GAAG,CAAC;YAC9C,IAAI,CAACF,kBAAkB;gBACrBX;gBACAT,YAAY,IAAIuB,MAAM;gBACtB;YACF;YAEA,MAAMC,WAAW,IAAIP,IAAIG;YACzB,IAAI,CAACI,SAASH,YAAY,CAACI,GAAG,CAAC,QAAQ;gBACrChB,iBAAiB;gBACjBT,YAAY,IAAIuB,MAAM;gBACtB;YACF;YAEA,IAAIG;YACJ,IAAI;gBACFA,QAAQ,MAAM9C,gBAAgB4C,SAASG,MAAM;YAC/C,EAAE,OAAOC,KAAK;gBACZnB,iBAAiB;gBACjBT,YAAY4B,eAAeL,QAAQK,MAAM,IAAIL,MAAM,CAAC,eAAe,EAAEK,KAAK;gBAC1E;YACF;YAEApB,IAAIG,SAAS,CAAC,KAAK,aAAa;gBAC9BC,YAAY;gBACZC,UAAU,GAAGlB,UAAU,cAAc,CAAC;YACxC;YACAa,IAAIM,GAAG;YACPT,OAAOU,KAAK;YACZhB,aAAa2B;QACf;QAEArB,OAAOwB,EAAE,CAAC,aAAa,SAASC;YAC9B,kFAAkF;YAClF,uFAAuF;YACvF,MAAMC,cAAcC,eAAe3B;YACnC,MAAM4B,WAAWC,YAAYxC,aAAaqC;YAC1C5B,QAAQ;gBAAC8B;gBAAU5B;gBAAQqB,OAAOzB;YAAY;QAChD;QAEAI,OAAOwB,EAAE,CAAC,SAAS,SAASM,sBAAsBP,GAAG;YACnD,IAAI,UAAUA,OAAOA,IAAIlB,IAAI,KAAK,cAAc;gBAC9Cb,eAAeD,aAAaE,KAAK;gBACjC,IAAI,CAACD,cAAc;oBACjBO,OAAO,IAAImB,MAAM;oBACjB;gBACF;gBAEA1C,MAAM,wBAAwBgB;gBAC9BQ,OAAO+B,MAAM,CAACvC;YAChB,OAAO;gBACLO,OAAOwB;YACT;QACF;QAEA/C,MAAM,uCAAuCgB;QAC7CQ,OAAO+B,MAAM,CAACvC;IAChB;AACF;AAEA;;;;;;;;;;CAUC,GACD,SAASqC,YAAYxC,WAAmB,EAAEqC,WAAgB;IACxD,sEAAsE;IACtE,MAAME,WAAW,IAAIhB,IAAIvB;IAEzB,mCAAmC;IACnC,MAAM2C,eAAe5D,GAAG6D,QAAQ;IAChC,MAAMA,WAAWD,gBAAgBrD,gBAAgBA,aAAa,CAACqD,aAAa,GAAGA;IAE/E,sDAAsD;IACtD,MAAME,WAAW9D,GAAG8D,QAAQ,GAAGC,UAAU,CAAC,mBAAmB;IAE7DP,SAASZ,YAAY,CAACoB,GAAG,CAAC,QAAQ;IAClCR,SAASZ,YAAY,CAACoB,GAAG,CAAC,SAAS,GAAGF,SAAS,GAAG,EAAED,UAAU;IAC9DL,SAASZ,YAAY,CAACoB,GAAG,CAAC,UAAUV,YAAYW,IAAI;IAEpD,OAAOT;AACT;AAEA,SAASD,eAAe3B,MAAc;IACpC,MAAMsC,YAAYtC,OAAOuC,OAAO;IAChC,IAAI,CAACD,aAAa,OAAOA,cAAc,UAAU;QAC/C,iEAAiE;QACjE,iEAAiE;QACjE,MAAM,IAAIpB,MAAM;IAClB;IAEA,OAAO,IAAIN,IAAIlC,kBAAkB,CAAC,iBAAiB,EAAE4D,UAAUE,IAAI,EAAE;AACvE"}
|
|
@@ -1,54 +1,65 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
1
2
|
import { input, spinner } from '@sanity/cli-core/ux';
|
|
3
|
+
import { promptForProviders } from '../../../prompts/promptForProviders.js';
|
|
4
|
+
import { getProviders, getVercelProviderUrl } from '../../../services/auth.js';
|
|
2
5
|
import { getSSOProvider } from './getSSOProvider.js';
|
|
3
|
-
|
|
6
|
+
const debug = subdebug('login:getProvider');
|
|
4
7
|
/**
|
|
5
8
|
* Prompt the user to select a login provider, or use the specified provider if given.
|
|
6
9
|
*
|
|
7
10
|
* @param options - Options for the provider resolve operation
|
|
8
11
|
* @returns Promise that resolves to the selected login provider
|
|
9
12
|
* @internal
|
|
10
|
-
*/ export async function getProvider({
|
|
11
|
-
if (
|
|
12
|
-
return
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
*/ export async function getProvider({ experimental, orgSlug, specifiedProvider }) {
|
|
14
|
+
if (specifiedProvider === 'vercel') {
|
|
15
|
+
return {
|
|
16
|
+
name: 'vercel',
|
|
17
|
+
title: 'Vercel',
|
|
18
|
+
url: await getVercelProviderUrl()
|
|
19
|
+
};
|
|
16
20
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
let spin;
|
|
22
|
+
try {
|
|
23
|
+
if (orgSlug) {
|
|
24
|
+
return getSSOProvider(orgSlug);
|
|
25
|
+
}
|
|
26
|
+
spin = spinner('Fetching providers...').start();
|
|
27
|
+
// Fetch and prompt for login provider to use
|
|
28
|
+
let { providers } = await getProviders();
|
|
29
|
+
if (experimental) {
|
|
30
|
+
providers = [
|
|
31
|
+
...providers,
|
|
32
|
+
{
|
|
33
|
+
name: 'sso',
|
|
34
|
+
title: 'SSO',
|
|
35
|
+
url: '_not_used_'
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
spin.stop();
|
|
40
|
+
if (specifiedProvider) {
|
|
41
|
+
const provider = providers.find((prov)=>prov.name === specifiedProvider);
|
|
42
|
+
if (!provider) {
|
|
43
|
+
throw new Error(`Cannot find login provider with name "${specifiedProvider}"`);
|
|
29
44
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const provider = providers
|
|
36
|
-
if (
|
|
37
|
-
|
|
45
|
+
return provider;
|
|
46
|
+
}
|
|
47
|
+
if (providers.length === 0) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const provider = await promptForProviders(providers);
|
|
51
|
+
if (provider.name === 'sso') {
|
|
52
|
+
const orgSlug = await input({
|
|
53
|
+
message: 'Organization slug:'
|
|
54
|
+
});
|
|
55
|
+
return getSSOProvider(orgSlug);
|
|
38
56
|
}
|
|
39
57
|
return provider;
|
|
58
|
+
} catch (err) {
|
|
59
|
+
spin?.stop();
|
|
60
|
+
debug('Error retrieving providers', err);
|
|
61
|
+
throw err;
|
|
40
62
|
}
|
|
41
|
-
const provider = await promptProviders(providers);
|
|
42
|
-
if (provider.name === 'sso') {
|
|
43
|
-
const orgSlug = await input({
|
|
44
|
-
message: 'Organization slug:'
|
|
45
|
-
});
|
|
46
|
-
return getSSOProvider({
|
|
47
|
-
client,
|
|
48
|
-
orgSlug
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
return provider;
|
|
52
63
|
}
|
|
53
64
|
|
|
54
65
|
//# sourceMappingURL=getProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/auth/login/getProvider.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/auth/login/getProvider.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\nimport {input, spinner, type SpinnerInstance} from '@sanity/cli-core/ux'\n\nimport {promptForProviders} from '../../../prompts/promptForProviders.js'\nimport {getProviders, getVercelProviderUrl} from '../../../services/auth.js'\nimport {type LoginProvider} from '../types.js'\nimport {getSSOProvider} from './getSSOProvider.js'\n\nconst debug = subdebug('login:getProvider')\n\n/**\n * Prompt the user to select a login provider, or use the specified provider if given.\n *\n * @param options - Options for the provider resolve operation\n * @returns Promise that resolves to the selected login provider\n * @internal\n */\nexport async function getProvider({\n experimental,\n orgSlug,\n specifiedProvider,\n}: {\n experimental: boolean | undefined\n orgSlug: string | undefined\n specifiedProvider: string | undefined\n}): Promise<LoginProvider | undefined> {\n if (specifiedProvider === 'vercel') {\n return {\n name: 'vercel',\n title: 'Vercel',\n url: await getVercelProviderUrl(),\n }\n }\n\n let spin: SpinnerInstance | undefined\n\n try {\n if (orgSlug) {\n return getSSOProvider(orgSlug)\n }\n\n spin = spinner('Fetching providers...').start()\n // Fetch and prompt for login provider to use\n let {providers} = await getProviders()\n if (experimental) {\n providers = [...providers, {name: 'sso', title: 'SSO', url: '_not_used_'}]\n }\n spin.stop()\n\n if (specifiedProvider) {\n const provider = providers.find((prov) => prov.name === specifiedProvider)\n if (!provider) {\n throw new Error(`Cannot find login provider with name \"${specifiedProvider}\"`)\n }\n return provider\n }\n\n if (providers.length === 0) {\n return undefined\n }\n\n const provider = await promptForProviders(providers)\n if (provider.name === 'sso') {\n const orgSlug = await input({message: 'Organization slug:'})\n return getSSOProvider(orgSlug)\n }\n\n return provider\n } catch (err) {\n spin?.stop()\n debug('Error retrieving providers', err)\n throw err\n }\n}\n"],"names":["subdebug","input","spinner","promptForProviders","getProviders","getVercelProviderUrl","getSSOProvider","debug","getProvider","experimental","orgSlug","specifiedProvider","name","title","url","spin","start","providers","stop","provider","find","prov","Error","length","undefined","message","err"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AACzC,SAAQC,KAAK,EAAEC,OAAO,QAA6B,sBAAqB;AAExE,SAAQC,kBAAkB,QAAO,yCAAwC;AACzE,SAAQC,YAAY,EAAEC,oBAAoB,QAAO,4BAA2B;AAE5E,SAAQC,cAAc,QAAO,sBAAqB;AAElD,MAAMC,QAAQP,SAAS;AAEvB;;;;;;CAMC,GACD,OAAO,eAAeQ,YAAY,EAChCC,YAAY,EACZC,OAAO,EACPC,iBAAiB,EAKlB;IACC,IAAIA,sBAAsB,UAAU;QAClC,OAAO;YACLC,MAAM;YACNC,OAAO;YACPC,KAAK,MAAMT;QACb;IACF;IAEA,IAAIU;IAEJ,IAAI;QACF,IAAIL,SAAS;YACX,OAAOJ,eAAeI;QACxB;QAEAK,OAAOb,QAAQ,yBAAyBc,KAAK;QAC7C,6CAA6C;QAC7C,IAAI,EAACC,SAAS,EAAC,GAAG,MAAMb;QACxB,IAAIK,cAAc;YAChBQ,YAAY;mBAAIA;gBAAW;oBAACL,MAAM;oBAAOC,OAAO;oBAAOC,KAAK;gBAAY;aAAE;QAC5E;QACAC,KAAKG,IAAI;QAET,IAAIP,mBAAmB;YACrB,MAAMQ,WAAWF,UAAUG,IAAI,CAAC,CAACC,OAASA,KAAKT,IAAI,KAAKD;YACxD,IAAI,CAACQ,UAAU;gBACb,MAAM,IAAIG,MAAM,CAAC,sCAAsC,EAAEX,kBAAkB,CAAC,CAAC;YAC/E;YACA,OAAOQ;QACT;QAEA,IAAIF,UAAUM,MAAM,KAAK,GAAG;YAC1B,OAAOC;QACT;QAEA,MAAML,WAAW,MAAMhB,mBAAmBc;QAC1C,IAAIE,SAASP,IAAI,KAAK,OAAO;YAC3B,MAAMF,UAAU,MAAMT,MAAM;gBAACwB,SAAS;YAAoB;YAC1D,OAAOnB,eAAeI;QACxB;QAEA,OAAOS;IACT,EAAE,OAAOO,KAAK;QACZX,MAAMG;QACNX,MAAM,8BAA8BmB;QACpC,MAAMA;IACR;AACF"}
|
|
@@ -1,30 +1,36 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
1
2
|
import { select } from '@sanity/cli-core/ux';
|
|
3
|
+
import { getSSOProviders } from '../../../services/auth.js';
|
|
2
4
|
import { samlProviderToLoginProvider } from './samlProviderToLoginProvider.js';
|
|
5
|
+
const debug = subdebug('login:getSSOProvider');
|
|
3
6
|
/**
|
|
4
7
|
* Get the SSO provider for the given slug
|
|
5
8
|
*
|
|
6
|
-
* @param
|
|
9
|
+
* @param orgSlug - The slug of the organization to get the SSO provider for
|
|
7
10
|
* @returns Promise that resolves to the SSO provider
|
|
8
11
|
* @internal
|
|
9
|
-
*/ export async function getSSOProvider(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
*/ export async function getSSOProvider(orgSlug) {
|
|
13
|
+
try {
|
|
14
|
+
const providers = await getSSOProviders(orgSlug);
|
|
15
|
+
const enabledProviders = providers.filter((candidate)=>!candidate.disabled);
|
|
16
|
+
if (enabledProviders.length === 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
if (enabledProviders.length === 1) {
|
|
20
|
+
return samlProviderToLoginProvider(enabledProviders[0]);
|
|
21
|
+
}
|
|
22
|
+
const selectedProvider = await select({
|
|
23
|
+
choices: enabledProviders.map((provider)=>({
|
|
24
|
+
name: provider.name,
|
|
25
|
+
value: provider
|
|
26
|
+
})),
|
|
27
|
+
message: 'Select SSO provider'
|
|
28
|
+
});
|
|
29
|
+
return samlProviderToLoginProvider(selectedProvider);
|
|
30
|
+
} catch (err) {
|
|
31
|
+
debug('Error retrieving SSO Providers: %O', err);
|
|
32
|
+
throw err;
|
|
16
33
|
}
|
|
17
|
-
if (enabledProviders.length === 1) {
|
|
18
|
-
return samlProviderToLoginProvider(enabledProviders[0]);
|
|
19
|
-
}
|
|
20
|
-
const selectedProvider = await select({
|
|
21
|
-
choices: enabledProviders.map((provider)=>({
|
|
22
|
-
name: provider.name,
|
|
23
|
-
value: provider
|
|
24
|
-
})),
|
|
25
|
-
message: 'Select SSO provider'
|
|
26
|
-
});
|
|
27
|
-
return selectedProvider ? samlProviderToLoginProvider(selectedProvider) : undefined;
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
//# sourceMappingURL=getSSOProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/auth/login/getSSOProvider.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/auth/login/getSSOProvider.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {getSSOProviders} from '../../../services/auth.js'\nimport {type LoginProvider} from '../types.js'\nimport {samlProviderToLoginProvider} from './samlProviderToLoginProvider.js'\n\nconst debug = subdebug('login:getSSOProvider')\n\n/**\n * Get the SSO provider for the given slug\n *\n * @param orgSlug - The slug of the organization to get the SSO provider for\n * @returns Promise that resolves to the SSO provider\n * @internal\n */\nexport async function getSSOProvider(orgSlug: string): Promise<LoginProvider | undefined> {\n try {\n const providers = await getSSOProviders(orgSlug)\n\n const enabledProviders = providers.filter((candidate) => !candidate.disabled)\n if (enabledProviders.length === 0) {\n return undefined\n }\n\n if (enabledProviders.length === 1) {\n return samlProviderToLoginProvider(enabledProviders[0])\n }\n\n const selectedProvider = await select({\n choices: enabledProviders.map((provider) => ({name: provider.name, value: provider})),\n message: 'Select SSO provider',\n })\n\n return samlProviderToLoginProvider(selectedProvider)\n } catch (err) {\n debug('Error retrieving SSO Providers: %O', err)\n throw err\n }\n}\n"],"names":["subdebug","select","getSSOProviders","samlProviderToLoginProvider","debug","getSSOProvider","orgSlug","providers","enabledProviders","filter","candidate","disabled","length","undefined","selectedProvider","choices","map","provider","name","value","message","err"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AACzC,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAQC,eAAe,QAAO,4BAA2B;AAEzD,SAAQC,2BAA2B,QAAO,mCAAkC;AAE5E,MAAMC,QAAQJ,SAAS;AAEvB;;;;;;CAMC,GACD,OAAO,eAAeK,eAAeC,OAAe;IAClD,IAAI;QACF,MAAMC,YAAY,MAAML,gBAAgBI;QAExC,MAAME,mBAAmBD,UAAUE,MAAM,CAAC,CAACC,YAAc,CAACA,UAAUC,QAAQ;QAC5E,IAAIH,iBAAiBI,MAAM,KAAK,GAAG;YACjC,OAAOC;QACT;QAEA,IAAIL,iBAAiBI,MAAM,KAAK,GAAG;YACjC,OAAOT,4BAA4BK,gBAAgB,CAAC,EAAE;QACxD;QAEA,MAAMM,mBAAmB,MAAMb,OAAO;YACpCc,SAASP,iBAAiBQ,GAAG,CAAC,CAACC,WAAc,CAAA;oBAACC,MAAMD,SAASC,IAAI;oBAAEC,OAAOF;gBAAQ,CAAA;YAClFG,SAAS;QACX;QAEA,OAAOjB,4BAA4BW;IACrC,EAAE,OAAOO,KAAK;QACZjB,MAAM,sCAAsCiB;QAC5C,MAAMA;IACR;AACF"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { getCliToken,
|
|
1
|
+
import { getCliToken, setCliUserConfig, subdebug } from '@sanity/cli-core';
|
|
2
2
|
import { spinner } from '@sanity/cli-core/ux';
|
|
3
3
|
import open from 'open';
|
|
4
|
+
import { logout } from '../../../services/auth.js';
|
|
4
5
|
import { LoginTrace } from '../../../telemetry/login.telemetry.js';
|
|
5
6
|
import { canLaunchBrowser } from '../../../util/canLaunchBrowser.js';
|
|
6
7
|
import { startServerForTokenCallback } from '../authServer.js';
|
|
7
8
|
import { getProvider } from './getProvider.js';
|
|
8
|
-
const
|
|
9
|
+
const debug = subdebug('login');
|
|
9
10
|
/**
|
|
10
11
|
* Trigger the authentication flow for the CLI.
|
|
11
12
|
*
|
|
@@ -21,15 +22,7 @@ const LOGIN_API_VERSION = '2024-02-01';
|
|
|
21
22
|
const hasExistingToken = Boolean(previousToken);
|
|
22
23
|
const trace = telemetry.trace(LoginTrace);
|
|
23
24
|
trace.start();
|
|
24
|
-
// We explicitly want to use an unauthenticated client here, even if we already logged in
|
|
25
|
-
const globalClient = await getGlobalCliClient({
|
|
26
|
-
apiVersion: LOGIN_API_VERSION
|
|
27
|
-
});
|
|
28
|
-
const client = globalClient.withConfig({
|
|
29
|
-
token: undefined
|
|
30
|
-
});
|
|
31
25
|
const provider = await getProvider({
|
|
32
|
-
client,
|
|
33
26
|
experimental: options.experimental,
|
|
34
27
|
orgSlug: options.sso,
|
|
35
28
|
specifiedProvider: options.provider
|
|
@@ -41,19 +34,10 @@ const LOGIN_API_VERSION = '2024-02-01';
|
|
|
41
34
|
if (provider === undefined) {
|
|
42
35
|
throw new Error('No authentication providers found');
|
|
43
36
|
}
|
|
44
|
-
const { loginUrl, server, token: tokenPromise } = await startServerForTokenCallback(
|
|
45
|
-
client,
|
|
46
|
-
providerUrl: provider.url
|
|
47
|
-
});
|
|
37
|
+
const { loginUrl, server, token: tokenPromise } = await startServerForTokenCallback(provider.url);
|
|
48
38
|
trace.log({
|
|
49
39
|
step: 'waitForToken'
|
|
50
40
|
});
|
|
51
|
-
const serverUrl = server.address();
|
|
52
|
-
if (!serverUrl || typeof serverUrl === 'string') {
|
|
53
|
-
// Note: `serverUrl` is string only when binding to unix sockets,
|
|
54
|
-
// thus we can safely assume Something Is Wrong™ if it's a string
|
|
55
|
-
throw new Error('Failed to start auth callback server');
|
|
56
|
-
}
|
|
57
41
|
// Open a browser on the login page (or tell the user to)
|
|
58
42
|
const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false;
|
|
59
43
|
const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at';
|
|
@@ -70,25 +54,20 @@ const LOGIN_API_VERSION = '2024-02-01';
|
|
|
70
54
|
} catch (err) {
|
|
71
55
|
spin.stop();
|
|
72
56
|
trace.error(err);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}) : new Error(`${err}`);
|
|
57
|
+
debug('Error retrieving token: %O', err);
|
|
58
|
+
throw err;
|
|
76
59
|
} finally{
|
|
77
|
-
|
|
78
|
-
|
|
60
|
+
await new Promise((resolve)=>{
|
|
61
|
+
server.close(()=>resolve());
|
|
62
|
+
});
|
|
79
63
|
}
|
|
80
64
|
// Store the token
|
|
81
|
-
await
|
|
65
|
+
await setCliUserConfig('authToken', authToken);
|
|
82
66
|
// Clear cached telemetry consent
|
|
83
|
-
await
|
|
67
|
+
await setCliUserConfig('telemetryConsent', undefined);
|
|
84
68
|
// If we had a session previously, attempt to clear it
|
|
85
69
|
if (hasExistingToken) {
|
|
86
|
-
await
|
|
87
|
-
token: previousToken
|
|
88
|
-
}).request({
|
|
89
|
-
method: 'POST',
|
|
90
|
-
uri: '/auth/logout'
|
|
91
|
-
}).catch((err)=>{
|
|
70
|
+
await logout(previousToken).catch((err)=>{
|
|
92
71
|
const statusCode = err && err.response && err.response.statusCode;
|
|
93
72
|
if (statusCode !== 401) {
|
|
94
73
|
output.warn('Failed to invalidate previous session');
|