From 3a2eca86df523fcb130cf00c8dea036f8d369cc2 Mon Sep 17 00:00:00 2001 From: Jonah Snider Date: Mon, 20 Jul 2026 18:14:52 -0700 Subject: [PATCH 1/2] Use named exit codes for runtime errors --- CONTRIBUTING.md | 16 +++++------ .../cli/src/commands/backups/disable.ts | 8 +++--- .../cli/src/commands/backups/download.ts | 14 +++++----- .../cli/src/commands/backups/enable.ts | 8 +++--- .../@sanity/cli/src/commands/backups/list.ts | 14 +++++----- packages/@sanity/cli/src/commands/codemod.ts | 10 +++---- packages/@sanity/cli/src/commands/cors/add.ts | 2 +- .../@sanity/cli/src/commands/cors/delete.ts | 8 +++--- .../@sanity/cli/src/commands/cors/list.ts | 4 +-- .../cli/src/commands/datasets/alias/create.ts | 10 +++---- .../cli/src/commands/datasets/alias/delete.ts | 4 +-- .../cli/src/commands/datasets/alias/link.ts | 10 +++---- .../cli/src/commands/datasets/alias/unlink.ts | 6 ++-- .../@sanity/cli/src/commands/datasets/copy.ts | 14 +++++----- .../cli/src/commands/datasets/create.ts | 6 ++-- .../cli/src/commands/datasets/delete.ts | 4 +-- .../commands/datasets/embeddings/disable.ts | 6 ++-- .../commands/datasets/embeddings/enable.ts | 10 +++---- .../commands/datasets/embeddings/status.ts | 6 ++-- .../cli/src/commands/datasets/export.ts | 12 ++++---- .../cli/src/commands/datasets/import.ts | 6 ++-- .../@sanity/cli/src/commands/datasets/list.ts | 4 +-- .../src/commands/datasets/visibility/get.ts | 4 +-- .../src/commands/datasets/visibility/set.ts | 6 ++-- packages/@sanity/cli/src/commands/deploy.ts | 4 +-- packages/@sanity/cli/src/commands/dev.ts | 4 +-- .../@sanity/cli/src/commands/docs/read.ts | 2 +- .../@sanity/cli/src/commands/docs/search.ts | 6 ++-- packages/@sanity/cli/src/commands/doctor.ts | 6 ++-- .../cli/src/commands/documents/create.ts | 6 ++-- .../cli/src/commands/documents/delete.ts | 6 ++-- .../@sanity/cli/src/commands/documents/get.ts | 4 +-- .../cli/src/commands/documents/query.ts | 4 +-- .../cli/src/commands/documents/validate.ts | 6 ++-- .../cli/src/commands/graphql/deploy.ts | 26 ++++++++--------- .../@sanity/cli/src/commands/graphql/list.ts | 4 +-- .../cli/src/commands/graphql/undeploy.ts | 4 +-- .../@sanity/cli/src/commands/hooks/attempt.ts | 4 +-- .../@sanity/cli/src/commands/hooks/create.ts | 6 ++-- .../@sanity/cli/src/commands/hooks/delete.ts | 8 +++--- .../@sanity/cli/src/commands/hooks/list.ts | 4 +-- .../@sanity/cli/src/commands/hooks/logs.ts | 10 +++---- packages/@sanity/cli/src/commands/login.ts | 4 +-- packages/@sanity/cli/src/commands/logout.ts | 4 +-- .../cli/src/commands/manifest/extract.ts | 6 ++-- .../@sanity/cli/src/commands/mcp/configure.ts | 8 +++--- .../cli/src/commands/media/create-aspect.ts | 6 ++-- .../cli/src/commands/media/delete-aspect.ts | 2 +- .../cli/src/commands/media/deploy-aspect.ts | 8 +++--- .../@sanity/cli/src/commands/media/export.ts | 14 +++++----- .../@sanity/cli/src/commands/media/import.ts | 12 ++++---- .../cli/src/commands/migrations/create.ts | 8 +++--- .../cli/src/commands/migrations/list.ts | 4 +-- .../cli/src/commands/migrations/run.ts | 28 +++++++++---------- .../@sanity/cli/src/commands/openapi/get.ts | 6 ++-- .../@sanity/cli/src/commands/openapi/list.ts | 4 +-- .../cli/src/commands/organizations/create.ts | 10 +++---- .../cli/src/commands/organizations/delete.ts | 12 ++++---- .../cli/src/commands/organizations/get.ts | 6 ++-- .../cli/src/commands/organizations/list.ts | 4 +-- .../cli/src/commands/organizations/update.ts | 12 ++++---- packages/@sanity/cli/src/commands/preview.ts | 4 +-- .../cli/src/commands/projects/create.ts | 4 +-- .../@sanity/cli/src/commands/projects/list.ts | 4 +-- .../cli/src/commands/schemas/delete.ts | 4 +-- .../cli/src/commands/schemas/deploy.ts | 4 +-- .../@sanity/cli/src/commands/schemas/list.ts | 2 +- .../cli/src/commands/schemas/validate.ts | 3 +- .../cli/src/commands/skills/install.ts | 4 +-- .../cli/src/commands/telemetry/disable.ts | 4 +-- .../cli/src/commands/telemetry/enable.ts | 4 +-- .../@sanity/cli/src/commands/tokens/create.ts | 4 +-- .../@sanity/cli/src/commands/tokens/delete.ts | 4 +-- .../@sanity/cli/src/commands/tokens/list.ts | 4 +-- .../@sanity/cli/src/commands/users/invite.ts | 6 ++-- 75 files changed, 260 insertions(+), 259 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 729f71fba0..ca9fb704c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -180,9 +180,9 @@ catch (error: any) { } Commands use a small set of exit codes aligned with oclif defaults and Unix convention. -- **0 - Success**: Command completed normally. Implicit when `run()` returns without throwing. Only use `this.exit(0)` when you need to short-circuit early on a successful path. -- **1 - Runtime error**: Something went wrong during execution that is not the user's fault. API failures, network errors, missing project config, file system errors, unexpected state. Use `this.output.error(message, {exit: 1})`. -- **2 - Usage error**: The user provided invalid input to the CLI itself. Bad arguments, unknown flags, invalid flag values, failing input validation. This is oclif's default for `this.output.error()` and all parse errors, so omitting the `exit` option also gives you 2. Use `this.output.error(message, {exit: 2})` or `this.output.error(message)`. +- **0 - Success**: Command completed normally. Implicit when `run()` returns without throwing. Only use `this.exit(exitCodes.SUCCESS)` when you need to short-circuit early on a successful path. +- **1 - Runtime error**: Something went wrong during execution that is not the user's fault. API failures, network errors, missing project config, file system errors, unexpected state. Use `this.output.error(message, {exit: exitCodes.RUNTIME_ERROR})`. +- **2 - Usage error**: The user provided invalid input to the CLI itself. Bad arguments, unknown flags, invalid flag values, failing input validation. This is oclif's default for `this.output.error()` and all parse errors, so omitting the `exit` option also gives you 2. Use `this.output.error(message, {exit: exitCodes.USAGE_ERROR})` or `this.output.error(message)`. - **3 - User abort**: The user declined a confirmation prompt or otherwise chose not to proceed. The command didn't fail, but it also didn't complete its intended action. Use `this.exit(exitCodes.USER_ABORT)`. Import `exitCodes` from `@sanity/cli-core`. - **130 - User abort (signal)**: The user cancelled via Ctrl+C or dismissed a prompt without answering. Handled automatically by `SanityCommand.catch()` - commands should not set this manually. @@ -197,7 +197,7 @@ Commands use a small set of exit codes aligned with oclif defaults and Unix conv ### In Practice -- For `this.output.error()`: pass `{exit: 1}` for runtime errors, `{exit: 2}` (or omit) for usage errors. +- For `this.output.error()`: pass `{exit: exitCodes.RUNTIME_ERROR}` for runtime errors, `{exit: exitCodes.USAGE_ERROR}` (or omit) for usage errors. - For user-declined prompts: `this.exit(exitCodes.USER_ABORT)` after logging a message like "Deploy cancelled." - For custom error classes extending `CLIError`: set `exit` in the constructor options. - For `this.exit()`: only use for early termination (exit 0 for success, exit 1 for programmatic failure like `doctor` checks failing). @@ -379,7 +379,7 @@ Sanity CLI commands all extend from the `SanityCommand` class, which provides se ### Basic Command Structure ```typescript -import {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core' import {Args, Flags, type FlagInput} from '@oclif/core' const debug = subdebug('namespace:command') @@ -430,7 +430,7 @@ export class MyCommand extends SanityCommand { } catch (error) { const message = error instanceof Error ? error.message : 'Unknown error' debug('Operation failed', error) - this.output.error(`Failed: ${message}`, {exit: 1}) + this.output.error(`Failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } } @@ -439,7 +439,7 @@ export class MyCommand extends SanityCommand { ### Error Handling Pattern ```typescript -import {subdebug} from '@sanity/cli-core' +import {exitCodes, subdebug} from '@sanity/cli-core' const debug = subdebug('feature:action') @@ -452,7 +452,7 @@ try { // Show user-friendly message const message = error instanceof Error ? error.message : 'Unknown error' - this.output.error(`User-facing message: ${message}`, {exit: 1}) + this.output.error(`User-facing message: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } ``` diff --git a/packages/@sanity/cli/src/commands/backups/disable.ts b/packages/@sanity/cli/src/commands/backups/disable.ts index 4efaf17f71..34c56fe9dd 100644 --- a/packages/@sanity/cli/src/commands/backups/disable.ts +++ b/packages/@sanity/cli/src/commands/backups/disable.ts @@ -64,11 +64,11 @@ export class DisableBackupCommand extends SanityCommand { const err = validateDatasetName(datasetName) if (err) { - this.error(err, {exit: 1}) + this.error(err, {exit: exitCodes.RUNTIME_ERROR}) } const backupId = String( @@ -354,7 +354,7 @@ ${styleText('bold', 'backupId')}: ${styleText('cyan', opts.backupId)}`, }) if (!response?.backups?.length) { - this.error('No backups found', {exit: 1}) + this.error('No backups found', {exit: exitCodes.RUNTIME_ERROR}) } const backupIdChoices = response.backups.map((backup: BackupItem) => ({ @@ -374,7 +374,7 @@ ${styleText('bold', 'backupId')}: ${styleText('cyan', opts.backupId)}`, } catch (err) { const message = err instanceof Error ? err.message : String(err) backupDownloadDebug(`Failed to fetch backups for dataset ${datasetName}: ${message}`, err) - this.error(`Failed to fetch backups for dataset ${datasetName}: ${message}`, {exit: 1}) + this.error(`Failed to fetch backups for dataset ${datasetName}: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/backups/enable.ts b/packages/@sanity/cli/src/commands/backups/enable.ts index b85365eb64..5d5072dde2 100644 --- a/packages/@sanity/cli/src/commands/backups/enable.ts +++ b/packages/@sanity/cli/src/commands/backups/enable.ts @@ -65,13 +65,13 @@ export class EnableBackupCommand extends SanityCommand dataset.name === 'production') if (datasets.length === 0) { - this.error('No datasets found in this project.', {exit: 1}) + this.error('No datasets found in this project.', {exit: exitCodes.RUNTIME_ERROR}) } if (dataset) { @@ -97,7 +97,7 @@ export class EnableBackupCommand extends SanityCommand { } catch (error) { const message = error instanceof Error ? error.message : String(error) listBackupDebug(`Failed to list datasets: ${message}`, error) - this.error(`Failed to list datasets: ${message}`, {exit: 1}) + this.error(`Failed to list datasets: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (datasets.length === 0) { - this.error('No datasets found in this project.', {exit: 1}) + this.error('No datasets found in this project.', {exit: exitCodes.RUNTIME_ERROR}) } if (dataset) { @@ -115,17 +115,17 @@ export class ListBackupCommand extends SanityCommand { const parsedAfter = this.processDateFlag(flags.after, 'after') if (parsedAfter && parsedBefore && isAfter(parsedAfter, parsedBefore)) { - this.error('--after date must be before --before', {exit: 1}) + this.error('--after date must be before --before', {exit: exitCodes.RUNTIME_ERROR}) } } catch (err) { - this.error(`Parsing date flags: ${err instanceof Error ? err.message : err}`, {exit: 1}) + this.error(`Parsing date flags: ${err instanceof Error ? err.message : err}`, {exit: exitCodes.RUNTIME_ERROR}) } } // Validate limit flag if (flags.limit < 1 || flags.limit > Number.MAX_SAFE_INTEGER) { this.error(`Parsing --limit: must be an integer between 1 and ${Number.MAX_SAFE_INTEGER}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } @@ -180,7 +180,7 @@ export class ListBackupCommand extends SanityCommand { } catch (error) { const message = error instanceof Error ? error.message : String(error) listBackupDebug(`Failed to list backups for dataset ${dataset}:`, error) - this.error(`List dataset backup failed: ${message}`, {exit: 1}) + this.error(`List dataset backup failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -208,7 +208,7 @@ export class ListBackupCommand extends SanityCommand { } catch (error) { listBackupDebug(`Error selecting dataset`, error) this.error(`Failed to select dataset:\n${error instanceof Error ? error.message : error}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } } diff --git a/packages/@sanity/cli/src/commands/codemod.ts b/packages/@sanity/cli/src/commands/codemod.ts index b5a92dd599..fcf9ba99c3 100644 --- a/packages/@sanity/cli/src/commands/codemod.ts +++ b/packages/@sanity/cli/src/commands/codemod.ts @@ -3,7 +3,7 @@ import {existsSync} from 'node:fs' import path from 'node:path' import {Args, Flags} from '@oclif/core' -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import {codemods} from '../actions/codemods/index.js' import {type CodeMod} from '../actions/codemods/types.js' @@ -66,7 +66,7 @@ export class CodemodCommand extends SanityCommand { // Verify that mod exists const mod = normalizedMods.get(codemodName.toLowerCase()) if (!mod) { - this.error(`Codemod with name "${codemodName}" not found`, {exit: 1}) + this.error(`Codemod with name "${codemodName}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } // Verify if there is any verification defined, and user has not opted out of it @@ -76,7 +76,7 @@ export class CodemodCommand extends SanityCommand { } catch (error) { const err = error instanceof Error ? error : new Error(String(error)) codemodeDebug('Verification failed: %s', err.message) - this.error(`Verification failed: ${err.message}`, {exit: 1}) + this.error(`Verification failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -133,12 +133,12 @@ export class CodemodCommand extends SanityCommand { try { const npxHelp = execSync('npx --help', {encoding: 'utf8'}) if (!npxHelp.includes('npm')) { - this.error('Not the npx we expected', {exit: 1}) + this.error('Not the npx we expected', {exit: exitCodes.RUNTIME_ERROR}) } } catch { this.error( `Failed to run "npx" - required to run codemods. Do you have a recent version of npm installed?`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } } diff --git a/packages/@sanity/cli/src/commands/cors/add.ts b/packages/@sanity/cli/src/commands/cors/add.ts index 864282c82c..11b0f09004 100644 --- a/packages/@sanity/cli/src/commands/cors/add.ts +++ b/packages/@sanity/cli/src/commands/cors/add.ts @@ -123,7 +123,7 @@ export class Add extends SanityCommand { const err = error as Error addCorsDebug(`Error adding CORS origin`, err) - this.error(`CORS origin addition failed:\n${err.message}`, {exit: 1}) + this.error(`CORS origin addition failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } diff --git a/packages/@sanity/cli/src/commands/cors/delete.ts b/packages/@sanity/cli/src/commands/cors/delete.ts index 9e94e3f18b..0ad3a446a4 100644 --- a/packages/@sanity/cli/src/commands/cors/delete.ts +++ b/packages/@sanity/cli/src/commands/cors/delete.ts @@ -67,7 +67,7 @@ export class Delete extends SanityCommand { } catch (error) { const err = error as Error deleteCorsDebug(`Error deleting CORS origin ${originId} for project ${projectId}`, err) - this.error(`Origin deletion failed:\n${err.message}`, {exit: 1}) + this.error(`Origin deletion failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -81,11 +81,11 @@ export class Delete extends SanityCommand { } catch (error) { const err = error as Error deleteCorsDebug(`Error fetching CORS origins for project ${projectId}`, err) - this.error(`Failed to fetch CORS origins:\n${err.message}`, {exit: 1}) + this.error(`Failed to fetch CORS origins:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (origins.length === 0) { - this.error('No CORS origins configured for this project.', {exit: 1}) + this.error('No CORS origins configured for this project.', {exit: exitCodes.RUNTIME_ERROR}) } // If origin is specified, find it in the list @@ -96,7 +96,7 @@ export class Delete extends SanityCommand { ) if (!selectedOrigin) { - this.error(`Origin "${specifiedOrigin}" not found`, {exit: 1}) + this.error(`Origin "${specifiedOrigin}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } return selectedOrigin.id diff --git a/packages/@sanity/cli/src/commands/cors/list.ts b/packages/@sanity/cli/src/commands/cors/list.ts index 28e27ae663..344c79271c 100644 --- a/packages/@sanity/cli/src/commands/cors/list.ts +++ b/packages/@sanity/cli/src/commands/cors/list.ts @@ -1,4 +1,4 @@ -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import {promptForProject} from '../../prompts/promptForProject.js' import {type CorsOrigin, listCorsOrigins} from '../../services/cors.js' @@ -43,7 +43,7 @@ export class List extends SanityCommand { const err = error as Error listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err) - this.error(`CORS origins list retrieval failed:\n${err.message}`, {exit: 1}) + this.error(`CORS origins list retrieval failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (origins.length === 0) { diff --git a/packages/@sanity/cli/src/commands/datasets/alias/create.ts b/packages/@sanity/cli/src/commands/datasets/alias/create.ts index 03c1c194d4..e05bb85678 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/create.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/create.ts @@ -95,11 +95,11 @@ export class CreateAliasCommand extends SanityCommand canCreateAlias = features.includes('advancedDatasetManagement') } catch (error) { createAliasDebug(`Error getting project features`, error) - this.error('Failed to get project features', {exit: 1}) + this.error('Failed to get project features', {exit: exitCodes.RUNTIME_ERROR}) } if (!canCreateAlias) { this.error('This project cannot create a dataset alias - see https://www.sanity.io/pricing', { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } @@ -122,7 +122,7 @@ export class CreateAliasCommand extends SanityCommand } if (existingAliases.includes(aliasName)) { - this.error(`Dataset alias "${aliasOutputName}" already exists`, {exit: 1}) + this.error(`Dataset alias "${aliasOutputName}" already exists`, {exit: exitCodes.RUNTIME_ERROR}) } const targetDataset = @@ -132,7 +132,7 @@ export class CreateAliasCommand extends SanityCommand if (targetDataset && !datasets.includes(targetDataset)) { this.error( `Dataset "${targetDataset}" does not exist. Available datasets: ${datasets.join(', ')}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } @@ -145,7 +145,7 @@ export class CreateAliasCommand extends SanityCommand createAliasDebug(`Error creating dataset alias`, error) this.error( `Dataset alias creation failed: ${error instanceof Error ? error.message : String(error)}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } } diff --git a/packages/@sanity/cli/src/commands/datasets/alias/delete.ts b/packages/@sanity/cli/src/commands/datasets/alias/delete.ts index 0ff3750b33..1913f0bd06 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/delete.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/delete.ts @@ -72,7 +72,7 @@ export class DeleteAliasCommand extends SanityCommand if (!existingAlias) { this.error(`Dataset alias "${displayName}" does not exist`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } @@ -95,7 +95,7 @@ export class DeleteAliasCommand extends SanityCommand const errorMessage = error instanceof Error ? error.message : String(error) deleteAliasDebug(`Error deleting dataset alias ${args.aliasName}`, error) - this.error(`Dataset alias deletion failed: ${errorMessage}`, {exit: 1}) + this.error(`Dataset alias deletion failed: ${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR}) } } diff --git a/packages/@sanity/cli/src/commands/datasets/alias/link.ts b/packages/@sanity/cli/src/commands/datasets/alias/link.ts index 8fff533948..7fe0125cf4 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/link.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/link.ts @@ -123,7 +123,7 @@ export class LinkAliasCommand extends SanityCommand { const availableAliases = aliases.map((a) => `~${a.name}`).join(', ') this.error( `Dataset alias "${displayName}" does not exist. Available aliases: ${availableAliases}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } @@ -136,18 +136,18 @@ export class LinkAliasCommand extends SanityCommand { : null) if (!targetDataset) { - this.error('No datasets available to link to', {exit: 1}) + this.error('No datasets available to link to', {exit: exitCodes.RUNTIME_ERROR}) } if (!datasets.includes(targetDataset)) { this.error( `Dataset "${targetDataset}" does not exist. Available datasets: ${datasets.join(', ')}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } if (existingAlias.datasetName === targetDataset) { - this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, {exit: 1}) + this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, {exit: exitCodes.RUNTIME_ERROR}) } if (existingAlias.datasetName && !force) { @@ -169,7 +169,7 @@ export class LinkAliasCommand extends SanityCommand { linkAliasDebug(`Error linking dataset alias`, error) this.error( `Dataset alias linking failed: ${error instanceof Error ? error.message : String(error)}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } } diff --git a/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts b/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts index b333ab3a88..e881fac312 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts @@ -92,11 +92,11 @@ export class UnlinkAliasCommand extends SanityCommand // get the current alias from the remote alias list const linkedAlias = aliases.find((elem) => elem.name === apiName) if (!linkedAlias) { - this.error(`Dataset alias "${displayName}" does not exist`, {exit: 1}) + this.error(`Dataset alias "${displayName}" does not exist`, {exit: exitCodes.RUNTIME_ERROR}) } if (!linkedAlias.datasetName) { - this.error(`Dataset alias "${displayName}" is not linked to a dataset`, {exit: 1}) + this.error(`Dataset alias "${displayName}" is not linked to a dataset`, {exit: exitCodes.RUNTIME_ERROR}) } if (force) { @@ -117,7 +117,7 @@ export class UnlinkAliasCommand extends SanityCommand unlinkAliasDebug('Error unlinking dataset alias', error) this.error( `Dataset alias unlink failed: ${error instanceof Error ? error.message : String(error)}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } } diff --git a/packages/@sanity/cli/src/commands/datasets/copy.ts b/packages/@sanity/cli/src/commands/datasets/copy.ts index 9a23e13241..2749da1ccb 100644 --- a/packages/@sanity/cli/src/commands/datasets/copy.ts +++ b/packages/@sanity/cli/src/commands/datasets/copy.ts @@ -233,7 +233,7 @@ export class CopyDatasetCommand extends SanityCommand copyDatasetDebug('Attaching to copy job %s', jobId) if (jobId.trim() === '') { - return this.output.error('Please supply a valid jobId', {exit: 1}) + return this.output.error('Please supply a valid jobId', {exit: exitCodes.RUNTIME_ERROR}) } try { @@ -242,7 +242,7 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Failed to attach to copy job: %s', message, error) - return this.output.error(`Failed to attach to copy job: ${message}`, {exit: 1}) + return this.output.error(`Failed to attach to copy job: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -271,7 +271,7 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Failed to fetch datasets: %s', message, error) - return this.output.error(`Failed to fetch datasets: ${message}`, {exit: 1}) + return this.output.error(`Failed to fetch datasets: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } const datasetNames = new Set(datasetsResponse.map((ds) => ds.name)) @@ -284,7 +284,7 @@ export class CopyDatasetCommand extends SanityCommand } if (!datasetNames.has(sourceDataset)) { - return this.output.error(`Source dataset "${sourceDataset}" doesn't exist`, {exit: 1}) + return this.output.error(`Source dataset "${sourceDataset}" doesn't exist`, {exit: exitCodes.RUNTIME_ERROR}) } // Get and validate target dataset @@ -301,7 +301,7 @@ export class CopyDatasetCommand extends SanityCommand } if (datasetNames.has(targetDataset)) { - return this.output.error(`Target dataset "${targetDataset}" already exists`, {exit: 1}) + return this.output.error(`Target dataset "${targetDataset}" already exists`, {exit: exitCodes.RUNTIME_ERROR}) } // Start the copy job @@ -335,7 +335,7 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Dataset copying failed: %s', message, error) - return this.output.error(`Dataset copying failed: ${message}`, {exit: 1}) + return this.output.error(`Dataset copying failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -361,7 +361,7 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error) - return this.output.error(`Failed to list dataset copy jobs: ${message}`, {exit: 1}) + return this.output.error(`Failed to list dataset copy jobs: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } diff --git a/packages/@sanity/cli/src/commands/datasets/create.ts b/packages/@sanity/cli/src/commands/datasets/create.ts index a4925fcc65..940ec486a3 100644 --- a/packages/@sanity/cli/src/commands/datasets/create.ts +++ b/packages/@sanity/cli/src/commands/datasets/create.ts @@ -104,11 +104,11 @@ export class CreateDatasetCommand extends SanityCommand set.name === dataset)) { - this.error(`Dataset with name "${dataset}" not found`, {exit: 1}) + this.error(`Dataset with name "${dataset}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } this.log( @@ -204,7 +204,7 @@ dataset: ${dataset.padEnd(46)}`, const outputPath = await this.getOutputPath(destinationPath, dataset, flags) if (!outputPath) { - this.error('Cancelled', {exit: 1}) + this.error('Cancelled', {exit: exitCodes.RUNTIME_ERROR}) } // Prepare export options @@ -233,7 +233,7 @@ dataset: ${dataset.padEnd(46)}`, fail() const err = error instanceof Error ? error : new Error(String(error)) exportDebug('Export failed', err) - this.error(`Export failed: ${err.message}`, {exit: 1}) + this.error(`Export failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -293,12 +293,12 @@ dataset: ${dataset.padEnd(46)}`, this.error( `Permission denied: Cannot create directory "${createPath}". Please check write permissions.`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } else { this.error(`Failed to create directory "${createPath}": ${err.message}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } } diff --git a/packages/@sanity/cli/src/commands/datasets/import.ts b/packages/@sanity/cli/src/commands/datasets/import.ts index b8556b3986..c6252d2d96 100644 --- a/packages/@sanity/cli/src/commands/datasets/import.ts +++ b/packages/@sanity/cli/src/commands/datasets/import.ts @@ -219,7 +219,7 @@ export class ImportDatasetCommand extends SanityCommand if (datasets.status === 'rejected') { const err = datasets.reason as Error listDatasetDebug(`Error listing datasets for project ${projectId}`, err) - this.error(`Dataset list retrieval failed: ${err.message}`, {exit: 1}) + this.error(`Dataset list retrieval failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } const datasetList = datasets.value diff --git a/packages/@sanity/cli/src/commands/datasets/visibility/get.ts b/packages/@sanity/cli/src/commands/datasets/visibility/get.ts index dd706bec39..5926fe2f66 100644 --- a/packages/@sanity/cli/src/commands/datasets/visibility/get.ts +++ b/packages/@sanity/cli/src/commands/datasets/visibility/get.ts @@ -58,12 +58,12 @@ export class DatasetVisibilityGetCommand extends SanityCommand curr.name === dataset) if (!current) { - this.error(`Dataset "${dataset}" not found`, {exit: 1}) + this.error(`Dataset "${dataset}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } if (current.aclMode === mode) { @@ -99,7 +99,7 @@ export class DatasetVisibilitySetCommand extends SanityCommand { })) if (!shouldProceed) { - this.output.error('Cancelled.', {exit: 1}) + this.output.error('Cancelled.', {exit: exitCodes.RUNTIME_ERROR}) } } diff --git a/packages/@sanity/cli/src/commands/dev.ts b/packages/@sanity/cli/src/commands/dev.ts index af97be10de..c3a394f3da 100644 --- a/packages/@sanity/cli/src/commands/dev.ts +++ b/packages/@sanity/cli/src/commands/dev.ts @@ -1,7 +1,7 @@ import {styleText} from 'node:util' import {Flags} from '@oclif/core' -import {type CliConfig, SanityCommand} from '@sanity/cli-core' +import {type CliConfig, exitCodes, SanityCommand} from '@sanity/cli-core' import {isWorkbenchApp} from '@sanity/workbench-cli' import {devAction} from '../actions/dev/devAction.js' @@ -81,7 +81,7 @@ export class DevCommand extends SanityCommand { this.output.error( styleText(['red', 'bgBlack'], `Failed to start dev server: ${error.message}`), { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } diff --git a/packages/@sanity/cli/src/commands/docs/read.ts b/packages/@sanity/cli/src/commands/docs/read.ts index e47b9ee6ec..048ffdb350 100644 --- a/packages/@sanity/cli/src/commands/docs/read.ts +++ b/packages/@sanity/cli/src/commands/docs/read.ts @@ -119,7 +119,7 @@ export class DocsReadCommand extends SanityCommand { this.log(content) } catch (error) { this.error(error instanceof Error ? error.message : 'Failed to read article', { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } } diff --git a/packages/@sanity/cli/src/commands/docs/search.ts b/packages/@sanity/cli/src/commands/docs/search.ts index 93c55d0f5e..0de9fde608 100644 --- a/packages/@sanity/cli/src/commands/docs/search.ts +++ b/packages/@sanity/cli/src/commands/docs/search.ts @@ -1,7 +1,7 @@ import {styleText} from 'node:util' import {Args, Flags} from '@oclif/core' -import {isInteractive, SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, isInteractive, SanityCommand, subdebug} from '@sanity/cli-core' import {select} from '@sanity/cli-core/ux' import {readDoc, searchDocs, type SearchResult} from '../../services/docs.js' @@ -66,7 +66,7 @@ export class DocsSearchCommand extends SanityCommand { ? error.message : 'The documentation search API is currently unavailable. Please try again later.' this.error(message, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } @@ -114,7 +114,7 @@ export class DocsSearchCommand extends SanityCommand { this.error( `Failed to read article: ${error instanceof Error ? error.message : 'Unknown error'}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } diff --git a/packages/@sanity/cli/src/commands/doctor.ts b/packages/@sanity/cli/src/commands/doctor.ts index 28370d759b..d34080ebdb 100644 --- a/packages/@sanity/cli/src/commands/doctor.ts +++ b/packages/@sanity/cli/src/commands/doctor.ts @@ -1,7 +1,7 @@ import {styleText} from 'node:util' import {Args, Flags} from '@oclif/core' -import {SanityCommand} from '@sanity/cli-core' +import {exitCodes, SanityCommand} from '@sanity/cli-core' import {logSymbols} from '@sanity/cli-core/ux' import {type DoctorCheckName, doctorChecks, KNOWN_CHECKS} from '../actions/doctor/checks/index.js' @@ -69,7 +69,7 @@ export class DoctorCommand extends SanityCommand { try { checks = getChecks(argv) } catch (err) { - return this.output.error(err instanceof Error ? err.message : String(err), {exit: 2}) + return this.output.error(err instanceof Error ? err.message : String(err), {exit: exitCodes.USAGE_ERROR}) } const cwd = process.cwd() @@ -91,7 +91,7 @@ export class DoctorCommand extends SanityCommand { // Exit with error code if any checks failed if (results.summary.errors > 0) { - return this.exit(1) + return this.exit(exitCodes.RUNTIME_ERROR) } } diff --git a/packages/@sanity/cli/src/commands/documents/create.ts b/packages/@sanity/cli/src/commands/documents/create.ts index 3222b9e9d9..b1b55eb3e1 100644 --- a/packages/@sanity/cli/src/commands/documents/create.ts +++ b/packages/@sanity/cli/src/commands/documents/create.ts @@ -152,7 +152,7 @@ export class CreateDocumentCommand extends SanityCommand const doc = await projectClient.getDocument(documentId) if (!doc) { - this.error(`Document "${documentId}" not found in dataset "${targetDataset}"`, {exit: 1}) + this.error(`Document "${documentId}" not found in dataset "${targetDataset}"`, {exit: exitCodes.RUNTIME_ERROR}) } // Output the document @@ -98,7 +98,7 @@ export class GetDocumentCommand extends SanityCommand const err = error as Error getDocumentDebug(`Error fetching document ${documentId}`, err) - this.error(`Failed to fetch document: ${err.message}`, {exit: 1}) + this.error(`Failed to fetch document: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/documents/query.ts b/packages/@sanity/cli/src/commands/documents/query.ts index ae2bc3a43b..daaba13ce9 100644 --- a/packages/@sanity/cli/src/commands/documents/query.ts +++ b/packages/@sanity/cli/src/commands/documents/query.ts @@ -108,7 +108,7 @@ export class QueryDocumentCommand extends SanityCommand 1 : apiDefs.length > 1 @@ -172,7 +172,7 @@ export class GraphQLDeployCommand extends SanityCommand apiDef.id === apiId)) { - this.error(`GraphQL API with id "${apiId}" not found`, {exit: 1}) + this.error(`GraphQL API with id "${apiId}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -187,7 +187,7 @@ export class GraphQLDeployCommand extends SanityCommand { const message = error instanceof Error ? error.message : String(error) listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error) - this.error(`GraphQL endpoints list retrieval failed:\n${message}`, {exit: 1}) + this.error(`GraphQL endpoints list retrieval failed:\n${message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (!endpoints || endpoints.length === 0) { diff --git a/packages/@sanity/cli/src/commands/graphql/undeploy.ts b/packages/@sanity/cli/src/commands/graphql/undeploy.ts index 260ff0cf46..4d7b684c59 100644 --- a/packages/@sanity/cli/src/commands/graphql/undeploy.ts +++ b/packages/@sanity/cli/src/commands/graphql/undeploy.ts @@ -82,7 +82,7 @@ export class Undeploy extends SanityCommand { const apiDef = apiDefs.find((def) => def.id === apiFlag) if (!apiDef) { - this.error(`GraphQL API "${apiFlag}" not found`, {exit: 1}) + this.error(`GraphQL API "${apiFlag}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } projectId = apiDef.projectId @@ -161,7 +161,7 @@ export class Undeploy extends SanityCommand { } catch (error) { const err = error instanceof Error ? error : new Error(`${error}`) undeployGraphqlDebug(`Error deleting GraphQL API for ${dataset}/${tag}`, err) - this.error(`GraphQL API deletion failed:\n${err.message}`, {exit: 1}) + this.error(`GraphQL API deletion failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/hooks/attempt.ts b/packages/@sanity/cli/src/commands/hooks/attempt.ts index 4a2259b92d..aaeeb768d4 100644 --- a/packages/@sanity/cli/src/commands/hooks/attempt.ts +++ b/packages/@sanity/cli/src/commands/hooks/attempt.ts @@ -1,5 +1,5 @@ import {Args} from '@oclif/core' -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import {formatFailure} from '../../actions/hook/formatFailure.js' import {type DeliveryAttempt} from '../../actions/hook/types.js' @@ -55,7 +55,7 @@ export class AttemptHookCommand extends SanityCommand } catch (error) { const err = error as Error attemptDebug(`Error fetching hook attempt ${attemptId}`, err) - this.error(`Hook attempt retrieval failed:\n${err.message}`, {exit: 1}) + this.error(`Hook attempt retrieval failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } const {createdAt, failureReason, inProgress, resultBody, resultCode} = attempt diff --git a/packages/@sanity/cli/src/commands/hooks/create.ts b/packages/@sanity/cli/src/commands/hooks/create.ts index 0312887f40..8aa9f8f17e 100644 --- a/packages/@sanity/cli/src/commands/hooks/create.ts +++ b/packages/@sanity/cli/src/commands/hooks/create.ts @@ -1,4 +1,4 @@ -import {getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core' import open from 'open' import {promptForProject} from '../../prompts/promptForProject.js' @@ -41,7 +41,7 @@ export class CreateHookCommand extends SanityCommand { } catch (error) { const err = error as Error createHookDebug(`Error fetching project info for project ${projectId}`, err) - this.error(`Failed to fetch project information:\n${err.message}`, {exit: 1}) + this.error(`Failed to fetch project information:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } const organizationId = projectInfo.organizationId || 'personal' @@ -61,7 +61,7 @@ export class CreateHookCommand extends SanityCommand { } catch (error) { const err = error as Error createHookDebug('Error opening browser', err) - this.error(`Failed to open browser:\n${err.message}`, {exit: 1}) + this.error(`Failed to open browser:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/hooks/delete.ts b/packages/@sanity/cli/src/commands/hooks/delete.ts index 3e9fa0fa39..c2ce5d2ed0 100644 --- a/packages/@sanity/cli/src/commands/hooks/delete.ts +++ b/packages/@sanity/cli/src/commands/hooks/delete.ts @@ -69,7 +69,7 @@ export class Delete extends SanityCommand { } catch (error) { const err = error as Error deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err) - this.error(`Hook deletion failed:\n${err.message}`, {exit: 1}) + this.error(`Hook deletion failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -83,11 +83,11 @@ export class Delete extends SanityCommand { } catch (error) { const err = error as Error deleteHookDebug(`Error fetching hooks for project ${projectId}`, err) - this.error(`Failed to fetch hooks:\n${err.message}`, {exit: 1}) + this.error(`Failed to fetch hooks:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (hooks.length === 0) { - this.error('No hooks configured for this project.', {exit: 1}) + this.error('No hooks configured for this project.', {exit: exitCodes.RUNTIME_ERROR}) } // If hook name is specified, find it in the list @@ -96,7 +96,7 @@ export class Delete extends SanityCommand { const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower) if (!selectedHook) { - this.error(`Hook with name "${specifiedName}" not found`, {exit: 1}) + this.error(`Hook with name "${specifiedName}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } return selectedHook.id diff --git a/packages/@sanity/cli/src/commands/hooks/list.ts b/packages/@sanity/cli/src/commands/hooks/list.ts index 5051e95615..976045ef47 100644 --- a/packages/@sanity/cli/src/commands/hooks/list.ts +++ b/packages/@sanity/cli/src/commands/hooks/list.ts @@ -1,4 +1,4 @@ -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import {type Hook} from '../../actions/hook/types' import {promptForProject} from '../../prompts/promptForProject.js' @@ -45,7 +45,7 @@ export class List extends SanityCommand { const err = error as Error listHookDebug(`Error fetching hooks for project ${projectId}`, err) - this.error(`Hook list retrieval failed:\n${err.message}`, {exit: 1}) + this.error(`Hook list retrieval failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } for (const hook of hooks) { diff --git a/packages/@sanity/cli/src/commands/hooks/logs.ts b/packages/@sanity/cli/src/commands/hooks/logs.ts index cbca8e85b5..6c65368f3c 100644 --- a/packages/@sanity/cli/src/commands/hooks/logs.ts +++ b/packages/@sanity/cli/src/commands/hooks/logs.ts @@ -73,11 +73,11 @@ export class LogsHookCommand extends SanityCommand { } catch (error) { const err = error as Error logsHookDebug(`Error fetching hooks for project ${projectId}`, err) - this.error(`Hook list retrieval failed:\n${err.message}`, {exit: 1}) + this.error(`Hook list retrieval failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (hooks.length === 0) { - this.error('No hooks currently registered', {exit: 1}) + this.error('No hooks currently registered', {exit: exitCodes.RUNTIME_ERROR}) } // If hook name is provided, find that specific hook @@ -85,7 +85,7 @@ export class LogsHookCommand extends SanityCommand { if (args.name) { selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase()) if (!selectedHook) { - this.error(`Hook with name "${args.name}" not found`, {exit: 1}) + this.error(`Hook with name "${args.name}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } } else if (hooks.length === 1) { // If only one hook exists, use that @@ -104,7 +104,7 @@ export class LogsHookCommand extends SanityCommand { } if (!selectedHook) { - this.error('No hook selected', {exit: 1}) + this.error('No hook selected', {exit: exitCodes.RUNTIME_ERROR}) } // Fetch messages and attempts for the selected hook @@ -124,7 +124,7 @@ export class LogsHookCommand extends SanityCommand { } catch (error) { const err = error as Error logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err) - this.error(`Hook logs retrieval failed:\n${err.message}`, {exit: 1}) + this.error(`Hook logs retrieval failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } // Group attempts by message ID diff --git a/packages/@sanity/cli/src/commands/login.ts b/packages/@sanity/cli/src/commands/login.ts index 3fb1f43b85..5102ca859d 100644 --- a/packages/@sanity/cli/src/commands/login.ts +++ b/packages/@sanity/cli/src/commands/login.ts @@ -2,7 +2,7 @@ import {text} from 'node:stream/consumers' import {Command, Flags} from '@oclif/core' import {type FlagInput} from '@oclif/core/interfaces' -import {SanityCommand} from '@sanity/cli-core' +import {exitCodes, SanityCommand} from '@sanity/cli-core' import {login} from '../actions/auth/login/login.js' import {LOGIN_PROVIDER_IDS} from '../actions/auth/login/loginInstructions.js' @@ -80,7 +80,7 @@ export class LoginCommand extends SanityCommand { this.log('Login successful') } catch (error) { const message = error instanceof Error ? error.message : String(error) - this.error(`Login failed: ${message}`, {exit: 1}) + this.error(`Login failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/logout.ts b/packages/@sanity/cli/src/commands/logout.ts index 7b62748d17..2c8334066e 100644 --- a/packages/@sanity/cli/src/commands/logout.ts +++ b/packages/@sanity/cli/src/commands/logout.ts @@ -1,4 +1,4 @@ -import {getCliToken, getUserConfig, SanityCommand, setCliUserConfig} from '@sanity/cli-core' +import {exitCodes, getCliToken, getUserConfig, SanityCommand, setCliUserConfig} from '@sanity/cli-core' import {isHttpError} from '@sanity/client' import {logout} from '../services/auth.js' @@ -28,7 +28,7 @@ export class LogoutCommand extends SanityCommand { return } const err = error instanceof Error ? error : new Error(`${error}`) - this.error(`Failed to logout: ${err.message}`, {exit: 1}) + this.error(`Failed to logout: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } diff --git a/packages/@sanity/cli/src/commands/manifest/extract.ts b/packages/@sanity/cli/src/commands/manifest/extract.ts index f3d6b7be85..74964bfb11 100644 --- a/packages/@sanity/cli/src/commands/manifest/extract.ts +++ b/packages/@sanity/cli/src/commands/manifest/extract.ts @@ -1,6 +1,6 @@ import {Flags} from '@oclif/core' import {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract' -import {findProjectRoot, SanityCommand} from '@sanity/cli-core' +import {exitCodes, findProjectRoot, SanityCommand} from '@sanity/cli-core' import {manifestDebug} from '../../actions/manifest/debug.js' import {extractManifest} from '../../actions/manifest/extractManifest.js' @@ -50,12 +50,12 @@ export class ExtractManifestCommand extends SanityCommand 0 ) { this.output.log(formatSchemaValidation(error.validation)) - this.exit(1) + this.exit(exitCodes.RUNTIME_ERROR) } this.error( `Failed to extract manifest:\n${error instanceof Error ? error.message : String(error)}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } } diff --git a/packages/@sanity/cli/src/commands/mcp/configure.ts b/packages/@sanity/cli/src/commands/mcp/configure.ts index 0cf718243c..e967888a6e 100644 --- a/packages/@sanity/cli/src/commands/mcp/configure.ts +++ b/packages/@sanity/cli/src/commands/mcp/configure.ts @@ -1,4 +1,4 @@ -import {isInteractive, SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, isInteractive, SanityCommand, subdebug} from '@sanity/cli-core' import {getErrorMessage, toError} from '@sanity/cli-core/errors' import {ensureAuthenticated} from '../../actions/auth/ensureAuthenticated.js' @@ -32,11 +32,11 @@ export class ConfigureMcpCommand extends SanityCommand promptForProject({})}) @@ -143,7 +143,7 @@ export class MediaDeployAspectCommand extends SanityCommand this.error( `Failed to list media libraries:\n${error instanceof Error ? error.message : error}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } if (mediaLibraries.length === 0) { - this.error('No active media libraries found in this project', {exit: 1}) + this.error('No active media libraries found in this project', {exit: exitCodes.RUNTIME_ERROR}) } let mediaLibraryId = flags['media-library-id'] @@ -106,14 +106,14 @@ export class MediaExportCommand extends SanityCommand this.error( `Failed to select media library:\n${error instanceof Error ? error.message : error}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } } if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) { - this.error(`Media library with id "${mediaLibraryId}" not found`, {exit: 1}) + this.error(`Media library with id "${mediaLibraryId}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } this.log( @@ -137,7 +137,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags) if (!outputPath) { - this.error('Cancelled', {exit: 1}) + this.error('Cancelled', {exit: exitCodes.RUNTIME_ERROR}) } const {fail, onProgress, succeed} = this.createProgressHandler() @@ -159,7 +159,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, fail() const err = error instanceof Error ? error : new Error(String(error)) exportDebug('Export failed', err) - this.error(`Export failed: ${err.message}`, {exit: 1}) + this.error(`Export failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -212,7 +212,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, } catch (error) { const err = error instanceof Error ? error : new Error(String(error)) this.error(`Failed to create directory "${createPath}": ${err.message}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } } diff --git a/packages/@sanity/cli/src/commands/media/import.ts b/packages/@sanity/cli/src/commands/media/import.ts index 661aac4582..3c78a57f28 100644 --- a/packages/@sanity/cli/src/commands/media/import.ts +++ b/packages/@sanity/cli/src/commands/media/import.ts @@ -70,13 +70,13 @@ export class MediaImportCommand extends SanityCommand this.error( `Failed to list media libraries:\n${error instanceof Error ? error.message : error}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } if (mediaLibraries.length === 0) { - this.error('No active media libraries found in this project', {exit: 1}) + this.error('No active media libraries found in this project', {exit: exitCodes.RUNTIME_ERROR}) } let mediaLibraryId = flags['media-library-id'] @@ -93,14 +93,14 @@ export class MediaImportCommand extends SanityCommand this.error( `Failed to select media library:\n${error instanceof Error ? error.message : error}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }, ) } } if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) { - this.error(`Media library with id "${mediaLibraryId}" not found`, {exit: 1}) + this.error(`Media library with id "${mediaLibraryId}" not found`, {exit: exitCodes.RUNTIME_ERROR}) } const projectClient = await getProjectCliClient({ @@ -165,10 +165,10 @@ export class MediaImportCommand extends SanityCommand process.once('SIGINT', () => { subscription.unsubscribe() spin.fail('Import interrupted.') - process.exit(130) + process.exit(exitCodes.SIGINT) }) }).catch((error) => { - this.error(styleText('red', error.message), {exit: 1}) + this.error(styleText('red', error.message), {exit: exitCodes.RUNTIME_ERROR}) }) } diff --git a/packages/@sanity/cli/src/commands/migrations/create.ts b/packages/@sanity/cli/src/commands/migrations/create.ts index 0e93a40507..8fc0cc95d1 100644 --- a/packages/@sanity/cli/src/commands/migrations/create.ts +++ b/packages/@sanity/cli/src/commands/migrations/create.ts @@ -3,7 +3,7 @@ import path from 'node:path' import {styleText} from 'node:util' import {Args} from '@oclif/core' -import {SanityCommand} from '@sanity/cli-core' +import {exitCodes, SanityCommand} from '@sanity/cli-core' import {confirm, input, select} from '@sanity/cli-core/ux' import {MIGRATIONS_DIRECTORY} from '../../actions/migration/constants.js' @@ -77,7 +77,7 @@ export class CreateMigrationCommand extends SanityCommand`')} to create a new migration`, ) - this.exit(1) + this.exit(exitCodes.RUNTIME_ERROR) } const table = new Table({ @@ -144,7 +144,7 @@ export class RunMigrationCommand extends SanityCommand` to run a migration') - this.exit(1) + this.exit(exitCodes.RUNTIME_ERROR) } const cliConfig = await this.getCliConfig() @@ -158,20 +158,20 @@ export class RunMigrationCommand extends SanityCommand path.relative(migrationsDirectoryPath, candidate.absolutePath)) .join('\n - ')}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } @@ -195,7 +195,7 @@ export class RunMigrationCommand extends SanityCommand path.relative(migrationsDirectoryPath, candidate.absolutePath)) .join('\n - ')}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } @@ -206,7 +206,7 @@ export class RunMigrationCommand extends SanityCommand MAX_MUTATION_CONCURRENCY) { this.error(`Concurrency exceeds the maximum allowed value of ${MAX_MUTATION_CONCURRENCY}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } if (concurrency < 1) { - this.error(`Concurrency must be a positive number, got ${concurrency}`, {exit: 1}) + this.error(`Concurrency must be a positive number, got ${concurrency}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -360,7 +360,7 @@ export class RunMigrationCommand extends SanityCommand { getOpenapiDebug(`Error fetching OpenAPI spec ${slug}`, error) if (error instanceof Response && error.status === 404) { - this.error(`OpenAPI specification not found. ${slug}`, {exit: 1}) + this.error(`OpenAPI specification not found. ${slug}`, {exit: exitCodes.RUNTIME_ERROR}) } this.error('The OpenAPI service is currently unavailable. Please try again later.', { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } } diff --git a/packages/@sanity/cli/src/commands/openapi/list.ts b/packages/@sanity/cli/src/commands/openapi/list.ts index 3fdea2552e..ef8ab9b01e 100644 --- a/packages/@sanity/cli/src/commands/openapi/list.ts +++ b/packages/@sanity/cli/src/commands/openapi/list.ts @@ -1,5 +1,5 @@ import {Flags} from '@oclif/core' -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import open from 'open' interface OpenAPISpec { @@ -56,7 +56,7 @@ export class ListOpenApiCommand extends SanityCommand listOpenapiDebug('Error fetching OpenAPI specs', error) this.error('The OpenAPI service is currently unavailable. Please try again later.', { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, }) } diff --git a/packages/@sanity/cli/src/commands/organizations/create.ts b/packages/@sanity/cli/src/commands/organizations/create.ts index 650a236952..e0e383ef3b 100644 --- a/packages/@sanity/cli/src/commands/organizations/create.ts +++ b/packages/@sanity/cli/src/commands/organizations/create.ts @@ -1,6 +1,6 @@ import {Flags} from '@oclif/core' import {type FlagInput} from '@oclif/core/interfaces' -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import {getErrorMessage} from '@sanity/cli-core/errors' import {spinner} from '@sanity/cli-core/ux' @@ -47,20 +47,20 @@ export class CreateOrganizationCommand extends SanityCommand { const message = error instanceof Error ? error.message : String(error) this.output.error(`Failed to start preview server: ${message}`, { - exit: 1, + exit: exitCodes.RUNTIME_ERROR, suggestions, }) } diff --git a/packages/@sanity/cli/src/commands/projects/create.ts b/packages/@sanity/cli/src/commands/projects/create.ts index 2a5bb2cb1f..8f196c1173 100644 --- a/packages/@sanity/cli/src/commands/projects/create.ts +++ b/packages/@sanity/cli/src/commands/projects/create.ts @@ -122,7 +122,7 @@ export class CreateProjectCommand extends SanityCommand { for (const row of rows) this.log(printRow(row)) } catch (error) { projectsDebug('Error listing projects', error) - this.error('Failed to list projects', {exit: 1}) + this.error('Failed to list projects', {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/schemas/delete.ts b/packages/@sanity/cli/src/commands/schemas/delete.ts index 4a0ea01412..563f4bf360 100644 --- a/packages/@sanity/cli/src/commands/schemas/delete.ts +++ b/packages/@sanity/cli/src/commands/schemas/delete.ts @@ -108,13 +108,13 @@ export class DeleteSchemaCommand extends SanityCommand 0 ) { this.output.log(formatSchemaValidation(error.validation)) - this.exit(1) + this.exit(exitCodes.RUNTIME_ERROR) } schemasDeployDebug('Failed to deploy schemas', error) const errorMessage = error instanceof Error ? error.message : String(error) - this.error(`Failed to deploy schemas:\n${errorMessage}`, {exit: 1}) + this.error(`Failed to deploy schemas:\n${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/schemas/list.ts b/packages/@sanity/cli/src/commands/schemas/list.ts index ddaa1c8d7c..b15b2742ba 100644 --- a/packages/@sanity/cli/src/commands/schemas/list.ts +++ b/packages/@sanity/cli/src/commands/schemas/list.ts @@ -83,7 +83,7 @@ export class ListSchemaCommand extends SanityCommand { schemasListDebug('Failed to list schemas', error) const errorMessage = error instanceof Error ? error.message : String(error) - this.error(`Failed to list schemas:\n${errorMessage}`, {exit: 1}) + this.error(`Failed to list schemas:\n${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/schemas/validate.ts b/packages/@sanity/cli/src/commands/schemas/validate.ts index 3c6c604eb0..85e14d2009 100644 --- a/packages/@sanity/cli/src/commands/schemas/validate.ts +++ b/packages/@sanity/cli/src/commands/schemas/validate.ts @@ -1,5 +1,6 @@ import {Flags} from '@oclif/core' import {subdebug} from '@sanity/cli-core/debug' +import {exitCodes} from '@sanity/cli-core/ExitCodes' import {SanityCommand} from '@sanity/cli-core/SanityCommand' import {validateAction} from '../../actions/schema/validateAction.js' @@ -71,7 +72,7 @@ export class SchemaValidate extends SanityCommand { debug('Error validating schema', error) return this.output.error( `Error validating schema: ${error instanceof Error ? error.message : String(error)}`, - {exit: 1}, + {exit: exitCodes.RUNTIME_ERROR}, ) } } diff --git a/packages/@sanity/cli/src/commands/skills/install.ts b/packages/@sanity/cli/src/commands/skills/install.ts index 6a2d6603ae..a7dbe15918 100644 --- a/packages/@sanity/cli/src/commands/skills/install.ts +++ b/packages/@sanity/cli/src/commands/skills/install.ts @@ -1,4 +1,4 @@ -import {SanityCommand, subdebug} from '@sanity/cli-core' +import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core' import {getErrorMessage, toError} from '@sanity/cli-core/errors' import {configureSkills} from '../../actions/skills/configureSkills.js' @@ -37,7 +37,7 @@ export class InstallSkillsCommand extends SanityCommand { } } catch (err: unknown) { const message = err instanceof Error ? err.message : 'An unknown error occurred' - this.output.error(message, {exit: 1}) + this.output.error(message, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/telemetry/enable.ts b/packages/@sanity/cli/src/commands/telemetry/enable.ts index a020253375..b5637f33e8 100644 --- a/packages/@sanity/cli/src/commands/telemetry/enable.ts +++ b/packages/@sanity/cli/src/commands/telemetry/enable.ts @@ -1,6 +1,6 @@ import {Command} from '@oclif/core' import {type FlagInput} from '@oclif/core/interfaces' -import {SanityCommand} from '@sanity/cli-core' +import {exitCodes, SanityCommand} from '@sanity/cli-core' import {setConsent} from '../../actions/telemetry/setConsent.js' import {telemetryLearnMoreMessage} from '../../actions/telemetry/telemetryLearnMoreMessage.js' @@ -33,7 +33,7 @@ export class Enable extends SanityCommand { } } catch (err: unknown) { const message = err instanceof Error ? err.message : 'An unknown error occurred' - return this.output.error(message, {exit: 1}) + return this.output.error(message, {exit: exitCodes.RUNTIME_ERROR}) } } } diff --git a/packages/@sanity/cli/src/commands/tokens/create.ts b/packages/@sanity/cli/src/commands/tokens/create.ts index 371d455971..44a043d86f 100644 --- a/packages/@sanity/cli/src/commands/tokens/create.ts +++ b/packages/@sanity/cli/src/commands/tokens/create.ts @@ -117,7 +117,7 @@ export class CreateTokenCommand extends SanityCommand const err = error as Error tokensCreateDebug(`Error creating token for project ${projectId}`, err) - this.error(`Token creation failed:\n${err.message}`, {exit: 1}) + this.error(`Token creation failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) } } @@ -152,7 +152,7 @@ export class CreateTokenCommand extends SanityCommand tokensCreateDebug('Robot roles', {robotRoles}) if (robotRoles.length === 0) { - this.error('No roles available for tokens', {exit: 1}) + this.error('No roles available for tokens', {exit: exitCodes.RUNTIME_ERROR}) } const selectedRoleName = await select({ diff --git a/packages/@sanity/cli/src/commands/tokens/delete.ts b/packages/@sanity/cli/src/commands/tokens/delete.ts index 16453672ba..7736648d01 100644 --- a/packages/@sanity/cli/src/commands/tokens/delete.ts +++ b/packages/@sanity/cli/src/commands/tokens/delete.ts @@ -112,12 +112,12 @@ export class DeleteTokensCommand extends SanityCommand { } catch (error) { const message = getErrorMessage(error) listTokenDebug(`Error fetching tokens for project ${projectId}`, error) - this.error(`Token list retrieval failed:\n${message}`, {exit: 1}) + this.error(`Token list retrieval failed:\n${message}`, {exit: exitCodes.RUNTIME_ERROR}) } if (outputJson) { diff --git a/packages/@sanity/cli/src/commands/users/invite.ts b/packages/@sanity/cli/src/commands/users/invite.ts index 5c1ba99c4e..c2d44293f0 100644 --- a/packages/@sanity/cli/src/commands/users/invite.ts +++ b/packages/@sanity/cli/src/commands/users/invite.ts @@ -98,7 +98,7 @@ export class UsersInviteCommand extends SanityCommand roles = (await getProjectRoles(projectId)).filter((role) => role.appliesToUsers) } catch (error) { usersInviteDebug('Error fetching roles', error) - this.error('Error fetching roles', {exit: 1}) + this.error('Error fetching roles', {exit: exitCodes.RUNTIME_ERROR}) } const email = normalizedEmail || (await this.promptForEmail()) @@ -119,10 +119,10 @@ export class UsersInviteCommand extends SanityCommand } catch (error) { usersInviteDebug(`Error inviting user`, error) if ((error as Error & {statusCode: number}).statusCode === 402) { - this.error(QUOTA_ERROR_MESSAGE, {exit: 1}) + this.error(QUOTA_ERROR_MESSAGE, {exit: exitCodes.RUNTIME_ERROR}) } - this.error(`Error inviting user`, {exit: 1}) + this.error(`Error inviting user`, {exit: exitCodes.RUNTIME_ERROR}) } } From 9372603fa1cf7e71d83a76452272e3f6ec3710a1 Mon Sep 17 00:00:00 2001 From: Jonah Snider Date: Tue, 21 Jul 2026 23:05:46 -0700 Subject: [PATCH 2/2] style: format --- .../cli/src/commands/backups/download.ts | 4 +++- .../cli/src/commands/backups/enable.ts | 4 +++- .../@sanity/cli/src/commands/backups/list.ts | 4 +++- .../@sanity/cli/src/commands/cors/list.ts | 4 +++- .../cli/src/commands/datasets/alias/create.ts | 4 +++- .../cli/src/commands/datasets/alias/link.ts | 4 +++- .../cli/src/commands/datasets/alias/unlink.ts | 4 +++- .../@sanity/cli/src/commands/datasets/copy.ts | 24 ++++++++++++++----- .../commands/datasets/embeddings/enable.ts | 12 +++++++--- .../cli/src/commands/datasets/import.ts | 4 +++- packages/@sanity/cli/src/commands/doctor.ts | 4 +++- .../@sanity/cli/src/commands/documents/get.ts | 4 +++- .../cli/src/commands/documents/validate.ts | 4 +++- .../cli/src/commands/graphql/deploy.ts | 20 ++++++++++++---- .../@sanity/cli/src/commands/graphql/list.ts | 4 +++- .../@sanity/cli/src/commands/hooks/create.ts | 4 +++- packages/@sanity/cli/src/commands/logout.ts | 8 ++++++- .../@sanity/cli/src/commands/mcp/configure.ts | 4 +++- .../cli/src/commands/media/deploy-aspect.ts | 4 +++- .../@sanity/cli/src/commands/media/export.ts | 4 +++- .../@sanity/cli/src/commands/media/import.ts | 4 +++- .../cli/src/commands/migrations/create.ts | 4 +++- .../cli/src/commands/migrations/run.ts | 12 +++++++--- .../cli/src/commands/organizations/create.ts | 4 +++- .../cli/src/commands/organizations/delete.ts | 4 +++- .../cli/src/commands/organizations/get.ts | 4 +++- .../cli/src/commands/organizations/list.ts | 4 +++- .../cli/src/commands/organizations/update.ts | 4 +++- .../cli/src/commands/projects/create.ts | 4 +++- 29 files changed, 130 insertions(+), 42 deletions(-) diff --git a/packages/@sanity/cli/src/commands/backups/download.ts b/packages/@sanity/cli/src/commands/backups/download.ts index f43b8d3f42..7890f5167c 100644 --- a/packages/@sanity/cli/src/commands/backups/download.ts +++ b/packages/@sanity/cli/src/commands/backups/download.ts @@ -374,7 +374,9 @@ ${styleText('bold', 'backupId')}: ${styleText('cyan', opts.backupId)}`, } catch (err) { const message = err instanceof Error ? err.message : String(err) backupDownloadDebug(`Failed to fetch backups for dataset ${datasetName}: ${message}`, err) - this.error(`Failed to fetch backups for dataset ${datasetName}: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Failed to fetch backups for dataset ${datasetName}: ${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } } } diff --git a/packages/@sanity/cli/src/commands/backups/enable.ts b/packages/@sanity/cli/src/commands/backups/enable.ts index 5d5072dde2..6ce42e9d43 100644 --- a/packages/@sanity/cli/src/commands/backups/enable.ts +++ b/packages/@sanity/cli/src/commands/backups/enable.ts @@ -97,7 +97,9 @@ export class EnableBackupCommand extends SanityCommand { this.error('--after date must be before --before', {exit: exitCodes.RUNTIME_ERROR}) } } catch (err) { - this.error(`Parsing date flags: ${err instanceof Error ? err.message : err}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Parsing date flags: ${err instanceof Error ? err.message : err}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } } diff --git a/packages/@sanity/cli/src/commands/cors/list.ts b/packages/@sanity/cli/src/commands/cors/list.ts index 344c79271c..e53a222ad5 100644 --- a/packages/@sanity/cli/src/commands/cors/list.ts +++ b/packages/@sanity/cli/src/commands/cors/list.ts @@ -43,7 +43,9 @@ export class List extends SanityCommand { const err = error as Error listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err) - this.error(`CORS origins list retrieval failed:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`CORS origins list retrieval failed:\n${err.message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } if (origins.length === 0) { diff --git a/packages/@sanity/cli/src/commands/datasets/alias/create.ts b/packages/@sanity/cli/src/commands/datasets/alias/create.ts index e05bb85678..c367a1d6e9 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/create.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/create.ts @@ -122,7 +122,9 @@ export class CreateAliasCommand extends SanityCommand } if (existingAliases.includes(aliasName)) { - this.error(`Dataset alias "${aliasOutputName}" already exists`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Dataset alias "${aliasOutputName}" already exists`, { + exit: exitCodes.RUNTIME_ERROR, + }) } const targetDataset = diff --git a/packages/@sanity/cli/src/commands/datasets/alias/link.ts b/packages/@sanity/cli/src/commands/datasets/alias/link.ts index 7fe0125cf4..6c9b22daf0 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/link.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/link.ts @@ -147,7 +147,9 @@ export class LinkAliasCommand extends SanityCommand { } if (existingAlias.datasetName === targetDataset) { - this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } if (existingAlias.datasetName && !force) { diff --git a/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts b/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts index e881fac312..c507790b9d 100644 --- a/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts +++ b/packages/@sanity/cli/src/commands/datasets/alias/unlink.ts @@ -96,7 +96,9 @@ export class UnlinkAliasCommand extends SanityCommand } if (!linkedAlias.datasetName) { - this.error(`Dataset alias "${displayName}" is not linked to a dataset`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Dataset alias "${displayName}" is not linked to a dataset`, { + exit: exitCodes.RUNTIME_ERROR, + }) } if (force) { diff --git a/packages/@sanity/cli/src/commands/datasets/copy.ts b/packages/@sanity/cli/src/commands/datasets/copy.ts index 2749da1ccb..8f3ddd76be 100644 --- a/packages/@sanity/cli/src/commands/datasets/copy.ts +++ b/packages/@sanity/cli/src/commands/datasets/copy.ts @@ -242,7 +242,9 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Failed to attach to copy job: %s', message, error) - return this.output.error(`Failed to attach to copy job: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) + return this.output.error(`Failed to attach to copy job: ${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } } @@ -271,7 +273,9 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Failed to fetch datasets: %s', message, error) - return this.output.error(`Failed to fetch datasets: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) + return this.output.error(`Failed to fetch datasets: ${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } const datasetNames = new Set(datasetsResponse.map((ds) => ds.name)) @@ -284,7 +288,9 @@ export class CopyDatasetCommand extends SanityCommand } if (!datasetNames.has(sourceDataset)) { - return this.output.error(`Source dataset "${sourceDataset}" doesn't exist`, {exit: exitCodes.RUNTIME_ERROR}) + return this.output.error(`Source dataset "${sourceDataset}" doesn't exist`, { + exit: exitCodes.RUNTIME_ERROR, + }) } // Get and validate target dataset @@ -301,7 +307,9 @@ export class CopyDatasetCommand extends SanityCommand } if (datasetNames.has(targetDataset)) { - return this.output.error(`Target dataset "${targetDataset}" already exists`, {exit: exitCodes.RUNTIME_ERROR}) + return this.output.error(`Target dataset "${targetDataset}" already exists`, { + exit: exitCodes.RUNTIME_ERROR, + }) } // Start the copy job @@ -335,7 +343,9 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Dataset copying failed: %s', message, error) - return this.output.error(`Dataset copying failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) + return this.output.error(`Dataset copying failed: ${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } } @@ -361,7 +371,9 @@ export class CopyDatasetCommand extends SanityCommand } catch (error) { const message = error instanceof Error ? error.message : String(error) copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error) - return this.output.error(`Failed to list dataset copy jobs: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) + return this.output.error(`Failed to list dataset copy jobs: ${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } } diff --git a/packages/@sanity/cli/src/commands/datasets/embeddings/enable.ts b/packages/@sanity/cli/src/commands/datasets/embeddings/enable.ts index 91c80a6942..681dcd3041 100644 --- a/packages/@sanity/cli/src/commands/datasets/embeddings/enable.ts +++ b/packages/@sanity/cli/src/commands/datasets/embeddings/enable.ts @@ -134,7 +134,9 @@ export class DatasetEmbeddingsEnableCommand extends SanityCommand< } catch (error) { const message = error instanceof Error ? error.message : String(error) spin.fail('Failed while waiting for embeddings.') - this.error(`Failed while waiting for embeddings: ${message}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Failed while waiting for embeddings: ${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } debug(`Poll status: ${settings.status}, next interval: ${Math.round(interval)}ms`) @@ -145,13 +147,17 @@ export class DatasetEmbeddingsEnableCommand extends SanityCommand< if (settings.status !== 'updating') { spin.fail(`Unexpected status: ${settings.status}`) - this.error(`Embeddings entered unexpected status: ${settings.status}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Embeddings entered unexpected status: ${settings.status}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } spin.text = 'Still processing...' } spin.fail('Timed out waiting for embeddings.') - this.error('Timed out. Check status with: sanity dataset embeddings status', {exit: exitCodes.RUNTIME_ERROR}) + this.error('Timed out. Check status with: sanity dataset embeddings status', { + exit: exitCodes.RUNTIME_ERROR, + }) } } diff --git a/packages/@sanity/cli/src/commands/datasets/import.ts b/packages/@sanity/cli/src/commands/datasets/import.ts index c6252d2d96..648d40c699 100644 --- a/packages/@sanity/cli/src/commands/datasets/import.ts +++ b/packages/@sanity/cli/src/commands/datasets/import.ts @@ -294,7 +294,9 @@ export class ImportDatasetCommand extends SanityCommand { try { checks = getChecks(argv) } catch (err) { - return this.output.error(err instanceof Error ? err.message : String(err), {exit: exitCodes.USAGE_ERROR}) + return this.output.error(err instanceof Error ? err.message : String(err), { + exit: exitCodes.USAGE_ERROR, + }) } const cwd = process.cwd() diff --git a/packages/@sanity/cli/src/commands/documents/get.ts b/packages/@sanity/cli/src/commands/documents/get.ts index 6773440013..88a1916967 100644 --- a/packages/@sanity/cli/src/commands/documents/get.ts +++ b/packages/@sanity/cli/src/commands/documents/get.ts @@ -85,7 +85,9 @@ export class GetDocumentCommand extends SanityCommand const doc = await projectClient.getDocument(documentId) if (!doc) { - this.error(`Document "${documentId}" not found in dataset "${targetDataset}"`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Document "${documentId}" not found in dataset "${targetDataset}"`, { + exit: exitCodes.RUNTIME_ERROR, + }) } // Output the document diff --git a/packages/@sanity/cli/src/commands/documents/validate.ts b/packages/@sanity/cli/src/commands/documents/validate.ts index 00f2ed8f0f..7066612665 100644 --- a/packages/@sanity/cli/src/commands/documents/validate.ts +++ b/packages/@sanity/cli/src/commands/documents/validate.ts @@ -203,7 +203,9 @@ export class ValidateDocumentsCommand extends SanityCommand { const message = error instanceof Error ? error.message : String(error) listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error) - this.error(`GraphQL endpoints list retrieval failed:\n${message}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`GraphQL endpoints list retrieval failed:\n${message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } if (!endpoints || endpoints.length === 0) { diff --git a/packages/@sanity/cli/src/commands/hooks/create.ts b/packages/@sanity/cli/src/commands/hooks/create.ts index 8aa9f8f17e..c6083c7f0f 100644 --- a/packages/@sanity/cli/src/commands/hooks/create.ts +++ b/packages/@sanity/cli/src/commands/hooks/create.ts @@ -41,7 +41,9 @@ export class CreateHookCommand extends SanityCommand { } catch (error) { const err = error as Error createHookDebug(`Error fetching project info for project ${projectId}`, err) - this.error(`Failed to fetch project information:\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Failed to fetch project information:\n${err.message}`, { + exit: exitCodes.RUNTIME_ERROR, + }) } const organizationId = projectInfo.organizationId || 'personal' diff --git a/packages/@sanity/cli/src/commands/logout.ts b/packages/@sanity/cli/src/commands/logout.ts index 2c8334066e..20b5374f9e 100644 --- a/packages/@sanity/cli/src/commands/logout.ts +++ b/packages/@sanity/cli/src/commands/logout.ts @@ -1,4 +1,10 @@ -import {exitCodes, getCliToken, getUserConfig, SanityCommand, setCliUserConfig} from '@sanity/cli-core' +import { + exitCodes, + getCliToken, + getUserConfig, + SanityCommand, + setCliUserConfig, +} from '@sanity/cli-core' import {isHttpError} from '@sanity/client' import {logout} from '../services/auth.js' diff --git a/packages/@sanity/cli/src/commands/mcp/configure.ts b/packages/@sanity/cli/src/commands/mcp/configure.ts index e967888a6e..8dd0eec7ab 100644 --- a/packages/@sanity/cli/src/commands/mcp/configure.ts +++ b/packages/@sanity/cli/src/commands/mcp/configure.ts @@ -36,7 +36,9 @@ export class ConfigureMcpCommand extends SanityCommand } if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) { - this.error(`Media library with id "${mediaLibraryId}" not found`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Media library with id "${mediaLibraryId}" not found`, { + exit: exitCodes.RUNTIME_ERROR, + }) } this.log( diff --git a/packages/@sanity/cli/src/commands/media/import.ts b/packages/@sanity/cli/src/commands/media/import.ts index 3c78a57f28..43599c6f39 100644 --- a/packages/@sanity/cli/src/commands/media/import.ts +++ b/packages/@sanity/cli/src/commands/media/import.ts @@ -100,7 +100,9 @@ export class MediaImportCommand extends SanityCommand } if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) { - this.error(`Media library with id "${mediaLibraryId}" not found`, {exit: exitCodes.RUNTIME_ERROR}) + this.error(`Media library with id "${mediaLibraryId}" not found`, { + exit: exitCodes.RUNTIME_ERROR, + }) } const projectClient = await getProjectCliClient({ diff --git a/packages/@sanity/cli/src/commands/migrations/create.ts b/packages/@sanity/cli/src/commands/migrations/create.ts index 8fc0cc95d1..3369784812 100644 --- a/packages/@sanity/cli/src/commands/migrations/create.ts +++ b/packages/@sanity/cli/src/commands/migrations/create.ts @@ -137,7 +137,9 @@ export class CreateMigrationCommand extends SanityCommand