@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/manifest/validationTransformer.ts"],"sourcesContent":["import {type Rule, type RuleSpec, type SchemaValidationValue} from '@sanity/types'\n\nimport {type SerializableProp} from './transformerUtils.js'\nimport {type ManifestValidationGroup, type ManifestValidationRule} from './types.js'\n\ntype Validation = Record<string, never> | {validation: ManifestValidationGroup[]}\ntype ManifestValidationFlag = ManifestValidationRule['flag']\ntype ValidationRuleTransformer = (rule: RuleSpec) => ManifestValidationRule | undefined\n\nconst transformTypeValidationRule: ValidationRuleTransformer = (rule) => {\n return {\n ...rule,\n constraint:\n 'constraint' in rule &&\n (typeof rule.constraint === 'string'\n ? rule.constraint.toLowerCase()\n : retainSerializablePropsForValidation(rule.constraint)),\n }\n}\n\nconst validationRuleTransformers: Partial<\n Record<ManifestValidationFlag, ValidationRuleTransformer>\n> = {\n type: transformTypeValidationRule,\n}\n\n/**\n * Transforms schema validation rules to their manifest representation\n */\nexport function transformValidation(\n validation: SchemaValidationValue,\n retainSerializableProps: (value: unknown, depth?: number) => SerializableProp,\n): Validation {\n const validationArray = (Array.isArray(validation) ? validation : [validation]).filter(\n (value): value is Rule => typeof value === 'object' && '_type' in value,\n )\n\n // we don't want type in the output as that is implicitly given by the typedef itself an will only bloat the payload\n const disallowedFlags = new Set(['type'])\n\n const serializedValidation = validationArray\n .map(({_level, _message, _rules}) => {\n const message: Partial<Pick<ManifestValidationGroup, 'message'>> =\n typeof _message === 'string' ? {message: _message} : {}\n\n const serializedRules = _rules\n .filter((rule) => {\n if (!('constraint' in rule)) {\n return false\n }\n\n const {constraint, flag} = rule\n\n if (disallowedFlags.has(flag)) {\n return false\n }\n\n // Validation rules that refer to other fields use symbols, which cannot be serialized. It would\n // be possible to transform these to a serializable type, but we haven't implemented that for now.\n const isFieldReference =\n typeof constraint === 'object' &&\n 'type' in constraint &&\n typeof constraint.type === 'symbol' &&\n (constraint.type.description === 'FIELD_REF' ||\n constraint.type.description === '@sanity/schema/field-ref')\n\n return !isFieldReference\n })\n .map((rule) => {\n const transformer: ValidationRuleTransformer =\n validationRuleTransformers[rule.flag] ??\n ((spec) => retainSerializableProps(spec) as ManifestValidationRule)\n\n const transformedRule = transformer(rule)\n\n if (!transformedRule) {\n return\n }\n\n return transformedRule\n })\n .filter((rule) => rule !== undefined)\n\n return {\n level: _level,\n rules: serializedRules,\n ...message,\n }\n })\n .filter((group) => group.rules.length > 0)\n\n return serializedValidation.length > 0 ? {validation: serializedValidation} : {}\n}\n\n/**\n * Helper function to retain serializable props specifically for validation transformation.\n * This is used internally by transformTypeValidationRule.\n */\nfunction retainSerializablePropsForValidation(value: unknown): SerializableProp {\n if (value === null || value === undefined) {\n return undefined\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n if (value === '') {\n return undefined\n }\n return value\n }\n\n if (value instanceof RegExp) {\n return value.toString()\n }\n\n if (Array.isArray(value)) {\n const items = value\n .map((item) => retainSerializablePropsForValidation(item))\n .filter((item) => item !== undefined)\n return items.length > 0 ? (items as SerializableProp) : undefined\n }\n\n if (typeof value === 'object') {\n const entries = Object.entries(value)\n .map(([key, val]) => [key, retainSerializablePropsForValidation(val)])\n .filter(([, val]) => val !== undefined)\n return entries.length > 0 ? Object.fromEntries(entries) : undefined\n }\n\n return undefined\n}\n"],"names":["transformTypeValidationRule","rule","constraint","toLowerCase","retainSerializablePropsForValidation","validationRuleTransformers","type","transformValidation","validation","retainSerializableProps","validationArray","Array","isArray","filter","value","disallowedFlags","Set","serializedValidation","map","_level","_message","_rules","message","serializedRules","flag","has","isFieldReference","description","transformer","spec","transformedRule","undefined","level","rules","group","length","RegExp","toString","items","item","entries","Object","key","val","fromEntries"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { subdebug } from '@sanity/cli-core';
|
|
4
|
+
import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
|
|
5
|
+
import { writeWorkspaceFiles } from './writeWorkspaceFiles.js';
|
|
6
|
+
const MANIFEST_FILENAME = 'create-manifest.json';
|
|
7
|
+
const debug = subdebug('writeManifestFile');
|
|
8
|
+
export async function writeManifestFile({ outPath, workDir, workspaceManifests }) {
|
|
9
|
+
const staticPath = isAbsolute(outPath) ? outPath : resolve(join(workDir, outPath));
|
|
10
|
+
debug('Writing manifest to %s', staticPath);
|
|
11
|
+
const path = join(staticPath, MANIFEST_FILENAME);
|
|
12
|
+
await mkdir(staticPath, {
|
|
13
|
+
recursive: true
|
|
14
|
+
});
|
|
15
|
+
const workspaceFiles = await writeWorkspaceFiles(workspaceManifests, staticPath);
|
|
16
|
+
const manifest = {
|
|
17
|
+
/**
|
|
18
|
+
* Version history:
|
|
19
|
+
* 1: Initial release.
|
|
20
|
+
* 2: Added tools file.
|
|
21
|
+
* 3. Added studioVersion field.
|
|
22
|
+
*/ createdAt: new Date().toISOString(),
|
|
23
|
+
studioVersion: await getLocalPackageVersion('sanity', workDir),
|
|
24
|
+
version: 3,
|
|
25
|
+
workspaces: workspaceFiles
|
|
26
|
+
};
|
|
27
|
+
await writeFile(path, JSON.stringify(manifest, null, 2));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=writeManifestFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/manifest/writeManifestFile.ts"],"sourcesContent":["import {mkdir, writeFile} from 'node:fs/promises'\nimport {isAbsolute, join, resolve} from 'node:path'\n\nimport {subdebug} from '@sanity/cli-core'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {type CreateManifest, type CreateWorkspaceManifest} from './types.js'\nimport {writeWorkspaceFiles} from './writeWorkspaceFiles.js'\n\nconst MANIFEST_FILENAME = 'create-manifest.json'\n\nconst debug = subdebug('writeManifestFile')\n\nexport async function writeManifestFile({\n outPath,\n workDir,\n workspaceManifests,\n}: {\n outPath: string\n workDir: string\n workspaceManifests: CreateWorkspaceManifest[]\n}) {\n const staticPath = isAbsolute(outPath) ? outPath : resolve(join(workDir, outPath))\n debug('Writing manifest to %s', staticPath)\n const path = join(staticPath, MANIFEST_FILENAME)\n\n await mkdir(staticPath, {recursive: true})\n\n const workspaceFiles = await writeWorkspaceFiles(workspaceManifests, staticPath)\n\n const manifest: CreateManifest = {\n /**\n * Version history:\n * 1: Initial release.\n * 2: Added tools file.\n * 3. Added studioVersion field.\n */\n createdAt: new Date().toISOString(),\n studioVersion: await getLocalPackageVersion('sanity', workDir),\n version: 3,\n workspaces: workspaceFiles,\n }\n\n await writeFile(path, JSON.stringify(manifest, null, 2))\n}\n"],"names":["mkdir","writeFile","isAbsolute","join","resolve","subdebug","getLocalPackageVersion","writeWorkspaceFiles","MANIFEST_FILENAME","debug","writeManifestFile","outPath","workDir","workspaceManifests","staticPath","path","recursive","workspaceFiles","manifest","createdAt","Date","toISOString","studioVersion","version","workspaces","JSON","stringify"],"mappings":"AAAA,SAAQA,KAAK,EAAEC,SAAS,QAAO,mBAAkB;AACjD,SAAQC,UAAU,EAAEC,IAAI,EAAEC,OAAO,QAAO,YAAW;AAEnD,SAAQC,QAAQ,QAAO,mBAAkB;AAEzC,SAAQC,sBAAsB,QAAO,uCAAsC;AAE3E,SAAQC,mBAAmB,QAAO,2BAA0B;AAE5D,MAAMC,oBAAoB;AAE1B,MAAMC,QAAQJ,SAAS;AAEvB,OAAO,eAAeK,kBAAkB,EACtCC,OAAO,EACPC,OAAO,EACPC,kBAAkB,EAKnB;IACC,MAAMC,aAAaZ,WAAWS,WAAWA,UAAUP,QAAQD,KAAKS,SAASD;IACzEF,MAAM,0BAA0BK;IAChC,MAAMC,OAAOZ,KAAKW,YAAYN;IAE9B,MAAMR,MAAMc,YAAY;QAACE,WAAW;IAAI;IAExC,MAAMC,iBAAiB,MAAMV,oBAAoBM,oBAAoBC;IAErE,MAAMI,WAA2B;QAC/B;;;;;KAKC,GACDC,WAAW,IAAIC,OAAOC,WAAW;QACjCC,eAAe,MAAMhB,uBAAuB,UAAUM;QACtDW,SAAS;QACTC,YAAYP;IACd;IAEA,MAAMhB,UAAUc,MAAMU,KAAKC,SAAS,CAACR,UAAU,MAAM;AACvD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
const SCHEMA_FILENAME_SUFFIX = '.create-schema.json';
|
|
5
|
+
const TOOLS_FILENAME_SUFFIX = '.create-tools.json';
|
|
6
|
+
export function writeWorkspaceFiles(manifestWorkspaces, staticPath) {
|
|
7
|
+
const output = manifestWorkspaces.map((workspace)=>writeWorkspaceFile(workspace, staticPath));
|
|
8
|
+
return Promise.all(output);
|
|
9
|
+
}
|
|
10
|
+
async function writeWorkspaceFile(workspace, staticPath) {
|
|
11
|
+
const [schemaFilename, toolsFilename] = await Promise.all([
|
|
12
|
+
createFile(staticPath, workspace.schema, SCHEMA_FILENAME_SUFFIX),
|
|
13
|
+
createFile(staticPath, workspace.tools, TOOLS_FILENAME_SUFFIX)
|
|
14
|
+
]);
|
|
15
|
+
return {
|
|
16
|
+
...workspace,
|
|
17
|
+
schema: schemaFilename,
|
|
18
|
+
tools: toolsFilename
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async function createFile(path, content, filenameSuffix) {
|
|
22
|
+
const stringifiedContent = JSON.stringify(content, null, 2);
|
|
23
|
+
const hash = createHash('sha1').update(stringifiedContent).digest('hex');
|
|
24
|
+
const filename = `${hash.slice(0, 8)}${filenameSuffix}`;
|
|
25
|
+
// workspaces with identical data will overwrite each others file. This is ok, since they are identical and can be shared
|
|
26
|
+
await writeFile(join(path, filename), stringifiedContent);
|
|
27
|
+
return filename;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=writeWorkspaceFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/manifest/writeWorkspaceFiles.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\nimport {writeFile} from 'node:fs/promises'\nimport {join} from 'node:path'\n\nimport {type CreateWorkspaceManifest, type ManifestWorkspaceFile} from './types.js'\n\nconst SCHEMA_FILENAME_SUFFIX = '.create-schema.json'\nconst TOOLS_FILENAME_SUFFIX = '.create-tools.json'\n\nexport function writeWorkspaceFiles(\n manifestWorkspaces: CreateWorkspaceManifest[],\n staticPath: string,\n): Promise<ManifestWorkspaceFile[]> {\n const output = manifestWorkspaces.map((workspace) => writeWorkspaceFile(workspace, staticPath))\n\n return Promise.all(output)\n}\n\nasync function writeWorkspaceFile(\n workspace: CreateWorkspaceManifest,\n staticPath: string,\n): Promise<ManifestWorkspaceFile> {\n const [schemaFilename, toolsFilename] = await Promise.all([\n createFile(staticPath, workspace.schema, SCHEMA_FILENAME_SUFFIX),\n createFile(staticPath, workspace.tools, TOOLS_FILENAME_SUFFIX),\n ])\n\n return {\n ...workspace,\n schema: schemaFilename,\n tools: toolsFilename,\n }\n}\n\nasync function createFile(path: string, content: unknown, filenameSuffix: string) {\n const stringifiedContent = JSON.stringify(content, null, 2)\n const hash = createHash('sha1').update(stringifiedContent).digest('hex')\n const filename = `${hash.slice(0, 8)}${filenameSuffix}`\n\n // workspaces with identical data will overwrite each others file. This is ok, since they are identical and can be shared\n await writeFile(join(path, filename), stringifiedContent)\n\n return filename\n}\n"],"names":["createHash","writeFile","join","SCHEMA_FILENAME_SUFFIX","TOOLS_FILENAME_SUFFIX","writeWorkspaceFiles","manifestWorkspaces","staticPath","output","map","workspace","writeWorkspaceFile","Promise","all","schemaFilename","toolsFilename","createFile","schema","tools","path","content","filenameSuffix","stringifiedContent","JSON","stringify","hash","update","digest","filename","slice"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,SAAS,QAAO,mBAAkB;AAC1C,SAAQC,IAAI,QAAO,YAAW;AAI9B,MAAMC,yBAAyB;AAC/B,MAAMC,wBAAwB;AAE9B,OAAO,SAASC,oBACdC,kBAA6C,EAC7CC,UAAkB;IAElB,MAAMC,SAASF,mBAAmBG,GAAG,CAAC,CAACC,YAAcC,mBAAmBD,WAAWH;IAEnF,OAAOK,QAAQC,GAAG,CAACL;AACrB;AAEA,eAAeG,mBACbD,SAAkC,EAClCH,UAAkB;IAElB,MAAM,CAACO,gBAAgBC,cAAc,GAAG,MAAMH,QAAQC,GAAG,CAAC;QACxDG,WAAWT,YAAYG,UAAUO,MAAM,EAAEd;QACzCa,WAAWT,YAAYG,UAAUQ,KAAK,EAAEd;KACzC;IAED,OAAO;QACL,GAAGM,SAAS;QACZO,QAAQH;QACRI,OAAOH;IACT;AACF;AAEA,eAAeC,WAAWG,IAAY,EAAEC,OAAgB,EAAEC,cAAsB;IAC9E,MAAMC,qBAAqBC,KAAKC,SAAS,CAACJ,SAAS,MAAM;IACzD,MAAMK,OAAOzB,WAAW,QAAQ0B,MAAM,CAACJ,oBAAoBK,MAAM,CAAC;IAClE,MAAMC,WAAW,GAAGH,KAAKI,KAAK,CAAC,GAAG,KAAKR,gBAAgB;IAEvD,yHAAyH;IACzH,MAAMpB,UAAUC,KAAKiB,MAAMS,WAAWN;IAEtC,OAAOM;AACT"}
|
|
@@ -2,17 +2,29 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import fs from 'node:fs/promises';
|
|
3
3
|
import { subdebug } from '@sanity/cli-core';
|
|
4
4
|
import { parse as parseJsonc } from 'jsonc-parser';
|
|
5
|
+
import { parse as parseToml } from 'smol-toml';
|
|
5
6
|
import { EDITOR_CONFIGS } from './editorConfigs.js';
|
|
6
7
|
const debug = subdebug('mcp:detectAvailableEditors');
|
|
7
8
|
/**
|
|
8
|
-
* Safely parse
|
|
9
|
+
* Safely parse config file content
|
|
9
10
|
* Returns parsed config or null if unparseable
|
|
10
|
-
*/ function parseConfig(content) {
|
|
11
|
+
*/ function parseConfig(content, format) {
|
|
11
12
|
const trimmed = content.trim();
|
|
12
13
|
if (trimmed === '') {
|
|
13
14
|
return {} // Empty file - safe to write, treat as empty config
|
|
14
15
|
;
|
|
15
16
|
}
|
|
17
|
+
if (format === 'toml') {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = parseToml(content);
|
|
20
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return parsed;
|
|
24
|
+
} catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
16
28
|
const errors = [];
|
|
17
29
|
const parsed = parseJsonc(content, errors, {
|
|
18
30
|
allowTrailingComma: true
|
|
@@ -27,7 +39,7 @@ const debug = subdebug('mcp:detectAvailableEditors');
|
|
|
27
39
|
* Check if an editor's config is usable and whether Sanity MCP is already configured.
|
|
28
40
|
* Returns null only if config exists but can't be parsed (to avoid data loss).
|
|
29
41
|
*/ async function checkEditorConfig(name, configPath) {
|
|
30
|
-
const { configKey } = EDITOR_CONFIGS[name];
|
|
42
|
+
const { configKey, format } = EDITOR_CONFIGS[name];
|
|
31
43
|
// Config file doesn't exist - can create it
|
|
32
44
|
if (!existsSync(configPath)) {
|
|
33
45
|
return {
|
|
@@ -39,7 +51,7 @@ const debug = subdebug('mcp:detectAvailableEditors');
|
|
|
39
51
|
// Config exists - try to parse it
|
|
40
52
|
try {
|
|
41
53
|
const content = await fs.readFile(configPath, 'utf8');
|
|
42
|
-
const config = parseConfig(content);
|
|
54
|
+
const config = parseConfig(content, format);
|
|
43
55
|
if (config === null) {
|
|
44
56
|
debug('Skipping %s: could not parse %s', name, configPath);
|
|
45
57
|
return null // Can't parse - skip this editor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/mcp/detectAvailableEditors.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport fs from 'node:fs/promises'\n\nimport {subdebug} from '@sanity/cli-core'\nimport {type ParseError, parse as parseJsonc} from 'jsonc-parser'\n\nimport {EDITOR_CONFIGS, type EditorName} from './editorConfigs.js'\n\nconst debug = subdebug('mcp:detectAvailableEditors')\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/mcp/detectAvailableEditors.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport fs from 'node:fs/promises'\n\nimport {subdebug} from '@sanity/cli-core'\nimport {type ParseError, parse as parseJsonc} from 'jsonc-parser'\nimport {parse as parseToml} from 'smol-toml'\n\nimport {EDITOR_CONFIGS, type EditorName} from './editorConfigs.js'\n\nconst debug = subdebug('mcp:detectAvailableEditors')\n\ninterface Editor {\n configPath: string\n /** Whether Sanity MCP is already configured for this editor */\n configured: boolean\n name: EditorName\n}\n\ninterface MCPConfig {\n [key: string]: Record<string, unknown> | undefined\n}\n\n/**\n * Safely parse config file content\n * Returns parsed config or null if unparseable\n */\nfunction parseConfig(content: string, format: 'jsonc' | 'toml'): MCPConfig | null {\n const trimmed = content.trim()\n if (trimmed === '') {\n return {} // Empty file - safe to write, treat as empty config\n }\n\n if (format === 'toml') {\n try {\n const parsed = parseToml(content)\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return null\n }\n\n return parsed as MCPConfig\n } catch {\n return null\n }\n }\n\n const errors: ParseError[] = []\n const parsed = parseJsonc(content, errors, {allowTrailingComma: true})\n\n if (errors.length > 0 || typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return null // Parse failed\n }\n\n return parsed as MCPConfig\n}\n\n/**\n * Check if an editor's config is usable and whether Sanity MCP is already configured.\n * Returns null only if config exists but can't be parsed (to avoid data loss).\n */\nasync function checkEditorConfig(name: EditorName, configPath: string): Promise<Editor | null> {\n const {configKey, format} = EDITOR_CONFIGS[name]\n\n // Config file doesn't exist - can create it\n if (!existsSync(configPath)) {\n return {configPath, configured: false, name}\n }\n\n // Config exists - try to parse it\n try {\n const content = await fs.readFile(configPath, 'utf8')\n const config = parseConfig(content, format)\n\n if (config === null) {\n debug('Skipping %s: could not parse %s', name, configPath)\n return null // Can't parse - skip this editor\n }\n\n // Check if Sanity MCP is already configured\n const configured = Boolean(config[configKey]?.Sanity)\n\n return {configPath, configured, name}\n } catch (err) {\n debug('Skipping %s: could not read %s: %s', name, configPath, err)\n return null\n }\n}\n\n/**\n * Detect which editors are installed and have parseable configs.\n * Editors with unparseable configs are skipped to avoid data loss.\n */\nexport async function detectAvailableEditors(): Promise<Editor[]> {\n const editors: Editor[] = []\n\n for (const [name, config] of Object.entries(EDITOR_CONFIGS)) {\n const configPath = await config.detect()\n if (configPath) {\n const editor = await checkEditorConfig(name as EditorName, configPath)\n if (editor) editors.push(editor)\n }\n }\n\n return editors\n}\n"],"names":["existsSync","fs","subdebug","parse","parseJsonc","parseToml","EDITOR_CONFIGS","debug","parseConfig","content","format","trimmed","trim","parsed","Array","isArray","errors","allowTrailingComma","length","checkEditorConfig","name","configPath","configKey","configured","readFile","config","Boolean","Sanity","err","detectAvailableEditors","editors","Object","entries","detect","editor","push"],"mappings":"AAAA,SAAQA,UAAU,QAAO,UAAS;AAClC,OAAOC,QAAQ,mBAAkB;AAEjC,SAAQC,QAAQ,QAAO,mBAAkB;AACzC,SAAyBC,SAASC,UAAU,QAAO,eAAc;AACjE,SAAQD,SAASE,SAAS,QAAO,YAAW;AAE5C,SAAQC,cAAc,QAAwB,qBAAoB;AAElE,MAAMC,QAAQL,SAAS;AAavB;;;CAGC,GACD,SAASM,YAAYC,OAAe,EAAEC,MAAwB;IAC5D,MAAMC,UAAUF,QAAQG,IAAI;IAC5B,IAAID,YAAY,IAAI;QAClB,OAAO,CAAC,EAAE,oDAAoD;;IAChE;IAEA,IAAID,WAAW,QAAQ;QACrB,IAAI;YACF,MAAMG,SAASR,UAAUI;YACzB,IAAI,OAAOI,WAAW,YAAYA,WAAW,QAAQC,MAAMC,OAAO,CAACF,SAAS;gBAC1E,OAAO;YACT;YAEA,OAAOA;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEA,MAAMG,SAAuB,EAAE;IAC/B,MAAMH,SAAST,WAAWK,SAASO,QAAQ;QAACC,oBAAoB;IAAI;IAEpE,IAAID,OAAOE,MAAM,GAAG,KAAK,OAAOL,WAAW,YAAYA,WAAW,QAAQC,MAAMC,OAAO,CAACF,SAAS;QAC/F,OAAO,KAAK,eAAe;;IAC7B;IAEA,OAAOA;AACT;AAEA;;;CAGC,GACD,eAAeM,kBAAkBC,IAAgB,EAAEC,UAAkB;IACnE,MAAM,EAACC,SAAS,EAAEZ,MAAM,EAAC,GAAGJ,cAAc,CAACc,KAAK;IAEhD,4CAA4C;IAC5C,IAAI,CAACpB,WAAWqB,aAAa;QAC3B,OAAO;YAACA;YAAYE,YAAY;YAAOH;QAAI;IAC7C;IAEA,kCAAkC;IAClC,IAAI;QACF,MAAMX,UAAU,MAAMR,GAAGuB,QAAQ,CAACH,YAAY;QAC9C,MAAMI,SAASjB,YAAYC,SAASC;QAEpC,IAAIe,WAAW,MAAM;YACnBlB,MAAM,mCAAmCa,MAAMC;YAC/C,OAAO,KAAK,iCAAiC;;QAC/C;QAEA,4CAA4C;QAC5C,MAAME,aAAaG,QAAQD,MAAM,CAACH,UAAU,EAAEK;QAE9C,OAAO;YAACN;YAAYE;YAAYH;QAAI;IACtC,EAAE,OAAOQ,KAAK;QACZrB,MAAM,sCAAsCa,MAAMC,YAAYO;QAC9D,OAAO;IACT;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeC;IACpB,MAAMC,UAAoB,EAAE;IAE5B,KAAK,MAAM,CAACV,MAAMK,OAAO,IAAIM,OAAOC,OAAO,CAAC1B,gBAAiB;QAC3D,MAAMe,aAAa,MAAMI,OAAOQ,MAAM;QACtC,IAAIZ,YAAY;YACd,MAAMa,SAAS,MAAMf,kBAAkBC,MAAoBC;YAC3D,IAAIa,QAAQJ,QAAQK,IAAI,CAACD;QAC3B;IACF;IAEA,OAAOJ;AACT"}
|
|
@@ -30,7 +30,33 @@ const homeDir = os.homedir();
|
|
|
30
30
|
} catch {
|
|
31
31
|
return null;
|
|
32
32
|
}
|
|
33
|
-
}
|
|
33
|
+
},
|
|
34
|
+
format: 'jsonc'
|
|
35
|
+
},
|
|
36
|
+
'Codex CLI': {
|
|
37
|
+
buildServerConfig: (token)=>({
|
|
38
|
+
http_headers: {
|
|
39
|
+
Authorization: `Bearer ${token}`
|
|
40
|
+
},
|
|
41
|
+
type: 'http',
|
|
42
|
+
url: MCP_SERVER_URL
|
|
43
|
+
}),
|
|
44
|
+
configKey: 'mcp_servers',
|
|
45
|
+
detect: async ()=>{
|
|
46
|
+
try {
|
|
47
|
+
await execa('codex', [
|
|
48
|
+
'--version'
|
|
49
|
+
], {
|
|
50
|
+
stdio: 'pipe',
|
|
51
|
+
timeout: 5000
|
|
52
|
+
});
|
|
53
|
+
const codexHome = process.env.CODEX_HOME || path.join(homeDir, '.codex');
|
|
54
|
+
return path.join(codexHome, 'config.toml');
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
format: 'toml'
|
|
34
60
|
},
|
|
35
61
|
Cursor: {
|
|
36
62
|
buildServerConfig: defaultHttpConfig,
|
|
@@ -38,7 +64,35 @@ const homeDir = os.homedir();
|
|
|
38
64
|
detect: async ()=>{
|
|
39
65
|
const cursorDir = path.join(homeDir, '.cursor');
|
|
40
66
|
return existsSync(cursorDir) ? path.join(cursorDir, 'mcp.json') : null;
|
|
41
|
-
}
|
|
67
|
+
},
|
|
68
|
+
format: 'jsonc'
|
|
69
|
+
},
|
|
70
|
+
'Gemini CLI': {
|
|
71
|
+
buildServerConfig: defaultHttpConfig,
|
|
72
|
+
configKey: 'mcpServers',
|
|
73
|
+
detect: async ()=>{
|
|
74
|
+
const geminiDir = path.join(homeDir, '.gemini');
|
|
75
|
+
return existsSync(geminiDir) ? path.join(geminiDir, 'settings.json') : null;
|
|
76
|
+
},
|
|
77
|
+
format: 'jsonc'
|
|
78
|
+
},
|
|
79
|
+
'GitHub Copilot CLI': {
|
|
80
|
+
buildServerConfig: (token)=>({
|
|
81
|
+
headers: {
|
|
82
|
+
Authorization: `Bearer ${token}`
|
|
83
|
+
},
|
|
84
|
+
tools: [
|
|
85
|
+
'*'
|
|
86
|
+
],
|
|
87
|
+
type: 'http',
|
|
88
|
+
url: MCP_SERVER_URL
|
|
89
|
+
}),
|
|
90
|
+
configKey: 'mcpServers',
|
|
91
|
+
detect: async ()=>{
|
|
92
|
+
const copilotDir = process.platform === 'linux' && process.env.XDG_CONFIG_HOME ? path.join(process.env.XDG_CONFIG_HOME, 'copilot') : path.join(homeDir, '.copilot');
|
|
93
|
+
return existsSync(copilotDir) ? path.join(copilotDir, 'mcp-config.json') : null;
|
|
94
|
+
},
|
|
95
|
+
format: 'jsonc'
|
|
42
96
|
},
|
|
43
97
|
OpenCode: {
|
|
44
98
|
buildServerConfig: (token)=>({
|
|
@@ -61,7 +115,8 @@ const homeDir = os.homedir();
|
|
|
61
115
|
} catch {
|
|
62
116
|
return null;
|
|
63
117
|
}
|
|
64
|
-
}
|
|
118
|
+
},
|
|
119
|
+
format: 'jsonc'
|
|
65
120
|
},
|
|
66
121
|
'VS Code': {
|
|
67
122
|
buildServerConfig: defaultHttpConfig,
|
|
@@ -87,7 +142,8 @@ const homeDir = os.homedir();
|
|
|
87
142
|
}
|
|
88
143
|
}
|
|
89
144
|
return configDir && existsSync(configDir) ? path.join(configDir, 'mcp.json') : null;
|
|
90
|
-
}
|
|
145
|
+
},
|
|
146
|
+
format: 'jsonc'
|
|
91
147
|
},
|
|
92
148
|
'VS Code Insiders': {
|
|
93
149
|
buildServerConfig: defaultHttpConfig,
|
|
@@ -113,7 +169,8 @@ const homeDir = os.homedir();
|
|
|
113
169
|
}
|
|
114
170
|
}
|
|
115
171
|
return configDir && existsSync(configDir) ? path.join(configDir, 'mcp.json') : null;
|
|
116
|
-
}
|
|
172
|
+
},
|
|
173
|
+
format: 'jsonc'
|
|
117
174
|
},
|
|
118
175
|
Zed: {
|
|
119
176
|
buildServerConfig: (token)=>({
|
|
@@ -140,7 +197,8 @@ const homeDir = os.homedir();
|
|
|
140
197
|
}
|
|
141
198
|
}
|
|
142
199
|
return configDir && existsSync(configDir) ? path.join(configDir, 'settings.json') : null;
|
|
143
|
-
}
|
|
200
|
+
},
|
|
201
|
+
format: 'jsonc'
|
|
144
202
|
}
|
|
145
203
|
};
|
|
146
204
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/mcp/editorConfigs.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport {execa} from 'execa'\n\nimport {MCP_SERVER_URL} from '../../services/mcp.js'\n\ninterface EditorConfig {\n buildServerConfig: (token: string) => Record<string, unknown>\n configKey: string\n /** Returns the config file path if editor is detected, null otherwise */\n detect: () => Promise<string | null>\n}\n\nconst defaultHttpConfig = (token: string) => ({\n headers: {Authorization: `Bearer ${token}`},\n type: 'http',\n url: MCP_SERVER_URL,\n})\n\nconst homeDir = os.homedir()\n\n/**\n * Centralized editor configuration including detection logic.\n * To add a new editor: add an entry here - EditorName type is derived automatically.\n */\nexport const EDITOR_CONFIGS = {\n 'Claude Code': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'mcpServers',\n detect: async () => {\n try {\n await execa('claude', ['--version'], {stdio: 'pipe', timeout: 5000})\n return path.join(homeDir, '.claude.json')\n } catch {\n return null\n }\n },\n },\n Cursor: {\n buildServerConfig: defaultHttpConfig,\n configKey: 'mcpServers',\n detect: async () => {\n const cursorDir = path.join(homeDir, '.cursor')\n return existsSync(cursorDir) ? path.join(cursorDir, 'mcp.json') : null\n },\n },\n OpenCode: {\n buildServerConfig: (token) => ({\n headers: {Authorization: `Bearer ${token}`},\n type: 'remote',\n url: MCP_SERVER_URL,\n }),\n configKey: 'mcp',\n detect: async () => {\n try {\n await execa('opencode', ['--version'], {stdio: 'pipe', timeout: 5000})\n return path.join(homeDir, '.config/opencode/opencode.json')\n } catch {\n return null\n }\n },\n },\n 'VS Code': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'servers',\n detect: async () => {\n let configDir: string | null = null\n switch (process.platform) {\n case 'darwin': {\n configDir = path.join(homeDir, 'Library/Application Support/Code/User')\n break\n }\n case 'win32': {\n if (process.env.APPDATA) {\n configDir = path.join(process.env.APPDATA, 'Code/User')\n }\n break\n }\n default: {\n configDir = path.join(homeDir, '.config/Code/User')\n }\n }\n return configDir && existsSync(configDir) ? path.join(configDir, 'mcp.json') : null\n },\n },\n 'VS Code Insiders': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'servers',\n detect: async () => {\n let configDir: string | null = null\n switch (process.platform) {\n case 'darwin': {\n configDir = path.join(homeDir, 'Library/Application Support/Code - Insiders/User')\n break\n }\n case 'win32': {\n if (process.env.APPDATA) {\n configDir = path.join(process.env.APPDATA, 'Code - Insiders/User')\n }\n break\n }\n default: {\n configDir = path.join(homeDir, '.config/Code - Insiders/User')\n }\n }\n return configDir && existsSync(configDir) ? path.join(configDir, 'mcp.json') : null\n },\n },\n Zed: {\n buildServerConfig: (token) => ({\n headers: {Authorization: `Bearer ${token}`},\n settings: {},\n url: MCP_SERVER_URL,\n }),\n configKey: 'context_servers',\n detect: async () => {\n let configDir: string | null = null\n switch (process.platform) {\n case 'win32': {\n if (process.env.APPDATA) {\n configDir = path.join(process.env.APPDATA, 'Zed')\n }\n break\n }\n default: {\n configDir = path.join(homeDir, '.config/zed')\n }\n }\n return configDir && existsSync(configDir) ? path.join(configDir, 'settings.json') : null\n },\n },\n} satisfies Record<string, EditorConfig>\n\n/** Derived from EDITOR_CONFIGS keys - add a new editor there and this updates automatically */\nexport type EditorName = keyof typeof EDITOR_CONFIGS\n"],"names":["existsSync","os","path","execa","MCP_SERVER_URL","defaultHttpConfig","token","headers","Authorization","type","url","homeDir","homedir","EDITOR_CONFIGS","buildServerConfig","configKey","detect","stdio","timeout","join","Cursor","cursorDir","
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/mcp/editorConfigs.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport {execa} from 'execa'\n\nimport {MCP_SERVER_URL} from '../../services/mcp.js'\n\ninterface EditorConfig {\n buildServerConfig: (token: string) => Record<string, unknown>\n configKey: string\n /** Returns the config file path if editor is detected, null otherwise */\n detect: () => Promise<string | null>\n format: 'jsonc' | 'toml'\n}\n\nconst defaultHttpConfig = (token: string) => ({\n headers: {Authorization: `Bearer ${token}`},\n type: 'http',\n url: MCP_SERVER_URL,\n})\n\nconst homeDir = os.homedir()\n\n/**\n * Centralized editor configuration including detection logic.\n * To add a new editor: add an entry here - EditorName type is derived automatically.\n */\nexport const EDITOR_CONFIGS = {\n 'Claude Code': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'mcpServers',\n detect: async () => {\n try {\n await execa('claude', ['--version'], {stdio: 'pipe', timeout: 5000})\n return path.join(homeDir, '.claude.json')\n } catch {\n return null\n }\n },\n format: 'jsonc',\n },\n 'Codex CLI': {\n buildServerConfig: (token) => ({\n http_headers: {Authorization: `Bearer ${token}`},\n type: 'http',\n url: MCP_SERVER_URL,\n }),\n configKey: 'mcp_servers',\n detect: async () => {\n try {\n await execa('codex', ['--version'], {stdio: 'pipe', timeout: 5000})\n const codexHome = process.env.CODEX_HOME || path.join(homeDir, '.codex')\n return path.join(codexHome, 'config.toml')\n } catch {\n return null\n }\n },\n format: 'toml',\n },\n Cursor: {\n buildServerConfig: defaultHttpConfig,\n configKey: 'mcpServers',\n detect: async () => {\n const cursorDir = path.join(homeDir, '.cursor')\n return existsSync(cursorDir) ? path.join(cursorDir, 'mcp.json') : null\n },\n format: 'jsonc',\n },\n 'Gemini CLI': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'mcpServers',\n detect: async () => {\n const geminiDir = path.join(homeDir, '.gemini')\n return existsSync(geminiDir) ? path.join(geminiDir, 'settings.json') : null\n },\n format: 'jsonc',\n },\n 'GitHub Copilot CLI': {\n buildServerConfig: (token: string) => ({\n headers: {Authorization: `Bearer ${token}`},\n tools: ['*'],\n type: 'http',\n url: MCP_SERVER_URL,\n }),\n configKey: 'mcpServers',\n detect: async () => {\n const copilotDir =\n process.platform === 'linux' && process.env.XDG_CONFIG_HOME\n ? path.join(process.env.XDG_CONFIG_HOME, 'copilot')\n : path.join(homeDir, '.copilot')\n return existsSync(copilotDir) ? path.join(copilotDir, 'mcp-config.json') : null\n },\n format: 'jsonc',\n },\n OpenCode: {\n buildServerConfig: (token) => ({\n headers: {Authorization: `Bearer ${token}`},\n type: 'remote',\n url: MCP_SERVER_URL,\n }),\n configKey: 'mcp',\n detect: async () => {\n try {\n await execa('opencode', ['--version'], {stdio: 'pipe', timeout: 5000})\n return path.join(homeDir, '.config/opencode/opencode.json')\n } catch {\n return null\n }\n },\n format: 'jsonc',\n },\n 'VS Code': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'servers',\n detect: async () => {\n let configDir: string | null = null\n switch (process.platform) {\n case 'darwin': {\n configDir = path.join(homeDir, 'Library/Application Support/Code/User')\n break\n }\n case 'win32': {\n if (process.env.APPDATA) {\n configDir = path.join(process.env.APPDATA, 'Code/User')\n }\n break\n }\n default: {\n configDir = path.join(homeDir, '.config/Code/User')\n }\n }\n return configDir && existsSync(configDir) ? path.join(configDir, 'mcp.json') : null\n },\n format: 'jsonc',\n },\n 'VS Code Insiders': {\n buildServerConfig: defaultHttpConfig,\n configKey: 'servers',\n detect: async () => {\n let configDir: string | null = null\n switch (process.platform) {\n case 'darwin': {\n configDir = path.join(homeDir, 'Library/Application Support/Code - Insiders/User')\n break\n }\n case 'win32': {\n if (process.env.APPDATA) {\n configDir = path.join(process.env.APPDATA, 'Code - Insiders/User')\n }\n break\n }\n default: {\n configDir = path.join(homeDir, '.config/Code - Insiders/User')\n }\n }\n return configDir && existsSync(configDir) ? path.join(configDir, 'mcp.json') : null\n },\n format: 'jsonc',\n },\n Zed: {\n buildServerConfig: (token) => ({\n headers: {Authorization: `Bearer ${token}`},\n settings: {},\n url: MCP_SERVER_URL,\n }),\n configKey: 'context_servers',\n detect: async () => {\n let configDir: string | null = null\n switch (process.platform) {\n case 'win32': {\n if (process.env.APPDATA) {\n configDir = path.join(process.env.APPDATA, 'Zed')\n }\n break\n }\n default: {\n configDir = path.join(homeDir, '.config/zed')\n }\n }\n return configDir && existsSync(configDir) ? path.join(configDir, 'settings.json') : null\n },\n format: 'jsonc',\n },\n} satisfies Record<string, EditorConfig>\n\n/** Derived from EDITOR_CONFIGS keys - add a new editor there and this updates automatically */\nexport type EditorName = keyof typeof EDITOR_CONFIGS\n"],"names":["existsSync","os","path","execa","MCP_SERVER_URL","defaultHttpConfig","token","headers","Authorization","type","url","homeDir","homedir","EDITOR_CONFIGS","buildServerConfig","configKey","detect","stdio","timeout","join","format","http_headers","codexHome","process","env","CODEX_HOME","Cursor","cursorDir","geminiDir","tools","copilotDir","platform","XDG_CONFIG_HOME","OpenCode","configDir","APPDATA","Zed","settings"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/mcp/setupMCP.ts"],"sourcesContent":["import {ux} from '@oclif/core'\nimport {subdebug} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\n\nimport {createMCPToken, MCP_SERVER_URL} from '../../services/mcp.js'\nimport {detectAvailableEditors} from './detectAvailableEditors.js'\nimport {type EditorName} from './editorConfigs.js'\nimport {promptForMCPSetup} from './promptForMCPSetup.js'\nimport {writeMCPConfig} from './writeMCPConfig.js'\n\nconst mcpDebug = subdebug('mcp:setup')\n\nconst NO_EDITORS_DETECTED_MESSAGE = `Couldn't auto-configure Sanity MCP server for your editor. Visit ${MCP_SERVER_URL} for setup instructions.`\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/mcp/setupMCP.ts"],"sourcesContent":["import {ux} from '@oclif/core'\nimport {subdebug} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\n\nimport {createMCPToken, MCP_SERVER_URL} from '../../services/mcp.js'\nimport {detectAvailableEditors} from './detectAvailableEditors.js'\nimport {type EditorName} from './editorConfigs.js'\nimport {promptForMCPSetup} from './promptForMCPSetup.js'\nimport {writeMCPConfig} from './writeMCPConfig.js'\n\nconst mcpDebug = subdebug('mcp:setup')\n\nconst NO_EDITORS_DETECTED_MESSAGE = `Couldn't auto-configure Sanity MCP server for your editor. Visit ${MCP_SERVER_URL} for setup instructions.`\n\ninterface MCPSetupResult {\n configuredEditors: EditorName[]\n detectedEditors: EditorName[]\n skipped: boolean\n\n error?: Error\n}\n\n/**\n * Main MCP setup orchestration\n * Opt-out by default: runs automatically unless skipMcp flag is set\n */\nexport async function setupMCP(mcp?: boolean): Promise<MCPSetupResult> {\n // 1. Check for explicit opt-out\n if (mcp === false) {\n ux.warn('Skipping MCP configuration due to --no-mcp flag')\n return {\n configuredEditors: [],\n detectedEditors: [],\n skipped: true,\n }\n }\n\n // 2. Detect available editors (filters out unparseable configs)\n const editors = await detectAvailableEditors()\n const detectedEditors = editors.map((e) => e.name)\n\n mcpDebug('Detected %d editors: %s', detectedEditors.length, detectedEditors)\n\n if (editors.length === 0) {\n ux.warn(NO_EDITORS_DETECTED_MESSAGE)\n return {\n configuredEditors: [],\n detectedEditors,\n skipped: true,\n }\n }\n\n // 3. Prompt user (shows existing config status, only pre-selects unconfigured editors)\n const selected = await promptForMCPSetup(editors)\n\n if (!selected || selected.length === 0) {\n // User deselected all editors\n ux.stdout('MCP configuration skipped')\n return {\n configuredEditors: [],\n detectedEditors,\n skipped: true,\n }\n }\n\n // 4. Create child token for MCP\n let token: string\n try {\n token = await createMCPToken()\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n mcpDebug('Error creating MCP token', error)\n ux.warn(`Could not configure MCP: ${err.message}`)\n ux.warn('You can set up MCP manually later using https://mcp.sanity.io')\n return {\n configuredEditors: [],\n detectedEditors,\n error: err,\n skipped: false,\n }\n }\n\n // 5. Write configs for each selected editor\n try {\n for (const editor of selected) {\n await writeMCPConfig(editor, token)\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n mcpDebug('Error writing MCP config', error)\n ux.warn(`Could not configure MCP: ${err.message}`)\n ux.warn('You can set up MCP manually later using https://mcp.sanity.io')\n return {\n configuredEditors: [],\n detectedEditors,\n error: err,\n skipped: false,\n }\n }\n\n const configuredEditors = selected.map((e) => e.name)\n ux.stdout(`${logSymbols.success} MCP configured for ${configuredEditors.join(', ')}`)\n\n return {\n configuredEditors,\n detectedEditors,\n skipped: false,\n }\n}\n"],"names":["ux","subdebug","logSymbols","createMCPToken","MCP_SERVER_URL","detectAvailableEditors","promptForMCPSetup","writeMCPConfig","mcpDebug","NO_EDITORS_DETECTED_MESSAGE","setupMCP","mcp","warn","configuredEditors","detectedEditors","skipped","editors","map","e","name","length","selected","stdout","token","error","err","Error","String","message","editor","success","join"],"mappings":"AAAA,SAAQA,EAAE,QAAO,cAAa;AAC9B,SAAQC,QAAQ,QAAO,mBAAkB;AACzC,SAAQC,UAAU,QAAO,sBAAqB;AAE9C,SAAQC,cAAc,EAAEC,cAAc,QAAO,wBAAuB;AACpE,SAAQC,sBAAsB,QAAO,8BAA6B;AAElE,SAAQC,iBAAiB,QAAO,yBAAwB;AACxD,SAAQC,cAAc,QAAO,sBAAqB;AAElD,MAAMC,WAAWP,SAAS;AAE1B,MAAMQ,8BAA8B,CAAC,iEAAiE,EAAEL,eAAe,wBAAwB,CAAC;AAUhJ;;;CAGC,GACD,OAAO,eAAeM,SAASC,GAAa;IAC1C,gCAAgC;IAChC,IAAIA,QAAQ,OAAO;QACjBX,GAAGY,IAAI,CAAC;QACR,OAAO;YACLC,mBAAmB,EAAE;YACrBC,iBAAiB,EAAE;YACnBC,SAAS;QACX;IACF;IAEA,gEAAgE;IAChE,MAAMC,UAAU,MAAMX;IACtB,MAAMS,kBAAkBE,QAAQC,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;IAEjDX,SAAS,2BAA2BM,gBAAgBM,MAAM,EAAEN;IAE5D,IAAIE,QAAQI,MAAM,KAAK,GAAG;QACxBpB,GAAGY,IAAI,CAACH;QACR,OAAO;YACLI,mBAAmB,EAAE;YACrBC;YACAC,SAAS;QACX;IACF;IAEA,uFAAuF;IACvF,MAAMM,WAAW,MAAMf,kBAAkBU;IAEzC,IAAI,CAACK,YAAYA,SAASD,MAAM,KAAK,GAAG;QACtC,8BAA8B;QAC9BpB,GAAGsB,MAAM,CAAC;QACV,OAAO;YACLT,mBAAmB,EAAE;YACrBC;YACAC,SAAS;QACX;IACF;IAEA,gCAAgC;IAChC,IAAIQ;IACJ,IAAI;QACFA,QAAQ,MAAMpB;IAChB,EAAE,OAAOqB,OAAO;QACd,MAAMC,MAAMD,iBAAiBE,QAAQF,QAAQ,IAAIE,MAAMC,OAAOH;QAC9DhB,SAAS,4BAA4BgB;QACrCxB,GAAGY,IAAI,CAAC,CAAC,yBAAyB,EAAEa,IAAIG,OAAO,EAAE;QACjD5B,GAAGY,IAAI,CAAC;QACR,OAAO;YACLC,mBAAmB,EAAE;YACrBC;YACAU,OAAOC;YACPV,SAAS;QACX;IACF;IAEA,4CAA4C;IAC5C,IAAI;QACF,KAAK,MAAMc,UAAUR,SAAU;YAC7B,MAAMd,eAAesB,QAAQN;QAC/B;IACF,EAAE,OAAOC,OAAO;QACd,MAAMC,MAAMD,iBAAiBE,QAAQF,QAAQ,IAAIE,MAAMC,OAAOH;QAC9DhB,SAAS,4BAA4BgB;QACrCxB,GAAGY,IAAI,CAAC,CAAC,yBAAyB,EAAEa,IAAIG,OAAO,EAAE;QACjD5B,GAAGY,IAAI,CAAC;QACR,OAAO;YACLC,mBAAmB,EAAE;YACrBC;YACAU,OAAOC;YACPV,SAAS;QACX;IACF;IAEA,MAAMF,oBAAoBQ,SAASJ,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;IACpDnB,GAAGsB,MAAM,CAAC,GAAGpB,WAAW4B,OAAO,CAAC,oBAAoB,EAAEjB,kBAAkBkB,IAAI,CAAC,OAAO;IAEpF,OAAO;QACLlB;QACAC;QACAC,SAAS;IACX;AACF"}
|
|
@@ -2,6 +2,7 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import fs from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { applyEdits, modify } from 'jsonc-parser';
|
|
5
|
+
import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
|
|
5
6
|
import { EDITOR_CONFIGS } from './editorConfigs.js';
|
|
6
7
|
/**
|
|
7
8
|
* Write MCP configuration to editor config file
|
|
@@ -10,27 +11,38 @@ import { EDITOR_CONFIGS } from './editorConfigs.js';
|
|
|
10
11
|
* Note: Config parseability is already validated in detectAvailableEditors()
|
|
11
12
|
*/ export async function writeMCPConfig(editor, token) {
|
|
12
13
|
const configPath = editor.configPath;
|
|
13
|
-
const { buildServerConfig, configKey } = EDITOR_CONFIGS[editor.name];
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const { buildServerConfig, configKey, format } = EDITOR_CONFIGS[editor.name];
|
|
15
|
+
const serverConfig = buildServerConfig(token);
|
|
16
|
+
// Read existing content or start with empty object/document
|
|
17
|
+
let content = format === 'toml' ? '' : '{}';
|
|
16
18
|
if (existsSync(configPath)) {
|
|
17
19
|
const fileContent = await fs.readFile(configPath, 'utf8');
|
|
18
20
|
if (fileContent.trim()) {
|
|
19
21
|
content = fileContent;
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
configKey
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
if (format === 'toml') {
|
|
25
|
+
const tomlConfig = content.trim() ? parseToml(content) : {};
|
|
26
|
+
const existingServers = tomlConfig[configKey];
|
|
27
|
+
tomlConfig[configKey] = {
|
|
28
|
+
...existingServers && typeof existingServers === 'object' ? existingServers : {},
|
|
29
|
+
Sanity: serverConfig
|
|
30
|
+
};
|
|
31
|
+
content = stringifyToml(tomlConfig);
|
|
32
|
+
} else {
|
|
33
|
+
// Modify using jsonc-parser - preserves comments
|
|
34
|
+
// Setting a nested path automatically creates intermediate objects
|
|
35
|
+
const edits = modify(content, [
|
|
36
|
+
configKey,
|
|
37
|
+
'Sanity'
|
|
38
|
+
], serverConfig, {
|
|
39
|
+
formattingOptions: {
|
|
40
|
+
insertSpaces: true,
|
|
41
|
+
tabSize: 2
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
content = applyEdits(content, edits);
|
|
45
|
+
}
|
|
34
46
|
// Ensure parent directory exists and write
|
|
35
47
|
await fs.mkdir(path.dirname(configPath), {
|
|
36
48
|
recursive: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/mcp/writeMCPConfig.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {applyEdits, modify} from 'jsonc-parser'\n\nimport {EDITOR_CONFIGS} from './editorConfigs.js'\nimport {Editor} from './types.js'\n\n/**\n * Write MCP configuration to editor config file\n * Uses jsonc-parser's modify/applyEdits to preserve comments\n *\n * Note: Config parseability is already validated in detectAvailableEditors()\n */\nexport async function writeMCPConfig(editor: Editor, token: string): Promise<void> {\n const configPath = editor.configPath\n const {buildServerConfig, configKey} = EDITOR_CONFIGS[editor.name]\n\n // Read existing content or start with empty object\n let content = '{}'\n if (existsSync(configPath)) {\n const fileContent = await fs.readFile(configPath, 'utf8')\n if (fileContent.trim()) {\n content = fileContent\n }\n }\n\n // Modify using jsonc-parser - preserves comments\n
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/mcp/writeMCPConfig.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {applyEdits, modify} from 'jsonc-parser'\nimport {parse as parseToml, stringify as stringifyToml} from 'smol-toml'\n\nimport {EDITOR_CONFIGS} from './editorConfigs.js'\nimport {Editor} from './types.js'\n\ninterface TomlConfig {\n [key: string]: Record<string, unknown> | undefined\n}\n\n/**\n * Write MCP configuration to editor config file\n * Uses jsonc-parser's modify/applyEdits to preserve comments\n *\n * Note: Config parseability is already validated in detectAvailableEditors()\n */\nexport async function writeMCPConfig(editor: Editor, token: string): Promise<void> {\n const configPath = editor.configPath\n const {buildServerConfig, configKey, format} = EDITOR_CONFIGS[editor.name]\n const serverConfig = buildServerConfig(token)\n\n // Read existing content or start with empty object/document\n let content = format === 'toml' ? '' : '{}'\n if (existsSync(configPath)) {\n const fileContent = await fs.readFile(configPath, 'utf8')\n if (fileContent.trim()) {\n content = fileContent\n }\n }\n\n if (format === 'toml') {\n const tomlConfig = content.trim() ? (parseToml(content) as TomlConfig) : {}\n const existingServers = tomlConfig[configKey]\n\n tomlConfig[configKey] = {\n ...(existingServers && typeof existingServers === 'object' ? existingServers : {}),\n Sanity: serverConfig,\n }\n\n content = stringifyToml(tomlConfig)\n } else {\n // Modify using jsonc-parser - preserves comments\n // Setting a nested path automatically creates intermediate objects\n const edits = modify(content, [configKey, 'Sanity'], serverConfig, {\n formattingOptions: {insertSpaces: true, tabSize: 2},\n })\n content = applyEdits(content, edits)\n }\n\n // Ensure parent directory exists and write\n await fs.mkdir(path.dirname(configPath), {recursive: true})\n await fs.writeFile(configPath, content, 'utf8')\n}\n"],"names":["existsSync","fs","path","applyEdits","modify","parse","parseToml","stringify","stringifyToml","EDITOR_CONFIGS","writeMCPConfig","editor","token","configPath","buildServerConfig","configKey","format","name","serverConfig","content","fileContent","readFile","trim","tomlConfig","existingServers","Sanity","edits","formattingOptions","insertSpaces","tabSize","mkdir","dirname","recursive","writeFile"],"mappings":"AAAA,SAAQA,UAAU,QAAO,UAAS;AAClC,OAAOC,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,UAAU,EAAEC,MAAM,QAAO,eAAc;AAC/C,SAAQC,SAASC,SAAS,EAAEC,aAAaC,aAAa,QAAO,YAAW;AAExE,SAAQC,cAAc,QAAO,qBAAoB;AAOjD;;;;;CAKC,GACD,OAAO,eAAeC,eAAeC,MAAc,EAAEC,KAAa;IAChE,MAAMC,aAAaF,OAAOE,UAAU;IACpC,MAAM,EAACC,iBAAiB,EAAEC,SAAS,EAAEC,MAAM,EAAC,GAAGP,cAAc,CAACE,OAAOM,IAAI,CAAC;IAC1E,MAAMC,eAAeJ,kBAAkBF;IAEvC,4DAA4D;IAC5D,IAAIO,UAAUH,WAAW,SAAS,KAAK;IACvC,IAAIhB,WAAWa,aAAa;QAC1B,MAAMO,cAAc,MAAMnB,GAAGoB,QAAQ,CAACR,YAAY;QAClD,IAAIO,YAAYE,IAAI,IAAI;YACtBH,UAAUC;QACZ;IACF;IAEA,IAAIJ,WAAW,QAAQ;QACrB,MAAMO,aAAaJ,QAAQG,IAAI,KAAMhB,UAAUa,WAA0B,CAAC;QAC1E,MAAMK,kBAAkBD,UAAU,CAACR,UAAU;QAE7CQ,UAAU,CAACR,UAAU,GAAG;YACtB,GAAIS,mBAAmB,OAAOA,oBAAoB,WAAWA,kBAAkB,CAAC,CAAC;YACjFC,QAAQP;QACV;QAEAC,UAAUX,cAAce;IAC1B,OAAO;QACL,iDAAiD;QACjD,mEAAmE;QACnE,MAAMG,QAAQtB,OAAOe,SAAS;YAACJ;YAAW;SAAS,EAAEG,cAAc;YACjES,mBAAmB;gBAACC,cAAc;gBAAMC,SAAS;YAAC;QACpD;QACAV,UAAUhB,WAAWgB,SAASO;IAChC;IAEA,2CAA2C;IAC3C,MAAMzB,GAAG6B,KAAK,CAAC5B,KAAK6B,OAAO,CAAClB,aAAa;QAACmB,WAAW;IAAI;IACzD,MAAM/B,GAAGgC,SAAS,CAACpB,YAAYM,SAAS;AAC1C"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
/**
|
|
3
|
+
* Stream an NDJSON file and build a Map from a key field to a value field.
|
|
4
|
+
*
|
|
5
|
+
* Only entries that contain the key field are indexed. If duplicate keys exist,
|
|
6
|
+
* the last entry wins.
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/ export async function buildNdjsonIndex(ndjson, keyField, valueField) {
|
|
10
|
+
const lines = readline.createInterface({
|
|
11
|
+
input: ndjson
|
|
12
|
+
});
|
|
13
|
+
const index = new Map();
|
|
14
|
+
try {
|
|
15
|
+
for await (const line of lines){
|
|
16
|
+
const trimmed = line.trim();
|
|
17
|
+
if (trimmed) {
|
|
18
|
+
const entry = JSON.parse(trimmed);
|
|
19
|
+
if (entry[keyField] != null) {
|
|
20
|
+
index.set(entry[keyField], entry[valueField]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
} finally{
|
|
25
|
+
lines.close();
|
|
26
|
+
// Explicitly destroy the underlying stream to prevent file descriptor leaks
|
|
27
|
+
ndjson.destroy();
|
|
28
|
+
}
|
|
29
|
+
return index;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=buildNdjsonIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/media/buildNdjsonIndex.ts"],"sourcesContent":["import readline from 'node:readline'\nimport {Readable} from 'node:stream'\n\n/**\n * Stream an NDJSON file and build a Map from a key field to a value field.\n *\n * Only entries that contain the key field are indexed. If duplicate keys exist,\n * the last entry wins.\n *\n * @internal\n */\nexport async function buildNdjsonIndex<Value = unknown>(\n ndjson: Readable,\n keyField: string,\n valueField: string,\n): Promise<Map<string, Value>> {\n const lines = readline.createInterface({\n input: ndjson,\n })\n\n const index = new Map<string, Value>()\n\n try {\n for await (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) {\n const entry = JSON.parse(trimmed)\n if (entry[keyField] != null) {\n index.set(entry[keyField], entry[valueField])\n }\n }\n }\n } finally {\n lines.close()\n // Explicitly destroy the underlying stream to prevent file descriptor leaks\n ndjson.destroy()\n }\n\n return index\n}\n"],"names":["readline","buildNdjsonIndex","ndjson","keyField","valueField","lines","createInterface","input","index","Map","line","trimmed","trim","entry","JSON","parse","set","close","destroy"],"mappings":"AAAA,OAAOA,cAAc,gBAAe;AAGpC;;;;;;;CAOC,GACD,OAAO,eAAeC,iBACpBC,MAAgB,EAChBC,QAAgB,EAChBC,UAAkB;IAElB,MAAMC,QAAQL,SAASM,eAAe,CAAC;QACrCC,OAAOL;IACT;IAEA,MAAMM,QAAQ,IAAIC;IAElB,IAAI;QACF,WAAW,MAAMC,QAAQL,MAAO;YAC9B,MAAMM,UAAUD,KAAKE,IAAI;YACzB,IAAID,SAAS;gBACX,MAAME,QAAQC,KAAKC,KAAK,CAACJ;gBACzB,IAAIE,KAAK,CAACV,SAAS,IAAI,MAAM;oBAC3BK,MAAMQ,GAAG,CAACH,KAAK,CAACV,SAAS,EAAEU,KAAK,CAACT,WAAW;gBAC9C;YACF;QACF;IACF,SAAU;QACRC,MAAMY,KAAK;QACX,4EAA4E;QAC5Ef,OAAOgB,OAAO;IAChB;IAEA,OAAOV;AACT"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { access, readdir } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { importModule } from '@sanity/cli-core';
|
|
4
4
|
import { validateMediaLibraryAssetAspect } from '@sanity/schema/_internal';
|
|
5
5
|
import { isAssetAspect } from '@sanity/types';
|
|
6
|
-
import { getTsconfig } from 'get-tsconfig';
|
|
7
|
-
import { tsImport } from 'tsx/esm/api';
|
|
8
6
|
/**
|
|
9
7
|
* File extensions that are considered valid aspect definition files
|
|
10
8
|
*/ const ASPECT_FILE_EXTENSIONS = new Set([
|
|
@@ -39,8 +37,6 @@ import { tsImport } from 'tsx/esm/api';
|
|
|
39
37
|
});
|
|
40
38
|
// Filter for valid aspect files
|
|
41
39
|
const aspectFiles = entries.filter((entry)=>entry.isFile() && ASPECT_FILE_EXTENSIONS.has(path.extname(entry.name)));
|
|
42
|
-
// Get tsconfig for TypeScript compilation
|
|
43
|
-
const tsconfig = getTsconfig(aspectsPath);
|
|
44
40
|
// Import and validate all aspect files
|
|
45
41
|
const aspects = [];
|
|
46
42
|
for (const file of aspectFiles){
|
|
@@ -48,12 +44,7 @@ import { tsImport } from 'tsx/esm/api';
|
|
|
48
44
|
const filePath = path.resolve(aspectsPath, filename);
|
|
49
45
|
try {
|
|
50
46
|
// Dynamically import the aspect file with TypeScript support
|
|
51
|
-
const
|
|
52
|
-
parentURL: import.meta.url,
|
|
53
|
-
tsconfig: tsconfig?.path
|
|
54
|
-
});
|
|
55
|
-
// Get the default export
|
|
56
|
-
const maybeAspect = tryGetDefaultExport(aspectModule);
|
|
47
|
+
const maybeAspect = await importModule(filePath);
|
|
57
48
|
// Check if user wants to filter this aspect
|
|
58
49
|
if (!filterAspects(maybeAspect)) {
|
|
59
50
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/media/importAspects.ts"],"sourcesContent":["import {access, readdir} from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/media/importAspects.ts"],"sourcesContent":["import {access, readdir} from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {importModule} from '@sanity/cli-core'\nimport {validateMediaLibraryAssetAspect} from '@sanity/schema/_internal'\nimport {\n isAssetAspect,\n type MediaLibraryAssetAspectDocument,\n type SchemaValidationProblem,\n} from '@sanity/types'\n\n/**\n * File extensions that are considered valid aspect definition files\n */\nconst ASPECT_FILE_EXTENSIONS = new Set(['.js', '.jsx', '.mjs', '.mts', '.ts', '.tsx'])\n\n/**\n * Type for an aspect that has been validated\n */\ninterface ValidAspect {\n aspect: MediaLibraryAssetAspectDocument\n filename: string\n status: 'valid'\n validationErrors: never[]\n}\n\n/**\n * Type for an aspect that failed validation\n */\ninterface InvalidAspect {\n aspect: unknown\n filename: string\n status: 'invalid'\n validationErrors: SchemaValidationProblem[][]\n}\n\n/**\n * Union type for aspect containers\n */\ntype AspectContainer = InvalidAspect | ValidAspect\n\n/**\n * Options for importing aspects\n */\ninterface ImportAspectsOptions {\n /**\n * Path to the directory containing aspect definition files\n */\n aspectsPath: string\n\n /**\n * Optional filter function to determine which aspects to include\n */\n filterAspects?: (aspect: unknown) => boolean\n}\n\n/**\n * Result of importing aspects, grouped by validation status\n */\ninterface ImportAspectsResult {\n invalid: InvalidAspect[]\n valid: ValidAspect[]\n}\n\n/**\n * Import and validate aspect definition files from a directory\n *\n * This function reads all TypeScript/JavaScript files from the specified directory,\n * dynamically imports them using tsx for TypeScript support, validates them,\n * and returns them grouped by validation status.\n *\n * @param options - Options for importing aspects\n * @returns Promise resolving to valid and invalid aspects\n * @internal\n */\nexport async function importAspects(options: ImportAspectsOptions): Promise<ImportAspectsResult> {\n const {aspectsPath, filterAspects = () => true} = options\n\n // Check if directory exists\n try {\n await access(aspectsPath)\n } catch {\n throw new Error(`Aspects directory does not exist: ${aspectsPath}`)\n }\n\n // Read directory entries\n const entries = await readdir(aspectsPath, {withFileTypes: true})\n\n // Filter for valid aspect files\n const aspectFiles = entries.filter(\n (entry) => entry.isFile() && ASPECT_FILE_EXTENSIONS.has(path.extname(entry.name)),\n )\n\n // Import and validate all aspect files\n const aspects: AspectContainer[] = []\n\n for (const file of aspectFiles) {\n const filename = file.name\n const filePath = path.resolve(aspectsPath, filename)\n\n try {\n // Dynamically import the aspect file with TypeScript support\n const maybeAspect = await importModule(filePath)\n\n // Check if user wants to filter this aspect\n if (!filterAspects(maybeAspect)) {\n continue\n }\n\n // Validate that it's an asset aspect\n if (!isAssetAspect(maybeAspect)) {\n aspects.push({\n aspect: maybeAspect,\n filename,\n status: 'invalid',\n validationErrors: [],\n })\n continue\n }\n\n // Validate the aspect schema\n const [valid, errors] = validateMediaLibraryAssetAspect(maybeAspect.definition)\n\n if (!valid) {\n aspects.push({\n aspect: maybeAspect,\n filename,\n status: 'invalid',\n validationErrors: errors,\n })\n continue\n }\n\n aspects.push({\n aspect: maybeAspect,\n filename,\n status: 'valid',\n validationErrors: [],\n })\n } catch (error) {\n aspects.push({\n aspect: null,\n filename,\n status: 'invalid',\n validationErrors: [\n [\n {\n message: `Failed to import file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n severity: 'error',\n },\n ],\n ],\n })\n }\n }\n\n // Group by validation status\n const result: ImportAspectsResult = {\n invalid: aspects.filter((a): a is InvalidAspect => a.status === 'invalid'),\n valid: aspects.filter((a): a is ValidAspect => a.status === 'valid'),\n }\n\n return result\n}\n"],"names":["access","readdir","path","importModule","validateMediaLibraryAssetAspect","isAssetAspect","ASPECT_FILE_EXTENSIONS","Set","importAspects","options","aspectsPath","filterAspects","Error","entries","withFileTypes","aspectFiles","filter","entry","isFile","has","extname","name","aspects","file","filename","filePath","resolve","maybeAspect","push","aspect","status","validationErrors","valid","errors","definition","error","message","severity","result","invalid","a"],"mappings":"AAAA,SAAQA,MAAM,EAAEC,OAAO,QAAO,mBAAkB;AAChD,OAAOC,UAAU,YAAW;AAE5B,SAAQC,YAAY,QAAO,mBAAkB;AAC7C,SAAQC,+BAA+B,QAAO,2BAA0B;AACxE,SACEC,aAAa,QAGR,gBAAe;AAEtB;;CAEC,GACD,MAAMC,yBAAyB,IAAIC,IAAI;IAAC;IAAO;IAAQ;IAAQ;IAAQ;IAAO;CAAO;AAkDrF;;;;;;;;;;CAUC,GACD,OAAO,eAAeC,cAAcC,OAA6B;IAC/D,MAAM,EAACC,WAAW,EAAEC,gBAAgB,IAAM,IAAI,EAAC,GAAGF;IAElD,4BAA4B;IAC5B,IAAI;QACF,MAAMT,OAAOU;IACf,EAAE,OAAM;QACN,MAAM,IAAIE,MAAM,CAAC,kCAAkC,EAAEF,aAAa;IACpE;IAEA,yBAAyB;IACzB,MAAMG,UAAU,MAAMZ,QAAQS,aAAa;QAACI,eAAe;IAAI;IAE/D,gCAAgC;IAChC,MAAMC,cAAcF,QAAQG,MAAM,CAChC,CAACC,QAAUA,MAAMC,MAAM,MAAMZ,uBAAuBa,GAAG,CAACjB,KAAKkB,OAAO,CAACH,MAAMI,IAAI;IAGjF,uCAAuC;IACvC,MAAMC,UAA6B,EAAE;IAErC,KAAK,MAAMC,QAAQR,YAAa;QAC9B,MAAMS,WAAWD,KAAKF,IAAI;QAC1B,MAAMI,WAAWvB,KAAKwB,OAAO,CAAChB,aAAac;QAE3C,IAAI;YACF,6DAA6D;YAC7D,MAAMG,cAAc,MAAMxB,aAAasB;YAEvC,4CAA4C;YAC5C,IAAI,CAACd,cAAcgB,cAAc;gBAC/B;YACF;YAEA,qCAAqC;YACrC,IAAI,CAACtB,cAAcsB,cAAc;gBAC/BL,QAAQM,IAAI,CAAC;oBACXC,QAAQF;oBACRH;oBACAM,QAAQ;oBACRC,kBAAkB,EAAE;gBACtB;gBACA;YACF;YAEA,6BAA6B;YAC7B,MAAM,CAACC,OAAOC,OAAO,GAAG7B,gCAAgCuB,YAAYO,UAAU;YAE9E,IAAI,CAACF,OAAO;gBACVV,QAAQM,IAAI,CAAC;oBACXC,QAAQF;oBACRH;oBACAM,QAAQ;oBACRC,kBAAkBE;gBACpB;gBACA;YACF;YAEAX,QAAQM,IAAI,CAAC;gBACXC,QAAQF;gBACRH;gBACAM,QAAQ;gBACRC,kBAAkB,EAAE;YACtB;QACF,EAAE,OAAOI,OAAO;YACdb,QAAQM,IAAI,CAAC;gBACXC,QAAQ;gBACRL;gBACAM,QAAQ;gBACRC,kBAAkB;oBAChB;wBACE;4BACEK,SAAS,CAAC,uBAAuB,EAAED,iBAAiBvB,QAAQuB,MAAMC,OAAO,GAAG,iBAAiB;4BAC7FC,UAAU;wBACZ;qBACD;iBACF;YACH;QACF;IACF;IAEA,6BAA6B;IAC7B,MAAMC,SAA8B;QAClCC,SAASjB,QAAQN,MAAM,CAAC,CAACwB,IAA0BA,EAAEV,MAAM,KAAK;QAChEE,OAAOV,QAAQN,MAAM,CAAC,CAACwB,IAAwBA,EAAEV,MAAM,KAAK;IAC9D;IAEA,OAAOQ;AACT"}
|