@sanity/cli 7.12.0 → 7.12.1

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.
Files changed (154) hide show
  1. package/dist/actions/build/buildApp.js +1 -1
  2. package/dist/actions/build/buildApp.js.map +1 -1
  3. package/dist/actions/build/buildStudio.js +1 -1
  4. package/dist/actions/build/buildStudio.js.map +1 -1
  5. package/dist/commands/backups/disable.js +4 -4
  6. package/dist/commands/backups/disable.js.map +1 -1
  7. package/dist/commands/backups/download.js +7 -7
  8. package/dist/commands/backups/download.js.map +1 -1
  9. package/dist/commands/backups/enable.js +4 -4
  10. package/dist/commands/backups/enable.js.map +1 -1
  11. package/dist/commands/backups/list.js +7 -7
  12. package/dist/commands/backups/list.js.map +1 -1
  13. package/dist/commands/codemod.js +5 -5
  14. package/dist/commands/codemod.js.map +1 -1
  15. package/dist/commands/cors/add.js +1 -1
  16. package/dist/commands/cors/add.js.map +1 -1
  17. package/dist/commands/cors/delete.js +4 -4
  18. package/dist/commands/cors/delete.js.map +1 -1
  19. package/dist/commands/cors/list.js +2 -2
  20. package/dist/commands/cors/list.js.map +1 -1
  21. package/dist/commands/datasets/alias/create.js +5 -5
  22. package/dist/commands/datasets/alias/create.js.map +1 -1
  23. package/dist/commands/datasets/alias/delete.js +2 -2
  24. package/dist/commands/datasets/alias/delete.js.map +1 -1
  25. package/dist/commands/datasets/alias/link.js +5 -5
  26. package/dist/commands/datasets/alias/link.js.map +1 -1
  27. package/dist/commands/datasets/alias/unlink.js +3 -3
  28. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  29. package/dist/commands/datasets/copy.js +7 -7
  30. package/dist/commands/datasets/copy.js.map +1 -1
  31. package/dist/commands/datasets/create.js +3 -3
  32. package/dist/commands/datasets/create.js.map +1 -1
  33. package/dist/commands/datasets/delete.js +2 -2
  34. package/dist/commands/datasets/delete.js.map +1 -1
  35. package/dist/commands/datasets/embeddings/disable.js +3 -3
  36. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  37. package/dist/commands/datasets/embeddings/enable.js +5 -5
  38. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  39. package/dist/commands/datasets/embeddings/status.js +3 -3
  40. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  41. package/dist/commands/datasets/export.js +6 -6
  42. package/dist/commands/datasets/export.js.map +1 -1
  43. package/dist/commands/datasets/import.js +3 -3
  44. package/dist/commands/datasets/import.js.map +1 -1
  45. package/dist/commands/datasets/list.js +2 -2
  46. package/dist/commands/datasets/list.js.map +1 -1
  47. package/dist/commands/datasets/visibility/get.js +2 -2
  48. package/dist/commands/datasets/visibility/get.js.map +1 -1
  49. package/dist/commands/datasets/visibility/set.js +3 -3
  50. package/dist/commands/datasets/visibility/set.js.map +1 -1
  51. package/dist/commands/deploy.js +2 -2
  52. package/dist/commands/deploy.js.map +1 -1
  53. package/dist/commands/dev.js +2 -2
  54. package/dist/commands/dev.js.map +1 -1
  55. package/dist/commands/docs/read.js +1 -1
  56. package/dist/commands/docs/read.js.map +1 -1
  57. package/dist/commands/docs/search.js +3 -3
  58. package/dist/commands/docs/search.js.map +1 -1
  59. package/dist/commands/doctor.js +3 -3
  60. package/dist/commands/doctor.js.map +1 -1
  61. package/dist/commands/documents/create.js +3 -3
  62. package/dist/commands/documents/create.js.map +1 -1
  63. package/dist/commands/documents/delete.js +3 -3
  64. package/dist/commands/documents/delete.js.map +1 -1
  65. package/dist/commands/documents/get.js +2 -2
  66. package/dist/commands/documents/get.js.map +1 -1
  67. package/dist/commands/documents/query.js +2 -2
  68. package/dist/commands/documents/query.js.map +1 -1
  69. package/dist/commands/documents/validate.js +3 -3
  70. package/dist/commands/documents/validate.js.map +1 -1
  71. package/dist/commands/graphql/deploy.js +13 -13
  72. package/dist/commands/graphql/deploy.js.map +1 -1
  73. package/dist/commands/graphql/list.js +2 -2
  74. package/dist/commands/graphql/list.js.map +1 -1
  75. package/dist/commands/graphql/undeploy.js +2 -2
  76. package/dist/commands/graphql/undeploy.js.map +1 -1
  77. package/dist/commands/hooks/attempt.js +2 -2
  78. package/dist/commands/hooks/attempt.js.map +1 -1
  79. package/dist/commands/hooks/create.js +3 -3
  80. package/dist/commands/hooks/create.js.map +1 -1
  81. package/dist/commands/hooks/delete.js +4 -4
  82. package/dist/commands/hooks/delete.js.map +1 -1
  83. package/dist/commands/hooks/list.js +2 -2
  84. package/dist/commands/hooks/list.js.map +1 -1
  85. package/dist/commands/hooks/logs.js +5 -5
  86. package/dist/commands/hooks/logs.js.map +1 -1
  87. package/dist/commands/login.js +2 -2
  88. package/dist/commands/login.js.map +1 -1
  89. package/dist/commands/logout.js +2 -2
  90. package/dist/commands/logout.js.map +1 -1
  91. package/dist/commands/manifest/extract.js +3 -3
  92. package/dist/commands/manifest/extract.js.map +1 -1
  93. package/dist/commands/mcp/configure.js +4 -4
  94. package/dist/commands/mcp/configure.js.map +1 -1
  95. package/dist/commands/media/create-aspect.js +3 -3
  96. package/dist/commands/media/create-aspect.js.map +1 -1
  97. package/dist/commands/media/delete-aspect.js +1 -1
  98. package/dist/commands/media/delete-aspect.js.map +1 -1
  99. package/dist/commands/media/deploy-aspect.js +4 -4
  100. package/dist/commands/media/deploy-aspect.js.map +1 -1
  101. package/dist/commands/media/export.js +7 -7
  102. package/dist/commands/media/export.js.map +1 -1
  103. package/dist/commands/media/import.js +6 -6
  104. package/dist/commands/media/import.js.map +1 -1
  105. package/dist/commands/migrations/create.js +4 -4
  106. package/dist/commands/migrations/create.js.map +1 -1
  107. package/dist/commands/migrations/list.js +2 -2
  108. package/dist/commands/migrations/list.js.map +1 -1
  109. package/dist/commands/migrations/run.js +14 -14
  110. package/dist/commands/migrations/run.js.map +1 -1
  111. package/dist/commands/openapi/get.js +3 -3
  112. package/dist/commands/openapi/get.js.map +1 -1
  113. package/dist/commands/openapi/list.js +2 -2
  114. package/dist/commands/openapi/list.js.map +1 -1
  115. package/dist/commands/organizations/create.js +5 -5
  116. package/dist/commands/organizations/create.js.map +1 -1
  117. package/dist/commands/organizations/delete.js +6 -6
  118. package/dist/commands/organizations/delete.js.map +1 -1
  119. package/dist/commands/organizations/get.js +3 -3
  120. package/dist/commands/organizations/get.js.map +1 -1
  121. package/dist/commands/organizations/list.js +2 -2
  122. package/dist/commands/organizations/list.js.map +1 -1
  123. package/dist/commands/organizations/update.js +6 -6
  124. package/dist/commands/organizations/update.js.map +1 -1
  125. package/dist/commands/preview.js +2 -2
  126. package/dist/commands/preview.js.map +1 -1
  127. package/dist/commands/projects/create.js +2 -2
  128. package/dist/commands/projects/create.js.map +1 -1
  129. package/dist/commands/projects/list.js +2 -2
  130. package/dist/commands/projects/list.js.map +1 -1
  131. package/dist/commands/schemas/delete.js +2 -2
  132. package/dist/commands/schemas/delete.js.map +1 -1
  133. package/dist/commands/schemas/deploy.js +2 -2
  134. package/dist/commands/schemas/deploy.js.map +1 -1
  135. package/dist/commands/schemas/list.js +1 -1
  136. package/dist/commands/schemas/list.js.map +1 -1
  137. package/dist/commands/schemas/validate.js +2 -1
  138. package/dist/commands/schemas/validate.js.map +1 -1
  139. package/dist/commands/skills/install.js +2 -2
  140. package/dist/commands/skills/install.js.map +1 -1
  141. package/dist/commands/telemetry/disable.js +2 -2
  142. package/dist/commands/telemetry/disable.js.map +1 -1
  143. package/dist/commands/telemetry/enable.js +2 -2
  144. package/dist/commands/telemetry/enable.js.map +1 -1
  145. package/dist/commands/tokens/create.js +2 -2
  146. package/dist/commands/tokens/create.js.map +1 -1
  147. package/dist/commands/tokens/delete.js +2 -2
  148. package/dist/commands/tokens/delete.js.map +1 -1
  149. package/dist/commands/tokens/list.js +2 -2
  150. package/dist/commands/tokens/list.js.map +1 -1
  151. package/dist/commands/users/invite.js +3 -3
  152. package/dist/commands/users/invite.js.map +1 -1
  153. package/oclif.manifest.json +512 -512
  154. package/package.json +6 -6
@@ -64,12 +64,12 @@ export class LogsHookCommand extends SanityCommand {
64
64
  const err = error;
65
65
  logsHookDebug(`Error fetching hooks for project ${projectId}`, err);
66
66
  this.error(`Hook list retrieval failed:\n${err.message}`, {
67
- exit: 1
67
+ exit: exitCodes.RUNTIME_ERROR
68
68
  });
69
69
  }
70
70
  if (hooks.length === 0) {
71
71
  this.error('No hooks currently registered', {
72
- exit: 1
72
+ exit: exitCodes.RUNTIME_ERROR
73
73
  });
74
74
  }
75
75
  // If hook name is provided, find that specific hook
