@sanity/cli 6.3.1 → 6.4.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 +311 -452
- package/dist/actions/build/decorateIndexWithStagingScript.js +16 -0
- package/dist/actions/build/decorateIndexWithStagingScript.js.map +1 -0
- package/dist/actions/build/writeSanityRuntime.js +3 -2
- package/dist/actions/build/writeSanityRuntime.js.map +1 -1
- package/dist/actions/dataset/create.js +4 -0
- package/dist/actions/dataset/create.js.map +1 -1
- package/dist/actions/deploy/findUserApplicationForApp.js +1 -0
- package/dist/actions/deploy/findUserApplicationForApp.js.map +1 -1
- package/dist/actions/deploy/types.js +1 -1
- package/dist/actions/deploy/types.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.js +16 -1
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/initApp.js +72 -0
- package/dist/actions/init/initApp.js.map +1 -0
- package/dist/actions/init/initHelpers.js +37 -0
- package/dist/actions/init/initHelpers.js.map +1 -0
- package/dist/actions/init/initNextJs.js +246 -0
- package/dist/actions/init/initNextJs.js.map +1 -0
- package/dist/actions/init/initStudio.js +127 -0
- package/dist/actions/init/initStudio.js.map +1 -0
- package/dist/actions/init/scaffoldTemplate.js +114 -0
- package/dist/actions/init/scaffoldTemplate.js.map +1 -0
- package/dist/actions/init/templates/appQuickstart.js +2 -1
- package/dist/actions/init/templates/appQuickstart.js.map +1 -1
- package/dist/actions/init/templates/appSanityUi.js +2 -1
- package/dist/actions/init/templates/appSanityUi.js.map +1 -1
- package/dist/actions/init/templates/nextjs/index.js +1 -2
- package/dist/actions/init/templates/nextjs/index.js.map +1 -1
- package/dist/actions/init/templates/shopify.js +6 -6
- package/dist/actions/init/templates/shopify.js.map +1 -1
- package/dist/actions/init/templates/shopifyOnline.js +2 -2
- package/dist/actions/init/templates/shopifyOnline.js.map +1 -1
- package/dist/actions/manifest/types.js +1 -1
- package/dist/actions/manifest/types.js.map +1 -1
- package/dist/actions/mcp/detectAvailableEditors.js +16 -3
- package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
- package/dist/actions/mcp/editorConfigs.js +192 -132
- package/dist/actions/mcp/editorConfigs.js.map +1 -1
- package/dist/actions/mcp/setupMCP.js +4 -1
- package/dist/actions/mcp/setupMCP.js.map +1 -1
- package/dist/actions/mcp/writeMCPConfig.js +2 -2
- package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
- package/dist/actions/schema/extractSchema.js +5 -7
- package/dist/actions/schema/extractSchema.js.map +1 -1
- package/dist/actions/schema/types.js +3 -3
- package/dist/actions/schema/types.js.map +1 -1
- package/dist/actions/users/validateEmail.js +2 -2
- package/dist/actions/users/validateEmail.js.map +1 -1
- package/dist/commands/backups/disable.js +1 -1
- package/dist/commands/backups/disable.js.map +1 -1
- package/dist/commands/backups/download.js +1 -1
- package/dist/commands/backups/download.js.map +1 -1
- package/dist/commands/backups/enable.js +1 -1
- package/dist/commands/backups/enable.js.map +1 -1
- package/dist/commands/backups/list.js +1 -1
- package/dist/commands/backups/list.js.map +1 -1
- package/dist/commands/build.js +1 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/cors/add.js +1 -1
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +1 -1
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -2
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/datasets/alias/create.js +1 -1
- package/dist/commands/datasets/alias/create.js.map +1 -1
- package/dist/commands/datasets/alias/delete.js +1 -1
- package/dist/commands/datasets/alias/delete.js.map +1 -1
- package/dist/commands/datasets/alias/link.js +1 -1
- package/dist/commands/datasets/alias/link.js.map +1 -1
- package/dist/commands/datasets/alias/unlink.js +1 -1
- package/dist/commands/datasets/alias/unlink.js.map +1 -1
- package/dist/commands/datasets/copy.js +15 -1
- package/dist/commands/datasets/copy.js.map +1 -1
- package/dist/commands/datasets/create.js +1 -1
- package/dist/commands/datasets/create.js.map +1 -1
- package/dist/commands/datasets/delete.js +1 -1
- package/dist/commands/datasets/delete.js.map +1 -1
- package/dist/commands/datasets/embeddings/enable.js +11 -0
- package/dist/commands/datasets/embeddings/enable.js.map +1 -1
- package/dist/commands/datasets/export.js +2 -2
- package/dist/commands/datasets/export.js.map +1 -1
- package/dist/commands/datasets/list.js +2 -2
- package/dist/commands/datasets/list.js.map +1 -1
- package/dist/commands/debug.js +1 -1
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/deploy.js +3 -3
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +5 -5
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/browse.js +1 -1
- package/dist/commands/docs/browse.js.map +1 -1
- package/dist/commands/documents/delete.js +1 -1
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/exec.js +2 -2
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/graphql/deploy.js +2 -2
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/hooks/create.js +2 -2
- package/dist/commands/hooks/create.js.map +1 -1
- package/dist/commands/hooks/delete.js +5 -5
- package/dist/commands/hooks/delete.js.map +1 -1
- package/dist/commands/hooks/list.js +3 -3
- package/dist/commands/hooks/list.js.map +1 -1
- package/dist/commands/hooks/logs.js +5 -5
- package/dist/commands/hooks/logs.js.map +1 -1
- package/dist/commands/init.js +175 -490
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +1 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/learn.js +1 -1
- package/dist/commands/learn.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/manage.js +1 -1
- package/dist/commands/manage.js.map +1 -1
- package/dist/commands/manifest/extract.js +2 -2
- 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/delete-aspect.js +1 -1
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/export.js +1 -1
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/preview.js +3 -3
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/projects/list.js +4 -2
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schemas/deploy.js +3 -4
- package/dist/commands/schemas/deploy.js.map +1 -1
- package/dist/commands/schemas/extract.js +3 -3
- package/dist/commands/schemas/extract.js.map +1 -1
- package/dist/commands/schemas/list.js +4 -5
- package/dist/commands/schemas/list.js.map +1 -1
- package/dist/commands/telemetry/disable.js +2 -2
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +2 -2
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/telemetry/status.js +2 -2
- package/dist/commands/telemetry/status.js.map +1 -1
- package/dist/commands/tokens/add.js +1 -1
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/tokens/delete.js +1 -1
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +2 -2
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/list.js +1 -1
- 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/hooks/prerun/injectEnvVariables.js +3 -5
- package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
- package/dist/server/vite/plugin-sanity-build-entries.js +3 -2
- package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -1
- package/dist/services/datasets.js +2 -1
- package/dist/services/datasets.js.map +1 -1
- package/dist/telemetry/init.telemetry.js.map +1 -1
- package/dist/util/packageManager/installationInfo/detectPackages.js +13 -7
- package/dist/util/packageManager/installationInfo/detectPackages.js.map +1 -1
- package/dist/util/telemetry/createTelemetryStore.js +27 -12
- package/dist/util/telemetry/createTelemetryStore.js.map +1 -1
- package/dist/util/update/fetchUpdateInfo.js +40 -0
- package/dist/util/update/fetchUpdateInfo.js.map +1 -0
- package/dist/util/update/fetchUpdateInfo.worker.js +19 -0
- package/dist/util/update/fetchUpdateInfo.worker.js.map +1 -0
- package/dist/util/update/getRunnerUpdateCommand.js +33 -0
- package/dist/util/update/getRunnerUpdateCommand.js.map +1 -0
- package/dist/util/update/getUpdateCommand.js +6 -7
- package/dist/util/update/getUpdateCommand.js.map +1 -1
- package/dist/util/update/packageRunner.js +10 -0
- package/dist/util/update/packageRunner.js.map +1 -0
- package/dist/util/update/resolveRunnerPackage.js +45 -0
- package/dist/util/update/resolveRunnerPackage.js.map +1 -0
- package/dist/util/update/resolveUpdateTarget.js +31 -0
- package/dist/util/update/resolveUpdateTarget.js.map +1 -0
- package/dist/util/update/showNotificationUpdate.js +8 -6
- package/dist/util/update/showNotificationUpdate.js.map +1 -1
- package/dist/util/update/updateChecker.js +73 -38
- package/dist/util/update/updateChecker.js.map +1 -1
- package/dist/util/validateProjection.js +121 -0
- package/dist/util/validateProjection.js.map +1 -0
- package/oclif.manifest.json +698 -681
- package/package.json +24 -23
- package/templates/app-quickstart/src/App.tsx +2 -2
- package/templates/app-sanity-ui/src/App.tsx +2 -2
- package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +1 -1
- package/dist/util/update/fetchLatestVersion.js +0 -21
- package/dist/util/update/fetchLatestVersion.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/graphql/deploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {isInteractive, SanityCommand} from '@sanity/cli-core'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport get from 'lodash-es/get.js'\n\nimport {extractGraphQLAPIs} from '../../actions/graphql/extractGraphQLAPIs.js'\nimport gen1 from '../../actions/graphql/gen1/index.js'\nimport gen2 from '../../actions/graphql/gen2/index.js'\nimport gen3 from '../../actions/graphql/gen3/index.js'\nimport {graphqlDebug} from '../../actions/graphql/graphqlDebug.js'\nimport {resolveApiGeneration} from '../../actions/graphql/resolveApiGeneration.js'\nimport {SchemaError} from '../../actions/graphql/SchemaError.js'\nimport {\n type ExtractedGraphQLAPI,\n type GeneratedApiSpecification,\n type ValidationResponse,\n} from '../../actions/graphql/types.js'\nimport {\n deployGraphQLAPI,\n getClientUrl,\n getCurrentSchemaProps,\n validateGraphQLAPI,\n} from '../../services/graphql.js'\nimport {getDatasetFlag} from '../../util/sharedFlags.js'\n\ninterface DeployTask {\n dataset: string\n enablePlayground: boolean\n projectId: string\n schema: GeneratedApiSpecification\n tag: string\n}\n\nconst apiIdRegex = /^[a-z0-9_-]+$/\nconst generations = {\n gen1,\n gen2,\n gen3,\n}\n\nconst ignoredBreaking = new Set<string>(['OPTIONAL_INPUT_FIELD_ADDED'])\n// Reserved for future use to filter out specific dangerous change types\nconst ignoredWarnings = new Set<string>()\n\nconst debug = graphqlDebug.extend('deploy')\n\nexport class GraphQLDeployCommand extends SanityCommand<typeof GraphQLDeployCommand> {\n static override description = 'Deploy a GraphQL API from the current Sanity schema'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Deploy all defined GraphQL APIs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dry-run',\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api staging --api ios',\n description: 'Deploy only the GraphQL APIs with the IDs \"staging\" and \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --playground',\n description: 'Deploy all defined GraphQL APIs, overriding any playground setting',\n },\n ]\n\n static override flags = {\n api: Flags.string({\n description: 'Only deploy API with this ID. Can be specified multiple times.',\n multiple: true,\n }),\n ...getDatasetFlag({description: 'Deploy API for the given dataset', semantics: 'specify'}),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n }),\n force: Flags.boolean({\n description: 'Deploy API without confirming breaking changes',\n }),\n generation: Flags.string({\n description: 'API generation to deploy (defaults to \"gen3\")',\n options: ['gen1', 'gen2', 'gen3'],\n }),\n 'non-null-document-fields': Flags.boolean({\n description: 'Use non-null document fields (_id, _type etc)',\n }),\n playground: Flags.boolean({\n allowNo: true,\n description: 'Enable GraphQL playground for easier debugging',\n }),\n tag: Flags.string({\n description: 'Deploy API(s) to given tag (defaults to \"default\")',\n }),\n 'with-union-cache': Flags.boolean({\n description:\n 'Enable union cache that optimizes schema generation for schemas with many self referencing types',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(GraphQLDeployCommand)\n const {\n api: onlyApis,\n dataset: datasetFlag,\n 'dry-run': dryRun,\n generation: generationFlag,\n 'non-null-document-fields': nonNullDocumentFieldsFlag,\n playground: playgroundFlag,\n tag: tagFlag,\n 'with-union-cache': withUnionCache,\n } = flags\n\n const workDir = (await this.getProjectRoot()).directory\n\n let apiDefs: ExtractedGraphQLAPI[] = []\n let spin: ReturnType<typeof spinner>\n\n try {\n apiDefs = await extractGraphQLAPIs(workDir, {\n nonNullDocumentFieldsFlag,\n withUnionCache,\n })\n } catch (error) {\n if (error instanceof SchemaError) {\n debug('Schema validation errors: %O', error.problemGroups)\n error.print(this.output)\n this.error('Fix the schema errors above and try again', {exit: 1})\n }\n debug('Failed to resolve GraphQL APIs: %O', error)\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Failed to resolve GraphQL APIs: ${message}`, {exit: 1})\n }\n\n const hasMultipleApis = flags.api ? flags.api.length > 1 : apiDefs.length > 1\n\n const usedFlags = [\n datasetFlag && '--dataset',\n tagFlag && '--tag',\n playgroundFlag !== undefined && '--playground',\n generationFlag !== undefined && '--generation',\n nonNullDocumentFieldsFlag !== undefined && '--non-null-document-fields',\n ].filter(Boolean)\n\n if (hasMultipleApis && usedFlags.length > 0) {\n this.warn(`More than one API defined, and ${usedFlags.join('/')} is specified`)\n this.warn(`This will use the specified flag(s) for ALL APIs, overriding config!`)\n\n if (flags.force) {\n this.warn(`--force specified, continuing...`)\n } else {\n const confirmed = await confirm({\n default: false,\n message: 'Continue with flag overrides for all APIs?',\n })\n if (!confirmed) {\n this.error('Operation cancelled', {exit: 1})\n }\n }\n }\n\n const deployTasks: DeployTask[] = []\n let hasErrors = false\n\n for (const apiId of onlyApis || []) {\n if (!apiDefs.some((apiDef) => apiDef.id === apiId)) {\n this.error(`GraphQL API with id \"${apiId}\" not found`, {exit: 1})\n }\n }\n\n const apiNames = new Set<string>()\n const apiIds = new Set<string>()\n\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n const {apiName} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n if (apiNames.has(apiName)) {\n this.error(`Multiple GraphQL APIs with the same dataset and tag found (${apiName})`, {\n exit: 1,\n })\n }\n\n if (apiDef.id) {\n if (!apiIdRegex.test(apiDef.id)) {\n this.error(\n `Invalid GraphQL API id \"${apiDef.id}\" - only a-z, 0-9, underscore and dashes are allowed`,\n {exit: 1},\n )\n }\n\n if (apiIds.has(apiDef.id)) {\n this.error(`Multiple GraphQL APIs with the same ID found (${apiDef.id})`, {exit: 1})\n }\n\n apiIds.add(apiDef.id)\n }\n\n apiNames.add(apiName)\n }\n\n if (onlyApis) {\n this.warn(`Deploying only specified APIs: ${onlyApis.join(', ')}`)\n }\n\n let index = -1\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n index++\n\n const {apiName, dataset, tag} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n const {playground, projectId} = apiDef\n spin = spinner(`Generating GraphQL API: ${apiName}`).start()\n\n if (!dataset) {\n spin.fail()\n this.error(`No dataset specified for API at index ${index}`, {exit: 1})\n }\n\n // Handle extraction errors early (computed in worker), before network calls and prompts.\n // Continue the loop so all API errors are reported — don't exit on the first failure.\n if (apiDef.schemaErrors?.length) {\n spin.fail()\n new SchemaError(apiDef.schemaErrors).print(this.output, `Schema errors in ${apiName}`)\n hasErrors = true\n continue\n }\n\n if (apiDef.extractionError) {\n debug('Failed to extract schema', apiDef.extractionError)\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: ${apiDef.extractionError}`)\n hasErrors = true\n continue\n }\n\n if (!apiDef.extracted) {\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: No extraction result`)\n hasErrors = true\n continue\n }\n\n let currentGeneration: string | undefined\n let playgroundEnabled: boolean | undefined\n try {\n const schemaProps = await getCurrentSchemaProps(projectId, dataset, tag)\n currentGeneration = schemaProps.currentGeneration\n playgroundEnabled = schemaProps.playgroundEnabled\n } catch (err) {\n debug('Failed to get current GraphQL schema properties', err)\n spin.fail()\n this.error('Failed to get current GraphQL schema properties', {exit: 1})\n }\n\n // CLI flag takes precedence over configuration\n const specifiedGeneration = generationFlag === undefined ? apiDef.generation : generationFlag\n\n const generation = await resolveApiGeneration({\n currentGeneration,\n force: flags.force,\n index,\n output: this.output,\n specifiedGeneration,\n })\n\n if (!generation) {\n // User cancelled\n spin.fail()\n continue\n }\n\n if (!this.isRecognizedApiGeneration(generation)) {\n spin.fail()\n this.error(`Unknown API generation \"${generation}\" for API at index ${index}`, {exit: 1})\n }\n\n const enablePlayground = await this.shouldEnablePlayground({\n dryRun,\n playgroundCliFlag: playgroundFlag,\n playgroundConfiguration: playground,\n playgroundCurrentlyEnabled: playgroundEnabled,\n spin,\n })\n\n let apiSpec: GeneratedApiSpecification\n try {\n const generateSchema = generations[generation]\n apiSpec = generateSchema(apiDef.extracted, {filterSuffix: apiDef.filterSuffix})\n } catch (err) {\n debug('Failed to generate schema', err)\n spin.fail()\n const message = err instanceof Error ? err.message : 'Unknown error'\n this.error(`Failed to generate schema: ${message}`, {exit: 1})\n }\n\n let valid: ValidationResponse | undefined\n try {\n valid = await validateGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n } catch (err) {\n debug('validateGraphQLAPI error', err)\n const validationError = get(err, 'response.body.validationError')\n spin.fail()\n this.error(validationError ?? 'Failed to validate GraphQL API', {exit: 1})\n }\n\n // when the result is not valid and there are breaking changes afoot!\n if (!this.isResultValid(valid, {force: flags.force, spin})) {\n // not valid and a dry run? then it can exit with a error\n if (dryRun) {\n spin.fail()\n this.renderBreakingChanges(valid)\n hasErrors = true\n continue\n }\n\n if (!isInteractive()) {\n spin.fail()\n this.renderBreakingChanges(valid)\n this.error(\n 'Dangerous changes found - falling back. Re-run the command with the `--force` flag to force deployment.',\n {exit: 1},\n )\n }\n\n spin.stop()\n this.renderBreakingChanges(valid)\n const shouldDeploy = await confirm({\n default: false,\n message: 'Do you want to deploy a new API despite the dangerous changes?',\n })\n\n if (!shouldDeploy) {\n spin.fail()\n continue\n }\n\n spin.succeed()\n } else if (dryRun) {\n // isResultValid() already set the spinner state (succeed or warn).\n // Check whether changes were forced so we print the correct message.\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n if (breakingChanges.length > 0 || dangerousChanges.length > 0) {\n this.renderBreakingChanges(valid)\n this.log('Forced with `--force`, skipping deploy (dry run)')\n } else {\n this.log('GraphQL API is valid and has no breaking changes')\n }\n continue\n }\n\n deployTasks.push({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n }\n\n // Give some space for deployment tasks\n this.log('')\n\n for (const task of deployTasks) {\n const {dataset, enablePlayground, projectId, schema, tag} = task\n\n this.log(`Project: ${projectId}`)\n this.log(`Dataset: ${dataset}`)\n this.log(`Tag: ${tag}`)\n\n spin = spinner('Deploying GraphQL API').start()\n\n try {\n const response = await deployGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema,\n tag,\n })\n\n spin.stop()\n const apiUrl = await getClientUrl(\n projectId,\n response.location.replace(/^\\/(v1|v\\d{4}-\\d{2}-\\d{2})\\//, '/'),\n )\n this.log(`URL: ${apiUrl}`)\n spin.start('Deployed!').succeed()\n this.log('')\n } catch (error) {\n spin.fail()\n debug('Failed to deploy GraphQL API', error)\n this.error('Failed to deploy GraphQL API', {exit: 1})\n }\n }\n\n if (hasErrors) {\n this.exit(1)\n }\n }\n\n private filterChanges(valid: ValidationResponse) {\n const {breakingChanges: breaking, dangerousChanges: dangerous} = valid\n return {\n breakingChanges: breaking.filter((change) => !ignoredBreaking.has(change.type)),\n dangerousChanges: dangerous.filter((change) => !ignoredWarnings.has(change.type)),\n }\n }\n\n private getApiIdentifiers(apiDef: ExtractedGraphQLAPI, datasetFlag?: string, tagFlag?: string) {\n const dataset = datasetFlag || apiDef.dataset\n const tag = tagFlag || apiDef.tag || 'default'\n const apiName = [dataset, tag].join('/')\n return {apiName, dataset, tag}\n }\n\n private isRecognizedApiGeneration(generation: string): generation is 'gen1' | 'gen2' | 'gen3' {\n return ['gen1', 'gen2', 'gen3'].includes(generation)\n }\n\n private isResultValid(\n valid: ValidationResponse,\n {force, spin}: {force?: boolean; spin: ReturnType<typeof spinner>},\n ) {\n const {validationError} = valid\n if (validationError) {\n spin.fail()\n this.error(`GraphQL schema is not valid:\\n\\n${validationError}`, {exit: 1})\n }\n\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n const hasProblematicChanges = breakingChanges.length > 0 || dangerousChanges.length > 0\n\n if (!hasProblematicChanges) {\n spin.succeed()\n return true\n }\n\n if (force) {\n spin.text = 'Validating GraphQL API: Dangerous changes. Forced with `--force`.'\n spin.warn()\n return true\n }\n\n spin.warn()\n return false\n }\n\n private renderBreakingChanges(valid: ValidationResponse) {\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n if (dangerousChanges.length > 0) {\n this.log('\\nFound potentially dangerous changes from previous schema:')\n for (const change of dangerousChanges) this.log(` - ${change.description}`)\n }\n\n if (breakingChanges.length > 0) {\n this.log('\\nFound BREAKING changes from previous schema:')\n for (const change of breakingChanges) this.log(` - ${change.description}`)\n }\n\n this.output.log('')\n }\n\n private async shouldEnablePlayground({\n dryRun,\n playgroundCliFlag,\n playgroundConfiguration,\n playgroundCurrentlyEnabled,\n spin,\n }: {\n dryRun: boolean\n playgroundCliFlag?: boolean\n playgroundConfiguration?: boolean\n playgroundCurrentlyEnabled?: boolean\n spin: ReturnType<typeof spinner>\n }): Promise<boolean> {\n // On a dry run, it doesn't matter, return true 🤷♂️\n if (dryRun) {\n return true\n }\n\n // Prioritize CLI flag if set\n if (playgroundCliFlag !== undefined) {\n return playgroundCliFlag\n }\n\n // If explicitly set true/false in configuration, use that\n if (playgroundConfiguration !== undefined) {\n return playgroundConfiguration\n }\n\n // If API is already deployed, use the current state\n if (playgroundCurrentlyEnabled !== undefined) {\n return playgroundCurrentlyEnabled\n }\n\n // If no API is deployed, default to true if non-interactive\n if (!isInteractive()) {\n return true\n }\n\n // Interactive environment, so prompt the user\n const prevText = spin.text\n spin.warn()\n const shouldDeploy = await confirm({\n default: true,\n message: 'Do you want to enable a GraphQL playground?',\n })\n spin.clear().start(prevText)\n\n return shouldDeploy\n }\n}\n"],"names":["Flags","isInteractive","SanityCommand","confirm","spinner","get","extractGraphQLAPIs","gen1","gen2","gen3","graphqlDebug","resolveApiGeneration","SchemaError","deployGraphQLAPI","getClientUrl","getCurrentSchemaProps","validateGraphQLAPI","getDatasetFlag","apiIdRegex","generations","ignoredBreaking","Set","ignoredWarnings","debug","extend","GraphQLDeployCommand","description","examples","command","flags","api","string","multiple","semantics","boolean","default","force","generation","options","playground","allowNo","tag","run","parse","onlyApis","dataset","datasetFlag","dryRun","generationFlag","nonNullDocumentFieldsFlag","playgroundFlag","tagFlag","withUnionCache","workDir","getProjectRoot","directory","apiDefs","spin","error","problemGroups","print","output","exit","message","Error","String","hasMultipleApis","length","usedFlags","undefined","filter","Boolean","warn","join","confirmed","deployTasks","hasErrors","apiId","some","apiDef","id","apiNames","apiIds","includes","apiName","getApiIdentifiers","has","test","add","index","projectId","start","fail","schemaErrors","extractionError","log","extracted","currentGeneration","playgroundEnabled","schemaProps","err","specifiedGeneration","isRecognizedApiGeneration","enablePlayground","shouldEnablePlayground","playgroundCliFlag","playgroundConfiguration","playgroundCurrentlyEnabled","apiSpec","generateSchema","filterSuffix","valid","schema","validationError","isResultValid","renderBreakingChanges","stop","shouldDeploy","succeed","breakingChanges","dangerousChanges","filterChanges","push","task","response","apiUrl","location","replace","breaking","dangerous","change","type","hasProblematicChanges","text","prevText","clear"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/graphql/deploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {isInteractive, SanityCommand} from '@sanity/cli-core'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport get from 'lodash-es/get.js'\n\nimport {extractGraphQLAPIs} from '../../actions/graphql/extractGraphQLAPIs.js'\nimport gen1 from '../../actions/graphql/gen1/index.js'\nimport gen2 from '../../actions/graphql/gen2/index.js'\nimport gen3 from '../../actions/graphql/gen3/index.js'\nimport {graphqlDebug} from '../../actions/graphql/graphqlDebug.js'\nimport {resolveApiGeneration} from '../../actions/graphql/resolveApiGeneration.js'\nimport {SchemaError} from '../../actions/graphql/SchemaError.js'\nimport {\n type ExtractedGraphQLAPI,\n type GeneratedApiSpecification,\n type ValidationResponse,\n} from '../../actions/graphql/types.js'\nimport {\n deployGraphQLAPI,\n getClientUrl,\n getCurrentSchemaProps,\n validateGraphQLAPI,\n} from '../../services/graphql.js'\nimport {getDatasetFlag} from '../../util/sharedFlags.js'\n\ninterface DeployTask {\n dataset: string\n enablePlayground: boolean\n projectId: string\n schema: GeneratedApiSpecification\n tag: string\n}\n\nconst apiIdRegex = /^[a-z0-9_-]+$/\nconst generations = {\n gen1,\n gen2,\n gen3,\n}\n\nconst ignoredBreaking = new Set<string>(['OPTIONAL_INPUT_FIELD_ADDED'])\n// Reserved for future use to filter out specific dangerous change types\nconst ignoredWarnings = new Set<string>()\n\nconst debug = graphqlDebug.extend('deploy')\n\nexport class GraphQLDeployCommand extends SanityCommand<typeof GraphQLDeployCommand> {\n static override description = 'Deploy a GraphQL API from the current Sanity schema'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Deploy all defined GraphQL APIs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dry-run',\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api staging --api ios',\n description: 'Deploy only the GraphQL APIs with the IDs \"staging\" and \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --playground',\n description: 'Deploy all defined GraphQL APIs, overriding any playground setting',\n },\n ]\n\n static override flags = {\n api: Flags.string({\n description: 'Only deploy API with this ID (can be specified multiple times)',\n multiple: true,\n }),\n ...getDatasetFlag({description: 'Deploy API for the given dataset', semantics: 'specify'}),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n }),\n force: Flags.boolean({\n description: 'Deploy API without confirming breaking changes',\n }),\n generation: Flags.string({\n description: 'API generation to deploy (defaults to \"gen3\")',\n options: ['gen1', 'gen2', 'gen3'],\n }),\n 'non-null-document-fields': Flags.boolean({\n description: 'Use non-null document fields (_id, _type etc)',\n }),\n playground: Flags.boolean({\n allowNo: true,\n description: 'Enable GraphQL playground for easier debugging',\n }),\n tag: Flags.string({\n description: 'Deploy API(s) to given tag (defaults to \"default\")',\n }),\n 'with-union-cache': Flags.boolean({\n description: 'Cache union types (faster for schemas with many self-references)',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(GraphQLDeployCommand)\n const {\n api: onlyApis,\n dataset: datasetFlag,\n 'dry-run': dryRun,\n generation: generationFlag,\n 'non-null-document-fields': nonNullDocumentFieldsFlag,\n playground: playgroundFlag,\n tag: tagFlag,\n 'with-union-cache': withUnionCache,\n } = flags\n\n const workDir = (await this.getProjectRoot()).directory\n\n let apiDefs: ExtractedGraphQLAPI[] = []\n let spin: ReturnType<typeof spinner>\n\n try {\n apiDefs = await extractGraphQLAPIs(workDir, {\n nonNullDocumentFieldsFlag,\n withUnionCache,\n })\n } catch (error) {\n if (error instanceof SchemaError) {\n debug('Schema validation errors: %O', error.problemGroups)\n error.print(this.output)\n this.error('Fix the schema errors above and try again', {exit: 1})\n }\n debug('Failed to resolve GraphQL APIs: %O', error)\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Failed to resolve GraphQL APIs: ${message}`, {exit: 1})\n }\n\n const hasMultipleApis = flags.api ? flags.api.length > 1 : apiDefs.length > 1\n\n const usedFlags = [\n datasetFlag && '--dataset',\n tagFlag && '--tag',\n playgroundFlag !== undefined && '--playground',\n generationFlag !== undefined && '--generation',\n nonNullDocumentFieldsFlag !== undefined && '--non-null-document-fields',\n ].filter(Boolean)\n\n if (hasMultipleApis && usedFlags.length > 0) {\n this.warn(`More than one API defined, and ${usedFlags.join('/')} is specified`)\n this.warn(`This will use the specified flag(s) for ALL APIs, overriding config!`)\n\n if (flags.force) {\n this.warn(`--force specified, continuing...`)\n } else {\n const confirmed = await confirm({\n default: false,\n message: 'Continue with flag overrides for all APIs?',\n })\n if (!confirmed) {\n this.error('Operation cancelled', {exit: 1})\n }\n }\n }\n\n const deployTasks: DeployTask[] = []\n let hasErrors = false\n\n for (const apiId of onlyApis || []) {\n if (!apiDefs.some((apiDef) => apiDef.id === apiId)) {\n this.error(`GraphQL API with id \"${apiId}\" not found`, {exit: 1})\n }\n }\n\n const apiNames = new Set<string>()\n const apiIds = new Set<string>()\n\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n const {apiName} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n if (apiNames.has(apiName)) {\n this.error(`Multiple GraphQL APIs with the same dataset and tag found (${apiName})`, {\n exit: 1,\n })\n }\n\n if (apiDef.id) {\n if (!apiIdRegex.test(apiDef.id)) {\n this.error(\n `Invalid GraphQL API id \"${apiDef.id}\" - only a-z, 0-9, underscore and dashes are allowed`,\n {exit: 1},\n )\n }\n\n if (apiIds.has(apiDef.id)) {\n this.error(`Multiple GraphQL APIs with the same ID found (${apiDef.id})`, {exit: 1})\n }\n\n apiIds.add(apiDef.id)\n }\n\n apiNames.add(apiName)\n }\n\n if (onlyApis) {\n this.warn(`Deploying only specified APIs: ${onlyApis.join(', ')}`)\n }\n\n let index = -1\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n index++\n\n const {apiName, dataset, tag} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n const {playground, projectId} = apiDef\n spin = spinner(`Generating GraphQL API: ${apiName}`).start()\n\n if (!dataset) {\n spin.fail()\n this.error(`No dataset specified for API at index ${index}`, {exit: 1})\n }\n\n // Handle extraction errors early (computed in worker), before network calls and prompts.\n // Continue the loop so all API errors are reported — don't exit on the first failure.\n if (apiDef.schemaErrors?.length) {\n spin.fail()\n new SchemaError(apiDef.schemaErrors).print(this.output, `Schema errors in ${apiName}`)\n hasErrors = true\n continue\n }\n\n if (apiDef.extractionError) {\n debug('Failed to extract schema', apiDef.extractionError)\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: ${apiDef.extractionError}`)\n hasErrors = true\n continue\n }\n\n if (!apiDef.extracted) {\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: No extraction result`)\n hasErrors = true\n continue\n }\n\n let currentGeneration: string | undefined\n let playgroundEnabled: boolean | undefined\n try {\n const schemaProps = await getCurrentSchemaProps(projectId, dataset, tag)\n currentGeneration = schemaProps.currentGeneration\n playgroundEnabled = schemaProps.playgroundEnabled\n } catch (err) {\n debug('Failed to get current GraphQL schema properties', err)\n spin.fail()\n this.error('Failed to get current GraphQL schema properties', {exit: 1})\n }\n\n // CLI flag takes precedence over configuration\n const specifiedGeneration = generationFlag === undefined ? apiDef.generation : generationFlag\n\n const generation = await resolveApiGeneration({\n currentGeneration,\n force: flags.force,\n index,\n output: this.output,\n specifiedGeneration,\n })\n\n if (!generation) {\n // User cancelled\n spin.fail()\n continue\n }\n\n if (!this.isRecognizedApiGeneration(generation)) {\n spin.fail()\n this.error(`Unknown API generation \"${generation}\" for API at index ${index}`, {exit: 1})\n }\n\n const enablePlayground = await this.shouldEnablePlayground({\n dryRun,\n playgroundCliFlag: playgroundFlag,\n playgroundConfiguration: playground,\n playgroundCurrentlyEnabled: playgroundEnabled,\n spin,\n })\n\n let apiSpec: GeneratedApiSpecification\n try {\n const generateSchema = generations[generation]\n apiSpec = generateSchema(apiDef.extracted, {filterSuffix: apiDef.filterSuffix})\n } catch (err) {\n debug('Failed to generate schema', err)\n spin.fail()\n const message = err instanceof Error ? err.message : 'Unknown error'\n this.error(`Failed to generate schema: ${message}`, {exit: 1})\n }\n\n let valid: ValidationResponse | undefined\n try {\n valid = await validateGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n } catch (err) {\n debug('validateGraphQLAPI error', err)\n const validationError = get(err, 'response.body.validationError')\n spin.fail()\n this.error(validationError ?? 'Failed to validate GraphQL API', {exit: 1})\n }\n\n // when the result is not valid and there are breaking changes afoot!\n if (!this.isResultValid(valid, {force: flags.force, spin})) {\n // not valid and a dry run? then it can exit with a error\n if (dryRun) {\n spin.fail()\n this.renderBreakingChanges(valid)\n hasErrors = true\n continue\n }\n\n if (!isInteractive()) {\n spin.fail()\n this.renderBreakingChanges(valid)\n this.error(\n 'Dangerous changes found - falling back. Re-run the command with the `--force` flag to force deployment.',\n {exit: 1},\n )\n }\n\n spin.stop()\n this.renderBreakingChanges(valid)\n const shouldDeploy = await confirm({\n default: false,\n message: 'Do you want to deploy a new API despite the dangerous changes?',\n })\n\n if (!shouldDeploy) {\n spin.fail()\n continue\n }\n\n spin.succeed()\n } else if (dryRun) {\n // isResultValid() already set the spinner state (succeed or warn).\n // Check whether changes were forced so we print the correct message.\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n if (breakingChanges.length > 0 || dangerousChanges.length > 0) {\n this.renderBreakingChanges(valid)\n this.log('Forced with `--force`, skipping deploy (dry run)')\n } else {\n this.log('GraphQL API is valid and has no breaking changes')\n }\n continue\n }\n\n deployTasks.push({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n }\n\n // Give some space for deployment tasks\n this.log('')\n\n for (const task of deployTasks) {\n const {dataset, enablePlayground, projectId, schema, tag} = task\n\n this.log(`Project: ${projectId}`)\n this.log(`Dataset: ${dataset}`)\n this.log(`Tag: ${tag}`)\n\n spin = spinner('Deploying GraphQL API').start()\n\n try {\n const response = await deployGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema,\n tag,\n })\n\n spin.stop()\n const apiUrl = await getClientUrl(\n projectId,\n response.location.replace(/^\\/(v1|v\\d{4}-\\d{2}-\\d{2})\\//, '/'),\n )\n this.log(`URL: ${apiUrl}`)\n spin.start('Deployed!').succeed()\n this.log('')\n } catch (error) {\n spin.fail()\n debug('Failed to deploy GraphQL API', error)\n this.error('Failed to deploy GraphQL API', {exit: 1})\n }\n }\n\n if (hasErrors) {\n this.exit(1)\n }\n }\n\n private filterChanges(valid: ValidationResponse) {\n const {breakingChanges: breaking, dangerousChanges: dangerous} = valid\n return {\n breakingChanges: breaking.filter((change) => !ignoredBreaking.has(change.type)),\n dangerousChanges: dangerous.filter((change) => !ignoredWarnings.has(change.type)),\n }\n }\n\n private getApiIdentifiers(apiDef: ExtractedGraphQLAPI, datasetFlag?: string, tagFlag?: string) {\n const dataset = datasetFlag || apiDef.dataset\n const tag = tagFlag || apiDef.tag || 'default'\n const apiName = [dataset, tag].join('/')\n return {apiName, dataset, tag}\n }\n\n private isRecognizedApiGeneration(generation: string): generation is 'gen1' | 'gen2' | 'gen3' {\n return ['gen1', 'gen2', 'gen3'].includes(generation)\n }\n\n private isResultValid(\n valid: ValidationResponse,\n {force, spin}: {force?: boolean; spin: ReturnType<typeof spinner>},\n ) {\n const {validationError} = valid\n if (validationError) {\n spin.fail()\n this.error(`GraphQL schema is not valid:\\n\\n${validationError}`, {exit: 1})\n }\n\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n const hasProblematicChanges = breakingChanges.length > 0 || dangerousChanges.length > 0\n\n if (!hasProblematicChanges) {\n spin.succeed()\n return true\n }\n\n if (force) {\n spin.text = 'Validating GraphQL API: Dangerous changes. Forced with `--force`.'\n spin.warn()\n return true\n }\n\n spin.warn()\n return false\n }\n\n private renderBreakingChanges(valid: ValidationResponse) {\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n if (dangerousChanges.length > 0) {\n this.log('\\nFound potentially dangerous changes from previous schema:')\n for (const change of dangerousChanges) this.log(` - ${change.description}`)\n }\n\n if (breakingChanges.length > 0) {\n this.log('\\nFound BREAKING changes from previous schema:')\n for (const change of breakingChanges) this.log(` - ${change.description}`)\n }\n\n this.output.log('')\n }\n\n private async shouldEnablePlayground({\n dryRun,\n playgroundCliFlag,\n playgroundConfiguration,\n playgroundCurrentlyEnabled,\n spin,\n }: {\n dryRun: boolean\n playgroundCliFlag?: boolean\n playgroundConfiguration?: boolean\n playgroundCurrentlyEnabled?: boolean\n spin: ReturnType<typeof spinner>\n }): Promise<boolean> {\n // On a dry run, it doesn't matter, return true 🤷♂️\n if (dryRun) {\n return true\n }\n\n // Prioritize CLI flag if set\n if (playgroundCliFlag !== undefined) {\n return playgroundCliFlag\n }\n\n // If explicitly set true/false in configuration, use that\n if (playgroundConfiguration !== undefined) {\n return playgroundConfiguration\n }\n\n // If API is already deployed, use the current state\n if (playgroundCurrentlyEnabled !== undefined) {\n return playgroundCurrentlyEnabled\n }\n\n // If no API is deployed, default to true if non-interactive\n if (!isInteractive()) {\n return true\n }\n\n // Interactive environment, so prompt the user\n const prevText = spin.text\n spin.warn()\n const shouldDeploy = await confirm({\n default: true,\n message: 'Do you want to enable a GraphQL playground?',\n })\n spin.clear().start(prevText)\n\n return shouldDeploy\n }\n}\n"],"names":["Flags","isInteractive","SanityCommand","confirm","spinner","get","extractGraphQLAPIs","gen1","gen2","gen3","graphqlDebug","resolveApiGeneration","SchemaError","deployGraphQLAPI","getClientUrl","getCurrentSchemaProps","validateGraphQLAPI","getDatasetFlag","apiIdRegex","generations","ignoredBreaking","Set","ignoredWarnings","debug","extend","GraphQLDeployCommand","description","examples","command","flags","api","string","multiple","semantics","boolean","default","force","generation","options","playground","allowNo","tag","run","parse","onlyApis","dataset","datasetFlag","dryRun","generationFlag","nonNullDocumentFieldsFlag","playgroundFlag","tagFlag","withUnionCache","workDir","getProjectRoot","directory","apiDefs","spin","error","problemGroups","print","output","exit","message","Error","String","hasMultipleApis","length","usedFlags","undefined","filter","Boolean","warn","join","confirmed","deployTasks","hasErrors","apiId","some","apiDef","id","apiNames","apiIds","includes","apiName","getApiIdentifiers","has","test","add","index","projectId","start","fail","schemaErrors","extractionError","log","extracted","currentGeneration","playgroundEnabled","schemaProps","err","specifiedGeneration","isRecognizedApiGeneration","enablePlayground","shouldEnablePlayground","playgroundCliFlag","playgroundConfiguration","playgroundCurrentlyEnabled","apiSpec","generateSchema","filterSuffix","valid","schema","validationError","isResultValid","renderBreakingChanges","stop","shouldDeploy","succeed","breakingChanges","dangerousChanges","filterChanges","push","task","response","apiUrl","location","replace","breaking","dangerous","change","type","hasProblematicChanges","text","prevText","clear"],"mappings":"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"}
|
|
@@ -5,11 +5,11 @@ import { GRAPHQL_API_VERSION, listGraphQLEndpoints } from '../../services/graphq
|
|
|
5
5
|
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
6
6
|
const listGraphQLDebug = subdebug('graphql:list');
|
|
7
7
|
export class List extends SanityCommand {
|
|
8
|
-
static description = 'List
|
|
8
|
+
static description = 'List deployed GraphQL endpoints for the project';
|
|
9
9
|
static examples = [
|
|
10
10
|
{
|
|
11
11
|
command: '<%= config.bin %> <%= command.id %>',
|
|
12
|
-
description: 'List GraphQL endpoints for the
|
|
12
|
+
description: 'List GraphQL endpoints for the project'
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/graphql/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n GRAPHQL_API_VERSION,\n type GraphQLEndpoint,\n listGraphQLEndpoints,\n} from '../../services/graphql.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listGraphQLDebug = subdebug('graphql:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/graphql/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n GRAPHQL_API_VERSION,\n type GraphQLEndpoint,\n listGraphQLEndpoints,\n} from '../../services/graphql.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listGraphQLDebug = subdebug('graphql:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List deployed GraphQL endpoints for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List GraphQL endpoints for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List GraphQL endpoints for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list GraphQL endpoints for',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n await this.parse(List)\n\n const projectId = await this.getProjectId({\n fallback: () => promptForProject({}),\n })\n\n let endpoints: GraphQLEndpoint[] | undefined\n try {\n endpoints = await listGraphQLEndpoints(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n\n listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error)\n this.error(`GraphQL endpoints list retrieval failed:\\n${message}`, {exit: 1})\n }\n\n if (!endpoints || endpoints.length === 0) {\n this.log(\"This project doesn't have any GraphQL endpoints deployed.\")\n return\n }\n\n const client = await getProjectCliClient({\n apiVersion: GRAPHQL_API_VERSION,\n projectId,\n })\n\n this.log('Here are the GraphQL endpoints deployed for this project:')\n for (const [index, endpoint] of endpoints.entries()) {\n const {dataset, tag} = endpoint\n const url = client.getUrl(`/graphql/${dataset}/${tag}`)\n\n this.log(`${index + 1}. ${styleText('bold', 'Dataset:')} ${dataset}`)\n this.log(` ${styleText('bold', 'Tag:')} ${tag}`)\n this.log(` ${styleText('bold', 'Generation:')} ${endpoint.generation}`)\n this.log(` ${styleText('bold', 'Playground:')} ${endpoint.playgroundEnabled}`)\n this.log(` ${styleText('bold', 'URL:')} ${url}\\n`)\n }\n }\n}\n"],"names":["styleText","getProjectCliClient","SanityCommand","subdebug","promptForProject","GRAPHQL_API_VERSION","listGraphQLEndpoints","getProjectIdFlag","listGraphQLDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","endpoints","error","message","Error","String","exit","length","log","client","apiVersion","index","endpoint","entries","dataset","tag","url","getUrl","generation","playgroundEnabled"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,mBAAmB,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAE7E,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SACEC,mBAAmB,EAEnBC,oBAAoB,QACf,4BAA2B;AAClC,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,kDAAiD;IAC/E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACP;QAEjB,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IAAMf,iBAAiB,CAAC;QACpC;QAEA,IAAIgB;QACJ,IAAI;YACFA,YAAY,MAAMd,qBAAqBW;QACzC,EAAE,OAAOI,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAEhEb,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEI;YAC9E,IAAI,CAACA,KAAK,CAAC,CAAC,0CAA0C,EAAEC,SAAS,EAAE;gBAACG,MAAM;YAAC;QAC7E;QAEA,IAAI,CAACL,aAAaA,UAAUM,MAAM,KAAK,GAAG;YACxC,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,SAAS,MAAM3B,oBAAoB;YACvC4B,YAAYxB;YACZY;QACF;QAEA,IAAI,CAACU,GAAG,CAAC;QACT,KAAK,MAAM,CAACG,OAAOC,SAAS,IAAIX,UAAUY,OAAO,GAAI;YACnD,MAAM,EAACC,OAAO,EAAEC,GAAG,EAAC,GAAGH;YACvB,MAAMI,MAAMP,OAAOQ,MAAM,CAAC,CAAC,SAAS,EAAEH,QAAQ,CAAC,EAAEC,KAAK;YAEtD,IAAI,CAACP,GAAG,CAAC,GAAGG,QAAQ,EAAE,GAAG,EAAE9B,UAAU,QAAQ,YAAY,KAAK,EAAEiC,SAAS;YACzE,IAAI,CAACN,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,QAAQ,SAAS,EAAEkC,KAAK;YAC1D,IAAI,CAACP,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,eAAe,EAAE,EAAE+B,SAASM,UAAU,EAAE;YAC1E,IAAI,CAACV,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,eAAe,EAAE,EAAE+B,SAASO,iBAAiB,EAAE;YACjF,IAAI,CAACX,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,QAAQ,EAAE,EAAEmC,IAAI,EAAE,CAAC;QACvD;IACF;AACF"}
|
|
@@ -5,11 +5,11 @@ import { getProjectById } from '../../services/projects.js';
|
|
|
5
5
|
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
6
6
|
const createHookDebug = subdebug('hook:create');
|
|
7
7
|
export class CreateHookCommand extends SanityCommand {
|
|
8
|
-
static description = 'Create a new webhook for the
|
|
8
|
+
static description = 'Create a new webhook for the project';
|
|
9
9
|
static examples = [
|
|
10
10
|
{
|
|
11
11
|
command: '<%= config.bin %> <%= command.id %>',
|
|
12
|
-
description: 'Create a new webhook for the
|
|
12
|
+
description: 'Create a new webhook for the project'
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hooks/create.ts"],"sourcesContent":["import {getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hooks/create.ts"],"sourcesContent":["import {getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Create a webhook for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create webhook for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:create']\n\n public async run() {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({requiredPermissions: [{grant: 'read', permission: 'sanity.project'}]}),\n })\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {exit: 1})\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl = getSanityUrl(\n `/organizations/${organizationId}/project/${projectId}/api/webhooks/new`,\n )\n\n this.log(`Opening ${manageUrl}`)\n\n try {\n await open(manageUrl)\n } catch (error) {\n const err = error as Error\n createHookDebug('Error opening browser', err)\n this.error(`Failed to open browser:\\n${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["getSanityUrl","SanityCommand","subdebug","open","promptForProject","getProjectById","getProjectIdFlag","createHookDebug","CreateHookCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectInfo","error","err","message","exit","organizationId","manageUrl","log"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACtE,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,6BAA4B;AACzD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,0BAA0BP;IACrC,OAAgBQ,cAAc,uCAAsC;IACpE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAM;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBAACe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;qBAAE;gBAAA;QAC1F;QAEA,IAAIC;QACJ,IAAI;YACFA,cAAc,MAAMjB,eAAeW;QACrC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACxE,IAAI,CAACD,KAAK,CAAC,CAAC,sCAAsC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC7E;QAEA,MAAMC,iBAAiBL,YAAYK,cAAc,IAAI;QACrD,MAAMC,YAAY5B,aAChB,CAAC,eAAe,EAAE2B,eAAe,SAAS,EAAEX,UAAU,iBAAiB,CAAC;QAG1E,IAAI,CAACa,GAAG,CAAC,CAAC,QAAQ,EAAED,WAAW;QAE/B,IAAI;YACF,MAAMzB,KAAKyB;QACb,EAAE,OAAOL,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,yBAAyBiB;YACzC,IAAI,CAACD,KAAK,CAAC,CAAC,yBAAyB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAChE;IACF;AACF"}
|
|
@@ -8,23 +8,23 @@ const deleteHookDebug = subdebug('hook:delete');
|
|
|
8
8
|
export class Delete extends SanityCommand {
|
|
9
9
|
static args = {
|
|
10
10
|
name: Args.string({
|
|
11
|
-
description: 'Name of
|
|
11
|
+
description: 'Name of webhook to delete (will prompt if not provided)',
|
|
12
12
|
required: false
|
|
13
13
|
})
|
|
14
14
|
};
|
|
15
|
-
static description = 'Delete a
|
|
15
|
+
static description = 'Delete a webhook from the project';
|
|
16
16
|
static examples = [
|
|
17
17
|
{
|
|
18
18
|
command: '<%= config.bin %> <%= command.id %>',
|
|
19
|
-
description: 'Interactively select and delete a
|
|
19
|
+
description: 'Interactively select and delete a webhook'
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
command: '<%= config.bin %> <%= command.id %> my-hook',
|
|
23
|
-
description: 'Delete a specific
|
|
23
|
+
description: 'Delete a specific webhook by name'
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
27
|
-
description: 'Delete a
|
|
27
|
+
description: 'Delete a webhook from a specific project'
|
|
28
28
|
}
|
|
29
29
|
];
|
|
30
30
|
static flags = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hooks/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hooks/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of webhook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a webhook from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a webhook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a webhook from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete webhook from',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:delete']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: 1})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: 1})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","SanityCommand","subdebug","select","promptForProject","deleteHookForProject","listHooksForProject","getProjectIdFlag","deleteHookDebug","Delete","args","name","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hookId","promptForHook","log","error","err","message","exit","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,MAAM,QAAO,sBAAqB;AAG1C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,oBAAoB,EAAEC,mBAAmB,QAAO,0BAAyB;AACjF,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBN,SAAS;AAEjC,OAAO,MAAMO,eAAeR;IAC1B,OAAgBS,OAAO;QACrBC,MAAMX,KAAKY,MAAM,CAAC;YAChBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,oCAAmC;IAEjE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAqB;QAChC,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAEhC,MAAMa,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRpB,iBAAiB;oBACfqB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAUC,YAAY;wBAAyB;qBAAE;gBACjF;QACJ;QAEA,4BAA4B;QAC5B,MAAMC,SAAS,MAAM,IAAI,CAACC,aAAa,CAACnB,KAAKC,IAAI,EAAEW;QAEnD,IAAI;YACF,MAAMjB,qBAAqBiB,WAAWM;YAEtC,IAAI,CAACE,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACd,MAAMC,MAAMD;YACZvB,gBAAgB,CAAC,oBAAoB,EAAEoB,OAAO,aAAa,EAAEN,WAAW,EAAEU;YAC1E,IAAI,CAACD,KAAK,CAAC,CAAC,uBAAuB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC9D;IACF;IAEA,MAAcL,cACZM,aAAiC,EACjCb,SAAiB,EACA;QACjB,IAAIc;QACJ,IAAI;YACFA,QAAQ,MAAM9B,oBAAoBgB;QACpC,EAAE,OAAOS,OAAO;YACd,MAAMC,MAAMD;YACZvB,gBAAgB,CAAC,iCAAiC,EAAEc,WAAW,EAAEU;YACjE,IAAI,CAACD,KAAK,CAAC,CAAC,wBAAwB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC/D;QAEA,IAAIE,MAAMC,MAAM,KAAK,GAAG;YACtB,IAAI,CAACN,KAAK,CAAC,yCAAyC;gBAACG,MAAM;YAAC;QAC9D;QAEA,iDAAiD;QACjD,IAAIC,eAAe;YACjB,MAAMG,qBAAqBH,cAAcI,WAAW;YACpD,MAAMC,eAAeJ,MAAMK,IAAI,CAAC,CAACC,OAASA,KAAK/B,IAAI,CAAC4B,WAAW,OAAOD;YAEtE,IAAI,CAACE,cAAc;gBACjB,IAAI,CAACT,KAAK,CAAC,CAAC,gBAAgB,EAAEI,cAAc,WAAW,CAAC,EAAE;oBAACD,MAAM;gBAAC;YACpE;YAEA,OAAOM,aAAaG,EAAE;QACxB;QAEA,uDAAuD;QACvD,MAAMC,UAAUR,MAAMS,GAAG,CAAC,CAACH,OAAU,CAAA;gBACnC/B,MAAM+B,KAAK/B,IAAI;gBACfmC,OAAOJ,KAAKC,EAAE;YAChB,CAAA;QAEA,MAAMI,aAAa,MAAM5C,OAAO;YAC9ByC;YACAX,SAAS;QACX;QAEA,OAAOc;IACT;AACF"}
|
|
@@ -4,15 +4,15 @@ import { listHooksForProject } from '../../services/hooks.js';
|
|
|
4
4
|
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
5
5
|
const listHookDebug = subdebug('hook:list');
|
|
6
6
|
export class List extends SanityCommand {
|
|
7
|
-
static description = 'List
|
|
7
|
+
static description = 'List webhooks for the project';
|
|
8
8
|
static examples = [
|
|
9
9
|
{
|
|
10
10
|
command: '<%= config.bin %> <%= command.id %>',
|
|
11
|
-
description: 'List
|
|
11
|
+
description: 'List webhooks for the project'
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
15
|
-
description: 'List
|
|
15
|
+
description: 'List webhooks for a specific project'
|
|
16
16
|
}
|
|
17
17
|
];
|
|
18
18
|
static flags = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hooks/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hooks/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List webhooks for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List webhooks for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List webhooks for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list webhooks for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:list']\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["SanityCommand","subdebug","promptForProject","listHooksForProject","getProjectIdFlag","listHookDebug","List","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGxD,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,mBAAmB,QAAO,0BAAyB;AAC3D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAY,CAAA;IAEvD,MAAaC,MAAM;QACjB,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,QAAQ,MAAMjB,oBAAoBW;QACpC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,iCAAiC,EAAES,WAAW,EAAEQ;YAC/D,IAAI,CAACD,KAAK,CAAC,CAAC,6BAA6B,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACpE;QAEA,KAAK,MAAMC,QAAQL,MAAO;YACxB,IAAI,CAACM,GAAG,CAAC,CAAC,MAAM,EAAED,KAAKE,IAAI,EAAE;YAC7B,IAAI,CAACD,GAAG,CAAC,CAAC,SAAS,EAAED,KAAKG,OAAO,EAAE;YACnC,IAAI,CAACF,GAAG,CAAC,CAAC,KAAK,EAAED,KAAKI,GAAG,EAAE;YAE3B,IAAIJ,KAAKK,IAAI,KAAK,YAAY;gBAC5B,IAAI,CAACJ,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKM,UAAU,EAAE;gBAE1C,IAAIN,KAAKlB,WAAW,EAAE;oBACpB,IAAI,CAACmB,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKlB,WAAW,EAAE;gBAC7C;YACF;YAEA,IAAI,CAACmB,GAAG,CAAC;QACX;IACF;AACF"}
|
|
@@ -11,23 +11,23 @@ const logsHookDebug = subdebug('hook:logs');
|
|
|
11
11
|
export class LogsHookCommand extends SanityCommand {
|
|
12
12
|
static args = {
|
|
13
13
|
name: Args.string({
|
|
14
|
-
description: 'Name of the
|
|
14
|
+
description: 'Name of the webhook to show logs for',
|
|
15
15
|
required: false
|
|
16
16
|
})
|
|
17
17
|
};
|
|
18
|
-
static description = '
|
|
18
|
+
static description = 'Show log entries for project webhooks';
|
|
19
19
|
static examples = [
|
|
20
20
|
{
|
|
21
21
|
command: '<%= config.bin %> <%= command.id %>',
|
|
22
|
-
description: '
|
|
22
|
+
description: 'Show log entries for project webhooks'
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
command: '<%= config.bin %> <%= command.id %> [NAME]',
|
|
26
|
-
description: '
|
|
26
|
+
description: 'Show log entries for a specific webhook by name'
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
command: '<%= config.bin %> <%= command.id %> --project-id abc123',
|
|
30
|
-
description: '
|
|
30
|
+
description: 'Show log entries for a specific project'
|
|
31
31
|
}
|
|
32
32
|
];
|
|
33
33
|
static flags = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/hooks/logs.ts"],"sourcesContent":["import {inspect, styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport groupBy from 'lodash-es/groupBy.js'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n getHookAttemptsForProject,\n getHookMessagesForProject,\n getHooksForProject,\n} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst logsHookDebug = subdebug('hook:logs')\n\nexport class LogsHookCommand extends SanityCommand<typeof LogsHookCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the hook to show logs for',\n required: false,\n }),\n }\n\n static override description = 'List latest log entries for a given hook'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List latest log entries for a given hook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> [NAME]',\n description: 'List latest log entries for a specific hook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List hook logs for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook logs for',\n semantics: 'override',\n }),\n detailed: Flags.boolean({\n description: 'Include detailed payload and attempts',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:logs']\n\n public async run() {\n const {args, flags} = await this.parse(LogsHookCommand)\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get hooks for the project\n let hooks: Hook[]\n try {\n hooks = await getHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: 1})\n }\n\n // If hook name is provided, find that specific hook\n let selectedHook: Hook | undefined\n if (args.name) {\n selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase())\n if (!selectedHook) {\n this.error(`Hook with name \"${args.name}\" not found`, {exit: 1})\n }\n } else if (hooks.length === 1) {\n // If only one hook exists, use that\n selectedHook = hooks[0]\n } else {\n // Otherwise prompt user to select a hook\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: 1})\n }\n\n // Fetch messages and attempts for the selected hook\n let messages: HookMessage[]\n let attempts: DeliveryAttempt[] = []\n try {\n ;[messages, attempts] = await Promise.all([\n getHookMessagesForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n getHookAttemptsForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n ])\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err)\n this.error(`Hook logs retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n // Group attempts by message ID\n const groupedAttempts = groupBy(attempts, 'messageId')\n\n // Populate messages with attempts\n const populated = messages.map((msg): HookMessage & {attempts: DeliveryAttempt[]} => ({\n ...msg,\n attempts: groupedAttempts[msg.id] || [],\n }))\n\n const totalMessages = messages.length - 1\n\n for (const [i, message] of populated.entries()) {\n this.printMessage(message, {detailed: flags.detailed})\n this.printSeparator(totalMessages === i)\n }\n }\n\n private formatAttemptDate(dateString: string): string {\n try {\n return new Date(dateString).toISOString().replace(/\\.\\d+Z$/, 'Z')\n } catch {\n return dateString // fallback to original if parsing fails\n }\n }\n\n private printMessage(\n message: HookMessage & {attempts: DeliveryAttempt[]},\n options: {detailed?: boolean},\n ) {\n const {detailed} = options\n\n this.log(`Date: ${message.createdAt}`)\n this.log(`Status: ${message.status}`)\n if (message.resultCode) {\n this.log(`Result code: ${message.resultCode}`)\n }\n\n if (message.failureCount > 0) {\n this.log(`Failures: ${message.failureCount}`)\n }\n\n if (detailed) {\n this.log('Payload:')\n try {\n const payload = JSON.parse(message.payload)\n this.log(inspect(payload, {colors: true}))\n } catch (error) {\n this.log(`Payload (raw): ${message.payload}`)\n logsHookDebug('Failed to parse payload JSON:', error)\n }\n }\n\n if (detailed && message.attempts && message.attempts.length > 0) {\n this.log('Attempts:')\n for (const attempt of message.attempts) {\n const date = this.formatAttemptDate(attempt.createdAt)\n const prefix = ` [${date}]`\n\n if (attempt.inProgress) {\n this.log(`${prefix} ${styleText('yellow', 'Pending')}`)\n } else if (attempt.isFailure) {\n const failure = formatFailure(attempt, {includeHelp: true})\n this.log(`${prefix} ${styleText('yellow', `Failure: ${failure}`)}`)\n } else {\n this.log(`${prefix} Success: HTTP ${attempt.resultCode} (${attempt.duration}ms)`)\n }\n }\n }\n\n // Leave some empty space between messages\n this.log('')\n }\n\n private printSeparator(skip: boolean) {\n if (!skip) {\n this.log('---\\n')\n }\n }\n\n private async selectHook(hooks: Hook[]) {\n const hookId = await select({\n choices: hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n })),\n message: 'Select hook to list logs for',\n })\n\n return hooks.find((hook) => hook.id === hookId)\n }\n}\n"],"names":["inspect","styleText","Args","Flags","SanityCommand","subdebug","select","groupBy","formatFailure","promptForProject","getHookAttemptsForProject","getHookMessagesForProject","getHooksForProject","getProjectIdFlag","logsHookDebug","LogsHookCommand","args","name","string","description","required","examples","command","flags","semantics","detailed","boolean","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","length","selectedHook","find","hook","toLowerCase","selectHook","messages","attempts","Promise","all","hookId","id","groupedAttempts","populated","map","msg","totalMessages","i","entries","printMessage","printSeparator","formatAttemptDate","dateString","Date","toISOString","replace","options","log","createdAt","status","resultCode","failureCount","payload","JSON","colors","attempt","date","prefix","inProgress","isFailure","failure","includeHelp","duration","skip","choices","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/hooks/logs.ts"],"sourcesContent":["import {inspect, styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport groupBy from 'lodash-es/groupBy.js'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n getHookAttemptsForProject,\n getHookMessagesForProject,\n getHooksForProject,\n} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst logsHookDebug = subdebug('hook:logs')\n\nexport class LogsHookCommand extends SanityCommand<typeof LogsHookCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the webhook to show logs for',\n required: false,\n }),\n }\n\n static override description = 'Show log entries for project webhooks'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Show log entries for project webhooks',\n },\n {\n command: '<%= config.bin %> <%= command.id %> [NAME]',\n description: 'Show log entries for a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Show log entries for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook logs for',\n semantics: 'override',\n }),\n detailed: Flags.boolean({\n description: 'Include detailed payload and attempts',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:logs']\n\n public async run() {\n const {args, flags} = await this.parse(LogsHookCommand)\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get hooks for the project\n let hooks: Hook[]\n try {\n hooks = await getHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: 1})\n }\n\n // If hook name is provided, find that specific hook\n let selectedHook: Hook | undefined\n if (args.name) {\n selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase())\n if (!selectedHook) {\n this.error(`Hook with name \"${args.name}\" not found`, {exit: 1})\n }\n } else if (hooks.length === 1) {\n // If only one hook exists, use that\n selectedHook = hooks[0]\n } else {\n // Otherwise prompt user to select a hook\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: 1})\n }\n\n // Fetch messages and attempts for the selected hook\n let messages: HookMessage[]\n let attempts: DeliveryAttempt[] = []\n try {\n ;[messages, attempts] = await Promise.all([\n getHookMessagesForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n getHookAttemptsForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n ])\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err)\n this.error(`Hook logs retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n // Group attempts by message ID\n const groupedAttempts = groupBy(attempts, 'messageId')\n\n // Populate messages with attempts\n const populated = messages.map((msg): HookMessage & {attempts: DeliveryAttempt[]} => ({\n ...msg,\n attempts: groupedAttempts[msg.id] || [],\n }))\n\n const totalMessages = messages.length - 1\n\n for (const [i, message] of populated.entries()) {\n this.printMessage(message, {detailed: flags.detailed})\n this.printSeparator(totalMessages === i)\n }\n }\n\n private formatAttemptDate(dateString: string): string {\n try {\n return new Date(dateString).toISOString().replace(/\\.\\d+Z$/, 'Z')\n } catch {\n return dateString // fallback to original if parsing fails\n }\n }\n\n private printMessage(\n message: HookMessage & {attempts: DeliveryAttempt[]},\n options: {detailed?: boolean},\n ) {\n const {detailed} = options\n\n this.log(`Date: ${message.createdAt}`)\n this.log(`Status: ${message.status}`)\n if (message.resultCode) {\n this.log(`Result code: ${message.resultCode}`)\n }\n\n if (message.failureCount > 0) {\n this.log(`Failures: ${message.failureCount}`)\n }\n\n if (detailed) {\n this.log('Payload:')\n try {\n const payload = JSON.parse(message.payload)\n this.log(inspect(payload, {colors: true}))\n } catch (error) {\n this.log(`Payload (raw): ${message.payload}`)\n logsHookDebug('Failed to parse payload JSON:', error)\n }\n }\n\n if (detailed && message.attempts && message.attempts.length > 0) {\n this.log('Attempts:')\n for (const attempt of message.attempts) {\n const date = this.formatAttemptDate(attempt.createdAt)\n const prefix = ` [${date}]`\n\n if (attempt.inProgress) {\n this.log(`${prefix} ${styleText('yellow', 'Pending')}`)\n } else if (attempt.isFailure) {\n const failure = formatFailure(attempt, {includeHelp: true})\n this.log(`${prefix} ${styleText('yellow', `Failure: ${failure}`)}`)\n } else {\n this.log(`${prefix} Success: HTTP ${attempt.resultCode} (${attempt.duration}ms)`)\n }\n }\n }\n\n // Leave some empty space between messages\n this.log('')\n }\n\n private printSeparator(skip: boolean) {\n if (!skip) {\n this.log('---\\n')\n }\n }\n\n private async selectHook(hooks: Hook[]) {\n const hookId = await select({\n choices: hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n })),\n message: 'Select hook to list logs for',\n })\n\n return hooks.find((hook) => hook.id === hookId)\n }\n}\n"],"names":["inspect","styleText","Args","Flags","SanityCommand","subdebug","select","groupBy","formatFailure","promptForProject","getHookAttemptsForProject","getHookMessagesForProject","getHooksForProject","getProjectIdFlag","logsHookDebug","LogsHookCommand","args","name","string","description","required","examples","command","flags","semantics","detailed","boolean","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","length","selectedHook","find","hook","toLowerCase","selectHook","messages","attempts","Promise","all","hookId","id","groupedAttempts","populated","map","msg","totalMessages","i","entries","printMessage","printSeparator","formatAttemptDate","dateString","Date","toISOString","replace","options","log","createdAt","status","resultCode","failureCount","payload","JSON","colors","attempt","date","prefix","inProgress","isFailure","failure","includeHelp","duration","skip","choices","value"],"mappings":"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"}
|