@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
@@ -97,13 +97,13 @@ export class GraphQLDeployCommand extends SanityCommand {
97
97
  debug('Schema validation errors: %O', error.problemGroups);
98
98
  error.print(this.output);
99
99
  this.error('Fix the schema errors above and try again', {
100
- exit: 1
100
+ exit: exitCodes.RUNTIME_ERROR
101
101
  });
102
102
  }
103
103
  debug('Failed to resolve GraphQL APIs: %O', error);
104
104
  const message = error instanceof Error ? error.message : String(error);
105
105
  this.error(`Failed to resolve GraphQL APIs: ${message}`, {
106
- exit: 1
106
+ exit: exitCodes.RUNTIME_ERROR
107
107
  });
108
108
  }
109
109
  const hasMultipleApis = flags.api ? flags.api.length > 1 : apiDefs.length > 1;
@@ -139,7 +139,7 @@ export class GraphQLDeployCommand extends SanityCommand {
139
139
  for (const apiId of onlyApis || []){
140
140
  if (!apiDefs.some((apiDef)=>apiDef.id === apiId)) {
141
141
  this.error(`GraphQL API with id "${apiId}" not found`, {
142
- exit: 1
142
+ exit: exitCodes.RUNTIME_ERROR
143
143
  });
144
144
  }
145
145
  }
@@ -152,18 +152,18 @@ export class GraphQLDeployCommand extends SanityCommand {
152
152
  const { apiName } = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag);
153
153
  if (apiNames.has(apiName)) {
154
154
  this.error(`Multiple GraphQL APIs with the same dataset and tag found (${apiName})`, {
155
- exit: 1
155
+ exit: exitCodes.RUNTIME_ERROR
156
156
  });
157
157
  }
158
158
  if (apiDef.id) {
159
159
  if (!apiIdRegex.test(apiDef.id)) {
160
160
  this.error(`Invalid GraphQL API id "${apiDef.id}" - only a-z, 0-9, underscore and dashes are allowed`, {
161
- exit: 1
161
+ exit: exitCodes.RUNTIME_ERROR
162
162
  });
163
163
  }
164
164
  if (apiIds.has(apiDef.id)) {
165
165
  this.error(`Multiple GraphQL APIs with the same ID found (${apiDef.id})`, {
166
- exit: 1
166
+ exit: exitCodes.RUNTIME_ERROR
167
167
  });
168
168
  }
169
169
  apiIds.add(apiDef.id);
@@ -219,7 +219,7 @@ export class GraphQLDeployCommand extends SanityCommand {
219
219
  debug('Failed to get current GraphQL schema properties', err);
220
220
  spin.fail();
221
221
  this.error('Failed to get current GraphQL schema properties', {
222
- exit: 1
222
+ exit: exitCodes.RUNTIME_ERROR
223
223
  });
224
224
  }
225
225
  // CLI flag takes precedence over configuration
@@ -240,7 +240,7 @@ export class GraphQLDeployCommand extends SanityCommand {
240
240
  if (!this.isRecognizedApiGeneration(generation)) {
241
241
  spin.fail();
242
242
  this.error(`Unknown API generation "${generation}" for API at index ${index}`, {
243
- exit: 1
243
+ exit: exitCodes.RUNTIME_ERROR
244
244
  });
245
245
  }
246
246
  const enablePlayground = await this.shouldEnablePlayground({
@@ -261,7 +261,7 @@ export class GraphQLDeployCommand extends SanityCommand {
261
261
  spin.fail();
262
262
  const message = err instanceof Error ? err.message : 'Unknown error';
263
263
  this.error(`Failed to generate schema: ${message}`, {
264
- exit: 1
264
+ exit: exitCodes.RUNTIME_ERROR
265
265
  });
266
266
  }
267
267
  let valid;
@@ -278,7 +278,7 @@ export class GraphQLDeployCommand extends SanityCommand {
278
278
  const validationError = get(err, 'response.body.validationError');
279
279
  spin.fail();
280
280
  this.error(validationError ?? 'Failed to validate GraphQL API', {
281
- exit: 1
281
+ exit: exitCodes.RUNTIME_ERROR
282
282
  });
283
283
  }
284
284
  // when the result is not valid and there are breaking changes afoot!
@@ -356,12 +356,12 @@ export class GraphQLDeployCommand extends SanityCommand {
356
356
  spin.fail();
357
357
  debug('Failed to deploy GraphQL API', error);
358
358
  this.error('Failed to deploy GraphQL API', {
359
- exit: 1
359
+ exit: exitCodes.RUNTIME_ERROR
360
360
  });
361
361
  }
362
362
  }
363
363
  if (hasErrors) {
364
- this.exit(1);
364
+ this.exit(exitCodes.RUNTIME_ERROR);
365
365
  }
366
366
  }
367
367
  filterChanges(valid) {
@@ -396,7 +396,7 @@ export class GraphQLDeployCommand extends SanityCommand {
396
396
  if (validationError) {
397
397
  spin.fail();
398
398
  this.error(`GraphQL schema is not valid:\n\n${validationError}`, {
399
- exit: 1
399
+ exit: exitCodes.RUNTIME_ERROR
400
400
  });
401
401
  }
402
402
  const { breakingChanges, dangerousChanges } = this.filterChanges(valid);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/graphql/deploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport get from 'lodash-es/get.js'\n\nimport {extractGraphQLAPIs} from '../../actions/graphql/extractGraphQLAPIs.js'\nimport gen1 from '../../actions/graphql/gen1/index.js'\nimport gen2 from '../../actions/graphql/gen2/index.js'\nimport gen3 from '../../actions/graphql/gen3/index.js'\nimport {graphqlDebug} from '../../actions/graphql/graphqlDebug.js'\nimport {resolveApiGeneration} from '../../actions/graphql/resolveApiGeneration.js'\nimport {SchemaError} from '../../actions/graphql/SchemaError.js'\nimport {\n type ExtractedGraphQLAPI,\n type GeneratedApiSpecification,\n type ValidationResponse,\n} from '../../actions/graphql/types.js'\nimport {\n deployGraphQLAPI,\n getClientUrl,\n getCurrentSchemaProps,\n validateGraphQLAPI,\n} from '../../services/graphql.js'\nimport {getDatasetFlag} from '../../util/sharedFlags.js'\n\ninterface DeployTask {\n dataset: string\n enablePlayground: boolean\n projectId: string\n schema: GeneratedApiSpecification\n tag: string\n}\n\nconst apiIdRegex = /^[a-z0-9_-]+$/\nconst generations = {\n gen1,\n gen2,\n gen3,\n}\n\nconst ignoredBreaking = new Set<string>(['OPTIONAL_INPUT_FIELD_ADDED'])\n// Reserved for future use to filter out specific dangerous change types\nconst ignoredWarnings = new Set<string>()\n\nconst debug = graphqlDebug.extend('deploy')\n\nexport class GraphQLDeployCommand extends SanityCommand<typeof GraphQLDeployCommand> {\n static override description = 'Deploy a GraphQL API from the current Sanity schema'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Deploy all defined GraphQL APIs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dry-run',\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api staging --api ios',\n description: 'Deploy only the GraphQL APIs with the IDs \"staging\" and \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --playground',\n description: 'Deploy all defined GraphQL APIs, overriding any playground setting',\n },\n ]\n\n static override flags = {\n api: Flags.string({\n description: 'Only deploy API with this ID (can be specified multiple times)',\n multiple: true,\n }),\n ...getDatasetFlag({description: 'Deploy API for the given dataset', semantics: 'specify'}),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n }),\n force: Flags.boolean({\n description: 'Deploy API without confirming breaking changes',\n }),\n generation: Flags.string({\n description: 'API generation to deploy (defaults to \"gen3\")',\n options: ['gen1', 'gen2', 'gen3'],\n }),\n 'non-null-document-fields': Flags.boolean({\n description: 'Use non-null document fields (_id, _type etc)',\n }),\n playground: Flags.boolean({\n allowNo: true,\n description: 'Enable GraphQL playground for easier debugging',\n }),\n tag: Flags.string({\n description: 'Deploy API(s) to given tag (defaults to \"default\")',\n }),\n 'with-union-cache': Flags.boolean({\n description: 'Cache union types (faster for schemas with many self-references)',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(GraphQLDeployCommand)\n const {\n api: onlyApis,\n dataset: datasetFlag,\n 'dry-run': dryRun,\n generation: generationFlag,\n 'non-null-document-fields': nonNullDocumentFieldsFlag,\n playground: playgroundFlag,\n tag: tagFlag,\n 'with-union-cache': withUnionCache,\n } = flags\n\n const workDir = (await this.getProjectRoot()).directory\n\n let apiDefs: ExtractedGraphQLAPI[] = []\n let spin: ReturnType<typeof spinner>\n\n try {\n apiDefs = await extractGraphQLAPIs(workDir, {\n nonNullDocumentFieldsFlag,\n withUnionCache,\n })\n } catch (error) {\n if (error instanceof SchemaError) {\n debug('Schema validation errors: %O', error.problemGroups)\n error.print(this.output)\n this.error('Fix the schema errors above and try again', {exit: 1})\n }\n debug('Failed to resolve GraphQL APIs: %O', error)\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Failed to resolve GraphQL APIs: ${message}`, {exit: 1})\n }\n\n const hasMultipleApis = flags.api ? flags.api.length > 1 : apiDefs.length > 1\n\n const usedFlags = [\n datasetFlag && '--dataset',\n tagFlag && '--tag',\n playgroundFlag !== undefined && '--playground',\n generationFlag !== undefined && '--generation',\n nonNullDocumentFieldsFlag !== undefined && '--non-null-document-fields',\n ].filter(Boolean)\n\n if (hasMultipleApis && usedFlags.length > 0) {\n this.warn(`More than one API defined, and ${usedFlags.join('/')} is specified`)\n this.warn(`This will use the specified flag(s) for ALL APIs, overriding config!`)\n\n if (flags.force) {\n this.warn(`--force specified, continuing...`)\n } else if (this.isUnattended()) {\n this.error(\n 'Flag overrides for multiple APIs require confirmation. Pass `--force` to continue.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n } else {\n const confirmed = await confirm({\n default: false,\n message: 'Continue with flag overrides for all APIs?',\n })\n if (!confirmed) {\n this.log('GraphQL deployment cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n }\n\n const deployTasks: DeployTask[] = []\n let hasErrors = false\n\n for (const apiId of onlyApis || []) {\n if (!apiDefs.some((apiDef) => apiDef.id === apiId)) {\n this.error(`GraphQL API with id \"${apiId}\" not found`, {exit: 1})\n }\n }\n\n const apiNames = new Set<string>()\n const apiIds = new Set<string>()\n\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n const {apiName} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n if (apiNames.has(apiName)) {\n this.error(`Multiple GraphQL APIs with the same dataset and tag found (${apiName})`, {\n exit: 1,\n })\n }\n\n if (apiDef.id) {\n if (!apiIdRegex.test(apiDef.id)) {\n this.error(\n `Invalid GraphQL API id \"${apiDef.id}\" - only a-z, 0-9, underscore and dashes are allowed`,\n {exit: 1},\n )\n }\n\n if (apiIds.has(apiDef.id)) {\n this.error(`Multiple GraphQL APIs with the same ID found (${apiDef.id})`, {exit: 1})\n }\n\n apiIds.add(apiDef.id)\n }\n\n apiNames.add(apiName)\n }\n\n if (onlyApis) {\n this.warn(`Deploying only specified APIs: ${onlyApis.join(', ')}`)\n }\n\n let index = -1\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n index++\n\n const {apiName, dataset, tag} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n const {playground, projectId} = apiDef\n spin = spinner(`Generating GraphQL API: ${apiName}`).start()\n\n if (!dataset) {\n spin.fail()\n this.error(\n `Dataset is required for API at index ${index}. Pass it with \\`--dataset <name>\\` or configure a dataset for the API.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n // Handle extraction errors early (computed in worker), before network calls and prompts.\n // Continue the loop so all API errors are reported — don't exit on the first failure.\n if (apiDef.schemaErrors?.length) {\n spin.fail()\n new SchemaError(apiDef.schemaErrors).print(this.output, `Schema errors in ${apiName}`)\n hasErrors = true\n continue\n }\n\n if (apiDef.extractionError) {\n debug('Failed to extract schema', apiDef.extractionError)\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: ${apiDef.extractionError}`)\n hasErrors = true\n continue\n }\n\n if (!apiDef.extracted) {\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: No extraction result`)\n hasErrors = true\n continue\n }\n\n let currentGeneration: string | undefined\n let playgroundEnabled: boolean | undefined\n try {\n const schemaProps = await getCurrentSchemaProps(projectId, dataset, tag)\n currentGeneration = schemaProps.currentGeneration\n playgroundEnabled = schemaProps.playgroundEnabled\n } catch (err) {\n debug('Failed to get current GraphQL schema properties', err)\n spin.fail()\n this.error('Failed to get current GraphQL schema properties', {exit: 1})\n }\n\n // CLI flag takes precedence over configuration\n const specifiedGeneration = generationFlag === undefined ? apiDef.generation : generationFlag\n\n const generation = await resolveApiGeneration({\n currentGeneration,\n force: flags.force,\n index,\n output: this.output,\n specifiedGeneration,\n unattended: this.isUnattended(),\n })\n\n if (!generation) {\n spin.stop()\n this.log('GraphQL deployment cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n\n if (!this.isRecognizedApiGeneration(generation)) {\n spin.fail()\n this.error(`Unknown API generation \"${generation}\" for API at index ${index}`, {exit: 1})\n }\n\n const enablePlayground = await this.shouldEnablePlayground({\n dryRun,\n playgroundCliFlag: playgroundFlag,\n playgroundConfiguration: playground,\n playgroundCurrentlyEnabled: playgroundEnabled,\n spin,\n })\n\n let apiSpec: GeneratedApiSpecification\n try {\n const generateSchema = generations[generation]\n apiSpec = generateSchema(apiDef.extracted, {filterSuffix: apiDef.filterSuffix})\n } catch (err) {\n debug('Failed to generate schema', err)\n spin.fail()\n const message = err instanceof Error ? err.message : 'Unknown error'\n this.error(`Failed to generate schema: ${message}`, {exit: 1})\n }\n\n let valid: ValidationResponse | undefined\n try {\n valid = await validateGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n } catch (err) {\n debug('validateGraphQLAPI error', err)\n const validationError = get(err, 'response.body.validationError')\n spin.fail()\n this.error(validationError ?? 'Failed to validate GraphQL API', {exit: 1})\n }\n\n // when the result is not valid and there are breaking changes afoot!\n if (!this.isResultValid(valid, {force: flags.force, spin})) {\n // not valid and a dry run? then it can exit with a error\n if (dryRun) {\n spin.fail()\n this.renderBreakingChanges(valid)\n hasErrors = true\n continue\n }\n\n if (this.isUnattended()) {\n spin.fail()\n this.renderBreakingChanges(valid)\n this.error(\n 'GraphQL deployment requires confirmation because the schema contains dangerous changes. Pass `--force` to continue.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n spin.stop()\n this.renderBreakingChanges(valid)\n const shouldDeploy = await confirm({\n default: false,\n message: 'Do you want to deploy a new API despite the dangerous changes?',\n })\n\n if (!shouldDeploy) {\n this.log('GraphQL deployment cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n\n spin.succeed()\n } else if (dryRun) {\n // isResultValid() already set the spinner state (succeed or warn).\n // Check whether changes were forced so we print the correct message.\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n if (breakingChanges.length > 0 || dangerousChanges.length > 0) {\n this.renderBreakingChanges(valid)\n this.log('Forced with `--force`, skipping deploy (dry run)')\n } else {\n this.log('GraphQL API is valid and has no breaking changes')\n }\n continue\n }\n\n deployTasks.push({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n }\n\n // Give some space for deployment tasks\n this.log('')\n\n for (const task of deployTasks) {\n const {dataset, enablePlayground, projectId, schema, tag} = task\n\n this.log(`Project: ${projectId}`)\n this.log(`Dataset: ${dataset}`)\n this.log(`Tag: ${tag}`)\n\n spin = spinner('Deploying GraphQL API').start()\n\n try {\n const response = await deployGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema,\n tag,\n })\n\n spin.stop()\n const apiUrl = await getClientUrl(\n projectId,\n response.location.replace(/^\\/(v1|v\\d{4}-\\d{2}-\\d{2})\\//, '/'),\n )\n this.log(`URL: ${apiUrl}`)\n spin.start('Deployed!').succeed()\n this.log('')\n } catch (error) {\n spin.fail()\n debug('Failed to deploy GraphQL API', error)\n this.error('Failed to deploy GraphQL API', {exit: 1})\n }\n }\n\n if (hasErrors) {\n this.exit(1)\n }\n }\n\n private filterChanges(valid: ValidationResponse) {\n const {breakingChanges: breaking, dangerousChanges: dangerous} = valid\n return {\n breakingChanges: breaking.filter((change) => !ignoredBreaking.has(change.type)),\n dangerousChanges: dangerous.filter((change) => !ignoredWarnings.has(change.type)),\n }\n }\n\n private getApiIdentifiers(apiDef: ExtractedGraphQLAPI, datasetFlag?: string, tagFlag?: string) {\n const dataset = datasetFlag || apiDef.dataset\n const tag = tagFlag || apiDef.tag || 'default'\n const apiName = [dataset, tag].join('/')\n return {apiName, dataset, tag}\n }\n\n private isRecognizedApiGeneration(generation: string): generation is 'gen1' | 'gen2' | 'gen3' {\n return ['gen1', 'gen2', 'gen3'].includes(generation)\n }\n\n private isResultValid(\n valid: ValidationResponse,\n {force, spin}: {force?: boolean; spin: ReturnType<typeof spinner>},\n ) {\n const {validationError} = valid\n if (validationError) {\n spin.fail()\n this.error(`GraphQL schema is not valid:\\n\\n${validationError}`, {exit: 1})\n }\n\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n const hasProblematicChanges = breakingChanges.length > 0 || dangerousChanges.length > 0\n\n if (!hasProblematicChanges) {\n spin.succeed()\n return true\n }\n\n if (force) {\n spin.text = 'Validating GraphQL API: Dangerous changes. Forced with `--force`.'\n spin.warn()\n return true\n }\n\n spin.warn()\n return false\n }\n\n private renderBreakingChanges(valid: ValidationResponse) {\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n if (dangerousChanges.length > 0) {\n this.log('\\nFound potentially dangerous changes from previous schema:')\n for (const change of dangerousChanges) this.log(` - ${change.description}`)\n }\n\n if (breakingChanges.length > 0) {\n this.log('\\nFound BREAKING changes from previous schema:')\n for (const change of breakingChanges) this.log(` - ${change.description}`)\n }\n\n this.output.log('')\n }\n\n private async shouldEnablePlayground({\n dryRun,\n playgroundCliFlag,\n playgroundConfiguration,\n playgroundCurrentlyEnabled,\n spin,\n }: {\n dryRun: boolean\n playgroundCliFlag?: boolean\n playgroundConfiguration?: boolean\n playgroundCurrentlyEnabled?: boolean\n spin: ReturnType<typeof spinner>\n }): Promise<boolean> {\n // On a dry run, it doesn't matter, return true 🤷‍♂️\n if (dryRun) {\n return true\n }\n\n // Prioritize CLI flag if set\n if (playgroundCliFlag !== undefined) {\n return playgroundCliFlag\n }\n\n // If explicitly set true/false in configuration, use that\n if (playgroundConfiguration !== undefined) {\n return playgroundConfiguration\n }\n\n // If API is already deployed, use the current state\n if (playgroundCurrentlyEnabled !== undefined) {\n return playgroundCurrentlyEnabled\n }\n\n // If no API is deployed, default to true if non-interactive\n if (this.isUnattended()) {\n return true\n }\n\n // Interactive environment, so prompt the user\n const prevText = spin.text\n spin.warn()\n const shouldDeploy = await confirm({\n default: true,\n message: 'Do you want to enable a GraphQL playground?',\n })\n spin.clear().start(prevText)\n\n return shouldDeploy\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","confirm","spinner","get","extractGraphQLAPIs","gen1","gen2","gen3","graphqlDebug","resolveApiGeneration","SchemaError","deployGraphQLAPI","getClientUrl","getCurrentSchemaProps","validateGraphQLAPI","getDatasetFlag","apiIdRegex","generations","ignoredBreaking","Set","ignoredWarnings","debug","extend","GraphQLDeployCommand","description","examples","command","flags","api","string","multiple","semantics","boolean","default","force","generation","options","playground","allowNo","tag","run","parse","onlyApis","dataset","datasetFlag","dryRun","generationFlag","nonNullDocumentFieldsFlag","playgroundFlag","tagFlag","withUnionCache","workDir","getProjectRoot","directory","apiDefs","spin","error","problemGroups","print","output","exit","message","Error","String","hasMultipleApis","length","usedFlags","undefined","filter","Boolean","warn","join","isUnattended","USAGE_ERROR","confirmed","log","USER_ABORT","deployTasks","hasErrors","apiId","some","apiDef","id","apiNames","apiIds","includes","apiName","getApiIdentifiers","has","test","add","index","projectId","start","fail","schemaErrors","extractionError","extracted","currentGeneration","playgroundEnabled","schemaProps","err","specifiedGeneration","unattended","stop","isRecognizedApiGeneration","enablePlayground","shouldEnablePlayground","playgroundCliFlag","playgroundConfiguration","playgroundCurrentlyEnabled","apiSpec","generateSchema","filterSuffix","valid","schema","validationError","isResultValid","renderBreakingChanges","shouldDeploy","succeed","breakingChanges","dangerousChanges","filterChanges","push","task","response","apiUrl","location","replace","breaking","dangerous","change","type","hasProblematicChanges","text","prevText","clear"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/graphql/deploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport get from 'lodash-es/get.js'\n\nimport {extractGraphQLAPIs} from '../../actions/graphql/extractGraphQLAPIs.js'\nimport gen1 from '../../actions/graphql/gen1/index.js'\nimport gen2 from '../../actions/graphql/gen2/index.js'\nimport gen3 from '../../actions/graphql/gen3/index.js'\nimport {graphqlDebug} from '../../actions/graphql/graphqlDebug.js'\nimport {resolveApiGeneration} from '../../actions/graphql/resolveApiGeneration.js'\nimport {SchemaError} from '../../actions/graphql/SchemaError.js'\nimport {\n type ExtractedGraphQLAPI,\n type GeneratedApiSpecification,\n type ValidationResponse,\n} from '../../actions/graphql/types.js'\nimport {\n deployGraphQLAPI,\n getClientUrl,\n getCurrentSchemaProps,\n validateGraphQLAPI,\n} from '../../services/graphql.js'\nimport {getDatasetFlag} from '../../util/sharedFlags.js'\n\ninterface DeployTask {\n dataset: string\n enablePlayground: boolean\n projectId: string\n schema: GeneratedApiSpecification\n tag: string\n}\n\nconst apiIdRegex = /^[a-z0-9_-]+$/\nconst generations = {\n gen1,\n gen2,\n gen3,\n}\n\nconst ignoredBreaking = new Set<string>(['OPTIONAL_INPUT_FIELD_ADDED'])\n// Reserved for future use to filter out specific dangerous change types\nconst ignoredWarnings = new Set<string>()\n\nconst debug = graphqlDebug.extend('deploy')\n\nexport class GraphQLDeployCommand extends SanityCommand<typeof GraphQLDeployCommand> {\n static override description = 'Deploy a GraphQL API from the current Sanity schema'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Deploy all defined GraphQL APIs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dry-run',\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api staging --api ios',\n description: 'Deploy only the GraphQL APIs with the IDs \"staging\" and \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --playground',\n description: 'Deploy all defined GraphQL APIs, overriding any playground setting',\n },\n ]\n\n static override flags = {\n api: Flags.string({\n description: 'Only deploy API with this ID (can be specified multiple times)',\n multiple: true,\n }),\n ...getDatasetFlag({description: 'Deploy API for the given dataset', semantics: 'specify'}),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Validate defined GraphQL APIs, check for breaking changes, skip deploy',\n }),\n force: Flags.boolean({\n description: 'Deploy API without confirming breaking changes',\n }),\n generation: Flags.string({\n description: 'API generation to deploy (defaults to \"gen3\")',\n options: ['gen1', 'gen2', 'gen3'],\n }),\n 'non-null-document-fields': Flags.boolean({\n description: 'Use non-null document fields (_id, _type etc)',\n }),\n playground: Flags.boolean({\n allowNo: true,\n description: 'Enable GraphQL playground for easier debugging',\n }),\n tag: Flags.string({\n description: 'Deploy API(s) to given tag (defaults to \"default\")',\n }),\n 'with-union-cache': Flags.boolean({\n description: 'Cache union types (faster for schemas with many self-references)',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(GraphQLDeployCommand)\n const {\n api: onlyApis,\n dataset: datasetFlag,\n 'dry-run': dryRun,\n generation: generationFlag,\n 'non-null-document-fields': nonNullDocumentFieldsFlag,\n playground: playgroundFlag,\n tag: tagFlag,\n 'with-union-cache': withUnionCache,\n } = flags\n\n const workDir = (await this.getProjectRoot()).directory\n\n let apiDefs: ExtractedGraphQLAPI[] = []\n let spin: ReturnType<typeof spinner>\n\n try {\n apiDefs = await extractGraphQLAPIs(workDir, {\n nonNullDocumentFieldsFlag,\n withUnionCache,\n })\n } catch (error) {\n if (error instanceof SchemaError) {\n debug('Schema validation errors: %O', error.problemGroups)\n error.print(this.output)\n this.error('Fix the schema errors above and try again', {exit: exitCodes.RUNTIME_ERROR})\n }\n debug('Failed to resolve GraphQL APIs: %O', error)\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Failed to resolve GraphQL APIs: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const hasMultipleApis = flags.api ? flags.api.length > 1 : apiDefs.length > 1\n\n const usedFlags = [\n datasetFlag && '--dataset',\n tagFlag && '--tag',\n playgroundFlag !== undefined && '--playground',\n generationFlag !== undefined && '--generation',\n nonNullDocumentFieldsFlag !== undefined && '--non-null-document-fields',\n ].filter(Boolean)\n\n if (hasMultipleApis && usedFlags.length > 0) {\n this.warn(`More than one API defined, and ${usedFlags.join('/')} is specified`)\n this.warn(`This will use the specified flag(s) for ALL APIs, overriding config!`)\n\n if (flags.force) {\n this.warn(`--force specified, continuing...`)\n } else if (this.isUnattended()) {\n this.error(\n 'Flag overrides for multiple APIs require confirmation. Pass `--force` to continue.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n } else {\n const confirmed = await confirm({\n default: false,\n message: 'Continue with flag overrides for all APIs?',\n })\n if (!confirmed) {\n this.log('GraphQL deployment cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n }\n\n const deployTasks: DeployTask[] = []\n let hasErrors = false\n\n for (const apiId of onlyApis || []) {\n if (!apiDefs.some((apiDef) => apiDef.id === apiId)) {\n this.error(`GraphQL API with id \"${apiId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n const apiNames = new Set<string>()\n const apiIds = new Set<string>()\n\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n const {apiName} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n if (apiNames.has(apiName)) {\n this.error(`Multiple GraphQL APIs with the same dataset and tag found (${apiName})`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (apiDef.id) {\n if (!apiIdRegex.test(apiDef.id)) {\n this.error(\n `Invalid GraphQL API id \"${apiDef.id}\" - only a-z, 0-9, underscore and dashes are allowed`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n if (apiIds.has(apiDef.id)) {\n this.error(`Multiple GraphQL APIs with the same ID found (${apiDef.id})`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n apiIds.add(apiDef.id)\n }\n\n apiNames.add(apiName)\n }\n\n if (onlyApis) {\n this.warn(`Deploying only specified APIs: ${onlyApis.join(', ')}`)\n }\n\n let index = -1\n for (const apiDef of apiDefs) {\n if (onlyApis && (!apiDef.id || !onlyApis.includes(apiDef.id))) {\n continue\n }\n\n index++\n\n const {apiName, dataset, tag} = this.getApiIdentifiers(apiDef, datasetFlag, tagFlag)\n const {playground, projectId} = apiDef\n spin = spinner(`Generating GraphQL API: ${apiName}`).start()\n\n if (!dataset) {\n spin.fail()\n this.error(\n `Dataset is required for API at index ${index}. Pass it with \\`--dataset <name>\\` or configure a dataset for the API.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n // Handle extraction errors early (computed in worker), before network calls and prompts.\n // Continue the loop so all API errors are reported — don't exit on the first failure.\n if (apiDef.schemaErrors?.length) {\n spin.fail()\n new SchemaError(apiDef.schemaErrors).print(this.output, `Schema errors in ${apiName}`)\n hasErrors = true\n continue\n }\n\n if (apiDef.extractionError) {\n debug('Failed to extract schema', apiDef.extractionError)\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: ${apiDef.extractionError}`)\n hasErrors = true\n continue\n }\n\n if (!apiDef.extracted) {\n spin.fail()\n this.log(`Failed to extract schema for ${apiName}: No extraction result`)\n hasErrors = true\n continue\n }\n\n let currentGeneration: string | undefined\n let playgroundEnabled: boolean | undefined\n try {\n const schemaProps = await getCurrentSchemaProps(projectId, dataset, tag)\n currentGeneration = schemaProps.currentGeneration\n playgroundEnabled = schemaProps.playgroundEnabled\n } catch (err) {\n debug('Failed to get current GraphQL schema properties', err)\n spin.fail()\n this.error('Failed to get current GraphQL schema properties', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // CLI flag takes precedence over configuration\n const specifiedGeneration = generationFlag === undefined ? apiDef.generation : generationFlag\n\n const generation = await resolveApiGeneration({\n currentGeneration,\n force: flags.force,\n index,\n output: this.output,\n specifiedGeneration,\n unattended: this.isUnattended(),\n })\n\n if (!generation) {\n spin.stop()\n this.log('GraphQL deployment cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n\n if (!this.isRecognizedApiGeneration(generation)) {\n spin.fail()\n this.error(`Unknown API generation \"${generation}\" for API at index ${index}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const enablePlayground = await this.shouldEnablePlayground({\n dryRun,\n playgroundCliFlag: playgroundFlag,\n playgroundConfiguration: playground,\n playgroundCurrentlyEnabled: playgroundEnabled,\n spin,\n })\n\n let apiSpec: GeneratedApiSpecification\n try {\n const generateSchema = generations[generation]\n apiSpec = generateSchema(apiDef.extracted, {filterSuffix: apiDef.filterSuffix})\n } catch (err) {\n debug('Failed to generate schema', err)\n spin.fail()\n const message = err instanceof Error ? err.message : 'Unknown error'\n this.error(`Failed to generate schema: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n let valid: ValidationResponse | undefined\n try {\n valid = await validateGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n } catch (err) {\n debug('validateGraphQLAPI error', err)\n const validationError = get(err, 'response.body.validationError')\n spin.fail()\n this.error(validationError ?? 'Failed to validate GraphQL API', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // when the result is not valid and there are breaking changes afoot!\n if (!this.isResultValid(valid, {force: flags.force, spin})) {\n // not valid and a dry run? then it can exit with a error\n if (dryRun) {\n spin.fail()\n this.renderBreakingChanges(valid)\n hasErrors = true\n continue\n }\n\n if (this.isUnattended()) {\n spin.fail()\n this.renderBreakingChanges(valid)\n this.error(\n 'GraphQL deployment requires confirmation because the schema contains dangerous changes. Pass `--force` to continue.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n spin.stop()\n this.renderBreakingChanges(valid)\n const shouldDeploy = await confirm({\n default: false,\n message: 'Do you want to deploy a new API despite the dangerous changes?',\n })\n\n if (!shouldDeploy) {\n this.log('GraphQL deployment cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n\n spin.succeed()\n } else if (dryRun) {\n // isResultValid() already set the spinner state (succeed or warn).\n // Check whether changes were forced so we print the correct message.\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n if (breakingChanges.length > 0 || dangerousChanges.length > 0) {\n this.renderBreakingChanges(valid)\n this.log('Forced with `--force`, skipping deploy (dry run)')\n } else {\n this.log('GraphQL API is valid and has no breaking changes')\n }\n continue\n }\n\n deployTasks.push({\n dataset,\n enablePlayground,\n projectId,\n schema: apiSpec,\n tag,\n })\n }\n\n // Give some space for deployment tasks\n this.log('')\n\n for (const task of deployTasks) {\n const {dataset, enablePlayground, projectId, schema, tag} = task\n\n this.log(`Project: ${projectId}`)\n this.log(`Dataset: ${dataset}`)\n this.log(`Tag: ${tag}`)\n\n spin = spinner('Deploying GraphQL API').start()\n\n try {\n const response = await deployGraphQLAPI({\n dataset,\n enablePlayground,\n projectId,\n schema,\n tag,\n })\n\n spin.stop()\n const apiUrl = await getClientUrl(\n projectId,\n response.location.replace(/^\\/(v1|v\\d{4}-\\d{2}-\\d{2})\\//, '/'),\n )\n this.log(`URL: ${apiUrl}`)\n spin.start('Deployed!').succeed()\n this.log('')\n } catch (error) {\n spin.fail()\n debug('Failed to deploy GraphQL API', error)\n this.error('Failed to deploy GraphQL API', {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n if (hasErrors) {\n this.exit(exitCodes.RUNTIME_ERROR)\n }\n }\n\n private filterChanges(valid: ValidationResponse) {\n const {breakingChanges: breaking, dangerousChanges: dangerous} = valid\n return {\n breakingChanges: breaking.filter((change) => !ignoredBreaking.has(change.type)),\n dangerousChanges: dangerous.filter((change) => !ignoredWarnings.has(change.type)),\n }\n }\n\n private getApiIdentifiers(apiDef: ExtractedGraphQLAPI, datasetFlag?: string, tagFlag?: string) {\n const dataset = datasetFlag || apiDef.dataset\n const tag = tagFlag || apiDef.tag || 'default'\n const apiName = [dataset, tag].join('/')\n return {apiName, dataset, tag}\n }\n\n private isRecognizedApiGeneration(generation: string): generation is 'gen1' | 'gen2' | 'gen3' {\n return ['gen1', 'gen2', 'gen3'].includes(generation)\n }\n\n private isResultValid(\n valid: ValidationResponse,\n {force, spin}: {force?: boolean; spin: ReturnType<typeof spinner>},\n ) {\n const {validationError} = valid\n if (validationError) {\n spin.fail()\n this.error(`GraphQL schema is not valid:\\n\\n${validationError}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n const hasProblematicChanges = breakingChanges.length > 0 || dangerousChanges.length > 0\n\n if (!hasProblematicChanges) {\n spin.succeed()\n return true\n }\n\n if (force) {\n spin.text = 'Validating GraphQL API: Dangerous changes. Forced with `--force`.'\n spin.warn()\n return true\n }\n\n spin.warn()\n return false\n }\n\n private renderBreakingChanges(valid: ValidationResponse) {\n const {breakingChanges, dangerousChanges} = this.filterChanges(valid)\n\n if (dangerousChanges.length > 0) {\n this.log('\\nFound potentially dangerous changes from previous schema:')\n for (const change of dangerousChanges) this.log(` - ${change.description}`)\n }\n\n if (breakingChanges.length > 0) {\n this.log('\\nFound BREAKING changes from previous schema:')\n for (const change of breakingChanges) this.log(` - ${change.description}`)\n }\n\n this.output.log('')\n }\n\n private async shouldEnablePlayground({\n dryRun,\n playgroundCliFlag,\n playgroundConfiguration,\n playgroundCurrentlyEnabled,\n spin,\n }: {\n dryRun: boolean\n playgroundCliFlag?: boolean\n playgroundConfiguration?: boolean\n playgroundCurrentlyEnabled?: boolean\n spin: ReturnType<typeof spinner>\n }): Promise<boolean> {\n // On a dry run, it doesn't matter, return true 🤷‍♂️\n if (dryRun) {\n return true\n }\n\n // Prioritize CLI flag if set\n if (playgroundCliFlag !== undefined) {\n return playgroundCliFlag\n }\n\n // If explicitly set true/false in configuration, use that\n if (playgroundConfiguration !== undefined) {\n return playgroundConfiguration\n }\n\n // If API is already deployed, use the current state\n if (playgroundCurrentlyEnabled !== undefined) {\n return playgroundCurrentlyEnabled\n }\n\n // If no API is deployed, default to true if non-interactive\n if (this.isUnattended()) {\n return true\n }\n\n // Interactive environment, so prompt the user\n const prevText = spin.text\n spin.warn()\n const shouldDeploy = await confirm({\n default: true,\n message: 'Do you want to enable a GraphQL playground?',\n })\n spin.clear().start(prevText)\n\n return shouldDeploy\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","confirm","spinner","get","extractGraphQLAPIs","gen1","gen2","gen3","graphqlDebug","resolveApiGeneration","SchemaError","deployGraphQLAPI","getClientUrl","getCurrentSchemaProps","validateGraphQLAPI","getDatasetFlag","apiIdRegex","generations","ignoredBreaking","Set","ignoredWarnings","debug","extend","GraphQLDeployCommand","description","examples","command","flags","api","string","multiple","semantics","boolean","default","force","generation","options","playground","allowNo","tag","run","parse","onlyApis","dataset","datasetFlag","dryRun","generationFlag","nonNullDocumentFieldsFlag","playgroundFlag","tagFlag","withUnionCache","workDir","getProjectRoot","directory","apiDefs","spin","error","problemGroups","print","output","exit","RUNTIME_ERROR","message","Error","String","hasMultipleApis","length","usedFlags","undefined","filter","Boolean","warn","join","isUnattended","USAGE_ERROR","confirmed","log","USER_ABORT","deployTasks","hasErrors","apiId","some","apiDef","id","apiNames","apiIds","includes","apiName","getApiIdentifiers","has","test","add","index","projectId","start","fail","schemaErrors","extractionError","extracted","currentGeneration","playgroundEnabled","schemaProps","err","specifiedGeneration","unattended","stop","isRecognizedApiGeneration","enablePlayground","shouldEnablePlayground","playgroundCliFlag","playgroundConfiguration","playgroundCurrentlyEnabled","apiSpec","generateSchema","filterSuffix","valid","schema","validationError","isResultValid","renderBreakingChanges","shouldDeploy","succeed","breakingChanges","dangerousChanges","filterChanges","push","task","response","apiUrl","location","replace","breaking","dangerous","change","type","hasProblematicChanges","text","prevText","clear"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { styleText } from 'node:util';
2
- import { getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { exitCodes, getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { promptForProject } from '../../prompts/promptForProject.js';
4
4
  import { GRAPHQL_API_VERSION, listGraphQLEndpoints } from '../../services/graphql.js';
5
5
  import { getProjectIdFlag } from '../../util/sharedFlags.js';
@@ -34,7 +34,7 @@ export class List extends SanityCommand {
34
34
  const message = error instanceof Error ? error.message : String(error);
35
35
  listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error);
36
36
  this.error(`GraphQL endpoints list retrieval failed:\n${message}`, {
37
- exit: 1
37
+ exit: exitCodes.RUNTIME_ERROR
38
38
  });
39
39
  }
40
40
  if (!endpoints || endpoints.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/graphql/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n GRAPHQL_API_VERSION,\n type GraphQLEndpoint,\n listGraphQLEndpoints,\n} from '../../services/graphql.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listGraphQLDebug = subdebug('graphql:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List deployed GraphQL endpoints for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List GraphQL endpoints for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List GraphQL endpoints for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list GraphQL endpoints for',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n await this.parse(List)\n\n const projectId = await this.getProjectId({\n fallback: () => promptForProject({}),\n })\n\n let endpoints: GraphQLEndpoint[] | undefined\n try {\n endpoints = await listGraphQLEndpoints(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n\n listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error)\n this.error(`GraphQL endpoints list retrieval failed:\\n${message}`, {exit: 1})\n }\n\n if (!endpoints || endpoints.length === 0) {\n this.log(\"This project doesn't have any GraphQL endpoints deployed.\")\n return\n }\n\n const client = await getProjectCliClient({\n apiVersion: GRAPHQL_API_VERSION,\n projectId,\n })\n\n this.log('Here are the GraphQL endpoints deployed for this project:')\n for (const [index, endpoint] of endpoints.entries()) {\n const {dataset, tag} = endpoint\n const url = client.getUrl(`/graphql/${dataset}/${tag}`)\n\n this.log(`${index + 1}. ${styleText('bold', 'Dataset:')} ${dataset}`)\n this.log(` ${styleText('bold', 'Tag:')} ${tag}`)\n this.log(` ${styleText('bold', 'Generation:')} ${endpoint.generation}`)\n this.log(` ${styleText('bold', 'Playground:')} ${endpoint.playgroundEnabled}`)\n this.log(` ${styleText('bold', 'URL:')} ${url}\\n`)\n }\n }\n}\n"],"names":["styleText","getProjectCliClient","SanityCommand","subdebug","promptForProject","GRAPHQL_API_VERSION","listGraphQLEndpoints","getProjectIdFlag","listGraphQLDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","endpoints","error","message","Error","String","exit","length","log","client","apiVersion","index","endpoint","entries","dataset","tag","url","getUrl","generation","playgroundEnabled"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,mBAAmB,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAE7E,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SACEC,mBAAmB,EAEnBC,oBAAoB,QACf,4BAA2B;AAClC,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,kDAAiD;IAC/E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACP;QAEjB,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IAAMf,iBAAiB,CAAC;QACpC;QAEA,IAAIgB;QACJ,IAAI;YACFA,YAAY,MAAMd,qBAAqBW;QACzC,EAAE,OAAOI,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAEhEb,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEI;YAC9E,IAAI,CAACA,KAAK,CAAC,CAAC,0CAA0C,EAAEC,SAAS,EAAE;gBAACG,MAAM;YAAC;QAC7E;QAEA,IAAI,CAACL,aAAaA,UAAUM,MAAM,KAAK,GAAG;YACxC,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,SAAS,MAAM3B,oBAAoB;YACvC4B,YAAYxB;YACZY;QACF;QAEA,IAAI,CAACU,GAAG,CAAC;QACT,KAAK,MAAM,CAACG,OAAOC,SAAS,IAAIX,UAAUY,OAAO,GAAI;YACnD,MAAM,EAACC,OAAO,EAAEC,GAAG,EAAC,GAAGH;YACvB,MAAMI,MAAMP,OAAOQ,MAAM,CAAC,CAAC,SAAS,EAAEH,QAAQ,CAAC,EAAEC,KAAK;YAEtD,IAAI,CAACP,GAAG,CAAC,GAAGG,QAAQ,EAAE,GAAG,EAAE9B,UAAU,QAAQ,YAAY,KAAK,EAAEiC,SAAS;YACzE,IAAI,CAACN,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,QAAQ,SAAS,EAAEkC,KAAK;YAC1D,IAAI,CAACP,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,eAAe,EAAE,EAAE+B,SAASM,UAAU,EAAE;YAC1E,IAAI,CAACV,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,eAAe,EAAE,EAAE+B,SAASO,iBAAiB,EAAE;YACjF,IAAI,CAACX,GAAG,CAAC,CAAC,IAAI,EAAE3B,UAAU,QAAQ,QAAQ,EAAE,EAAEmC,IAAI,EAAE,CAAC;QACvD;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/graphql/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n GRAPHQL_API_VERSION,\n type GraphQLEndpoint,\n listGraphQLEndpoints,\n} from '../../services/graphql.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listGraphQLDebug = subdebug('graphql:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List deployed GraphQL endpoints for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List GraphQL endpoints for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List GraphQL endpoints for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list GraphQL endpoints for',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n await this.parse(List)\n\n const projectId = await this.getProjectId({\n fallback: () => promptForProject({}),\n })\n\n let endpoints: GraphQLEndpoint[] | undefined\n try {\n endpoints = await listGraphQLEndpoints(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n\n listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error)\n this.error(`GraphQL endpoints list retrieval failed:\\n${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (!endpoints || endpoints.length === 0) {\n this.log(\"This project doesn't have any GraphQL endpoints deployed.\")\n return\n }\n\n const client = await getProjectCliClient({\n apiVersion: GRAPHQL_API_VERSION,\n projectId,\n })\n\n this.log('Here are the GraphQL endpoints deployed for this project:')\n for (const [index, endpoint] of endpoints.entries()) {\n const {dataset, tag} = endpoint\n const url = client.getUrl(`/graphql/${dataset}/${tag}`)\n\n this.log(`${index + 1}. ${styleText('bold', 'Dataset:')} ${dataset}`)\n this.log(` ${styleText('bold', 'Tag:')} ${tag}`)\n this.log(` ${styleText('bold', 'Generation:')} ${endpoint.generation}`)\n this.log(` ${styleText('bold', 'Playground:')} ${endpoint.playgroundEnabled}`)\n this.log(` ${styleText('bold', 'URL:')} ${url}\\n`)\n }\n }\n}\n"],"names":["styleText","exitCodes","getProjectCliClient","SanityCommand","subdebug","promptForProject","GRAPHQL_API_VERSION","listGraphQLEndpoints","getProjectIdFlag","listGraphQLDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","endpoints","error","message","Error","String","exit","RUNTIME_ERROR","length","log","client","apiVersion","index","endpoint","entries","dataset","tag","url","getUrl","generation","playgroundEnabled"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,SAAS,EAAEC,mBAAmB,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExF,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SACEC,mBAAmB,EAEnBC,oBAAoB,QACf,4BAA2B;AAClC,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,kDAAiD;IAC/E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACP;QAEjB,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IAAMf,iBAAiB,CAAC;QACpC;QAEA,IAAIgB;QACJ,IAAI;YACFA,YAAY,MAAMd,qBAAqBW;QACzC,EAAE,OAAOI,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAEhEb,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEI;YAC9E,IAAI,CAACA,KAAK,CAAC,CAAC,0CAA0C,EAAEC,SAAS,EAAE;gBACjEG,MAAMzB,UAAU0B,aAAa;YAC/B;QACF;QAEA,IAAI,CAACN,aAAaA,UAAUO,MAAM,KAAK,GAAG;YACxC,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,SAAS,MAAM5B,oBAAoB;YACvC6B,YAAYzB;YACZY;QACF;QAEA,IAAI,CAACW,GAAG,CAAC;QACT,KAAK,MAAM,CAACG,OAAOC,SAAS,IAAIZ,UAAUa,OAAO,GAAI;YACnD,MAAM,EAACC,OAAO,EAAEC,GAAG,EAAC,GAAGH;YACvB,MAAMI,MAAMP,OAAOQ,MAAM,CAAC,CAAC,SAAS,EAAEH,QAAQ,CAAC,EAAEC,KAAK;YAEtD,IAAI,CAACP,GAAG,CAAC,GAAGG,QAAQ,EAAE,GAAG,EAAEhC,UAAU,QAAQ,YAAY,KAAK,EAAEmC,SAAS;YACzE,IAAI,CAACN,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,QAAQ,SAAS,EAAEoC,KAAK;YAC1D,IAAI,CAACP,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,eAAe,EAAE,EAAEiC,SAASM,UAAU,EAAE;YAC1E,IAAI,CAACV,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,eAAe,EAAE,EAAEiC,SAASO,iBAAiB,EAAE;YACjF,IAAI,CAACX,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,QAAQ,EAAE,EAAEqC,IAAI,EAAE,CAAC;QACvD;IACF;AACF"}
@@ -82,7 +82,7 @@ export class Undeploy extends SanityCommand {
82
82
  const apiDef = apiDefs.find((def)=>def.id === apiFlag);
83
83
  if (!apiDef) {
84
84
  this.error(`GraphQL API "${apiFlag}" not found`, {
85
- exit: 1
85
+ exit: exitCodes.RUNTIME_ERROR
86
86
  });
87
87
  }
88
88
  projectId = apiDef.projectId;
@@ -149,7 +149,7 @@ export class Undeploy extends SanityCommand {
149
149
  const err = error instanceof Error ? error : new Error(`${error}`);
150
150
  undeployGraphqlDebug(`Error deleting GraphQL API for ${dataset}/${tag}`, err);
151
151
  this.error(`GraphQL API deletion failed:\n${err.message}`, {
152
- exit: 1
152
+ exit: exitCodes.RUNTIME_ERROR
153
153
  });
154
154
  }
155
155
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/graphql/undeploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {getGraphQLAPIs} from '../../actions/graphql/getGraphQLAPIs.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteGraphQLAPI} from '../../services/graphql.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst undeployGraphqlDebug = subdebug('graphql:undeploy')\n\nexport class Undeploy extends SanityCommand<typeof Undeploy> {\n static override description = 'Remove a deployed GraphQL API'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Undeploy GraphQL API for current project and dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api ios',\n description: 'Undeploy API with ID \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging',\n description: 'Undeploy GraphQL API for staging dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging --tag next',\n description: 'Undeploy GraphQL API for staging dataset with \"next\" tag',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --force',\n description: 'Undeploy GraphQL API without confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123 --dataset production',\n description: 'Undeploy GraphQL API for a specific project and dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to undeploy GraphQL API from',\n semantics: 'override',\n }),\n api: Flags.string({\n description: 'Undeploy API with this ID',\n exclusive: ['project-id', 'project'],\n required: false,\n }),\n ...getDatasetFlag({description: 'Dataset to undeploy GraphQL API from', semantics: 'override'}),\n force: Flags.boolean({\n description: 'Skip confirmation prompt',\n required: false,\n }),\n project: Flags.string({\n deprecated: {to: 'project-id'},\n description: 'Project ID to delete GraphQL API for',\n hidden: true,\n required: false,\n }),\n tag: Flags.string({\n default: 'default',\n description: 'Tag to undeploy GraphQL API from',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(Undeploy)\n const {api: apiFlag, dataset: datasetFlag, force, tag: tagFlag} = flags\n\n let projectId: string | undefined\n let dataset = datasetFlag\n let tag = tagFlag\n\n // If specifying --api, use it for the flags not provided\n if (apiFlag) {\n const workDir = (await this.getProjectRoot()).directory\n const apiDefs = await getGraphQLAPIs(workDir)\n const apiDef = apiDefs.find((def) => def.id === apiFlag)\n\n if (!apiDef) {\n this.error(`GraphQL API \"${apiFlag}\" not found`, {exit: 1})\n }\n\n projectId = apiDef.projectId\n\n if (dataset && dataset !== apiDef.dataset) {\n this.warn(`Both --api and --dataset specified, using --dataset ${dataset}`)\n } else {\n dataset = apiDef.dataset\n }\n\n if (tag && tag !== 'default' && apiDef.tag && tag !== apiDef.tag) {\n this.warn(`Both --api and --tag specified, using --tag ${tag}`)\n } else {\n tag = apiDef.tag || 'default'\n }\n }\n\n // Get projectId from config if not specified\n if (!projectId) {\n projectId = await this.getProjectId({\n deprecatedFlagName: 'project',\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'manage', permission: 'sanity.project.graphql'}],\n }),\n })\n }\n\n // Get dataset from CLI config if not specified\n if (!dataset) {\n const cliConfig = await this.tryGetCliConfig()\n dataset = cliConfig.api?.dataset\n }\n\n if (!dataset) {\n this.error(\n 'Dataset is required. Pass it with `--dataset <name>` or configure it in your project.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n // Confirm deletion unless --force is used\n if (!force) {\n if (this.isUnattended()) {\n this.error('GraphQL API undeploy requires confirmation. Pass `--force` to continue.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const confirmMessage =\n tag === 'default'\n ? `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId}?`\n : `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId} with tag \"${tag}\"?`\n\n const confirmed = await confirm({\n default: false,\n message: confirmMessage,\n })\n\n if (!confirmed) {\n this.log('GraphQL API undeploy cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n await deleteGraphQLAPI({\n dataset,\n projectId,\n tag,\n })\n\n this.log('GraphQL API deleted')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n undeployGraphqlDebug(`Error deleting GraphQL API for ${dataset}/${tag}`, err)\n this.error(`GraphQL API deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","confirm","getGraphQLAPIs","promptForProject","deleteGraphQLAPI","getDatasetFlag","getProjectIdFlag","undeployGraphqlDebug","Undeploy","description","examples","command","flags","semantics","api","string","exclusive","required","force","boolean","project","deprecated","to","hidden","tag","default","run","parse","apiFlag","dataset","datasetFlag","tagFlag","projectId","workDir","getProjectRoot","directory","apiDefs","apiDef","find","def","id","error","exit","warn","getProjectId","deprecatedFlagName","fallback","requiredPermissions","grant","permission","cliConfig","tryGetCliConfig","USAGE_ERROR","isUnattended","confirmMessage","confirmed","message","log","USER_ABORT","err","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/graphql/undeploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {getGraphQLAPIs} from '../../actions/graphql/getGraphQLAPIs.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteGraphQLAPI} from '../../services/graphql.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst undeployGraphqlDebug = subdebug('graphql:undeploy')\n\nexport class Undeploy extends SanityCommand<typeof Undeploy> {\n static override description = 'Remove a deployed GraphQL API'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Undeploy GraphQL API for current project and dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api ios',\n description: 'Undeploy API with ID \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging',\n description: 'Undeploy GraphQL API for staging dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging --tag next',\n description: 'Undeploy GraphQL API for staging dataset with \"next\" tag',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --force',\n description: 'Undeploy GraphQL API without confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123 --dataset production',\n description: 'Undeploy GraphQL API for a specific project and dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to undeploy GraphQL API from',\n semantics: 'override',\n }),\n api: Flags.string({\n description: 'Undeploy API with this ID',\n exclusive: ['project-id', 'project'],\n required: false,\n }),\n ...getDatasetFlag({description: 'Dataset to undeploy GraphQL API from', semantics: 'override'}),\n force: Flags.boolean({\n description: 'Skip confirmation prompt',\n required: false,\n }),\n project: Flags.string({\n deprecated: {to: 'project-id'},\n description: 'Project ID to delete GraphQL API for',\n hidden: true,\n required: false,\n }),\n tag: Flags.string({\n default: 'default',\n description: 'Tag to undeploy GraphQL API from',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(Undeploy)\n const {api: apiFlag, dataset: datasetFlag, force, tag: tagFlag} = flags\n\n let projectId: string | undefined\n let dataset = datasetFlag\n let tag = tagFlag\n\n // If specifying --api, use it for the flags not provided\n if (apiFlag) {\n const workDir = (await this.getProjectRoot()).directory\n const apiDefs = await getGraphQLAPIs(workDir)\n const apiDef = apiDefs.find((def) => def.id === apiFlag)\n\n if (!apiDef) {\n this.error(`GraphQL API \"${apiFlag}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n projectId = apiDef.projectId\n\n if (dataset && dataset !== apiDef.dataset) {\n this.warn(`Both --api and --dataset specified, using --dataset ${dataset}`)\n } else {\n dataset = apiDef.dataset\n }\n\n if (tag && tag !== 'default' && apiDef.tag && tag !== apiDef.tag) {\n this.warn(`Both --api and --tag specified, using --tag ${tag}`)\n } else {\n tag = apiDef.tag || 'default'\n }\n }\n\n // Get projectId from config if not specified\n if (!projectId) {\n projectId = await this.getProjectId({\n deprecatedFlagName: 'project',\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'manage', permission: 'sanity.project.graphql'}],\n }),\n })\n }\n\n // Get dataset from CLI config if not specified\n if (!dataset) {\n const cliConfig = await this.tryGetCliConfig()\n dataset = cliConfig.api?.dataset\n }\n\n if (!dataset) {\n this.error(\n 'Dataset is required. Pass it with `--dataset <name>` or configure it in your project.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n // Confirm deletion unless --force is used\n if (!force) {\n if (this.isUnattended()) {\n this.error('GraphQL API undeploy requires confirmation. Pass `--force` to continue.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const confirmMessage =\n tag === 'default'\n ? `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId}?`\n : `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId} with tag \"${tag}\"?`\n\n const confirmed = await confirm({\n default: false,\n message: confirmMessage,\n })\n\n if (!confirmed) {\n this.log('GraphQL API undeploy cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n await deleteGraphQLAPI({\n dataset,\n projectId,\n tag,\n })\n\n this.log('GraphQL API deleted')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n undeployGraphqlDebug(`Error deleting GraphQL API for ${dataset}/${tag}`, err)\n this.error(`GraphQL API deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","confirm","getGraphQLAPIs","promptForProject","deleteGraphQLAPI","getDatasetFlag","getProjectIdFlag","undeployGraphqlDebug","Undeploy","description","examples","command","flags","semantics","api","string","exclusive","required","force","boolean","project","deprecated","to","hidden","tag","default","run","parse","apiFlag","dataset","datasetFlag","tagFlag","projectId","workDir","getProjectRoot","directory","apiDefs","apiDef","find","def","id","error","exit","RUNTIME_ERROR","warn","getProjectId","deprecatedFlagName","fallback","requiredPermissions","grant","permission","cliConfig","tryGetCliConfig","USAGE_ERROR","isUnattended","confirmMessage","confirmed","message","log","USER_ABORT","err","Error"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Args } from '@oclif/core';
2
- import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { formatFailure } from '../../actions/hook/formatFailure.js';
4
4
  import { promptForProject } from '../../prompts/promptForProject.js';
5
5
  import { getHookAttempt } from '../../services/hooks.js';
@@ -55,7 +55,7 @@ export class AttemptHookCommand extends SanityCommand {
55
55
  const err = error;
56
56
  attemptDebug(`Error fetching hook attempt ${attemptId}`, err);
57
57
  this.error(`Hook attempt retrieval failed:\n${err.message}`, {
58
- exit: 1
58
+ exit: exitCodes.RUNTIME_ERROR
59
59
  });
60
60
  }
61
61
  const { createdAt, failureReason, inProgress, resultBody, resultCode } = attempt;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/attempt.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt} from '../../actions/hook/types.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getHookAttempt} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst attemptDebug = subdebug('hook:attempt')\n\nexport class AttemptHookCommand extends SanityCommand<typeof AttemptHookCommand> {\n static override args = {\n attemptId: Args.string({\n description: 'The delivery attempt ID to get details for',\n required: true,\n }),\n }\n static override description = 'Print details of a given webhook delivery attempt'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> abc123',\n description: 'Print details of webhook delivery attempt with ID abc123',\n },\n {\n command: '<%= config.bin %> <%= command.id %> abc123 --project-id projectId',\n description: 'Get attempt details for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook attempt for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:attempt']\n\n public async run() {\n const {args} = await this.parse(AttemptHookCommand)\n const {attemptId} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let attempt: DeliveryAttempt\n try {\n attempt = await getHookAttempt({attemptId, projectId})\n } catch (error) {\n const err = error as Error\n attemptDebug(`Error fetching hook attempt ${attemptId}`, err)\n this.error(`Hook attempt retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n const {createdAt, failureReason, inProgress, resultBody, resultCode} = attempt\n\n this.log(`Date: ${createdAt}`)\n this.log(`Status: ${this.getStatus(attempt)}`)\n this.log(`Status code: ${resultCode}`)\n\n if (attempt.isFailure) {\n this.log(`Failure: ${formatFailure(attempt)}`)\n }\n\n if (!inProgress && (!failureReason || failureReason === 'http')) {\n const body = resultBody ? `\\n---\\n${resultBody}\\n---\\n` : '<empty>'\n this.log(`Response body: ${body}`)\n }\n }\n\n private getStatus(attempt: DeliveryAttempt): string {\n if (attempt.isFailure) {\n return 'Failed'\n }\n\n if (attempt.inProgress) {\n return 'In progress'\n }\n\n return 'Delivered'\n }\n}\n"],"names":["Args","SanityCommand","subdebug","formatFailure","promptForProject","getHookAttempt","getProjectIdFlag","attemptDebug","AttemptHookCommand","args","attemptId","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","attempt","error","err","message","exit","createdAt","failureReason","inProgress","resultBody","resultCode","log","getStatus","isFailure","body"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,aAAa,QAAO,sCAAqC;AAEjE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,0BAAyB;AACtD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,eAAeL,SAAS;AAE9B,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,OAAO;QACrBC,WAAWV,KAAKW,MAAM,CAAC;YACrBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IACD,OAAgBD,cAAc,oDAAmD;IAEjF,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;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,MAAM,EAACE,SAAS,EAAC,GAAGD;QAEpB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMtB,eAAe;gBAACK;gBAAWW;YAAS;QACtD,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZrB,aAAa,CAAC,4BAA4B,EAAEG,WAAW,EAAEmB;YACzD,IAAI,CAACD,KAAK,CAAC,CAAC,gCAAgC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACvE;QAEA,MAAM,EAACC,SAAS,EAAEC,aAAa,EAAEC,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAC,GAAGT;QAEvE,IAAI,CAACU,GAAG,CAAC,CAAC,MAAM,EAAEL,WAAW;QAC7B,IAAI,CAACK,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAACC,SAAS,CAACX,UAAU;QAC7C,IAAI,CAACU,GAAG,CAAC,CAAC,aAAa,EAAED,YAAY;QAErC,IAAIT,QAAQY,SAAS,EAAE;YACrB,IAAI,CAACF,GAAG,CAAC,CAAC,SAAS,EAAElC,cAAcwB,UAAU;QAC/C;QAEA,IAAI,CAACO,cAAe,CAAA,CAACD,iBAAiBA,kBAAkB,MAAK,GAAI;YAC/D,MAAMO,OAAOL,aAAa,CAAC,OAAO,EAAEA,WAAW,OAAO,CAAC,GAAG;YAC1D,IAAI,CAACE,GAAG,CAAC,CAAC,eAAe,EAAEG,MAAM;QACnC;IACF;IAEQF,UAAUX,OAAwB,EAAU;QAClD,IAAIA,QAAQY,SAAS,EAAE;YACrB,OAAO;QACT;QAEA,IAAIZ,QAAQO,UAAU,EAAE;YACtB,OAAO;QACT;QAEA,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/attempt.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt} from '../../actions/hook/types.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getHookAttempt} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst attemptDebug = subdebug('hook:attempt')\n\nexport class AttemptHookCommand extends SanityCommand<typeof AttemptHookCommand> {\n static override args = {\n attemptId: Args.string({\n description: 'The delivery attempt ID to get details for',\n required: true,\n }),\n }\n static override description = 'Print details of a given webhook delivery attempt'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> abc123',\n description: 'Print details of webhook delivery attempt with ID abc123',\n },\n {\n command: '<%= config.bin %> <%= command.id %> abc123 --project-id projectId',\n description: 'Get attempt details for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook attempt for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:attempt']\n\n public async run() {\n const {args} = await this.parse(AttemptHookCommand)\n const {attemptId} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let attempt: DeliveryAttempt\n try {\n attempt = await getHookAttempt({attemptId, projectId})\n } catch (error) {\n const err = error as Error\n attemptDebug(`Error fetching hook attempt ${attemptId}`, err)\n this.error(`Hook attempt retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const {createdAt, failureReason, inProgress, resultBody, resultCode} = attempt\n\n this.log(`Date: ${createdAt}`)\n this.log(`Status: ${this.getStatus(attempt)}`)\n this.log(`Status code: ${resultCode}`)\n\n if (attempt.isFailure) {\n this.log(`Failure: ${formatFailure(attempt)}`)\n }\n\n if (!inProgress && (!failureReason || failureReason === 'http')) {\n const body = resultBody ? `\\n---\\n${resultBody}\\n---\\n` : '<empty>'\n this.log(`Response body: ${body}`)\n }\n }\n\n private getStatus(attempt: DeliveryAttempt): string {\n if (attempt.isFailure) {\n return 'Failed'\n }\n\n if (attempt.inProgress) {\n return 'In progress'\n }\n\n return 'Delivered'\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","formatFailure","promptForProject","getHookAttempt","getProjectIdFlag","attemptDebug","AttemptHookCommand","args","attemptId","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","attempt","error","err","message","exit","RUNTIME_ERROR","createdAt","failureReason","inProgress","resultBody","resultCode","log","getStatus","isFailure","body"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,aAAa,QAAO,sCAAqC;AAEjE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,0BAAyB;AACtD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,eAAeL,SAAS;AAE9B,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,OAAO;QACrBC,WAAWX,KAAKY,MAAM,CAAC;YACrBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IACD,OAAgBD,cAAc,oDAAmD;IAEjF,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;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,MAAM,EAACE,SAAS,EAAC,GAAGD;QAEpB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMtB,eAAe;gBAACK;gBAAWW;YAAS;QACtD,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZrB,aAAa,CAAC,4BAA4B,EAAEG,WAAW,EAAEmB;YACzD,IAAI,CAACD,KAAK,CAAC,CAAC,gCAAgC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM/B,UAAUgC,aAAa;YAAA;QAC7F;QAEA,MAAM,EAACC,SAAS,EAAEC,aAAa,EAAEC,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAC,GAAGV;QAEvE,IAAI,CAACW,GAAG,CAAC,CAAC,MAAM,EAAEL,WAAW;QAC7B,IAAI,CAACK,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAACC,SAAS,CAACZ,UAAU;QAC7C,IAAI,CAACW,GAAG,CAAC,CAAC,aAAa,EAAED,YAAY;QAErC,IAAIV,QAAQa,SAAS,EAAE;YACrB,IAAI,CAACF,GAAG,CAAC,CAAC,SAAS,EAAEnC,cAAcwB,UAAU;QAC/C;QAEA,IAAI,CAACQ,cAAe,CAAA,CAACD,iBAAiBA,kBAAkB,MAAK,GAAI;YAC/D,MAAMO,OAAOL,aAAa,CAAC,OAAO,EAAEA,WAAW,OAAO,CAAC,GAAG;YAC1D,IAAI,CAACE,GAAG,CAAC,CAAC,eAAe,EAAEG,MAAM;QACnC;IACF;IAEQF,UAAUZ,OAAwB,EAAU;QAClD,IAAIA,QAAQa,SAAS,EAAE;YACrB,OAAO;QACT;QAEA,IAAIb,QAAQQ,UAAU,EAAE;YACtB,OAAO;QACT;QAEA,OAAO;IACT;AACF"}
@@ -1,4 +1,4 @@
1
- import { getSanityUrl, SanityCommand, subdebug } from '@sanity/cli-core';
1
+ import { exitCodes, getSanityUrl, SanityCommand, subdebug } from '@sanity/cli-core';
2
2
  import open from 'open';
3
3
  import { promptForProject } from '../../prompts/promptForProject.js';
4
4
  import { getProjectById } from '../../services/projects.js';
@@ -43,7 +43,7 @@ export class CreateHookCommand extends SanityCommand {
43
43
  const err = error;
44
44
  createHookDebug(`Error fetching project info for project ${projectId}`, err);
45
45
  this.error(`Failed to fetch project information:\n${err.message}`, {
46
- exit: 1
46
+ exit: exitCodes.RUNTIME_ERROR
47
47
  });
48
48
  }
49
49
  const organizationId = projectInfo.organizationId || 'personal';
@@ -59,7 +59,7 @@ export class CreateHookCommand extends SanityCommand {
59
59
  const err = error;
60
60
  createHookDebug('Error opening browser', err);
61
61
  this.error(`Failed to open browser:\n${err.message}`, {
62
- exit: 1
62
+ exit: exitCodes.RUNTIME_ERROR
63
63
  });
64
64
  }
65
65
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/create.ts"],"sourcesContent":["import {getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Create a webhook for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create webhook for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:create']\n\n public async run() {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({requiredPermissions: [{grant: 'read', permission: 'sanity.project'}]}),\n })\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {exit: 1})\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl = getSanityUrl(\n `/organizations/${organizationId}/project/${projectId}/api/webhooks/new`,\n )\n\n if (this.isUnattended()) {\n this.log(`Create a webhook at ${manageUrl}`)\n return\n }\n\n this.log(`Opening ${manageUrl}`)\n\n try {\n await open(manageUrl)\n } catch (error) {\n const err = error as Error\n createHookDebug('Error opening browser', err)\n this.error(`Failed to open browser:\\n${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["getSanityUrl","SanityCommand","subdebug","open","promptForProject","getProjectById","getProjectIdFlag","createHookDebug","CreateHookCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectInfo","error","err","message","exit","organizationId","manageUrl","isUnattended","log"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACtE,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,6BAA4B;AACzD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,0BAA0BP;IACrC,OAAgBQ,cAAc,uCAAsC;IACpE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAM;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBAACe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;qBAAE;gBAAA;QAC1F;QAEA,IAAIC;QACJ,IAAI;YACFA,cAAc,MAAMjB,eAAeW;QACrC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACxE,IAAI,CAACD,KAAK,CAAC,CAAC,sCAAsC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC7E;QAEA,MAAMC,iBAAiBL,YAAYK,cAAc,IAAI;QACrD,MAAMC,YAAY5B,aAChB,CAAC,eAAe,EAAE2B,eAAe,SAAS,EAAEX,UAAU,iBAAiB,CAAC;QAG1E,IAAI,IAAI,CAACa,YAAY,IAAI;YACvB,IAAI,CAACC,GAAG,CAAC,CAAC,oBAAoB,EAAEF,WAAW;YAC3C;QACF;QAEA,IAAI,CAACE,GAAG,CAAC,CAAC,QAAQ,EAAEF,WAAW;QAE/B,IAAI;YACF,MAAMzB,KAAKyB;QACb,EAAE,OAAOL,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,yBAAyBiB;YACzC,IAAI,CAACD,KAAK,CAAC,CAAC,yBAAyB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAChE;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/create.ts"],"sourcesContent":["import {exitCodes, getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Create a webhook for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create webhook for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:create']\n\n public async run() {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({requiredPermissions: [{grant: 'read', permission: 'sanity.project'}]}),\n })\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl = getSanityUrl(\n `/organizations/${organizationId}/project/${projectId}/api/webhooks/new`,\n )\n\n if (this.isUnattended()) {\n this.log(`Create a webhook at ${manageUrl}`)\n return\n }\n\n this.log(`Opening ${manageUrl}`)\n\n try {\n await open(manageUrl)\n } catch (error) {\n const err = error as Error\n createHookDebug('Error opening browser', err)\n this.error(`Failed to open browser:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","getSanityUrl","SanityCommand","subdebug","open","promptForProject","getProjectById","getProjectIdFlag","createHookDebug","CreateHookCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectInfo","error","err","message","exit","RUNTIME_ERROR","organizationId","manageUrl","isUnattended","log"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,YAAY,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACjF,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,6BAA4B;AACzD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,0BAA0BP;IACrC,OAAgBQ,cAAc,uCAAsC;IACpE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAM;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBAACe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;qBAAE;gBAAA;QAC1F;QAEA,IAAIC;QACJ,IAAI;YACFA,cAAc,MAAMjB,eAAeW;QACrC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACxE,IAAI,CAACD,KAAK,CAAC,CAAC,sCAAsC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBACjEC,MAAM3B,UAAU4B,aAAa;YAC/B;QACF;QAEA,MAAMC,iBAAiBN,YAAYM,cAAc,IAAI;QACrD,MAAMC,YAAY7B,aAChB,CAAC,eAAe,EAAE4B,eAAe,SAAS,EAAEZ,UAAU,iBAAiB,CAAC;QAG1E,IAAI,IAAI,CAACc,YAAY,IAAI;YACvB,IAAI,CAACC,GAAG,CAAC,CAAC,oBAAoB,EAAEF,WAAW;YAC3C;QACF;QAEA,IAAI,CAACE,GAAG,CAAC,CAAC,QAAQ,EAAEF,WAAW;QAE/B,IAAI;YACF,MAAM1B,KAAK0B;QACb,EAAE,OAAON,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,yBAAyBiB;YACzC,IAAI,CAACD,KAAK,CAAC,CAAC,yBAAyB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM3B,UAAU4B,aAAa;YAAA;QACtF;IACF;AACF"}
@@ -62,7 +62,7 @@ export class Delete extends SanityCommand {
62
62
  const err = error;
63
63
  deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err);
64
64
  this.error(`Hook deletion failed:\n${err.message}`, {
65
- exit: 1
65
+ exit: exitCodes.RUNTIME_ERROR
66
66
  });
67
67
  }
68
68
  }
@@ -74,12 +74,12 @@ export class Delete extends SanityCommand {
74
74
  const err = error;
75
75
  deleteHookDebug(`Error fetching hooks for project ${projectId}`, err);
76
76
  this.error(`Failed to fetch hooks:\n${err.message}`, {
77
- exit: 1
77
+ exit: exitCodes.RUNTIME_ERROR
78
78
  });
79
79
  }
80
80
  if (hooks.length === 0) {
81
81
  this.error('No hooks configured for this project.', {
82
- exit: 1
82
+ exit: exitCodes.RUNTIME_ERROR
83
83
  });
84
84
  }
85
85
  // If hook name is specified, find it in the list
@@ -88,7 +88,7 @@ export class Delete extends SanityCommand {
88
88
  const selectedHook = hooks.find((hook)=>hook.name.toLowerCase() === specifiedNameLower);
89
89
  if (!selectedHook) {
90
90
  this.error(`Hook with name "${specifiedName}" not found`, {
91
- exit: 1
91
+ exit: exitCodes.RUNTIME_ERROR
92
92
  });
93
93
  }
94
94
  return selectedHook.id;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of webhook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a webhook from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a webhook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a webhook from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete webhook from',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:delete']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n if (!args.name && this.isUnattended()) {\n this.error('Webhook name is required. Pass the name as an argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: 1})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: 1})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: 1})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","select","promptForProject","deleteHookForProject","listHooksForProject","getProjectIdFlag","deleteHookDebug","Delete","args","name","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hookId","promptForHook","log","err","message","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of webhook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a webhook from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a webhook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a webhook from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete webhook from',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:delete']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n if (!args.name && this.isUnattended()) {\n this.error('Webhook name is required. Pass the name as an argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","select","promptForProject","deleteHookForProject","listHooksForProject","getProjectIdFlag","deleteHookDebug","Delete","args","name","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hookId","promptForHook","log","err","message","RUNTIME_ERROR","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { SanityCommand, subdebug } from '@sanity/cli-core';
1
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
2
2
  import { promptForProject } from '../../prompts/promptForProject.js';
3
3
  import { listHooksForProject } from '../../services/hooks.js';
4
4
  import { getProjectIdFlag } from '../../util/sharedFlags.js';
@@ -43,7 +43,7 @@ export class List extends SanityCommand {
43
43
  const err = error;
44
44
  listHookDebug(`Error fetching hooks for project ${projectId}`, err);
45
45
  this.error(`Hook list retrieval failed:\n${err.message}`, {
46
- exit: 1
46
+ exit: exitCodes.RUNTIME_ERROR
47
47
  });
48
48
  }
49
49
  for (const hook of hooks){
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List webhooks for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List webhooks for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List webhooks for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list webhooks for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:list']\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["SanityCommand","subdebug","promptForProject","listHooksForProject","getProjectIdFlag","listHookDebug","List","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGxD,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,mBAAmB,QAAO,0BAAyB;AAC3D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAY,CAAA;IAEvD,MAAaC,MAAM;QACjB,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,QAAQ,MAAMjB,oBAAoBW;QACpC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,iCAAiC,EAAES,WAAW,EAAEQ;YAC/D,IAAI,CAACD,KAAK,CAAC,CAAC,6BAA6B,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACpE;QAEA,KAAK,MAAMC,QAAQL,MAAO;YACxB,IAAI,CAACM,GAAG,CAAC,CAAC,MAAM,EAAED,KAAKE,IAAI,EAAE;YAC7B,IAAI,CAACD,GAAG,CAAC,CAAC,SAAS,EAAED,KAAKG,OAAO,EAAE;YACnC,IAAI,CAACF,GAAG,CAAC,CAAC,KAAK,EAAED,KAAKI,GAAG,EAAE;YAE3B,IAAIJ,KAAKK,IAAI,KAAK,YAAY;gBAC5B,IAAI,CAACJ,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKM,UAAU,EAAE;gBAE1C,IAAIN,KAAKlB,WAAW,EAAE;oBACpB,IAAI,CAACmB,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKlB,WAAW,EAAE;gBAC7C;YACF;YAEA,IAAI,CAACmB,GAAG,CAAC;QACX;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/list.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List webhooks for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List webhooks for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List webhooks for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list webhooks for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:list']\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","promptForProject","listHooksForProject","getProjectIdFlag","listHookDebug","List","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","RUNTIME_ERROR","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGnE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,mBAAmB,QAAO,0BAAyB;AAC3D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAY,CAAA;IAEvD,MAAaC,MAAM;QACjB,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,QAAQ,MAAMjB,oBAAoBW;QACpC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,iCAAiC,EAAES,WAAW,EAAEQ;YAC/D,IAAI,CAACD,KAAK,CAAC,CAAC,6BAA6B,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAMzB,UAAU0B,aAAa;YAAA;QAC1F;QAEA,KAAK,MAAMC,QAAQN,MAAO;YACxB,IAAI,CAACO,GAAG,CAAC,CAAC,MAAM,EAAED,KAAKE,IAAI,EAAE;YAC7B,IAAI,CAACD,GAAG,CAAC,CAAC,SAAS,EAAED,KAAKG,OAAO,EAAE;YACnC,IAAI,CAACF,GAAG,CAAC,CAAC,KAAK,EAAED,KAAKI,GAAG,EAAE;YAE3B,IAAIJ,KAAKK,IAAI,KAAK,YAAY;gBAC5B,IAAI,CAACJ,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKM,UAAU,EAAE;gBAE1C,IAAIN,KAAKnB,WAAW,EAAE;oBACpB,IAAI,CAACoB,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKnB,WAAW,EAAE;gBAC7C;YACF;YAEA,IAAI,CAACoB,GAAG,CAAC;QACX;IACF;AACF"}