@@ -78,7 +78,7 @@ export class LogsHookCommand extends SanityCommand {
78
78
  selectedHook = hooks.find((hook)=>hook.name.toLowerCase() === args.name?.toLowerCase());
79
79
  if (!selectedHook) {
80
80
  this.error(`Hook with name "${args.name}" not found`, {
81
- exit: 1
81
+ exit: exitCodes.RUNTIME_ERROR
82
82
  });
83
83
  }
84
84
  } else if (hooks.length === 1) {
@@ -95,7 +95,7 @@ export class LogsHookCommand extends SanityCommand {
95
95
  }
96
96
  if (!selectedHook) {
97
97
  this.error('No hook selected', {
98
- exit: 1
98
+ exit: exitCodes.RUNTIME_ERROR
99
99
  });
100
100
  }
101
101
  // Fetch messages and attempts for the selected hook
@@ -117,7 +117,7 @@ export class LogsHookCommand extends SanityCommand {
117
117
  const err = error;
118
118
  logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err);
119
119
  this.error(`Hook logs retrieval failed:\n${err.message}`, {
120
- exit: 1
120
+ exit: exitCodes.RUNTIME_ERROR
121
121
  });
122
122
  }
123
123
  // Group attempts by message ID
@@ -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 {exitCodes, 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 if (this.isUnattended()) {\n this.error(\n 'Webhook name is required when multiple webhooks exist. Pass the name as an argument.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\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","exitCodes","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","isUnattended","USAGE_ERROR","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 {exitCodes, 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: exitCodes.RUNTIME_ERROR})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: exitCodes.RUNTIME_ERROR})\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: exitCodes.RUNTIME_ERROR})\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 if (this.isUnattended()) {\n this.error(\n 'Webhook name is required when multiple webhooks exist. Pass the name as an argument.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: exitCodes.RUNTIME_ERROR})\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: exitCodes.RUNTIME_ERROR})\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","exitCodes","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","RUNTIME_ERROR","length","selectedHook","find","hook","toLowerCase","isUnattended","USAGE_ERROR","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,6 +1,6 @@
1
1
  import { text } from 'node:stream/consumers';
2
2
  import { Flags } from '@oclif/core';
3
- import { SanityCommand } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand } from '@sanity/cli-core';
4
4
  import { login } from '../actions/auth/login/login.js';
5
5
  import { LOGIN_PROVIDER_IDS } from '../actions/auth/login/loginInstructions.js';
6
6
  export class LoginCommand extends SanityCommand {
@@ -84,7 +84,7 @@ export class LoginCommand extends SanityCommand {
84
84
  } catch (error) {
85
85
  const message = error instanceof Error ? error.message : String(error);
86
86
  this.error(`Login failed: ${message}`, {
87
- exit: 1
87
+ exit: exitCodes.RUNTIME_ERROR
88
88
  });
89
89
  }
90
90
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import {text} from 'node:stream/consumers'\n\nimport {Command, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {login} from '../actions/auth/login/login.js'\nimport {LOGIN_PROVIDER_IDS} from '../actions/auth/login/loginInstructions.js'\n\nexport class LoginCommand extends SanityCommand<typeof LoginCommand> {\n static override description = 'Log in to your Sanity account'\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Log in using default settings',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --provider github --no-open',\n description: 'Login with GitHub provider, but do not open a browser window automatically',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sso my-organization',\n description: 'Log in using Single Sign-On with the \"my-organization\" slug',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --sso my-organization --sso-provider \"Okta SSO\"',\n description: 'Log in using a specific SSO provider within an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --with-token < token.txt',\n description: 'Log in using a token from standard input',\n },\n ]\n static override flags = {\n experimental: Flags.boolean({\n default: false,\n hidden: true,\n }),\n open: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Open a browser window to log in (`--no-open` only prints URL)',\n }),\n provider: Flags.string({\n description: `Log in using a provider ID (${LOGIN_PROVIDER_IDS.join(', ')})`,\n exclusive: ['sso', 'with-token'],\n helpValue: '<providerId>',\n }),\n sso: Flags.string({\n description: 'Log in using Single Sign-On, using the given organization slug',\n exclusive: ['provider', 'with-token'],\n helpValue: '<slug>',\n }),\n 'sso-provider': Flags.string({\n dependsOn: ['sso'],\n description: 'Select a specific SSO provider by name (use with --sso)',\n helpValue: '<name>',\n }),\n 'with-token': Flags.boolean({\n description: 'Read token from standard input',\n exclusive: ['provider', 'sso'],\n }),\n } satisfies FlagInput\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(LoginCommand)\n const {'sso-provider': ssoProvider, 'with-token': withToken, ...loginFlags} = flags\n\n try {\n const token = withToken ? await readTokenFromStdin() : undefined\n\n await login({\n ...loginFlags,\n output: this.output,\n ssoProvider,\n telemetry: this.telemetry,\n token,\n })\n this.log('Login successful')\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Login failed: ${message}`, {exit: 1})\n }\n }\n}\n\nasync function readTokenFromStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new Error(\n 'Token is required on standard input. Run `sanity login --with-token < token.txt`.',\n )\n }\n\n return text(process.stdin)\n}\n"],"names":["text","Flags","SanityCommand","login","LOGIN_PROVIDER_IDS","LoginCommand","description","examples","command","flags","experimental","boolean","default","hidden","open","allowNo","provider","string","join","exclusive","helpValue","sso","dependsOn","run","parse","ssoProvider","withToken","loginFlags","token","readTokenFromStdin","undefined","output","telemetry","log","error","message","Error","String","exit","process","stdin","isTTY"],"mappings":"AAAA,SAAQA,IAAI,QAAO,wBAAuB;AAE1C,SAAiBC,KAAK,QAAO,cAAa;AAE1C,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,KAAK,QAAO,iCAAgC;AACpD,SAAQC,kBAAkB,QAAO,6CAA4C;AAE7E,OAAO,MAAMC,qBAAqBH;IAChC,OAAgBI,cAAc,gCAA+B;IAC7D,OAAgBC,WAAmC;QACjD;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SACE;YACFF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtBC,cAAcT,MAAMU,OAAO,CAAC;YAC1BC,SAAS;YACTC,QAAQ;QACV;QACAC,MAAMb,MAAMU,OAAO,CAAC;YAClBI,SAAS;YACTH,SAAS;YACTN,aAAa;QACf;QACAU,UAAUf,MAAMgB,MAAM,CAAC;YACrBX,aAAa,CAAC,4BAA4B,EAAEF,mBAAmBc,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5EC,WAAW;gBAAC;gBAAO;aAAa;YAChCC,WAAW;QACb;QACAC,KAAKpB,MAAMgB,MAAM,CAAC;YAChBX,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAa;YACrCC,WAAW;QACb;QACA,gBAAgBnB,MAAMgB,MAAM,CAAC;YAC3BK,WAAW;gBAAC;aAAM;YAClBhB,aAAa;YACbc,WAAW;QACb;QACA,cAAcnB,MAAMU,OAAO,CAAC;YAC1BL,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAM;QAChC;IACF,EAAqB;IAErB,MAAaI,MAAqB;QAChC,MAAM,EAACd,KAAK,EAAC,GAAG,MAAM,IAAI,CAACe,KAAK,CAACnB;QACjC,MAAM,EAAC,gBAAgBoB,WAAW,EAAE,cAAcC,SAAS,EAAE,GAAGC,YAAW,GAAGlB;QAE9E,IAAI;YACF,MAAMmB,QAAQF,YAAY,MAAMG,uBAAuBC;YAEvD,MAAM3B,MAAM;gBACV,GAAGwB,UAAU;gBACbI,QAAQ,IAAI,CAACA,MAAM;gBACnBN;gBACAO,WAAW,IAAI,CAACA,SAAS;gBACzBJ;YACF;YACA,IAAI,CAACK,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChE,IAAI,CAACA,KAAK,CAAC,CAAC,cAAc,EAAEC,SAAS,EAAE;gBAACG,MAAM;YAAC;QACjD;IACF;AACF;AAEA,eAAeT;IACb,IAAIU,QAAQC,KAAK,CAACC,KAAK,EAAE;QACvB,MAAM,IAAIL,MACR;IAEJ;IAEA,OAAOpC,KAAKuC,QAAQC,KAAK;AAC3B"}
1
+ {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import {text} from 'node:stream/consumers'\n\nimport {Command, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {login} from '../actions/auth/login/login.js'\nimport {LOGIN_PROVIDER_IDS} from '../actions/auth/login/loginInstructions.js'\n\nexport class LoginCommand extends SanityCommand<typeof LoginCommand> {\n static override description = 'Log in to your Sanity account'\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Log in using default settings',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --provider github --no-open',\n description: 'Login with GitHub provider, but do not open a browser window automatically',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sso my-organization',\n description: 'Log in using Single Sign-On with the \"my-organization\" slug',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --sso my-organization --sso-provider \"Okta SSO\"',\n description: 'Log in using a specific SSO provider within an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --with-token < token.txt',\n description: 'Log in using a token from standard input',\n },\n ]\n static override flags = {\n experimental: Flags.boolean({\n default: false,\n hidden: true,\n }),\n open: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Open a browser window to log in (`--no-open` only prints URL)',\n }),\n provider: Flags.string({\n description: `Log in using a provider ID (${LOGIN_PROVIDER_IDS.join(', ')})`,\n exclusive: ['sso', 'with-token'],\n helpValue: '<providerId>',\n }),\n sso: Flags.string({\n description: 'Log in using Single Sign-On, using the given organization slug',\n exclusive: ['provider', 'with-token'],\n helpValue: '<slug>',\n }),\n 'sso-provider': Flags.string({\n dependsOn: ['sso'],\n description: 'Select a specific SSO provider by name (use with --sso)',\n helpValue: '<name>',\n }),\n 'with-token': Flags.boolean({\n description: 'Read token from standard input',\n exclusive: ['provider', 'sso'],\n }),\n } satisfies FlagInput\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(LoginCommand)\n const {'sso-provider': ssoProvider, 'with-token': withToken, ...loginFlags} = flags\n\n try {\n const token = withToken ? await readTokenFromStdin() : undefined\n\n await login({\n ...loginFlags,\n output: this.output,\n ssoProvider,\n telemetry: this.telemetry,\n token,\n })\n this.log('Login successful')\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Login failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n\nasync function readTokenFromStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new Error(\n 'Token is required on standard input. Run `sanity login --with-token < token.txt`.',\n )\n }\n\n return text(process.stdin)\n}\n"],"names":["text","Flags","exitCodes","SanityCommand","login","LOGIN_PROVIDER_IDS","LoginCommand","description","examples","command","flags","experimental","boolean","default","hidden","open","allowNo","provider","string","join","exclusive","helpValue","sso","dependsOn","run","parse","ssoProvider","withToken","loginFlags","token","readTokenFromStdin","undefined","output","telemetry","log","error","message","Error","String","exit","RUNTIME_ERROR","process","stdin","isTTY"],"mappings":"AAAA,SAAQA,IAAI,QAAO,wBAAuB;AAE1C,SAAiBC,KAAK,QAAO,cAAa;AAE1C,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,KAAK,QAAO,iCAAgC;AACpD,SAAQC,kBAAkB,QAAO,6CAA4C;AAE7E,OAAO,MAAMC,qBAAqBH;IAChC,OAAgBI,cAAc,gCAA+B;IAC7D,OAAgBC,WAAmC;QACjD;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SACE;YACFF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtBC,cAAcV,MAAMW,OAAO,CAAC;YAC1BC,SAAS;YACTC,QAAQ;QACV;QACAC,MAAMd,MAAMW,OAAO,CAAC;YAClBI,SAAS;YACTH,SAAS;YACTN,aAAa;QACf;QACAU,UAAUhB,MAAMiB,MAAM,CAAC;YACrBX,aAAa,CAAC,4BAA4B,EAAEF,mBAAmBc,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5EC,WAAW;gBAAC;gBAAO;aAAa;YAChCC,WAAW;QACb;QACAC,KAAKrB,MAAMiB,MAAM,CAAC;YAChBX,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAa;YACrCC,WAAW;QACb;QACA,gBAAgBpB,MAAMiB,MAAM,CAAC;YAC3BK,WAAW;gBAAC;aAAM;YAClBhB,aAAa;YACbc,WAAW;QACb;QACA,cAAcpB,MAAMW,OAAO,CAAC;YAC1BL,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAM;QAChC;IACF,EAAqB;IAErB,MAAaI,MAAqB;QAChC,MAAM,EAACd,KAAK,EAAC,GAAG,MAAM,IAAI,CAACe,KAAK,CAACnB;QACjC,MAAM,EAAC,gBAAgBoB,WAAW,EAAE,cAAcC,SAAS,EAAE,GAAGC,YAAW,GAAGlB;QAE9E,IAAI;YACF,MAAMmB,QAAQF,YAAY,MAAMG,uBAAuBC;YAEvD,MAAM3B,MAAM;gBACV,GAAGwB,UAAU;gBACbI,QAAQ,IAAI,CAACA,MAAM;gBACnBN;gBACAO,WAAW,IAAI,CAACA,SAAS;gBACzBJ;YACF;YACA,IAAI,CAACK,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChE,IAAI,CAACA,KAAK,CAAC,CAAC,cAAc,EAAEC,SAAS,EAAE;gBAACG,MAAMrC,UAAUsC,aAAa;YAAA;QACvE;IACF;AACF;AAEA,eAAeV;IACb,IAAIW,QAAQC,KAAK,CAACC,KAAK,EAAE;QACvB,MAAM,IAAIN,MACR;IAEJ;IAEA,OAAOrC,KAAKyC,QAAQC,KAAK;AAC3B"}
@@ -1,4 +1,4 @@
1
- import { getCliToken, getUserConfig, SanityCommand, setCliUserConfig } from '@sanity/cli-core';
1
+ import { exitCodes, getCliToken, getUserConfig, SanityCommand, setCliUserConfig } from '@sanity/cli-core';
2
2
  import { isHttpError } from '@sanity/client';
3
3
  import { logout } from '../services/auth.js';
4
4
  export class LogoutCommand extends SanityCommand {
@@ -23,7 +23,7 @@ export class LogoutCommand extends SanityCommand {
23
23
  }
24
24
  const err = error instanceof Error ? error : new Error(`${error}`);
25
25
  this.error(`Failed to logout: ${err.message}`, {
26
- exit: 1
26
+ exit: exitCodes.RUNTIME_ERROR
27
27
  });
28
28
  }
29
29
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import {getCliToken, getUserConfig, SanityCommand, setCliUserConfig} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nimport {logout} from '../services/auth.js'\n\nexport class LogoutCommand extends SanityCommand<typeof LogoutCommand> {\n static override description = 'Log out of the current session'\n\n public async run(): Promise<void> {\n await this.parse(LogoutCommand)\n\n const previousToken = await getCliToken()\n if (!previousToken) {\n this.log('No login credentials found')\n return\n }\n\n try {\n await logout()\n\n this.clearConfig()\n } catch (error) {\n // In the case of session timeouts or missing sessions, we'll get a 401\n // This is an acceptable situation seen from a logout perspective - all we\n // need to do in this case is clear the session from the view of the CLI\n if (isHttpError(error) && error.response.statusCode === 401) {\n this.clearConfig()\n return\n }\n const err = error instanceof Error ? error : new Error(`${error}`)\n this.error(`Failed to logout: ${err.message}`, {exit: 1})\n }\n }\n\n private clearConfig() {\n setCliUserConfig('authToken', undefined)\n getUserConfig().delete('telemetryConsent')\n\n this.log('Logged out successfully')\n }\n}\n"],"names":["getCliToken","getUserConfig","SanityCommand","setCliUserConfig","isHttpError","logout","LogoutCommand","description","run","parse","previousToken","log","clearConfig","error","response","statusCode","err","Error","message","exit","undefined","delete"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,aAAa,EAAEC,aAAa,EAAEC,gBAAgB,QAAO,mBAAkB;AAC5F,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,OAAO,MAAMC,sBAAsBJ;IACjC,OAAgBK,cAAc,iCAAgC;IAE9D,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACH;QAEjB,MAAMI,gBAAgB,MAAMV;QAC5B,IAAI,CAACU,eAAe;YAClB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,IAAI;YACF,MAAMN;YAEN,IAAI,CAACO,WAAW;QAClB,EAAE,OAAOC,OAAO;YACd,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,IAAIT,YAAYS,UAAUA,MAAMC,QAAQ,CAACC,UAAU,KAAK,KAAK;gBAC3D,IAAI,CAACH,WAAW;gBAChB;YACF;YACA,MAAMI,MAAMH,iBAAiBI,QAAQJ,QAAQ,IAAII,MAAM,GAAGJ,OAAO;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,kBAAkB,EAAEG,IAAIE,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACzD;IACF;IAEQP,cAAc;QACpBT,iBAAiB,aAAaiB;QAC9BnB,gBAAgBoB,MAAM,CAAC;QAEvB,IAAI,CAACV,GAAG,CAAC;IACX;AACF"}
1
+ {"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import {\n exitCodes,\n getCliToken,\n getUserConfig,\n SanityCommand,\n setCliUserConfig,\n} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nimport {logout} from '../services/auth.js'\n\nexport class LogoutCommand extends SanityCommand<typeof LogoutCommand> {\n static override description = 'Log out of the current session'\n\n public async run(): Promise<void> {\n await this.parse(LogoutCommand)\n\n const previousToken = await getCliToken()\n if (!previousToken) {\n this.log('No login credentials found')\n return\n }\n\n try {\n await logout()\n\n this.clearConfig()\n } catch (error) {\n // In the case of session timeouts or missing sessions, we'll get a 401\n // This is an acceptable situation seen from a logout perspective - all we\n // need to do in this case is clear the session from the view of the CLI\n if (isHttpError(error) && error.response.statusCode === 401) {\n this.clearConfig()\n return\n }\n const err = error instanceof Error ? error : new Error(`${error}`)\n this.error(`Failed to logout: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private clearConfig() {\n setCliUserConfig('authToken', undefined)\n getUserConfig().delete('telemetryConsent')\n\n this.log('Logged out successfully')\n }\n}\n"],"names":["exitCodes","getCliToken","getUserConfig","SanityCommand","setCliUserConfig","isHttpError","logout","LogoutCommand","description","run","parse","previousToken","log","clearConfig","error","response","statusCode","err","Error","message","exit","RUNTIME_ERROR","undefined","delete"],"mappings":"AAAA,SACEA,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,aAAa,EACbC,gBAAgB,QACX,mBAAkB;AACzB,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,OAAO,MAAMC,sBAAsBJ;IACjC,OAAgBK,cAAc,iCAAgC;IAE9D,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACH;QAEjB,MAAMI,gBAAgB,MAAMV;QAC5B,IAAI,CAACU,eAAe;YAClB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,IAAI;YACF,MAAMN;YAEN,IAAI,CAACO,WAAW;QAClB,EAAE,OAAOC,OAAO;YACd,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,IAAIT,YAAYS,UAAUA,MAAMC,QAAQ,CAACC,UAAU,KAAK,KAAK;gBAC3D,IAAI,CAACH,WAAW;gBAChB;YACF;YACA,MAAMI,MAAMH,iBAAiBI,QAAQJ,QAAQ,IAAII,MAAM,GAAGJ,OAAO;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,kBAAkB,EAAEG,IAAIE,OAAO,EAAE,EAAE;gBAACC,MAAMpB,UAAUqB,aAAa;YAAA;QAC/E;IACF;IAEQR,cAAc;QACpBT,iBAAiB,aAAakB;QAC9BpB,gBAAgBqB,MAAM,CAAC;QAEvB,IAAI,CAACX,GAAG,CAAC;IACX;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import { formatSchemaValidation, SchemaExtractionError } from '@sanity/cli-build/_internal/extract';
3
- import { findProjectRoot, SanityCommand } from '@sanity/cli-core';
3
+ import { exitCodes, findProjectRoot, SanityCommand } from '@sanity/cli-core';
4
4
  import { manifestDebug } from '../../actions/manifest/debug.js';
5
5
  import { extractManifest } from '../../actions/manifest/extractManifest.js';
6
6
  const description = `
@@ -39,10 +39,10 @@ export class ExtractManifestCommand extends SanityCommand {
39
39
  manifestDebug('Error extracting manifest in command', error);
40
40
  if (error instanceof SchemaExtractionError && error.validation && error.validation.length > 0) {
41
41
  this.output.log(formatSchemaValidation(error.validation));
42
- this.exit(1);
42
+ this.exit(exitCodes.RUNTIME_ERROR);
43
43
  }
44
44
  this.error(`Failed to extract manifest:\n${error instanceof Error ? error.message : String(error)}`, {
45
- exit: 1
45
+ exit: exitCodes.RUNTIME_ERROR
46
46
  });
47
47
  }
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {findProjectRoot, SanityCommand} from '@sanity/cli-core'\n\nimport {manifestDebug} from '../../actions/manifest/debug.js'\nimport {extractManifest} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtract studio configuration as JSON manifest files.\n\nNote: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: 'dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n\n try {\n const projectRoot = await findProjectRoot(process.cwd())\n await extractManifest({\n outPath: flags.path,\n path: projectRoot.path,\n workDir: projectRoot.directory,\n })\n } catch (error) {\n manifestDebug('Error extracting manifest in command', error)\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(1)\n }\n\n this.error(\n `Failed to extract manifest:\\n${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Flags","formatSchemaValidation","SchemaExtractionError","findProjectRoot","SanityCommand","manifestDebug","extractManifest","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","projectRoot","process","cwd","outPath","workDir","directory","error","validation","length","output","log","exit","Error","message","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,eAAe,EAAEC,aAAa,QAAO,mBAAkB;AAE/D,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,eAAe,QAAO,4CAA2C;AAEzE,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BL;IAC1C,OAAgBG,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMb,MAAMc,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QAEjC,IAAI;YACF,MAAMS,cAAc,MAAMf,gBAAgBgB,QAAQC,GAAG;YACrD,MAAMd,gBAAgB;gBACpBe,SAAST,MAAMC,IAAI;gBACnBA,MAAMK,YAAYL,IAAI;gBACtBS,SAASJ,YAAYK,SAAS;YAChC;QACF,EAAE,OAAOC,OAAO;YACdnB,cAAc,wCAAwCmB;YACtD,IACEA,iBAAiBtB,yBACjBsB,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACC,GAAG,CAAC3B,uBAAuBuB,MAAMC,UAAU;gBACvD,IAAI,CAACI,IAAI,CAAC;YACZ;YAEA,IAAI,CAACL,KAAK,CACR,CAAC,6BAA6B,EAAEA,iBAAiBM,QAAQN,MAAMO,OAAO,GAAGC,OAAOR,QAAQ,EACxF;gBAACK,MAAM;YAAC;QAEZ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {exitCodes, findProjectRoot, SanityCommand} from '@sanity/cli-core'\n\nimport {manifestDebug} from '../../actions/manifest/debug.js'\nimport {extractManifest} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtract studio configuration as JSON manifest files.\n\nNote: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: 'dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n\n try {\n const projectRoot = await findProjectRoot(process.cwd())\n await extractManifest({\n outPath: flags.path,\n path: projectRoot.path,\n workDir: projectRoot.directory,\n })\n } catch (error) {\n manifestDebug('Error extracting manifest in command', error)\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(exitCodes.RUNTIME_ERROR)\n }\n\n this.error(\n `Failed to extract manifest:\\n${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Flags","formatSchemaValidation","SchemaExtractionError","exitCodes","findProjectRoot","SanityCommand","manifestDebug","extractManifest","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","projectRoot","process","cwd","outPath","workDir","directory","error","validation","length","output","log","exit","RUNTIME_ERROR","Error","message","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,SAAS,EAAEC,eAAe,EAAEC,aAAa,QAAO,mBAAkB;AAE1E,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,eAAe,QAAO,4CAA2C;AAEzE,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BL;IAC1C,OAAgBG,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMd,MAAMe,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QAEjC,IAAI;YACF,MAAMS,cAAc,MAAMf,gBAAgBgB,QAAQC,GAAG;YACrD,MAAMd,gBAAgB;gBACpBe,SAAST,MAAMC,IAAI;gBACnBA,MAAMK,YAAYL,IAAI;gBACtBS,SAASJ,YAAYK,SAAS;YAChC;QACF,EAAE,OAAOC,OAAO;YACdnB,cAAc,wCAAwCmB;YACtD,IACEA,iBAAiBvB,yBACjBuB,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACC,GAAG,CAAC5B,uBAAuBwB,MAAMC,UAAU;gBACvD,IAAI,CAACI,IAAI,CAAC3B,UAAU4B,aAAa;YACnC;YAEA,IAAI,CAACN,KAAK,CACR,CAAC,6BAA6B,EAAEA,iBAAiBO,QAAQP,MAAMQ,OAAO,GAAGC,OAAOT,QAAQ,EACxF;gBAACK,MAAM3B,UAAU4B,aAAa;YAAA;QAElC;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { isInteractive, SanityCommand, subdebug } from '@sanity/cli-core';
1
+ import { exitCodes, isInteractive, SanityCommand, subdebug } from '@sanity/cli-core';
2
2
  import { getErrorMessage, toError } from '@sanity/cli-core/errors';
3
3
  import { ensureAuthenticated } from '../../actions/auth/ensureAuthenticated.js';
4
4
  import { setupMCP } from '../../actions/mcp/setupMCP.js';
@@ -26,11 +26,11 @@ export class ConfigureMcpCommand extends SanityCommand {
26
26
  trace.error(toError(error));
27
27
  if (error instanceof LoginError) {
28
28
  this.error(`Failed to verify authentication credentials: ${error.message}. Try running \`sanity login\`.`, {
29
- exit: 1
29
+ exit: exitCodes.RUNTIME_ERROR
30
30
  });
31
31
  }
32
32
  this.error(`Failed to check authentication: ${getErrorMessage(error)}`, {
33
- exit: 1
33
+ exit: exitCodes.RUNTIME_ERROR
34
34
  });
35
35
  }
36
36
  try {
@@ -52,7 +52,7 @@ export class ConfigureMcpCommand extends SanityCommand {
52
52
  } catch (error) {
53
53
  trace.error(toError(error));
54
54
  this.error(getErrorMessage(error), {
55
- exit: 1
55
+ exit: exitCodes.RUNTIME_ERROR
56
56
  });
57
57
  }
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/mcp/configure.ts"],"sourcesContent":["import {isInteractive, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage, toError} from '@sanity/cli-core/errors'\n\nimport {ensureAuthenticated} from '../../actions/auth/ensureAuthenticated.js'\nimport {setupMCP} from '../../actions/mcp/setupMCP.js'\nimport {LoginError} from '../../errors/LoginError.js'\nimport {MCPConfigureTrace} from '../../telemetry/mcp.telemetry.js'\n\nconst debug = subdebug('mcp:configure')\n\nexport class ConfigureMcpCommand extends SanityCommand<typeof ConfigureMcpCommand> {\n static override description =\n 'Configure Sanity MCP server for AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, MCPorter, OpenCode, VS Code, VS Code Insiders, Zed)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Configure Sanity MCP server for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(MCPConfigureTrace)\n trace.start()\n\n try {\n await ensureAuthenticated({output: this.output, telemetry: this.telemetry})\n } catch (error) {\n debug('Authentication check failed: %O', error)\n trace.error(toError(error))\n\n if (error instanceof LoginError) {\n this.error(\n `Failed to verify authentication credentials: ${error.message}. Try running \\`sanity login\\`.`,\n {exit: 1},\n )\n }\n\n this.error(`Failed to check authentication: ${getErrorMessage(error)}`, {exit: 1})\n }\n\n try {\n const mcpResult = await setupMCP({\n explicit: true,\n mode: isInteractive() ? 'prompt' : 'auto',\n output: this.output,\n skillsMode: 'skip',\n })\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n })\n\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n } else {\n trace.complete()\n }\n } catch (error) {\n trace.error(toError(error))\n this.error(getErrorMessage(error), {exit: 1})\n }\n }\n}\n"],"names":["isInteractive","SanityCommand","subdebug","getErrorMessage","toError","ensureAuthenticated","setupMCP","LoginError","MCPConfigureTrace","debug","ConfigureMcpCommand","description","examples","command","run","trace","telemetry","start","output","error","message","exit","mcpResult","explicit","mode","skillsMode","log","configuredEditors","detectedEditors","complete"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACvE,SAAQC,eAAe,EAAEC,OAAO,QAAO,0BAAyB;AAEhE,SAAQC,mBAAmB,QAAO,4CAA2C;AAC7E,SAAQC,QAAQ,QAAO,gCAA+B;AACtD,SAAQC,UAAU,QAAO,6BAA4B;AACrD,SAAQC,iBAAiB,QAAO,mCAAkC;AAElE,MAAMC,QAAQP,SAAS;AAEvB,OAAO,MAAMQ,4BAA4BT;IACvC,OAAgBU,cACd,iMAAgM;IAElM,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACP;QACnCO,MAAME,KAAK;QAEX,IAAI;YACF,MAAMZ,oBAAoB;gBAACa,QAAQ,IAAI,CAACA,MAAM;gBAAEF,WAAW,IAAI,CAACA,SAAS;YAAA;QAC3E,EAAE,OAAOG,OAAO;YACdV,MAAM,mCAAmCU;YACzCJ,MAAMI,KAAK,CAACf,QAAQe;YAEpB,IAAIA,iBAAiBZ,YAAY;gBAC/B,IAAI,CAACY,KAAK,CACR,CAAC,6CAA6C,EAAEA,MAAMC,OAAO,CAAC,+BAA+B,CAAC,EAC9F;oBAACC,MAAM;gBAAC;YAEZ;YAEA,IAAI,CAACF,KAAK,CAAC,CAAC,gCAAgC,EAAEhB,gBAAgBgB,QAAQ,EAAE;gBAACE,MAAM;YAAC;QAClF;QAEA,IAAI;YACF,MAAMC,YAAY,MAAMhB,SAAS;gBAC/BiB,UAAU;gBACVC,MAAMxB,kBAAkB,WAAW;gBACnCkB,QAAQ,IAAI,CAACA,MAAM;gBACnBO,YAAY;YACd;YAEAV,MAAMW,GAAG,CAAC;gBACRC,mBAAmBL,UAAUK,iBAAiB;gBAC9CC,iBAAiBN,UAAUM,eAAe;YAC5C;YAEA,IAAIN,UAAUH,KAAK,EAAE;gBACnBJ,MAAMI,KAAK,CAACG,UAAUH,KAAK;YAC7B,OAAO;gBACLJ,MAAMc,QAAQ;YAChB;QACF,EAAE,OAAOV,OAAO;YACdJ,MAAMI,KAAK,CAACf,QAAQe;YACpB,IAAI,CAACA,KAAK,CAAChB,gBAAgBgB,QAAQ;gBAACE,MAAM;YAAC;QAC7C;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/mcp/configure.ts"],"sourcesContent":["import {exitCodes, isInteractive, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage, toError} from '@sanity/cli-core/errors'\n\nimport {ensureAuthenticated} from '../../actions/auth/ensureAuthenticated.js'\nimport {setupMCP} from '../../actions/mcp/setupMCP.js'\nimport {LoginError} from '../../errors/LoginError.js'\nimport {MCPConfigureTrace} from '../../telemetry/mcp.telemetry.js'\n\nconst debug = subdebug('mcp:configure')\n\nexport class ConfigureMcpCommand extends SanityCommand<typeof ConfigureMcpCommand> {\n static override description =\n 'Configure Sanity MCP server for AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, MCPorter, OpenCode, VS Code, VS Code Insiders, Zed)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Configure Sanity MCP server for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(MCPConfigureTrace)\n trace.start()\n\n try {\n await ensureAuthenticated({output: this.output, telemetry: this.telemetry})\n } catch (error) {\n debug('Authentication check failed: %O', error)\n trace.error(toError(error))\n\n if (error instanceof LoginError) {\n this.error(\n `Failed to verify authentication credentials: ${error.message}. Try running \\`sanity login\\`.`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n this.error(`Failed to check authentication: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n try {\n const mcpResult = await setupMCP({\n explicit: true,\n mode: isInteractive() ? 'prompt' : 'auto',\n output: this.output,\n skillsMode: 'skip',\n })\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n })\n\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n } else {\n trace.complete()\n }\n } catch (error) {\n trace.error(toError(error))\n this.error(getErrorMessage(error), {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","isInteractive","SanityCommand","subdebug","getErrorMessage","toError","ensureAuthenticated","setupMCP","LoginError","MCPConfigureTrace","debug","ConfigureMcpCommand","description","examples","command","run","trace","telemetry","start","output","error","message","exit","RUNTIME_ERROR","mcpResult","explicit","mode","skillsMode","log","configuredEditors","detectedEditors","complete"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAClF,SAAQC,eAAe,EAAEC,OAAO,QAAO,0BAAyB;AAEhE,SAAQC,mBAAmB,QAAO,4CAA2C;AAC7E,SAAQC,QAAQ,QAAO,gCAA+B;AACtD,SAAQC,UAAU,QAAO,6BAA4B;AACrD,SAAQC,iBAAiB,QAAO,mCAAkC;AAElE,MAAMC,QAAQP,SAAS;AAEvB,OAAO,MAAMQ,4BAA4BT;IACvC,OAAgBU,cACd,iMAAgM;IAElM,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACP;QACnCO,MAAME,KAAK;QAEX,IAAI;YACF,MAAMZ,oBAAoB;gBAACa,QAAQ,IAAI,CAACA,MAAM;gBAAEF,WAAW,IAAI,CAACA,SAAS;YAAA;QAC3E,EAAE,OAAOG,OAAO;YACdV,MAAM,mCAAmCU;YACzCJ,MAAMI,KAAK,CAACf,QAAQe;YAEpB,IAAIA,iBAAiBZ,YAAY;gBAC/B,IAAI,CAACY,KAAK,CACR,CAAC,6CAA6C,EAAEA,MAAMC,OAAO,CAAC,+BAA+B,CAAC,EAC9F;oBAACC,MAAMtB,UAAUuB,aAAa;gBAAA;YAElC;YAEA,IAAI,CAACH,KAAK,CAAC,CAAC,gCAAgC,EAAEhB,gBAAgBgB,QAAQ,EAAE;gBACtEE,MAAMtB,UAAUuB,aAAa;YAC/B;QACF;QAEA,IAAI;YACF,MAAMC,YAAY,MAAMjB,SAAS;gBAC/BkB,UAAU;gBACVC,MAAMzB,kBAAkB,WAAW;gBACnCkB,QAAQ,IAAI,CAACA,MAAM;gBACnBQ,YAAY;YACd;YAEAX,MAAMY,GAAG,CAAC;gBACRC,mBAAmBL,UAAUK,iBAAiB;gBAC9CC,iBAAiBN,UAAUM,eAAe;YAC5C;YAEA,IAAIN,UAAUJ,KAAK,EAAE;gBACnBJ,MAAMI,KAAK,CAACI,UAAUJ,KAAK;YAC7B,OAAO;gBACLJ,MAAMe,QAAQ;YAChB;QACF,EAAE,OAAOX,OAAO;YACdJ,MAAMI,KAAK,CAACf,QAAQe;YACpB,IAAI,CAACA,KAAK,CAAChB,gBAAgBgB,QAAQ;gBAACE,MAAMtB,UAAUuB,aAAa;YAAA;QACnE;IACF;AACF"}
@@ -30,7 +30,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
30
30
  const mediaLibrary = getMediaLibraryConfig(cliConfig);
31
31
  if (mediaLibrary?.aspectsPath === undefined) {
32
32
  this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {
33
- exit: 1
33
+ exit: exitCodes.RUNTIME_ERROR
34
34
  });
35
35
  }
36
36
  const title = this.flags.title ?? (this.isUnattended() ? this.error('Aspect title is required. Pass it with `--title <title>`.', {
@@ -53,7 +53,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
53
53
  const destinationPathExists = await access(destinationPath).then(()=>true, ()=>false);
54
54
  if (destinationPathExists) {
55
55
  this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {
56
- exit: 1
56
+ exit: exitCodes.RUNTIME_ERROR
57
57
  });
58
58
  }
59
59
  await fs.writeFile(destinationPath, template({
@@ -74,7 +74,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
74
74
  const message = error instanceof Error ? error.message : String(error);
75
75
  createAspectDebug('Failed to create aspect', error);
76
76
  this.error(`Failed to create aspect: ${message}`, {
77
- exit: 1
77
+ exit: exitCodes.RUNTIME_ERROR
78
78
  });
79
79
  }
80
80
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/create-aspect.ts"],"sourcesContent":["import fs, {access, mkdir} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\nimport {createPublishedId} from '@sanity/id-utils'\nimport camelCase from 'lodash-es/camelCase.js'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\n\nconst createAspectDebug = subdebug('media:create-aspect')\n\nexport class MediaCreateAspectCommand extends SanityCommand<typeof MediaCreateAspectCommand> {\n static override description = 'Create a new aspect definition file'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new aspect definition file',\n },\n ]\n\n static override flags = {\n name: Flags.string({description: 'Aspect name. Defaults to the title in camel case'}),\n title: Flags.string({description: 'Aspect title'}),\n }\n\n public async run(): Promise<void> {\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n if (mediaLibrary?.aspectsPath === undefined) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n const title =\n this.flags.title ??\n (this.isUnattended()\n ? this.error('Aspect title is required. Pass it with `--title <title>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n : await input({message: 'Title'}))\n\n const defaultName = createPublishedId(camelCase(title))\n const name =\n this.flags.name ??\n (this.isUnattended()\n ? defaultName\n : await input({\n default: defaultName,\n message: 'Name',\n }))\n\n try {\n const safeName = createPublishedId(camelCase(name))\n const destinationPath = path.resolve(mediaLibrary.aspectsPath, `${safeName}.ts`)\n const relativeDestinationPath = path.relative(process.cwd(), destinationPath)\n\n await mkdir(path.resolve(mediaLibrary.aspectsPath), {\n recursive: true,\n })\n\n const destinationPathExists = await access(destinationPath).then(\n () => true,\n () => false,\n )\n if (destinationPathExists) {\n this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {\n exit: 1,\n })\n }\n\n await fs.writeFile(\n destinationPath,\n template({\n name: safeName,\n title,\n }),\n )\n\n this.log(\n `${styleText('green', '✓')} Aspect created! ${styleText('bold', relativeDestinationPath)}`,\n )\n this.log()\n this.log('Next steps:')\n this.log(\n `Open ${styleText('bold', relativeDestinationPath)} in your code editor and customize the aspect.`,\n )\n this.log()\n this.log('Deploy this aspect by running:')\n this.log(styleText('bold', `sanity media deploy-aspect ${safeName}`))\n this.log()\n this.log('Deploy all aspects by running:')\n this.log(styleText('bold', `sanity media deploy-aspect --all`))\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createAspectDebug('Failed to create aspect', error)\n this.error(`Failed to create aspect: ${message}`, {exit: 1})\n }\n }\n}\n\nfunction template({name, title}: {name: string; title: string}) {\n return `import {defineAssetAspect, defineField} from 'sanity'\n\nexport default defineAssetAspect({\n name: '${name}',\n title: '${title}',\n type: 'object',\n fields: [\n defineField({\n name: 'string',\n title: 'Plain String',\n type: 'string',\n }),\n ],\n})\n`\n}\n"],"names":["fs","access","mkdir","path","styleText","Flags","exitCodes","SanityCommand","subdebug","input","createPublishedId","camelCase","getMediaLibraryConfig","NO_MEDIA_LIBRARY_ASPECTS_PATH","createAspectDebug","MediaCreateAspectCommand","description","examples","command","flags","name","string","title","run","cliConfig","getCliConfig","mediaLibrary","aspectsPath","undefined","error","exit","isUnattended","USAGE_ERROR","message","defaultName","default","safeName","destinationPath","resolve","relativeDestinationPath","relative","process","cwd","recursive","destinationPathExists","then","writeFile","template","log","Error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/create-aspect.ts"],"sourcesContent":["import fs, {access, mkdir} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\nimport {createPublishedId} from '@sanity/id-utils'\nimport camelCase from 'lodash-es/camelCase.js'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\n\nconst createAspectDebug = subdebug('media:create-aspect')\n\nexport class MediaCreateAspectCommand extends SanityCommand<typeof MediaCreateAspectCommand> {\n static override description = 'Create a new aspect definition file'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new aspect definition file',\n },\n ]\n\n static override flags = {\n name: Flags.string({description: 'Aspect name. Defaults to the title in camel case'}),\n title: Flags.string({description: 'Aspect title'}),\n }\n\n public async run(): Promise<void> {\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n if (mediaLibrary?.aspectsPath === undefined) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const title =\n this.flags.title ??\n (this.isUnattended()\n ? this.error('Aspect title is required. Pass it with `--title <title>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n : await input({message: 'Title'}))\n\n const defaultName = createPublishedId(camelCase(title))\n const name =\n this.flags.name ??\n (this.isUnattended()\n ? defaultName\n : await input({\n default: defaultName,\n message: 'Name',\n }))\n\n try {\n const safeName = createPublishedId(camelCase(name))\n const destinationPath = path.resolve(mediaLibrary.aspectsPath, `${safeName}.ts`)\n const relativeDestinationPath = path.relative(process.cwd(), destinationPath)\n\n await mkdir(path.resolve(mediaLibrary.aspectsPath), {\n recursive: true,\n })\n\n const destinationPathExists = await access(destinationPath).then(\n () => true,\n () => false,\n )\n if (destinationPathExists) {\n this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n await fs.writeFile(\n destinationPath,\n template({\n name: safeName,\n title,\n }),\n )\n\n this.log(\n `${styleText('green', '✓')} Aspect created! ${styleText('bold', relativeDestinationPath)}`,\n )\n this.log()\n this.log('Next steps:')\n this.log(\n `Open ${styleText('bold', relativeDestinationPath)} in your code editor and customize the aspect.`,\n )\n this.log()\n this.log('Deploy this aspect by running:')\n this.log(styleText('bold', `sanity media deploy-aspect ${safeName}`))\n this.log()\n this.log('Deploy all aspects by running:')\n this.log(styleText('bold', `sanity media deploy-aspect --all`))\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createAspectDebug('Failed to create aspect', error)\n this.error(`Failed to create aspect: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n\nfunction template({name, title}: {name: string; title: string}) {\n return `import {defineAssetAspect, defineField} from 'sanity'\n\nexport default defineAssetAspect({\n name: '${name}',\n title: '${title}',\n type: 'object',\n fields: [\n defineField({\n name: 'string',\n title: 'Plain String',\n type: 'string',\n }),\n ],\n})\n`\n}\n"],"names":["fs","access","mkdir","path","styleText","Flags","exitCodes","SanityCommand","subdebug","input","createPublishedId","camelCase","getMediaLibraryConfig","NO_MEDIA_LIBRARY_ASPECTS_PATH","createAspectDebug","MediaCreateAspectCommand","description","examples","command","flags","name","string","title","run","cliConfig","getCliConfig","mediaLibrary","aspectsPath","undefined","error","exit","RUNTIME_ERROR","isUnattended","USAGE_ERROR","message","defaultName","default","safeName","destinationPath","resolve","relativeDestinationPath","relative","process","cwd","recursive","destinationPathExists","then","writeFile","template","log","Error","String"],"mappings":"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"}
@@ -93,7 +93,7 @@ export class MediaDeleteAspectCommand extends SanityCommand {
93
93
  const err = error;
94
94
  deleteAspectDebug('Failed to delete aspect', err);
95
95
  this.error(styleText('bold', 'Failed to delete aspect') + `\n - ${aspectName}\n\n${styleText('red', err.message)}`, {
96
- exit: 1
96
+ exit: exitCodes.RUNTIME_ERROR
97
97
  });
98
98
  }
99
99
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/delete-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deleteAspect} from '../../services/mediaLibraries.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteAspectDebug = subdebug('media:delete-aspect')\n\nexport class MediaDeleteAspectCommand extends SanityCommand<typeof MediaDeleteAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete an aspect definition'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Delete the aspect named \"someAspect\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete media aspect from',\n semantics: 'override',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Run without prompts and confirm deletion',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation} = this.flags\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!mediaLibraryIdFlag) {\n errors.push('Media library ID is required. Pass it with `--media-library-id <id>`.')\n }\n if (!skipConfirmation) {\n errors.push('Deletion requires confirmation. Pass `--yes` to delete the aspect.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Are you absolutely sure you want to undeploy the ${aspectName} aspect from the \"${mediaLibraryId}\" media library?`,\n })\n\n if (!confirmed) {\n this.log('Operation cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const response = await deleteAspect({\n aspectName,\n mediaLibraryId,\n projectId,\n })\n\n if (response.results.length === 0) {\n this.warn(styleText('bold', `There's no deployed aspect with that name`))\n this.log(` - ${aspectName}`)\n return\n }\n\n this.log()\n this.log(`${styleText('green', '✓')} ${styleText('bold', 'Deleted aspect')}`)\n this.log(` - ${aspectName}`)\n\n // TODO: Find existing aspect definition files matching the undeployed aspect name and offer\n // to delete them.\n } catch (error) {\n const err = error as Error\n deleteAspectDebug('Failed to delete aspect', err)\n this.error(\n styleText('bold', 'Failed to delete aspect') +\n `\\n - ${aspectName}\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","confirm","promptForProject","selectMediaLibrary","deleteAspect","formatCliErrorMessages","getProjectIdFlag","deleteAspectDebug","MediaDeleteAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","run","mediaLibraryIdFlag","skipConfirmation","isUnattended","errors","push","length","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","mediaLibraryId","confirmed","default","message","log","USER_ABORT","response","results","warn","err"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/delete-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deleteAspect} from '../../services/mediaLibraries.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteAspectDebug = subdebug('media:delete-aspect')\n\nexport class MediaDeleteAspectCommand extends SanityCommand<typeof MediaDeleteAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete an aspect definition'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Delete the aspect named \"someAspect\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete media aspect from',\n semantics: 'override',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Run without prompts and confirm deletion',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation} = this.flags\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!mediaLibraryIdFlag) {\n errors.push('Media library ID is required. Pass it with `--media-library-id <id>`.')\n }\n if (!skipConfirmation) {\n errors.push('Deletion requires confirmation. Pass `--yes` to delete the aspect.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Are you absolutely sure you want to undeploy the ${aspectName} aspect from the \"${mediaLibraryId}\" media library?`,\n })\n\n if (!confirmed) {\n this.log('Operation cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const response = await deleteAspect({\n aspectName,\n mediaLibraryId,\n projectId,\n })\n\n if (response.results.length === 0) {\n this.warn(styleText('bold', `There's no deployed aspect with that name`))\n this.log(` - ${aspectName}`)\n return\n }\n\n this.log()\n this.log(`${styleText('green', '✓')} ${styleText('bold', 'Deleted aspect')}`)\n this.log(` - ${aspectName}`)\n\n // TODO: Find existing aspect definition files matching the undeployed aspect name and offer\n // to delete them.\n } catch (error) {\n const err = error as Error\n deleteAspectDebug('Failed to delete aspect', err)\n this.error(\n styleText('bold', 'Failed to delete aspect') +\n `\\n - ${aspectName}\\n\\n${styleText('red', err.message)}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","confirm","promptForProject","selectMediaLibrary","deleteAspect","formatCliErrorMessages","getProjectIdFlag","deleteAspectDebug","MediaDeleteAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","run","mediaLibraryIdFlag","skipConfirmation","isUnattended","errors","push","length","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","mediaLibraryId","confirmed","default","message","log","USER_ABORT","response","results","warn","err","RUNTIME_ERROR"],"mappings":"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"}
@@ -65,7 +65,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
65
65
  } catch (err) {
66
66
  if (err instanceof ProjectRootNotFoundError) {
67
67
  this.error('This command must be run from within a Sanity project directory (requires media library configuration)', {
68
- exit: 1
68
+ exit: exitCodes.RUNTIME_ERROR
69
69
  });
70
70
  }
71
71
  throw err;
@@ -73,7 +73,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
73
73
  const mediaLibrary = getMediaLibraryConfig(cliConfig);
74
74
  if (!mediaLibrary?.aspectsPath) {
75
75
  this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {
76
- exit: 1
76
+ exit: exitCodes.RUNTIME_ERROR
77
77
  });
78
78
  }
79
79
  const projectId = await this.getProjectId({
@@ -115,7 +115,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
115
115
  if (!all && result.valid.length === 0 && result.invalid.length === 0) {
116
116
  this.log();
117
117
  this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {
118
- exit: 1
118
+ exit: exitCodes.RUNTIME_ERROR
119
119
  });
120
120
  }
121
121
  // Deploy valid aspects
@@ -147,7 +147,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
147
147
  mediaLibraryId: mediaLibraryIdFlag
148
148
  });
149
149
  this.error(styleText('bold', 'Failed to deploy aspects') + `\n\n${styleText('red', err.message)}`, {
150
- exit: 1
150
+ exit: exitCodes.RUNTIME_ERROR
151
151
  });
152
152
  }
153
153
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/deploy-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {\n type CliConfig,\n exitCodes,\n ProjectRootNotFoundError,\n SanityCommand,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isAssetAspect, type SchemaValidationProblem} from '@sanity/types'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {importAspects} from '../../actions/media/importAspects.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deployAspects} from '../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\nimport {pluralize} from '../../util/pluralize.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deployAspectDebug = subdebug('media:deploy-aspect')\n\nexport class MediaDeployAspectCommand extends SanityCommand<typeof MediaDeployAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to deploy',\n required: false,\n }),\n }\n\n static override description = 'Deploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Deploy the aspect named \"someAspect\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --all',\n description: 'Deploy all aspects',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to deploy media aspect to',\n semantics: 'override',\n }),\n all: Flags.boolean({\n description: 'Deploy all aspects',\n required: false,\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {all, 'media-library-id': mediaLibraryIdFlag} = this.flags\n\n // Validation: must provide either aspect name or --all flag\n if (!all && !aspectName) {\n this.error(\n 'Aspect name is required. Pass it as the `<aspectName>` argument, or pass `--all`.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n // Validation: cannot provide both aspect name and --all flag\n if (all && aspectName) {\n this.error('Specify either the `<aspectName>` argument or `--all`, but not both.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n let cliConfig: CliConfig\n try {\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n this.error(\n 'This command must be run from within a Sanity project directory (requires media library configuration)',\n {exit: 1},\n )\n }\n throw err\n }\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n\n if (!mediaLibrary?.aspectsPath) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n if (!mediaLibraryIdFlag && this.isUnattended()) {\n this.error('Media library ID is required. Pass it with `--media-library-id <id>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n try {\n // Determine target media library\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n // Import and validate aspects\n const spin = spinner('Loading aspect definitions').start()\n const result = await importAspects({\n aspectsPath: mediaLibrary.aspectsPath,\n filterAspects: (aspect) => {\n if (all) {\n return true\n }\n\n if (typeof aspect === 'object' && aspect !== null && '_id' in aspect) {\n return aspect._id === aspectName\n }\n\n return false\n },\n })\n spin.stop()\n\n // Handle invalid aspects\n if (result.invalid.length > 0) {\n this.logToStderr('')\n this.warn(\n styleText(\n 'bold',\n `Skipped ${result.invalid.length} invalid ${pluralize('aspect', result.invalid.length)}`,\n ),\n )\n this.logToStderr(this.formatAspectList(result.invalid))\n }\n\n // Check if we found the requested aspect (when not using --all)\n if (!all && result.valid.length === 0 && result.invalid.length === 0) {\n this.log()\n this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {exit: 1})\n }\n\n // Deploy valid aspects\n if (result.valid.length === 0) {\n this.logToStderr('')\n this.warn('No valid aspects to deploy')\n return\n }\n\n const deploySpin = spinner(\n `Deploying ${result.valid.length} ${pluralize('aspect', result.valid.length)}`,\n ).start()\n\n const deployResponse = await deployAspects({\n aspects: result.valid.map((a) => a.aspect),\n mediaLibraryId,\n })\n\n deploySpin.succeed()\n\n // Display success message\n this.log()\n this.log(\n `${styleText('green', '✓')} ${styleText('bold', `Deployed ${result.valid.length} ${pluralize('aspect', result.valid.length)}`)}`,\n )\n this.log(this.formatAspectList(result.valid))\n\n deployAspectDebug('Deployed aspects', {\n count: result.valid.length,\n results: deployResponse.results,\n })\n } catch (error) {\n const err = error as Error\n deployAspectDebug('Failed to deploy aspects', {\n all,\n aspectName,\n error: err,\n mediaLibraryId: mediaLibraryIdFlag,\n })\n this.error(\n styleText('bold', 'Failed to deploy aspects') + `\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n /**\n * Format a list of aspects for display\n */\n private formatAspectList(\n aspects: Array<{\n aspect: unknown\n filename: string\n validationErrors?: SchemaValidationProblem[][]\n }>,\n ): string {\n return aspects\n .map(({aspect, filename, validationErrors = []}) => {\n const label = isAssetAspect(aspect) ? aspect._id : 'Unnamed aspect'\n\n // Flatten the nested validation errors and extract messages\n const simplifiedErrors = validationErrors.flatMap((group) =>\n group.map(({message}) => message),\n )\n\n const errorLabel =\n simplifiedErrors.length > 0 ? ` ${styleText('bgRed', simplifiedErrors[0])}` : ''\n\n const remainingErrorsCount = simplifiedErrors.length - 1\n const remainingErrorsLabel =\n remainingErrorsCount > 0\n ? styleText(\n 'italic',\n ` and ${remainingErrorsCount} other ${pluralize('error', remainingErrorsCount)}`,\n )\n : ''\n\n return ` - ${label} ${styleText('dim', filename)}${errorLabel}${remainingErrorsLabel}`\n })\n .join('\\n')\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","ProjectRootNotFoundError","SanityCommand","subdebug","spinner","isAssetAspect","getMediaLibraryConfig","importAspects","promptForProject","selectMediaLibrary","deployAspects","NO_MEDIA_LIBRARY_ASPECTS_PATH","pluralize","getProjectIdFlag","deployAspectDebug","MediaDeployAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","all","boolean","run","mediaLibraryIdFlag","error","exit","USAGE_ERROR","cliConfig","getCliConfig","err","mediaLibrary","aspectsPath","projectId","getProjectId","fallback","isUnattended","mediaLibraryId","spin","start","result","filterAspects","aspect","_id","stop","invalid","length","logToStderr","warn","formatAspectList","valid","log","deploySpin","deployResponse","aspects","map","a","succeed","count","results","message","filename","validationErrors","label","simplifiedErrors","flatMap","group","errorLabel","remainingErrorsCount","remainingErrorsLabel","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/deploy-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {\n type CliConfig,\n exitCodes,\n ProjectRootNotFoundError,\n SanityCommand,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isAssetAspect, type SchemaValidationProblem} from '@sanity/types'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {importAspects} from '../../actions/media/importAspects.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deployAspects} from '../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\nimport {pluralize} from '../../util/pluralize.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deployAspectDebug = subdebug('media:deploy-aspect')\n\nexport class MediaDeployAspectCommand extends SanityCommand<typeof MediaDeployAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to deploy',\n required: false,\n }),\n }\n\n static override description = 'Deploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Deploy the aspect named \"someAspect\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --all',\n description: 'Deploy all aspects',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to deploy media aspect to',\n semantics: 'override',\n }),\n all: Flags.boolean({\n description: 'Deploy all aspects',\n required: false,\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {all, 'media-library-id': mediaLibraryIdFlag} = this.flags\n\n // Validation: must provide either aspect name or --all flag\n if (!all && !aspectName) {\n this.error(\n 'Aspect name is required. Pass it as the `<aspectName>` argument, or pass `--all`.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n // Validation: cannot provide both aspect name and --all flag\n if (all && aspectName) {\n this.error('Specify either the `<aspectName>` argument or `--all`, but not both.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n let cliConfig: CliConfig\n try {\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n this.error(\n 'This command must be run from within a Sanity project directory (requires media library configuration)',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n throw err\n }\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n\n if (!mediaLibrary?.aspectsPath) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n if (!mediaLibraryIdFlag && this.isUnattended()) {\n this.error('Media library ID is required. Pass it with `--media-library-id <id>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n try {\n // Determine target media library\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n // Import and validate aspects\n const spin = spinner('Loading aspect definitions').start()\n const result = await importAspects({\n aspectsPath: mediaLibrary.aspectsPath,\n filterAspects: (aspect) => {\n if (all) {\n return true\n }\n\n if (typeof aspect === 'object' && aspect !== null && '_id' in aspect) {\n return aspect._id === aspectName\n }\n\n return false\n },\n })\n spin.stop()\n\n // Handle invalid aspects\n if (result.invalid.length > 0) {\n this.logToStderr('')\n this.warn(\n styleText(\n 'bold',\n `Skipped ${result.invalid.length} invalid ${pluralize('aspect', result.invalid.length)}`,\n ),\n )\n this.logToStderr(this.formatAspectList(result.invalid))\n }\n\n // Check if we found the requested aspect (when not using --all)\n if (!all && result.valid.length === 0 && result.invalid.length === 0) {\n this.log()\n this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Deploy valid aspects\n if (result.valid.length === 0) {\n this.logToStderr('')\n this.warn('No valid aspects to deploy')\n return\n }\n\n const deploySpin = spinner(\n `Deploying ${result.valid.length} ${pluralize('aspect', result.valid.length)}`,\n ).start()\n\n const deployResponse = await deployAspects({\n aspects: result.valid.map((a) => a.aspect),\n mediaLibraryId,\n })\n\n deploySpin.succeed()\n\n // Display success message\n this.log()\n this.log(\n `${styleText('green', '✓')} ${styleText('bold', `Deployed ${result.valid.length} ${pluralize('aspect', result.valid.length)}`)}`,\n )\n this.log(this.formatAspectList(result.valid))\n\n deployAspectDebug('Deployed aspects', {\n count: result.valid.length,\n results: deployResponse.results,\n })\n } catch (error) {\n const err = error as Error\n deployAspectDebug('Failed to deploy aspects', {\n all,\n aspectName,\n error: err,\n mediaLibraryId: mediaLibraryIdFlag,\n })\n this.error(\n styleText('bold', 'Failed to deploy aspects') + `\\n\\n${styleText('red', err.message)}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n\n /**\n * Format a list of aspects for display\n */\n private formatAspectList(\n aspects: Array<{\n aspect: unknown\n filename: string\n validationErrors?: SchemaValidationProblem[][]\n }>,\n ): string {\n return aspects\n .map(({aspect, filename, validationErrors = []}) => {\n const label = isAssetAspect(aspect) ? aspect._id : 'Unnamed aspect'\n\n // Flatten the nested validation errors and extract messages\n const simplifiedErrors = validationErrors.flatMap((group) =>\n group.map(({message}) => message),\n )\n\n const errorLabel =\n simplifiedErrors.length > 0 ? ` ${styleText('bgRed', simplifiedErrors[0])}` : ''\n\n const remainingErrorsCount = simplifiedErrors.length - 1\n const remainingErrorsLabel =\n remainingErrorsCount > 0\n ? styleText(\n 'italic',\n ` and ${remainingErrorsCount} other ${pluralize('error', remainingErrorsCount)}`,\n )\n : ''\n\n return ` - ${label} ${styleText('dim', filename)}${errorLabel}${remainingErrorsLabel}`\n })\n .join('\\n')\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","ProjectRootNotFoundError","SanityCommand","subdebug","spinner","isAssetAspect","getMediaLibraryConfig","importAspects","promptForProject","selectMediaLibrary","deployAspects","NO_MEDIA_LIBRARY_ASPECTS_PATH","pluralize","getProjectIdFlag","deployAspectDebug","MediaDeployAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","all","boolean","run","mediaLibraryIdFlag","error","exit","USAGE_ERROR","cliConfig","getCliConfig","err","RUNTIME_ERROR","mediaLibrary","aspectsPath","projectId","getProjectId","fallback","isUnattended","mediaLibraryId","spin","start","result","filterAspects","aspect","_id","stop","invalid","length","logToStderr","warn","formatAspectList","valid","log","deploySpin","deployResponse","aspects","map","a","succeed","count","results","message","filename","validationErrors","label","simplifiedErrors","flatMap","group","errorLabel","remainingErrorsCount","remainingErrorsLabel","join"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAEEC,SAAS,EACTC,wBAAwB,EACxBC,aAAa,EACbC,QAAQ,QACH,mBAAkB;AACzB,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,SAAQC,aAAa,QAAqC,gBAAe;AAEzE,SAAQC,qBAAqB,QAAO,+CAA8C;AAClF,SAAQC,aAAa,QAAO,uCAAsC;AAClE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,aAAa,QAAO,mCAAkC;AAC9D,SAAQC,6BAA6B,QAAO,8BAA6B;AACzE,SAAQC,SAAS,QAAO,0BAAyB;AACjD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,oBAAoBX,SAAS;AAEnC,OAAO,MAAMY,iCAAiCb;IAC5C,OAAgBc,OAAO;QACrBC,YAAYnB,KAAKoB,MAAM,CAAC;YACtBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,mBAAkB;IAEhD,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;QACFC,KAAK1B,MAAM2B,OAAO,CAAC;YACjBP,aAAa;YACbC,UAAU;QACZ;QACA,oBAAoBrB,MAAMmB,MAAM,CAAC;YAC/BC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,MAAaO,MAAqB;QAChC,MAAM,EAACV,UAAU,EAAC,GAAG,IAAI,CAACD,IAAI;QAC9B,MAAM,EAACS,GAAG,EAAE,oBAAoBG,kBAAkB,EAAC,GAAG,IAAI,CAACL,KAAK;QAEhE,4DAA4D;QAC5D,IAAI,CAACE,OAAO,CAACR,YAAY;YACvB,IAAI,CAACY,KAAK,CACR,qFACA;gBAACC,MAAM9B,UAAU+B,WAAW;YAAA;QAEhC;QAEA,6DAA6D;QAC7D,IAAIN,OAAOR,YAAY;YACrB,IAAI,CAACY,KAAK,CAAC,wEAAwE;gBACjFC,MAAM9B,UAAU+B,WAAW;YAC7B;QACF;QAEA,IAAIC;QACJ,IAAI;YACFA,YAAY,MAAM,IAAI,CAACC,YAAY;QACrC,EAAE,OAAOC,KAAK;YACZ,IAAIA,eAAejC,0BAA0B;gBAC3C,IAAI,CAAC4B,KAAK,CACR,0GACA;oBAACC,MAAM9B,UAAUmC,aAAa;gBAAA;YAElC;YACA,MAAMD;QACR;QACA,MAAME,eAAe9B,sBAAsB0B;QAE3C,IAAI,CAACI,cAAcC,aAAa;YAC9B,IAAI,CAACR,KAAK,CAAClB,+BAA+B;gBAACmB,MAAM9B,UAAUmC,aAAa;YAAA;QAC1E;QAEA,MAAMG,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YAACC,UAAU,IAAMhC,iBAAiB,CAAC;QAAE;QAE/E,IAAI,CAACoB,sBAAsB,IAAI,CAACa,YAAY,IAAI;YAC9C,IAAI,CAACZ,KAAK,CAAC,yEAAyE;gBAClFC,MAAM9B,UAAU+B,WAAW;YAC7B;QACF;QAEA,IAAI;YACF,iCAAiC;YACjC,IAAIW,iBAAiBd;YACrB,IAAI,CAACc,gBAAgB;gBACnBA,iBAAiB,MAAMjC,mBAAmB6B;YAC5C;YAEA,8BAA8B;YAC9B,MAAMK,OAAOvC,QAAQ,8BAA8BwC,KAAK;YACxD,MAAMC,SAAS,MAAMtC,cAAc;gBACjC8B,aAAaD,aAAaC,WAAW;gBACrCS,eAAe,CAACC;oBACd,IAAItB,KAAK;wBACP,OAAO;oBACT;oBAEA,IAAI,OAAOsB,WAAW,YAAYA,WAAW,QAAQ,SAASA,QAAQ;wBACpE,OAAOA,OAAOC,GAAG,KAAK/B;oBACxB;oBAEA,OAAO;gBACT;YACF;YACA0B,KAAKM,IAAI;YAET,yBAAyB;YACzB,IAAIJ,OAAOK,OAAO,CAACC,MAAM,GAAG,GAAG;gBAC7B,IAAI,CAACC,WAAW,CAAC;gBACjB,IAAI,CAACC,IAAI,CACPxD,UACE,QACA,CAAC,QAAQ,EAAEgD,OAAOK,OAAO,CAACC,MAAM,CAAC,SAAS,EAAEvC,UAAU,UAAUiC,OAAOK,OAAO,CAACC,MAAM,GAAG;gBAG5F,IAAI,CAACC,WAAW,CAAC,IAAI,CAACE,gBAAgB,CAACT,OAAOK,OAAO;YACvD;YAEA,gEAAgE;YAChE,IAAI,CAACzB,OAAOoB,OAAOU,KAAK,CAACJ,MAAM,KAAK,KAAKN,OAAOK,OAAO,CAACC,MAAM,KAAK,GAAG;gBACpE,IAAI,CAACK,GAAG;gBACR,IAAI,CAAC3B,KAAK,CAAC,CAAC,uBAAuB,EAAEhC,UAAU,QAAQoB,cAAc,KAAK,EAAE;oBAC1Ea,MAAM9B,UAAUmC,aAAa;gBAC/B;YACF;YAEA,uBAAuB;YACvB,IAAIU,OAAOU,KAAK,CAACJ,MAAM,KAAK,GAAG;gBAC7B,IAAI,CAACC,WAAW,CAAC;gBACjB,IAAI,CAACC,IAAI,CAAC;gBACV;YACF;YAEA,MAAMI,aAAarD,QACjB,CAAC,UAAU,EAAEyC,OAAOU,KAAK,CAACJ,MAAM,CAAC,CAAC,EAAEvC,UAAU,UAAUiC,OAAOU,KAAK,CAACJ,MAAM,GAAG,EAC9EP,KAAK;YAEP,MAAMc,iBAAiB,MAAMhD,cAAc;gBACzCiD,SAASd,OAAOU,KAAK,CAACK,GAAG,CAAC,CAACC,IAAMA,EAAEd,MAAM;gBACzCL;YACF;YAEAe,WAAWK,OAAO;YAElB,0BAA0B;YAC1B,IAAI,CAACN,GAAG;YACR,IAAI,CAACA,GAAG,CACN,GAAG3D,UAAU,SAAS,KAAK,CAAC,EAAEA,UAAU,QAAQ,CAAC,SAAS,EAAEgD,OAAOU,KAAK,CAACJ,MAAM,CAAC,CAAC,EAAEvC,UAAU,UAAUiC,OAAOU,KAAK,CAACJ,MAAM,GAAG,GAAG;YAElI,IAAI,CAACK,GAAG,CAAC,IAAI,CAACF,gBAAgB,CAACT,OAAOU,KAAK;YAE3CzC,kBAAkB,oBAAoB;gBACpCiD,OAAOlB,OAAOU,KAAK,CAACJ,MAAM;gBAC1Ba,SAASN,eAAeM,OAAO;YACjC;QACF,EAAE,OAAOnC,OAAO;YACd,MAAMK,MAAML;YACZf,kBAAkB,4BAA4B;gBAC5CW;gBACAR;gBACAY,OAAOK;gBACPQ,gBAAgBd;YAClB;YACA,IAAI,CAACC,KAAK,CACRhC,UAAU,QAAQ,8BAA8B,CAAC,IAAI,EAAEA,UAAU,OAAOqC,IAAI+B,OAAO,GAAG,EACtF;gBACEnC,MAAM9B,UAAUmC,aAAa;YAC/B;QAEJ;IACF;IAEA;;GAEC,GACD,AAAQmB,iBACNK,OAIE,EACM;QACR,OAAOA,QACJC,GAAG,CAAC,CAAC,EAACb,MAAM,EAAEmB,QAAQ,EAAEC,mBAAmB,EAAE,EAAC;YAC7C,MAAMC,QAAQ/D,cAAc0C,UAAUA,OAAOC,GAAG,GAAG;YAEnD,4DAA4D;YAC5D,MAAMqB,mBAAmBF,iBAAiBG,OAAO,CAAC,CAACC,QACjDA,MAAMX,GAAG,CAAC,CAAC,EAACK,OAAO,EAAC,GAAKA;YAG3B,MAAMO,aACJH,iBAAiBlB,MAAM,GAAG,IAAI,CAAC,CAAC,EAAEtD,UAAU,SAASwE,gBAAgB,CAAC,EAAE,GAAG,GAAG;YAEhF,MAAMI,uBAAuBJ,iBAAiBlB,MAAM,GAAG;YACvD,MAAMuB,uBACJD,uBAAuB,IACnB5E,UACE,UACA,CAAC,KAAK,EAAE4E,qBAAqB,OAAO,EAAE7D,UAAU,SAAS6D,uBAAuB,IAElF;YAEN,OAAO,CAAC,IAAI,EAAEL,MAAM,CAAC,EAAEvE,UAAU,OAAOqE,YAAYM,aAAaE,sBAAsB;QACzF,GACCC,IAAI,CAAC;IACV;AACF"}
@@ -71,12 +71,12 @@ export class MediaExportCommand extends SanityCommand {
71
71
  } catch (error) {
72
72
  exportDebug('Error listing media libraries', error);
73
73
  this.error(`Failed to list media libraries:\n${error instanceof Error ? error.message : error}`, {
74
- exit: 1
74
+ exit: exitCodes.RUNTIME_ERROR
75
75
  });
76
76
  }
77
77
  if (mediaLibraries.length === 0) {
78
78
  this.error('No active media libraries found in this project', {
79
- exit: 1
79
+ exit: exitCodes.RUNTIME_ERROR
80
80
  });
81
81
  }
82
82
  let mediaLibraryId = flags['media-library-id'];
@@ -93,13 +93,13 @@ export class MediaExportCommand extends SanityCommand {
93
93
  } catch (error) {
94
94
  exportDebug('Error selecting media library', error);
95
95
  this.error(`Failed to select media library:\n${error instanceof Error ? error.message : error}`, {
96
- exit: 1
96
+ exit: exitCodes.RUNTIME_ERROR
97
97
  });
98
98
  }
99
99
  }
100
100
  if (!mediaLibraries.some((library)=>library.id === mediaLibraryId)) {
101
101
  this.error(`Media library with id "${mediaLibraryId}" not found`, {
102
- exit: 1
102
+ exit: exitCodes.RUNTIME_ERROR
103
103
  });
104
104
  }
105
105
  this.log(boxen(`Exporting from:
@@ -117,7 +117,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, {
117
117
  const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags);
118
118
  if (!outputPath) {
119
119
  this.error('Cancelled', {
120
- exit: 1
120
+ exit: exitCodes.RUNTIME_ERROR
121
121
  });
122
122
  }
123
123
  const { fail, onProgress, succeed } = this.createProgressHandler();
@@ -139,7 +139,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, {
139
139
  const err = error instanceof Error ? error : new Error(String(error));
140
140
  exportDebug('Export failed', err);
141
141
  this.error(`Export failed: ${err.message}`, {
142
- exit: 1
142
+ exit: exitCodes.RUNTIME_ERROR
143
143
  });
144
144
  }
145
145
  }
@@ -183,7 +183,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, {
183
183
  } catch (error) {
184
184
  const err = error instanceof Error ? error : new Error(String(error));
185
185
  this.error(`Failed to create directory "${createPath}": ${err.message}`, {
186
- exit: 1
186
+ exit: exitCodes.RUNTIME_ERROR
187
187
  });
188
188
  }
189
189
  }