@sanity/cli 8.25.0 → 8.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +3 -2
  2. package/dist/actions/build/shouldAutoUpdate.js +1 -26
  3. package/dist/actions/build/shouldAutoUpdate.js.map +1 -1
  4. package/dist/actions/context/mcpEndpoint.js +165 -0
  5. package/dist/actions/context/mcpEndpoint.js.map +1 -0
  6. package/dist/actions/context/resolveOrganizationId.js +8 -1
  7. package/dist/actions/context/resolveOrganizationId.js.map +1 -1
  8. package/dist/actions/deploy/deployApp.js +10 -3
  9. package/dist/actions/deploy/deployApp.js.map +1 -1
  10. package/dist/actions/deploy/deployStudio.js +11 -4
  11. package/dist/actions/deploy/deployStudio.js.map +1 -1
  12. package/dist/actions/init/initAction.js +3 -3
  13. package/dist/actions/init/initAction.js.map +1 -1
  14. package/dist/actions/init/plan/verifyCoupon.js +0 -1
  15. package/dist/actions/init/plan/verifyCoupon.js.map +1 -1
  16. package/dist/actions/init/scaffoldTemplate.js +1 -1
  17. package/dist/actions/init/scaffoldTemplate.js.map +1 -1
  18. package/dist/commands/api.js +10 -0
  19. package/dist/commands/api.js.map +1 -1
  20. package/dist/commands/backups/download.js +6 -0
  21. package/dist/commands/backups/download.js.map +1 -1
  22. package/dist/commands/context/create.js +8 -22
  23. package/dist/commands/context/create.js.map +1 -1
  24. package/dist/commands/context/delete.js +8 -1
  25. package/dist/commands/context/delete.js.map +1 -1
  26. package/dist/commands/context/issues/list.js +0 -5
  27. package/dist/commands/context/issues/list.js.map +1 -1
  28. package/dist/commands/context/list.js +6 -14
  29. package/dist/commands/context/list.js.map +1 -1
  30. package/dist/commands/context/mcp/create.js +152 -0
  31. package/dist/commands/context/mcp/create.js.map +1 -0
  32. package/dist/commands/context/mcp/delete.js +82 -0
  33. package/dist/commands/context/mcp/delete.js.map +1 -0
  34. package/dist/commands/context/mcp/get.js +42 -0
  35. package/dist/commands/context/mcp/get.js.map +1 -0
  36. package/dist/commands/context/mcp/list.js +87 -0
  37. package/dist/commands/context/mcp/list.js.map +1 -0
  38. package/dist/commands/context/mcp/status.js +98 -0
  39. package/dist/commands/context/mcp/status.js.map +1 -0
  40. package/dist/commands/context/mcp/update.js +225 -0
  41. package/dist/commands/context/mcp/update.js.map +1 -0
  42. package/dist/commands/context/query.js +6 -14
  43. package/dist/commands/context/query.js.map +1 -1
  44. package/dist/commands/context/update.js +12 -1
  45. package/dist/commands/context/update.js.map +1 -1
  46. package/dist/commands/datasets/create.js +6 -0
  47. package/dist/commands/datasets/create.js.map +1 -1
  48. package/dist/commands/datasets/embeddings/enable.js +6 -0
  49. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  50. package/dist/commands/datasets/import.js +6 -0
  51. package/dist/commands/datasets/import.js.map +1 -1
  52. package/dist/commands/deploy.js +7 -0
  53. package/dist/commands/deploy.js.map +1 -1
  54. package/dist/commands/documents/validate.js +6 -0
  55. package/dist/commands/documents/validate.js.map +1 -1
  56. package/dist/commands/exec.js +4 -2
  57. package/dist/commands/exec.js.map +1 -1
  58. package/dist/commands/init.js +13 -0
  59. package/dist/commands/init.js.map +1 -1
  60. package/dist/commands/manifest/extract.js +6 -0
  61. package/dist/commands/manifest/extract.js.map +1 -1
  62. package/dist/commands/media/create-aspect.js +7 -0
  63. package/dist/commands/media/create-aspect.js.map +1 -1
  64. package/dist/commands/migrations/run.js +6 -0
  65. package/dist/commands/migrations/run.js.map +1 -1
  66. package/dist/commands/organizations/create.js +6 -0
  67. package/dist/commands/organizations/create.js.map +1 -1
  68. package/dist/commands/organizations/update.js +6 -0
  69. package/dist/commands/organizations/update.js.map +1 -1
  70. package/dist/commands/schemas/delete.js +6 -0
  71. package/dist/commands/schemas/delete.js.map +1 -1
  72. package/dist/commands/schemas/deploy.js +6 -0
  73. package/dist/commands/schemas/deploy.js.map +1 -1
  74. package/dist/commands/schemas/extract.js +28 -3
  75. package/dist/commands/schemas/extract.js.map +1 -1
  76. package/dist/commands/schemas/list.js +6 -0
  77. package/dist/commands/schemas/list.js.map +1 -1
  78. package/dist/commands/schemas/validate.js +6 -0
  79. package/dist/commands/schemas/validate.js.map +1 -1
  80. package/dist/commands/tokens/rotate.js +6 -0
  81. package/dist/commands/tokens/rotate.js.map +1 -1
  82. package/dist/commands/typegen/generate.js +25 -1
  83. package/dist/commands/typegen/generate.js.map +1 -1
  84. package/dist/exports/invokeSanityCli/commandPolicies/mcpPolicy.js +6 -0
  85. package/dist/exports/invokeSanityCli/commandPolicies/mcpPolicy.js.map +1 -1
  86. package/dist/generated/apiRoutes.js +22 -0
  87. package/dist/generated/apiRoutes.js.map +1 -1
  88. package/dist/hooks/prerun/setupTelemetry.js +2 -3
  89. package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
  90. package/dist/prompts/promptForText.js +12 -0
  91. package/dist/prompts/promptForText.js.map +1 -0
  92. package/dist/services/context.js +174 -1
  93. package/dist/services/context.js.map +1 -1
  94. package/dist/services/telemetry.js +4 -2
  95. package/dist/services/telemetry.js.map +1 -1
  96. package/dist/telemetry/cli.telemetry.js +1 -1
  97. package/dist/telemetry/cli.telemetry.js.map +1 -1
  98. package/dist/telemetry/init.telemetry.js +1 -1
  99. package/dist/telemetry/init.telemetry.js.map +1 -1
  100. package/dist/telemetry/typegen.telemetry.js +12 -0
  101. package/dist/telemetry/typegen.telemetry.js.map +1 -0
  102. package/dist/util/parseArguments.js +12 -40
  103. package/dist/util/parseArguments.js.map +1 -1
  104. package/dist/util/sharedFlags.js.map +1 -1
  105. package/dist/util/telemetry/cliCommandIdentity.js +222 -0
  106. package/dist/util/telemetry/cliCommandIdentity.js.map +1 -0
  107. package/dist/util/telemetry/cliTelemetryFlags.js +186 -0
  108. package/dist/util/telemetry/cliTelemetryFlags.js.map +1 -0
  109. package/dist/util/telemetry/commandTelemetry.js +56 -11
  110. package/dist/util/telemetry/commandTelemetry.js.map +1 -1
  111. package/dist/util/telemetry/createTelemetryStore.js +13 -5
  112. package/dist/util/telemetry/createTelemetryStore.js.map +1 -1
  113. package/dist/util/telemetry/createTraceId.js +3 -3
  114. package/dist/util/telemetry/createTraceId.js.map +1 -1
  115. package/dist/util/telemetry/flushTelemetryFiles.js +14 -4
  116. package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -1
  117. package/dist/util/telemetry/logger.js +1 -1
  118. package/dist/util/telemetry/logger.js.map +1 -1
  119. package/dist/util/telemetry/readNDJSON.js +1 -1
  120. package/dist/util/telemetry/readNDJSON.js.map +1 -1
  121. package/dist/util/telemetry/sanitizeTelemetryEvent.js +304 -0
  122. package/dist/util/telemetry/sanitizeTelemetryEvent.js.map +1 -0
  123. package/dist/util/telemetry/trace.js +4 -7
  124. package/dist/util/telemetry/trace.js.map +1 -1
  125. package/oclif.config.js +1 -1
  126. package/oclif.manifest.json +2380 -1526
  127. package/package.json +8 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/organizations/update.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\n\nimport {validateOrganizationName} from '../../actions/organizations/validateOrganizationName.js'\nimport {validateOrganizationSlug} from '../../actions/organizations/validateOrganizationSlug.js'\nimport {type OrganizationUpdateParams, updateOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst updateOrgDebug = subdebug('organizations:update')\n\nconst UPDATE_FLAGS = ['name', 'slug', 'default-role'] as const\n\nexport class UpdateOrganizationCommand extends SanityCommand<typeof UpdateOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID',\n required: true,\n }),\n }\n\n static override description = 'Update an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --name \"New Name\"',\n description: 'Rename an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --slug new-slug',\n description: 'Set the organization slug (requires authSAML feature)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --default-role viewer',\n description: 'Change the default member role',\n },\n ]\n\n static override flags = {\n 'default-role': Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New default role for new members',\n required: false,\n }),\n name: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New organization name',\n required: false,\n }),\n slug: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New URL slug (requires authSAML feature on the organization)',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('update')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n const {'default-role': defaultRole, name, slug} = this.flags\n\n const params: OrganizationUpdateParams = {}\n if (name !== undefined) {\n const trimmedName = name.trim()\n const validation = validateOrganizationName(trimmedName)\n if (validation !== true) {\n this.error(validation, {exit: exitCodes.RUNTIME_ERROR})\n }\n params.name = trimmedName\n }\n if (slug !== undefined) {\n const trimmedSlug = slug.trim()\n const slugValidation = validateOrganizationSlug(trimmedSlug)\n if (slugValidation !== true) {\n this.error(slugValidation, {exit: exitCodes.RUNTIME_ERROR})\n }\n params.slug = trimmedSlug\n }\n if (defaultRole !== undefined) {\n const trimmedRole = defaultRole.trim()\n if (trimmedRole === '') {\n this.error('Default role cannot be empty', {exit: exitCodes.RUNTIME_ERROR})\n }\n params.defaultRoleName = trimmedRole\n }\n\n const spin = spinner('Updating organization').start()\n try {\n await updateOrganization(organizationId, params)\n spin.succeed()\n this.log('Organization updated')\n } catch (error) {\n spin.fail()\n updateOrgDebug('Error updating organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.error(`Failed to update organization: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","spinner","isHttpError","validateOrganizationName","validateOrganizationSlug","updateOrganization","organizationAliases","updateOrgDebug","UPDATE_FLAGS","UpdateOrganizationCommand","args","organizationId","string","description","required","examples","command","flags","atLeastOne","name","slug","hiddenAliases","run","defaultRole","params","undefined","trimmedName","trim","validation","error","exit","RUNTIME_ERROR","trimmedSlug","slugValidation","trimmedRole","defaultRoleName","spin","start","succeed","log","fail","statusCode"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/organizations/update.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\n\nimport {validateOrganizationName} from '../../actions/organizations/validateOrganizationName.js'\nimport {validateOrganizationSlug} from '../../actions/organizations/validateOrganizationSlug.js'\nimport {type OrganizationUpdateParams, updateOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst updateOrgDebug = subdebug('organizations:update')\n\nconst UPDATE_FLAGS = ['name', 'slug', 'default-role'] as const\n\nexport class UpdateOrganizationCommand extends SanityCommand<typeof UpdateOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID',\n required: true,\n }),\n }\n\n static override description = 'Update an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --name \"New Name\"',\n description: 'Rename an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --slug new-slug',\n description: 'Set the organization slug (requires authSAML feature)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --default-role viewer',\n description: 'Change the default member role',\n },\n ]\n\n static override flags = {\n 'default-role': Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New default role for new members',\n required: false,\n }),\n name: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New organization name',\n required: false,\n }),\n slug: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New URL slug (requires authSAML feature on the organization)',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('update')\n\n static telemetry = defineCommandTelemetry(this.flags, {redact: ['name']})\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n const {'default-role': defaultRole, name, slug} = this.flags\n\n const params: OrganizationUpdateParams = {}\n if (name !== undefined) {\n const trimmedName = name.trim()\n const validation = validateOrganizationName(trimmedName)\n if (validation !== true) {\n this.error(validation, {exit: exitCodes.RUNTIME_ERROR})\n }\n params.name = trimmedName\n }\n if (slug !== undefined) {\n const trimmedSlug = slug.trim()\n const slugValidation = validateOrganizationSlug(trimmedSlug)\n if (slugValidation !== true) {\n this.error(slugValidation, {exit: exitCodes.RUNTIME_ERROR})\n }\n params.slug = trimmedSlug\n }\n if (defaultRole !== undefined) {\n const trimmedRole = defaultRole.trim()\n if (trimmedRole === '') {\n this.error('Default role cannot be empty', {exit: exitCodes.RUNTIME_ERROR})\n }\n params.defaultRoleName = trimmedRole\n }\n\n const spin = spinner('Updating organization').start()\n try {\n await updateOrganization(organizationId, params)\n spin.succeed()\n this.log('Organization updated')\n } catch (error) {\n spin.fail()\n updateOrgDebug('Error updating organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.error(`Failed to update organization: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","spinner","isHttpError","validateOrganizationName","validateOrganizationSlug","updateOrganization","organizationAliases","defineCommandTelemetry","updateOrgDebug","UPDATE_FLAGS","UpdateOrganizationCommand","args","organizationId","string","description","required","examples","command","flags","atLeastOne","name","slug","hiddenAliases","telemetry","redact","run","defaultRole","params","undefined","trimmedName","trim","validation","error","exit","RUNTIME_ERROR","trimmedSlug","slugValidation","trimmedRole","defaultRoleName","spin","start","succeed","log","fail","statusCode"],"mappings":"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"}
@@ -7,6 +7,7 @@ import { deleteSchemaAction } from '../../actions/schema/deleteSchemaAction.js';
7
7
  import { parseIds } from '../../actions/schema/utils/schemaStoreValidation.js';
8
8
  import { promptForProject } from '../../prompts/promptForProject.js';
9
9
  import { getDatasetFlag, getProjectIdFlag } from '../../util/sharedFlags.js';
10
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
10
11
  const deleteSchemaDebug = subdebug('schema:delete');
11
12
  export class DeleteSchemaCommand extends SanityCommand {
12
13
  static description = 'Delete schema documents by id';
@@ -56,6 +57,11 @@ export class DeleteSchemaCommand extends SanityCommand {
56
57
  static hiddenAliases = [
57
58
  'schema:delete'
58
59
  ];
60
+ static telemetry = defineCommandTelemetry(this.flags, {
61
+ redact: [
62
+ 'manifest-dir'
63
+ ]
64
+ });
59
65
  async run() {
60
66
  const { flags } = await this.parse(DeleteSchemaCommand);
61
67
  const { dataset, yes } = flags;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/schemas/delete.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {requiredWhenUnattended} from '@sanity/cli-core/flags'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deleteSchemaAction} from '../../actions/schema/deleteSchemaAction.js'\nimport {parseIds} from '../../actions/schema/utils/schemaStoreValidation.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteSchemaDebug = subdebug('schema:delete')\n\nexport class DeleteSchemaCommand extends SanityCommand<typeof DeleteSchemaCommand> {\n static override description = 'Delete schema documents by id'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName',\n description: 'Delete a single schema',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName,prefix.sanity.workspace.schema.otherWorkspace',\n description: 'Delete multiple schemas',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete schema from',\n semantics: 'override',\n }),\n ...getDatasetFlag({\n description: 'Delete schemas from a specific dataset',\n semantics: 'specify',\n }),\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Generate manifest file (disable with --no-extract-manifest)',\n hidden: true,\n }),\n ids: Flags.string({\n description: 'Comma-separated list of schema ids to delete',\n required: true,\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n hidden: true,\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: requiredWhenUnattended(\n Flags.boolean({\n char: 'y',\n description: 'Delete schemas without prompting for confirmation',\n }),\n ),\n }\n\n static override hiddenAliases: string[] = ['schema:delete']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeleteSchemaCommand)\n const {dataset, yes} = flags\n\n deleteSchemaDebug('Running schema delete with flags: %O', flags)\n\n const ids = parseIds(flags.ids)\n\n if (!yes) {\n const confirmed = await confirm({\n default: false,\n message: `Delete ${ids.length} schema${ids.length === 1 ? '' : 's'}?`,\n })\n\n if (!confirmed) {\n this.log('Schema deletion cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const workDir = await this.getProjectRoot()\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'deployStudio', permission: 'sanity.project'}],\n }),\n })\n\n await deleteSchemaAction({\n configPath: workDir.path,\n dataset,\n ids,\n output: this.output,\n projectId,\n verbose: flags['verbose'],\n workDir: workDir.directory,\n })\n } catch (error) {\n if (error instanceof CLIError) {\n this.error(error.message, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n deleteSchemaDebug('Error deleting schemas', error)\n this.error(\n `Failed to delete schemas: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Flags","CLIError","exitCodes","SanityCommand","subdebug","requiredWhenUnattended","confirm","deleteSchemaAction","parseIds","promptForProject","getDatasetFlag","getProjectIdFlag","deleteSchemaDebug","DeleteSchemaCommand","description","examples","command","flags","semantics","boolean","allowNo","default","hidden","ids","string","required","directory","verbose","yes","char","hiddenAliases","run","parse","dataset","confirmed","message","length","log","exit","USER_ABORT","workDir","getProjectRoot","projectId","getProjectId","fallback","requiredPermissions","grant","permission","configPath","path","output","error","RUNTIME_ERROR","Error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/schemas/delete.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {requiredWhenUnattended} from '@sanity/cli-core/flags'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deleteSchemaAction} from '../../actions/schema/deleteSchemaAction.js'\nimport {parseIds} from '../../actions/schema/utils/schemaStoreValidation.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst deleteSchemaDebug = subdebug('schema:delete')\n\nexport class DeleteSchemaCommand extends SanityCommand<typeof DeleteSchemaCommand> {\n static override description = 'Delete schema documents by id'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName',\n description: 'Delete a single schema',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName,prefix.sanity.workspace.schema.otherWorkspace',\n description: 'Delete multiple schemas',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete schema from',\n semantics: 'override',\n }),\n ...getDatasetFlag({\n description: 'Delete schemas from a specific dataset',\n semantics: 'specify',\n }),\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Generate manifest file (disable with --no-extract-manifest)',\n hidden: true,\n }),\n ids: Flags.string({\n description: 'Comma-separated list of schema ids to delete',\n required: true,\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n hidden: true,\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: requiredWhenUnattended(\n Flags.boolean({\n char: 'y',\n description: 'Delete schemas without prompting for confirmation',\n }),\n ),\n }\n\n static override hiddenAliases: string[] = ['schema:delete']\n\n static telemetry = defineCommandTelemetry(this.flags, {redact: ['manifest-dir']})\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeleteSchemaCommand)\n const {dataset, yes} = flags\n\n deleteSchemaDebug('Running schema delete with flags: %O', flags)\n\n const ids = parseIds(flags.ids)\n\n if (!yes) {\n const confirmed = await confirm({\n default: false,\n message: `Delete ${ids.length} schema${ids.length === 1 ? '' : 's'}?`,\n })\n\n if (!confirmed) {\n this.log('Schema deletion cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const workDir = await this.getProjectRoot()\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'deployStudio', permission: 'sanity.project'}],\n }),\n })\n\n await deleteSchemaAction({\n configPath: workDir.path,\n dataset,\n ids,\n output: this.output,\n projectId,\n verbose: flags['verbose'],\n workDir: workDir.directory,\n })\n } catch (error) {\n if (error instanceof CLIError) {\n this.error(error.message, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n deleteSchemaDebug('Error deleting schemas', error)\n this.error(\n `Failed to delete schemas: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Flags","CLIError","exitCodes","SanityCommand","subdebug","requiredWhenUnattended","confirm","deleteSchemaAction","parseIds","promptForProject","getDatasetFlag","getProjectIdFlag","defineCommandTelemetry","deleteSchemaDebug","DeleteSchemaCommand","description","examples","command","flags","semantics","boolean","allowNo","default","hidden","ids","string","required","directory","verbose","yes","char","hiddenAliases","telemetry","redact","run","parse","dataset","confirmed","message","length","log","exit","USER_ABORT","workDir","getProjectRoot","projectId","getProjectId","fallback","requiredPermissions","grant","permission","configPath","path","output","error","RUNTIME_ERROR","Error","String"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { exitCodes, SanityCommand } from '@sanity/cli-core';
6
6
  import { deploySchemas } from '../../actions/schema/deploySchemas.js';
7
7
  import { schemasDeployDebug } from '../../actions/schema/utils/debug.js';
8
8
  import { parseTag } from '../../actions/schema/utils/schemaStoreValidation.js';
9
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
9
10
  const description = `
10
11
  Deploy schema documents into workspace datasets.
11
12
 
@@ -61,6 +62,11 @@ export class DeploySchemaCommand extends SanityCommand {
61
62
  static hiddenAliases = [
62
63
  'schema:deploy'
63
64
  ];
65
+ static telemetry = defineCommandTelemetry(this.flags, {
66
+ redact: [
67
+ 'manifest-dir'
68
+ ]
69
+ });
64
70
  async run() {
65
71
  const { flags } = await this.parse(DeploySchemaCommand);
66
72
  const { tag, workspace } = flags;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/schemas/deploy.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {deploySchemas} from '../../actions/schema/deploySchemas.js'\nimport {schemasDeployDebug} from '../../actions/schema/utils/debug.js'\nimport {parseTag} from '../../actions/schema/utils/schemaStoreValidation.js'\n\nconst description = `\nDeploy schema documents into workspace datasets.\n\nNote: This command is experimental and subject to change.\n\nRegenerates a manifest file by default. To re-use an existing manifest, use --no-extract-manifest.\n`.trim()\n\nexport class DeploySchemaCommand extends SanityCommand<typeof DeploySchemaCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Deploy all workspace schemas',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Deploy the schema for only the workspace \"default\"',\n },\n ]\n\n static override flags = {\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Regenerate manifest before deploying (use --no-extract-manifest to skip)',\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n helpValue: '<directory>',\n }),\n tag: Flags.string({\n description: 'Add a tag suffix to the schema id',\n helpValue: '<tag>',\n parse: parseTag,\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Print detailed information during deployment',\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to deploy a schema for',\n helpValue: '<name>',\n parse: async (input) => {\n if (!input) {\n throw new CLIError(\n 'Workspace name cannot be empty. Pass a value with `--workspace <name>`.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n return input\n },\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:deploy']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeploySchemaCommand)\n const {tag, workspace} = flags\n\n try {\n const workDir = (await this.getProjectRoot()).directory\n\n await deploySchemas({\n tag,\n verbose: flags['verbose'],\n workDir,\n workspaceName: workspace,\n })\n\n this.log(\n `${styleText('gray', '↳ List deployed schemas with:')} ${styleText('cyan', 'sanity schema list')}`,\n )\n } catch (error) {\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(exitCodes.RUNTIME_ERROR)\n }\n\n schemasDeployDebug('Failed to deploy schemas', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.error(`Failed to deploy schemas:\\n${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["styleText","Flags","CLIError","formatSchemaValidation","SchemaExtractionError","exitCodes","SanityCommand","deploySchemas","schemasDeployDebug","parseTag","description","trim","DeploySchemaCommand","examples","command","flags","boolean","allowNo","default","directory","helpValue","tag","string","parse","verbose","workspace","input","exit","USAGE_ERROR","hiddenAliases","run","workDir","getProjectRoot","workspaceName","log","error","validation","length","output","RUNTIME_ERROR","errorMessage","Error","message","String"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,aAAa,QAAO,wCAAuC;AACnE,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,QAAQ,QAAO,sDAAqD;AAE5E,MAAMC,cAAc,CAAC;;;;;;AAMrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,4BAA4BN;IACvC,OAAgBI,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,oBAAoBd,MAAMe,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACA,gBAAgBT,MAAMkB,SAAS,CAAC;YAC9BD,SAAS;YACTR,aAAa;YACbU,WAAW;QACb;QACAC,KAAKpB,MAAMqB,MAAM,CAAC;YAChBZ,aAAa;YACbU,WAAW;YACXG,OAAOd;QACT;QACAe,SAASvB,MAAMe,OAAO,CAAC;YACrBE,SAAS;YACTR,aAAa;QACf;QACAe,WAAWxB,MAAMqB,MAAM,CAAC;YACtBZ,aAAa;YACbU,WAAW;YACXG,OAAO,OAAOG;gBACZ,IAAI,CAACA,OAAO;oBACV,MAAM,IAAIxB,SACR,2EACA;wBAACyB,MAAMtB,UAAUuB,WAAW;oBAAA;gBAEhC;gBACA,OAAOF;YACT;QACF;IACF,EAAC;IAED,OAAgBG,gBAA0B;QAAC;KAAgB,CAAA;IAE3D,MAAaC,MAAqB;QAChC,MAAM,EAACf,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACX;QACjC,MAAM,EAACS,GAAG,EAAEI,SAAS,EAAC,GAAGV;QAEzB,IAAI;YACF,MAAMgB,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGb,SAAS;YAEvD,MAAMZ,cAAc;gBAClBc;gBACAG,SAAST,KAAK,CAAC,UAAU;gBACzBgB;gBACAE,eAAeR;YACjB;YAEA,IAAI,CAACS,GAAG,CACN,GAAGlC,UAAU,QAAQ,iCAAiC,CAAC,EAAEA,UAAU,QAAQ,uBAAuB;QAEtG,EAAE,OAAOmC,OAAO;YACd,IACEA,iBAAiB/B,yBACjB+B,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACJ,GAAG,CAAC/B,uBAAuBgC,MAAMC,UAAU;gBACvD,IAAI,CAACT,IAAI,CAACtB,UAAUkC,aAAa;YACnC;YAEA/B,mBAAmB,4BAA4B2B;YAC/C,MAAMK,eAAeL,iBAAiBM,QAAQN,MAAMO,OAAO,GAAGC,OAAOR;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,2BAA2B,EAAEK,cAAc,EAAE;gBAACb,MAAMtB,UAAUkC,aAAa;YAAA;QACzF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/schemas/deploy.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {deploySchemas} from '../../actions/schema/deploySchemas.js'\nimport {schemasDeployDebug} from '../../actions/schema/utils/debug.js'\nimport {parseTag} from '../../actions/schema/utils/schemaStoreValidation.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst description = `\nDeploy schema documents into workspace datasets.\n\nNote: This command is experimental and subject to change.\n\nRegenerates a manifest file by default. To re-use an existing manifest, use --no-extract-manifest.\n`.trim()\n\nexport class DeploySchemaCommand extends SanityCommand<typeof DeploySchemaCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Deploy all workspace schemas',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Deploy the schema for only the workspace \"default\"',\n },\n ]\n\n static override flags = {\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Regenerate manifest before deploying (use --no-extract-manifest to skip)',\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n helpValue: '<directory>',\n }),\n tag: Flags.string({\n description: 'Add a tag suffix to the schema id',\n helpValue: '<tag>',\n parse: parseTag,\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Print detailed information during deployment',\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to deploy a schema for',\n helpValue: '<name>',\n parse: async (input) => {\n if (!input) {\n throw new CLIError(\n 'Workspace name cannot be empty. Pass a value with `--workspace <name>`.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n return input\n },\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:deploy']\n\n static telemetry = defineCommandTelemetry(this.flags, {redact: ['manifest-dir']})\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeploySchemaCommand)\n const {tag, workspace} = flags\n\n try {\n const workDir = (await this.getProjectRoot()).directory\n\n await deploySchemas({\n tag,\n verbose: flags['verbose'],\n workDir,\n workspaceName: workspace,\n })\n\n this.log(\n `${styleText('gray', '↳ List deployed schemas with:')} ${styleText('cyan', 'sanity schema list')}`,\n )\n } catch (error) {\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(exitCodes.RUNTIME_ERROR)\n }\n\n schemasDeployDebug('Failed to deploy schemas', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.error(`Failed to deploy schemas:\\n${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["styleText","Flags","CLIError","formatSchemaValidation","SchemaExtractionError","exitCodes","SanityCommand","deploySchemas","schemasDeployDebug","parseTag","defineCommandTelemetry","description","trim","DeploySchemaCommand","examples","command","flags","boolean","allowNo","default","directory","helpValue","tag","string","parse","verbose","workspace","input","exit","USAGE_ERROR","hiddenAliases","telemetry","redact","run","workDir","getProjectRoot","workspaceName","log","error","validation","length","output","RUNTIME_ERROR","errorMessage","Error","message","String"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,aAAa,QAAO,wCAAuC;AACnE,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,QAAQ,QAAO,sDAAqD;AAC5E,SAAQC,sBAAsB,QAAO,2CAA0C;AAE/E,MAAMC,cAAc,CAAC;;;;;;AAMrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,4BAA4BP;IACvC,OAAgBK,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,oBAAoBf,MAAMgB,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACA,gBAAgBV,MAAMmB,SAAS,CAAC;YAC9BD,SAAS;YACTR,aAAa;YACbU,WAAW;QACb;QACAC,KAAKrB,MAAMsB,MAAM,CAAC;YAChBZ,aAAa;YACbU,WAAW;YACXG,OAAOf;QACT;QACAgB,SAASxB,MAAMgB,OAAO,CAAC;YACrBE,SAAS;YACTR,aAAa;QACf;QACAe,WAAWzB,MAAMsB,MAAM,CAAC;YACtBZ,aAAa;YACbU,WAAW;YACXG,OAAO,OAAOG;gBACZ,IAAI,CAACA,OAAO;oBACV,MAAM,IAAIzB,SACR,2EACA;wBAAC0B,MAAMvB,UAAUwB,WAAW;oBAAA;gBAEhC;gBACA,OAAOF;YACT;QACF;IACF,EAAC;IAED,OAAgBG,gBAA0B;QAAC;KAAgB,CAAA;IAE3D,OAAOC,YAAYrB,uBAAuB,IAAI,CAACM,KAAK,EAAE;QAACgB,QAAQ;YAAC;SAAe;IAAA,GAAE;IAEjF,MAAaC,MAAqB;QAChC,MAAM,EAACjB,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACX;QACjC,MAAM,EAACS,GAAG,EAAEI,SAAS,EAAC,GAAGV;QAEzB,IAAI;YACF,MAAMkB,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGf,SAAS;YAEvD,MAAMb,cAAc;gBAClBe;gBACAG,SAAST,KAAK,CAAC,UAAU;gBACzBkB;gBACAE,eAAeV;YACjB;YAEA,IAAI,CAACW,GAAG,CACN,GAAGrC,UAAU,QAAQ,iCAAiC,CAAC,EAAEA,UAAU,QAAQ,uBAAuB;QAEtG,EAAE,OAAOsC,OAAO;YACd,IACEA,iBAAiBlC,yBACjBkC,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACJ,GAAG,CAAClC,uBAAuBmC,MAAMC,UAAU;gBACvD,IAAI,CAACX,IAAI,CAACvB,UAAUqC,aAAa;YACnC;YAEAlC,mBAAmB,4BAA4B8B;YAC/C,MAAMK,eAAeL,iBAAiBM,QAAQN,MAAMO,OAAO,GAAGC,OAAOR;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,2BAA2B,EAAEK,cAAc,EAAE;gBAACf,MAAMvB,UAAUqC,aAAa;YAAA;QACzF;IACF;AACF"}
@@ -1,10 +1,12 @@
1
1
  import { access } from 'node:fs/promises';
2
+ import { dirname, resolve } from 'node:path';
2
3
  import { Flags } from '@oclif/core';
3
- import { exitCodes, SanityCommand } from '@sanity/cli-core';
4
+ import { exitCodes, getCliConfig, isNotFoundError, SanityCommand } from '@sanity/cli-core';
4
5
  import { confirm } from '@sanity/cli-core/ux';
5
6
  import { extractSchema } from '../../actions/schema/extractSchema.js';
6
7
  import { getExtractOptions } from '../../actions/schema/getExtractOptions.js';
7
8
  import { watchExtractSchema } from '../../actions/schema/watchExtractSchema.js';
9
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
8
10
  const description = `
9
11
  Extract a JSON representation of a Sanity schema within a Studio context.
10
12
 
@@ -27,6 +29,10 @@ export class ExtractSchemaCommand extends SanityCommand {
27
29
  }
28
30
  ];
29
31
  static flags = {
32
+ 'config-path': Flags.string({
33
+ description: 'Path to the Sanity Studio config file',
34
+ helpValue: '<path>'
35
+ }),
30
36
  'enforce-required-fields': Flags.boolean({
31
37
  description: 'Makes the schema generated treat fields marked as required as non-optional'
32
38
  }),
@@ -57,10 +63,29 @@ export class ExtractSchemaCommand extends SanityCommand {
57
63
  static hiddenAliases = [
58
64
  'schema:extract'
59
65
  ];
66
+ static telemetry = defineCommandTelemetry(this.flags, {
67
+ redact: [
68
+ 'config-path',
69
+ 'path',
70
+ 'watch-patterns'
71
+ ]
72
+ });
60
73
  async run() {
61
74
  const { flags } = await this.parse(ExtractSchemaCommand);
62
- const projectRoot = await this.getProjectRoot();
63
- const { schemaExtraction } = await this.getCliConfig();
75
+ const configPath = flags['config-path'] && resolve(flags['config-path']);
76
+ const projectRoot = configPath ? {
77
+ directory: dirname(configPath),
78
+ path: configPath,
79
+ type: 'studio'
80
+ } : await this.getProjectRoot();
81
+ let cliConfig;
82
+ try {
83
+ cliConfig = await getCliConfig(projectRoot.directory);
84
+ } catch (err) {
85
+ if (!configPath || !isNotFoundError(err)) throw err;
86
+ cliConfig = {};
87
+ }
88
+ const { schemaExtraction } = cliConfig;
64
89
  const extractOptions = getExtractOptions({
65
90
  flags,
66
91
  projectRoot,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/schemas/extract.ts"],"sourcesContent":["import {access} from 'node:fs/promises'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {extractSchema} from '../../actions/schema/extractSchema.js'\nimport {getExtractOptions} from '../../actions/schema/getExtractOptions.js'\nimport {watchExtractSchema} from '../../actions/schema/watchExtractSchema.js'\n\nconst description = `\nExtract a JSON representation of a Sanity schema within a Studio context.\n\nNote: This command is experimental and subject to change.\n`.trim()\n\nexport class ExtractSchemaCommand extends SanityCommand<typeof ExtractSchemaCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Extracts schema types in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --watch',\n description: 'Watch mode - re-extract on changes',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --watch --watch-patterns \"lib/**/*.ts\"',\n description: 'Watch with custom glob patterns',\n },\n ]\n\n static override flags = {\n 'enforce-required-fields': Flags.boolean({\n description: 'Makes the schema generated treat fields marked as required as non-optional',\n }),\n force: Flags.boolean({\n description: 'Overwrite an existing schema file',\n }),\n format: Flags.string({\n default: 'groq-type-nodes',\n description: 'Output format (currently only groq-type-nodes)',\n helpValue: '<format>',\n }),\n path: Flags.string({\n description: 'Optional path to specify destination of the schema file',\n }),\n watch: Flags.boolean({\n description: 'Enable watch mode to re-extract schema on file changes',\n }),\n 'watch-patterns': Flags.string({\n description: 'Additional glob pattern(s) to watch (can be specified multiple times)',\n helpValue: '<glob>',\n multiple: true,\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to generate a schema for',\n helpValue: '<name>',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:extract']\n\n public async run(): Promise<{close?: () => Promise<void>} | void> {\n const {flags} = await this.parse(ExtractSchemaCommand)\n const projectRoot = await this.getProjectRoot()\n\n const {schemaExtraction} = await this.getCliConfig()\n const extractOptions = getExtractOptions({\n flags,\n projectRoot,\n schemaExtraction,\n })\n\n const outputExists = await access(extractOptions.outputPath).then(\n () => true,\n () => false,\n )\n if (outputExists && !flags.force) {\n if (this.isUnattended()) {\n this.error(\n `Schema file already exists at \"${extractOptions.outputPath}\". Pass \\`--force\\` to overwrite it.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n const shouldOverwrite = await confirm({\n default: false,\n message: `Schema file already exists at \"${extractOptions.outputPath}\". Overwrite it?`,\n })\n\n if (!shouldOverwrite) {\n this.output.log('Schema extraction cancelled')\n return this.exit(exitCodes.USER_ABORT)\n }\n }\n\n if (flags.watch) {\n return watchExtractSchema({\n extractOptions,\n output: this.output,\n })\n }\n\n return extractSchema({\n extractOptions,\n output: this.output,\n })\n }\n}\n"],"names":["access","Flags","exitCodes","SanityCommand","confirm","extractSchema","getExtractOptions","watchExtractSchema","description","trim","ExtractSchemaCommand","examples","command","flags","boolean","force","format","string","default","helpValue","path","watch","multiple","workspace","hiddenAliases","run","parse","projectRoot","getProjectRoot","schemaExtraction","getCliConfig","extractOptions","outputExists","outputPath","then","isUnattended","error","exit","USAGE_ERROR","shouldOverwrite","message","output","log","USER_ABORT"],"mappings":"AAAA,SAAQA,MAAM,QAAO,mBAAkB;AAEvC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AACzD,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,aAAa,QAAO,wCAAuC;AACnE,SAAQC,iBAAiB,QAAO,4CAA2C;AAC3E,SAAQC,kBAAkB,QAAO,6CAA4C;AAE7E,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,6BAA6BP;IACxC,OAAgBK,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,2BAA2BZ,MAAMa,OAAO,CAAC;YACvCN,aAAa;QACf;QACAO,OAAOd,MAAMa,OAAO,CAAC;YACnBN,aAAa;QACf;QACAQ,QAAQf,MAAMgB,MAAM,CAAC;YACnBC,SAAS;YACTV,aAAa;YACbW,WAAW;QACb;QACAC,MAAMnB,MAAMgB,MAAM,CAAC;YACjBT,aAAa;QACf;QACAa,OAAOpB,MAAMa,OAAO,CAAC;YACnBN,aAAa;QACf;QACA,kBAAkBP,MAAMgB,MAAM,CAAC;YAC7BT,aAAa;YACbW,WAAW;YACXG,UAAU;QACZ;QACAC,WAAWtB,MAAMgB,MAAM,CAAC;YACtBT,aAAa;YACbW,WAAW;QACb;IACF,EAAC;IAED,OAAgBK,gBAA0B;QAAC;KAAiB,CAAA;IAE5D,MAAaC,MAAqD;QAChE,MAAM,EAACZ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACa,KAAK,CAAChB;QACjC,MAAMiB,cAAc,MAAM,IAAI,CAACC,cAAc;QAE7C,MAAM,EAACC,gBAAgB,EAAC,GAAG,MAAM,IAAI,CAACC,YAAY;QAClD,MAAMC,iBAAiBzB,kBAAkB;YACvCO;YACAc;YACAE;QACF;QAEA,MAAMG,eAAe,MAAMhC,OAAO+B,eAAeE,UAAU,EAAEC,IAAI,CAC/D,IAAM,MACN,IAAM;QAER,IAAIF,gBAAgB,CAACnB,MAAME,KAAK,EAAE;YAChC,IAAI,IAAI,CAACoB,YAAY,IAAI;gBACvB,IAAI,CAACC,KAAK,CACR,CAAC,+BAA+B,EAAEL,eAAeE,UAAU,CAAC,oCAAoC,CAAC,EACjG;oBAACI,MAAMnC,UAAUoC,WAAW;gBAAA;YAEhC;YAEA,MAAMC,kBAAkB,MAAMnC,QAAQ;gBACpCc,SAAS;gBACTsB,SAAS,CAAC,+BAA+B,EAAET,eAAeE,UAAU,CAAC,gBAAgB,CAAC;YACxF;YAEA,IAAI,CAACM,iBAAiB;gBACpB,IAAI,CAACE,MAAM,CAACC,GAAG,CAAC;gBAChB,OAAO,IAAI,CAACL,IAAI,CAACnC,UAAUyC,UAAU;YACvC;QACF;QAEA,IAAI9B,MAAMQ,KAAK,EAAE;YACf,OAAOd,mBAAmB;gBACxBwB;gBACAU,QAAQ,IAAI,CAACA,MAAM;YACrB;QACF;QAEA,OAAOpC,cAAc;YACnB0B;YACAU,QAAQ,IAAI,CAACA,MAAM;QACrB;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/schemas/extract.ts"],"sourcesContent":["import {access} from 'node:fs/promises'\nimport {dirname, resolve} from 'node:path'\n\nimport {Flags} from '@oclif/core'\nimport {\n type CliConfig,\n exitCodes,\n getCliConfig,\n isNotFoundError,\n SanityCommand,\n} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {extractSchema} from '../../actions/schema/extractSchema.js'\nimport {getExtractOptions} from '../../actions/schema/getExtractOptions.js'\nimport {watchExtractSchema} from '../../actions/schema/watchExtractSchema.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst description = `\nExtract a JSON representation of a Sanity schema within a Studio context.\n\nNote: This command is experimental and subject to change.\n`.trim()\n\nexport class ExtractSchemaCommand extends SanityCommand<typeof ExtractSchemaCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Extracts schema types in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --watch',\n description: 'Watch mode - re-extract on changes',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --watch --watch-patterns \"lib/**/*.ts\"',\n description: 'Watch with custom glob patterns',\n },\n ]\n\n static override flags = {\n 'config-path': Flags.string({\n description: 'Path to the Sanity Studio config file',\n helpValue: '<path>',\n }),\n 'enforce-required-fields': Flags.boolean({\n description: 'Makes the schema generated treat fields marked as required as non-optional',\n }),\n force: Flags.boolean({\n description: 'Overwrite an existing schema file',\n }),\n format: Flags.string({\n default: 'groq-type-nodes',\n description: 'Output format (currently only groq-type-nodes)',\n helpValue: '<format>',\n }),\n path: Flags.string({\n description: 'Optional path to specify destination of the schema file',\n }),\n watch: Flags.boolean({\n description: 'Enable watch mode to re-extract schema on file changes',\n }),\n 'watch-patterns': Flags.string({\n description: 'Additional glob pattern(s) to watch (can be specified multiple times)',\n helpValue: '<glob>',\n multiple: true,\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to generate a schema for',\n helpValue: '<name>',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:extract']\n\n static telemetry = defineCommandTelemetry(this.flags, {\n redact: ['config-path', 'path', 'watch-patterns'],\n })\n\n public async run(): Promise<{close?: () => Promise<void>} | void> {\n const {flags} = await this.parse(ExtractSchemaCommand)\n const configPath = flags['config-path'] && resolve(flags['config-path'])\n const projectRoot = configPath\n ? {directory: dirname(configPath), path: configPath, type: 'studio' as const}\n : await this.getProjectRoot()\n\n let cliConfig: CliConfig\n try {\n cliConfig = await getCliConfig(projectRoot.directory)\n } catch (err) {\n if (!configPath || !isNotFoundError(err)) throw err\n cliConfig = {}\n }\n\n const {schemaExtraction} = cliConfig\n const extractOptions = getExtractOptions({\n flags,\n projectRoot,\n schemaExtraction,\n })\n\n const outputExists = await access(extractOptions.outputPath).then(\n () => true,\n () => false,\n )\n if (outputExists && !flags.force) {\n if (this.isUnattended()) {\n this.error(\n `Schema file already exists at \"${extractOptions.outputPath}\". Pass \\`--force\\` to overwrite it.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n const shouldOverwrite = await confirm({\n default: false,\n message: `Schema file already exists at \"${extractOptions.outputPath}\". Overwrite it?`,\n })\n\n if (!shouldOverwrite) {\n this.output.log('Schema extraction cancelled')\n return this.exit(exitCodes.USER_ABORT)\n }\n }\n\n if (flags.watch) {\n return watchExtractSchema({\n extractOptions,\n output: this.output,\n })\n }\n\n return extractSchema({\n extractOptions,\n output: this.output,\n })\n }\n}\n"],"names":["access","dirname","resolve","Flags","exitCodes","getCliConfig","isNotFoundError","SanityCommand","confirm","extractSchema","getExtractOptions","watchExtractSchema","defineCommandTelemetry","description","trim","ExtractSchemaCommand","examples","command","flags","string","helpValue","boolean","force","format","default","path","watch","multiple","workspace","hiddenAliases","telemetry","redact","run","parse","configPath","projectRoot","directory","type","getProjectRoot","cliConfig","err","schemaExtraction","extractOptions","outputExists","outputPath","then","isUnattended","error","exit","USAGE_ERROR","shouldOverwrite","message","output","log","USER_ABORT"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { exitCodes, SanityCommand } from '@sanity/cli-core';
3
3
  import { listSchemas } from '../../actions/schema/listSchemas.js';
4
4
  import { schemasListDebug } from '../../actions/schema/utils/debug.js';
5
5
  import { parseWorkspaceSchemaId } from '../../actions/schema/utils/schemaStoreValidation.js';
6
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
6
7
  const description = `
7
8
  List all schemas in the current dataset.
8
9
 
@@ -52,6 +53,11 @@ export class ListSchemaCommand extends SanityCommand {
52
53
  static hiddenAliases = [
53
54
  'schema:list'
54
55
  ];
56
+ static telemetry = defineCommandTelemetry(this.flags, {
57
+ redact: [
58
+ 'manifest-dir'
59
+ ]
60
+ });
55
61
  async run() {
56
62
  const { flags } = await this.parse(ListSchemaCommand);
57
63
  const errors = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/schemas/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {listSchemas} from '../../actions/schema/listSchemas.js'\nimport {schemasListDebug} from '../../actions/schema/utils/debug.js'\nimport {parseWorkspaceSchemaId} from '../../actions/schema/utils/schemaStoreValidation.js'\n\nconst description = `\nList all schemas in the current dataset.\n\nNote: This command is experimental and subject to change.\n\nRegenerates a manifest file by default. To reuse an existing manifest, use --no-extract-manifest.\n`.trim()\n\nexport class ListSchemaCommand extends SanityCommand<typeof ListSchemaCommand> {\n static override description = description\n\n static override enableJsonFlag = true\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all schemas found in any workspace dataset in a table',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --id _.schemas.workspaceName',\n description: 'Get a schema for a given id',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json',\n description: 'Get stored schemas as pretty-printed json-array',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json --id _.schemas.workspaceName',\n description: 'Get singular stored schema as pretty-printed json-object',\n },\n ]\n\n static override flags = {\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Regenerate manifest before listing (use --no-extract-manifest to skip)',\n hidden: true,\n }),\n id: Flags.string({\n description: 'Fetch a single schema by id',\n helpValue: '<schema_id>',\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n helpValue: '<directory>',\n hidden: true,\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:list']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ListSchemaCommand)\n const errors: string[] = []\n const id = parseWorkspaceSchemaId(errors, flags.id)?.schemaId\n if (errors.length > 0) {\n this.error(`Invalid arguments:\\n${errors.map((error) => ` - ${error}`).join('\\n')}`, {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n try {\n const projectRoot = await this.getProjectRoot()\n\n await listSchemas({\n configPath: projectRoot.path,\n id,\n json: !!flags.json,\n output: this.output,\n workDir: projectRoot.directory,\n })\n } catch (error) {\n schemasListDebug('Failed to list schemas', error)\n\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.error(`Failed to list schemas:\\n${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","listSchemas","schemasListDebug","parseWorkspaceSchemaId","description","trim","ListSchemaCommand","enableJsonFlag","examples","command","flags","boolean","allowNo","default","hidden","id","string","helpValue","directory","hiddenAliases","run","parse","errors","schemaId","length","error","map","join","exit","USAGE_ERROR","projectRoot","getProjectRoot","configPath","path","json","output","workDir","errorMessage","Error","message","String","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,WAAW,QAAO,sCAAqC;AAC/D,SAAQC,gBAAgB,QAAO,sCAAqC;AACpE,SAAQC,sBAAsB,QAAO,sDAAqD;AAE1F,MAAMC,cAAc,CAAC;;;;;;AAMrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,0BAA0BN;IACrC,OAAgBI,cAAcA,YAAW;IAEzC,OAAgBG,iBAAiB,KAAI;IAErC,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;KACD,CAAA;IAED,OAAgBM,QAAQ;QACtB,oBAAoBZ,MAAMa,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTT,aAAa;YACbU,QAAQ;QACV;QACAC,IAAIjB,MAAMkB,MAAM,CAAC;YACfZ,aAAa;YACba,WAAW;QACb;QACA,gBAAgBnB,MAAMoB,SAAS,CAAC;YAC9BL,SAAS;YACTT,aAAa;YACba,WAAW;YACXH,QAAQ;QACV;IACF,EAAC;IAED,OAAgBK,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAqB;QAChC,MAAM,EAACV,KAAK,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACf;QACjC,MAAMgB,SAAmB,EAAE;QAC3B,MAAMP,KAAKZ,uBAAuBmB,QAAQZ,MAAMK,EAAE,GAAGQ;QACrD,IAAID,OAAOE,MAAM,GAAG,GAAG;YACrB,IAAI,CAACC,KAAK,CAAC,CAAC,oBAAoB,EAAEH,OAAOI,GAAG,CAAC,CAACD,QAAU,CAAC,IAAI,EAAEA,OAAO,EAAEE,IAAI,CAAC,OAAO,EAAE;gBACpFC,MAAM7B,UAAU8B,WAAW;YAC7B;QACF;QAEA,IAAI;YACF,MAAMC,cAAc,MAAM,IAAI,CAACC,cAAc;YAE7C,MAAM9B,YAAY;gBAChB+B,YAAYF,YAAYG,IAAI;gBAC5BlB;gBACAmB,MAAM,CAAC,CAACxB,MAAMwB,IAAI;gBAClBC,QAAQ,IAAI,CAACA,MAAM;gBACnBC,SAASN,YAAYZ,SAAS;YAChC;QACF,EAAE,OAAOO,OAAO;YACdvB,iBAAiB,0BAA0BuB;YAE3C,MAAMY,eAAeZ,iBAAiBa,QAAQb,MAAMc,OAAO,GAAGC,OAAOf;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEY,cAAc,EAAE;gBAACT,MAAM7B,UAAU0C,aAAa;YAAA;QACvF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/schemas/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {listSchemas} from '../../actions/schema/listSchemas.js'\nimport {schemasListDebug} from '../../actions/schema/utils/debug.js'\nimport {parseWorkspaceSchemaId} from '../../actions/schema/utils/schemaStoreValidation.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst description = `\nList all schemas in the current dataset.\n\nNote: This command is experimental and subject to change.\n\nRegenerates a manifest file by default. To reuse an existing manifest, use --no-extract-manifest.\n`.trim()\n\nexport class ListSchemaCommand extends SanityCommand<typeof ListSchemaCommand> {\n static override description = description\n\n static override enableJsonFlag = true\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all schemas found in any workspace dataset in a table',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --id _.schemas.workspaceName',\n description: 'Get a schema for a given id',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json',\n description: 'Get stored schemas as pretty-printed json-array',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json --id _.schemas.workspaceName',\n description: 'Get singular stored schema as pretty-printed json-object',\n },\n ]\n\n static override flags = {\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Regenerate manifest before listing (use --no-extract-manifest to skip)',\n hidden: true,\n }),\n id: Flags.string({\n description: 'Fetch a single schema by id',\n helpValue: '<schema_id>',\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n helpValue: '<directory>',\n hidden: true,\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:list']\n\n static telemetry = defineCommandTelemetry(this.flags, {redact: ['manifest-dir']})\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ListSchemaCommand)\n const errors: string[] = []\n const id = parseWorkspaceSchemaId(errors, flags.id)?.schemaId\n if (errors.length > 0) {\n this.error(`Invalid arguments:\\n${errors.map((error) => ` - ${error}`).join('\\n')}`, {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n try {\n const projectRoot = await this.getProjectRoot()\n\n await listSchemas({\n configPath: projectRoot.path,\n id,\n json: !!flags.json,\n output: this.output,\n workDir: projectRoot.directory,\n })\n } catch (error) {\n schemasListDebug('Failed to list schemas', error)\n\n const errorMessage = error instanceof Error ? error.message : String(error)\n this.error(`Failed to list schemas:\\n${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","listSchemas","schemasListDebug","parseWorkspaceSchemaId","defineCommandTelemetry","description","trim","ListSchemaCommand","enableJsonFlag","examples","command","flags","boolean","allowNo","default","hidden","id","string","helpValue","directory","hiddenAliases","telemetry","redact","run","parse","errors","schemaId","length","error","map","join","exit","USAGE_ERROR","projectRoot","getProjectRoot","configPath","path","json","output","workDir","errorMessage","Error","message","String","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,WAAW,QAAO,sCAAqC;AAC/D,SAAQC,gBAAgB,QAAO,sCAAqC;AACpE,SAAQC,sBAAsB,QAAO,sDAAqD;AAC1F,SAAQC,sBAAsB,QAAO,2CAA0C;AAE/E,MAAMC,cAAc,CAAC;;;;;;AAMrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,0BAA0BP;IACrC,OAAgBK,cAAcA,YAAW;IAEzC,OAAgBG,iBAAiB,KAAI;IAErC,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;KACD,CAAA;IAED,OAAgBM,QAAQ;QACtB,oBAAoBb,MAAMc,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTT,aAAa;YACbU,QAAQ;QACV;QACAC,IAAIlB,MAAMmB,MAAM,CAAC;YACfZ,aAAa;YACba,WAAW;QACb;QACA,gBAAgBpB,MAAMqB,SAAS,CAAC;YAC9BL,SAAS;YACTT,aAAa;YACba,WAAW;YACXH,QAAQ;QACV;IACF,EAAC;IAED,OAAgBK,gBAA0B;QAAC;KAAc,CAAA;IAEzD,OAAOC,YAAYjB,uBAAuB,IAAI,CAACO,KAAK,EAAE;QAACW,QAAQ;YAAC;SAAe;IAAA,GAAE;IAEjF,MAAaC,MAAqB;QAChC,MAAM,EAACZ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACa,KAAK,CAACjB;QACjC,MAAMkB,SAAmB,EAAE;QAC3B,MAAMT,KAAKb,uBAAuBsB,QAAQd,MAAMK,EAAE,GAAGU;QACrD,IAAID,OAAOE,MAAM,GAAG,GAAG;YACrB,IAAI,CAACC,KAAK,CAAC,CAAC,oBAAoB,EAAEH,OAAOI,GAAG,CAAC,CAACD,QAAU,CAAC,IAAI,EAAEA,OAAO,EAAEE,IAAI,CAAC,OAAO,EAAE;gBACpFC,MAAMhC,UAAUiC,WAAW;YAC7B;QACF;QAEA,IAAI;YACF,MAAMC,cAAc,MAAM,IAAI,CAACC,cAAc;YAE7C,MAAMjC,YAAY;gBAChBkC,YAAYF,YAAYG,IAAI;gBAC5BpB;gBACAqB,MAAM,CAAC,CAAC1B,MAAM0B,IAAI;gBAClBC,QAAQ,IAAI,CAACA,MAAM;gBACnBC,SAASN,YAAYd,SAAS;YAChC;QACF,EAAE,OAAOS,OAAO;YACd1B,iBAAiB,0BAA0B0B;YAE3C,MAAMY,eAAeZ,iBAAiBa,QAAQb,MAAMc,OAAO,GAAGC,OAAOf;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEY,cAAc,EAAE;gBAACT,MAAMhC,UAAU6C,aAAa;YAAA;QACvF;IACF;AACF"}
@@ -3,6 +3,7 @@ import { subdebug } from '@sanity/cli-core/debug';
3
3
  import { exitCodes } from '@sanity/cli-core/ExitCodes';
4
4
  import { SanityCommand } from '@sanity/cli-core/SanityCommand';
5
5
  import { validateAction } from '../../actions/schema/validateAction.js';
6
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
6
7
  const debug = subdebug('schema:validate');
7
8
  export class SchemaValidate extends SanityCommand {
8
9
  static description = 'Validates all schema types specified in a workspace';
@@ -53,6 +54,11 @@ export class SchemaValidate extends SanityCommand {
53
54
  static hiddenAliases = [
54
55
  'schema:validate'
55
56
  ];
57
+ static telemetry = defineCommandTelemetry(this.flags, {
58
+ redact: [
59
+ 'debug-metafile-path'
60
+ ]
61
+ });
56
62
  async run() {
57
63
  const { flags } = await this.parse(SchemaValidate);
58
64
  const workDir = (await this.getProjectRoot()).directory;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/schemas/validate.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {exitCodes} from '@sanity/cli-core/ExitCodes'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\n\nimport {validateAction} from '../../actions/schema/validateAction.js'\n\nconst debug = subdebug('schema:validate')\nexport class SchemaValidate extends SanityCommand<typeof SchemaValidate> {\n static override description = 'Validates all schema types specified in a workspace'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Validates all schema types in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> > report.txt',\n description: 'Save the results of the report into a file',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --level error',\n description: 'Report out only errors',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --debug-metafile-path metafile.json',\n description:\n 'Generate a report which can be analyzed with https://esbuild.github.io/analyze/',\n },\n ]\n\n static override flags = {\n 'debug-metafile-path': Flags.string({\n description:\n 'Optional path where a metafile will be written for build analysis. Only written on successful validation. Can be analyzed at https://esbuild.github.io/analyze/',\n helpGroup: 'DEBUG',\n }),\n format: Flags.string({\n default: 'pretty',\n description: 'The output format used to print schema errors and warnings',\n options: ['pretty', 'ndjson', 'json'],\n }),\n level: Flags.string({\n default: 'warning',\n description: 'The minimum level reported out',\n options: ['error', 'warning'],\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to use when validating all schema types',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:validate']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(SchemaValidate)\n\n const workDir = (await this.getProjectRoot()).directory\n\n const options = {\n debugMetafilePath: flags['debug-metafile-path'],\n format: flags.format,\n level: flags.level as 'error' | 'warning',\n output: this.output,\n workDir,\n workspace: flags.workspace,\n }\n\n try {\n await validateAction(options)\n } catch (error) {\n debug('Error validating schema', error)\n return this.output.error(\n `Error validating schema: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Flags","subdebug","exitCodes","SanityCommand","validateAction","debug","SchemaValidate","description","examples","command","flags","string","helpGroup","format","default","options","level","workspace","hiddenAliases","run","parse","workDir","getProjectRoot","directory","debugMetafilePath","output","error","Error","message","String","exit","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,yBAAwB;AAC/C,SAAQC,SAAS,QAAO,6BAA4B;AACpD,SAAQC,aAAa,QAAO,iCAAgC;AAE5D,SAAQC,cAAc,QAAO,yCAAwC;AAErE,MAAMC,QAAQJ,SAAS;AACvB,OAAO,MAAMK,uBAAuBH;IAClC,OAAgBI,cAAc,sDAAqD;IAEnF,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aACE;QACJ;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,uBAAuBV,MAAMW,MAAM,CAAC;YAClCJ,aACE;YACFK,WAAW;QACb;QACAC,QAAQb,MAAMW,MAAM,CAAC;YACnBG,SAAS;YACTP,aAAa;YACbQ,SAAS;gBAAC;gBAAU;gBAAU;aAAO;QACvC;QACAC,OAAOhB,MAAMW,MAAM,CAAC;YAClBG,SAAS;YACTP,aAAa;YACbQ,SAAS;gBAAC;gBAAS;aAAU;QAC/B;QACAE,WAAWjB,MAAMW,MAAM,CAAC;YACtBJ,aAAa;QACf;IACF,EAAC;IAED,OAAgBW,gBAA0B;QAAC;KAAkB,CAAA;IAE7D,MAAaC,MAAqB;QAChC,MAAM,EAACT,KAAK,EAAC,GAAG,MAAM,IAAI,CAACU,KAAK,CAACd;QAEjC,MAAMe,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QAEvD,MAAMR,UAAU;YACdS,mBAAmBd,KAAK,CAAC,sBAAsB;YAC/CG,QAAQH,MAAMG,MAAM;YACpBG,OAAON,MAAMM,KAAK;YAClBS,QAAQ,IAAI,CAACA,MAAM;YACnBJ;YACAJ,WAAWP,MAAMO,SAAS;QAC5B;QAEA,IAAI;YACF,MAAMb,eAAeW;QACvB,EAAE,OAAOW,OAAO;YACdrB,MAAM,2BAA2BqB;YACjC,OAAO,IAAI,CAACD,MAAM,CAACC,KAAK,CACtB,CAAC,yBAAyB,EAAEA,iBAAiBC,QAAQD,MAAME,OAAO,GAAGC,OAAOH,QAAQ,EACpF;gBAACI,MAAM5B,UAAU6B,aAAa;YAAA;QAElC;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/schemas/validate.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {exitCodes} from '@sanity/cli-core/ExitCodes'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\n\nimport {validateAction} from '../../actions/schema/validateAction.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst debug = subdebug('schema:validate')\nexport class SchemaValidate extends SanityCommand<typeof SchemaValidate> {\n static override description = 'Validates all schema types specified in a workspace'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Validates all schema types in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> > report.txt',\n description: 'Save the results of the report into a file',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --level error',\n description: 'Report out only errors',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --debug-metafile-path metafile.json',\n description:\n 'Generate a report which can be analyzed with https://esbuild.github.io/analyze/',\n },\n ]\n\n static override flags = {\n 'debug-metafile-path': Flags.string({\n description:\n 'Optional path where a metafile will be written for build analysis. Only written on successful validation. Can be analyzed at https://esbuild.github.io/analyze/',\n helpGroup: 'DEBUG',\n }),\n format: Flags.string({\n default: 'pretty',\n description: 'The output format used to print schema errors and warnings',\n options: ['pretty', 'ndjson', 'json'],\n }),\n level: Flags.string({\n default: 'warning',\n description: 'The minimum level reported out',\n options: ['error', 'warning'],\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to use when validating all schema types',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:validate']\n\n static telemetry = defineCommandTelemetry(this.flags, {redact: ['debug-metafile-path']})\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(SchemaValidate)\n\n const workDir = (await this.getProjectRoot()).directory\n\n const options = {\n debugMetafilePath: flags['debug-metafile-path'],\n format: flags.format,\n level: flags.level as 'error' | 'warning',\n output: this.output,\n workDir,\n workspace: flags.workspace,\n }\n\n try {\n await validateAction(options)\n } catch (error) {\n debug('Error validating schema', error)\n return this.output.error(\n `Error validating schema: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Flags","subdebug","exitCodes","SanityCommand","validateAction","defineCommandTelemetry","debug","SchemaValidate","description","examples","command","flags","string","helpGroup","format","default","options","level","workspace","hiddenAliases","telemetry","redact","run","parse","workDir","getProjectRoot","directory","debugMetafilePath","output","error","Error","message","String","exit","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,yBAAwB;AAC/C,SAAQC,SAAS,QAAO,6BAA4B;AACpD,SAAQC,aAAa,QAAO,iCAAgC;AAE5D,SAAQC,cAAc,QAAO,yCAAwC;AACrE,SAAQC,sBAAsB,QAAO,2CAA0C;AAE/E,MAAMC,QAAQL,SAAS;AACvB,OAAO,MAAMM,uBAAuBJ;IAClC,OAAgBK,cAAc,sDAAqD;IAEnF,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aACE;QACJ;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,uBAAuBX,MAAMY,MAAM,CAAC;YAClCJ,aACE;YACFK,WAAW;QACb;QACAC,QAAQd,MAAMY,MAAM,CAAC;YACnBG,SAAS;YACTP,aAAa;YACbQ,SAAS;gBAAC;gBAAU;gBAAU;aAAO;QACvC;QACAC,OAAOjB,MAAMY,MAAM,CAAC;YAClBG,SAAS;YACTP,aAAa;YACbQ,SAAS;gBAAC;gBAAS;aAAU;QAC/B;QACAE,WAAWlB,MAAMY,MAAM,CAAC;YACtBJ,aAAa;QACf;IACF,EAAC;IAED,OAAgBW,gBAA0B;QAAC;KAAkB,CAAA;IAE7D,OAAOC,YAAYf,uBAAuB,IAAI,CAACM,KAAK,EAAE;QAACU,QAAQ;YAAC;SAAsB;IAAA,GAAE;IAExF,MAAaC,MAAqB;QAChC,MAAM,EAACX,KAAK,EAAC,GAAG,MAAM,IAAI,CAACY,KAAK,CAAChB;QAEjC,MAAMiB,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QAEvD,MAAMV,UAAU;YACdW,mBAAmBhB,KAAK,CAAC,sBAAsB;YAC/CG,QAAQH,MAAMG,MAAM;YACpBG,OAAON,MAAMM,KAAK;YAClBW,QAAQ,IAAI,CAACA,MAAM;YACnBJ;YACAN,WAAWP,MAAMO,SAAS;QAC5B;QAEA,IAAI;YACF,MAAMd,eAAeY;QACvB,EAAE,OAAOa,OAAO;YACdvB,MAAM,2BAA2BuB;YACjC,OAAO,IAAI,CAACD,MAAM,CAACC,KAAK,CACtB,CAAC,yBAAyB,EAAEA,iBAAiBC,QAAQD,MAAME,OAAO,GAAGC,OAAOH,QAAQ,EACpF;gBAACI,MAAM/B,UAAUgC,aAAa;YAAA;QAElC;IACF;AACF"}
@@ -4,6 +4,7 @@ import { getErrorMessage } from '@sanity/cli-core/errors';
4
4
  import { isHttpError } from '@sanity/client';
5
5
  import { rotateToken } from '../../services/tokens.js';
6
6
  import { readTokenFromStdin } from '../../util/readTokenFromStdin.js';
7
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
7
8
  const tokensRotateDebug = subdebug('tokens:rotate');
8
9
  const TOKEN_USAGE_HINT = 'Token is required. Pipe it on standard input (`echo "$SANITY_TOKEN" | sanity tokens rotate`) to keep it out of shell history, or pass it with `--token`.';
9
10
  export class RotateTokenCommand extends SanityCommand {
@@ -33,6 +34,11 @@ export class RotateTokenCommand extends SanityCommand {
33
34
  static hiddenAliases = [
34
35
  'token:rotate'
35
36
  ];
37
+ static telemetry = defineCommandTelemetry(this.flags, {
38
+ redact: [
39
+ 'token'
40
+ ]
41
+ });
36
42
  async run() {
37
43
  const { flags } = await this.parse(RotateTokenCommand);
38
44
  const { json } = flags;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/tokens/rotate.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {isHttpError} from '@sanity/client'\n\nimport {rotateToken} from '../../services/tokens.js'\nimport {readTokenFromStdin} from '../../util/readTokenFromStdin.js'\n\nconst tokensRotateDebug = subdebug('tokens:rotate')\n\nconst TOKEN_USAGE_HINT =\n 'Token is required. Pipe it on standard input (`echo \"$SANITY_TOKEN\" | sanity tokens rotate`) to keep it out of shell history, or pass it with `--token`.'\n\nexport class RotateTokenCommand extends SanityCommand<typeof RotateTokenCommand> {\n static override description = 'Rotate an API token, replacing its secret with a new one'\n\n static override enableJsonFlag = true\n\n static override examples = [\n {\n command: 'echo \"$SANITY_TOKEN\" | <%= config.bin %> <%= command.id %>',\n description: 'Rotate the token piped on standard input',\n },\n {\n command: '<%= config.bin %> <%= command.id %> < token.txt',\n description: 'Rotate a token read from a file',\n },\n {\n command: 'echo \"$SANITY_TOKEN\" | <%= config.bin %> <%= command.id %> --json',\n description: 'Output the rotated token as JSON',\n },\n ]\n\n static override flags = {\n token: Flags.string({\n char: 't',\n description: 'Token to rotate (prefer standard input to keep it out of shell history)',\n helpValue: '<token>',\n }),\n }\n\n static override hiddenAliases: string[] = ['token:rotate']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(RotateTokenCommand)\n const {json} = flags\n\n const token = flags.token?.trim() || (await this.readTokenArg())\n\n try {\n tokensRotateDebug('Rotating API token')\n const robot = await rotateToken(token)\n\n if (json) {\n this.logJson(robot)\n return\n }\n\n this.log('API token rotated')\n this.log(`Label: ${robot.label}`)\n this.log(`ID: ${robot.id}`)\n if (robot.expiresAt) {\n this.log(`Expires: ${robot.expiresAt}`)\n }\n this.log(`Token: ${robot.token}`)\n this.log('')\n this.log(\"Copy the token now. It won't be shown again.\")\n this.log('The previous token was revoked and no longer works.')\n } catch (error) {\n tokensRotateDebug('Error rotating token', error)\n\n if (isHttpError(error) && error.statusCode === 401) {\n this.error(\n 'Token is invalid, expired, or was already rotated or revoked. Check that you are passing the current token.',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n if (isHttpError(error) && error.statusCode === 403) {\n this.error(\n 'The token is not an API token and cannot be rotated. Personal tokens are renewed by logging in again.',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n this.error(`Token rotation failed:\\n${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async readTokenArg(): Promise<string> {\n let token: string\n try {\n token = await readTokenFromStdin(TOKEN_USAGE_HINT)\n } catch (error) {\n return this.error(getErrorMessage(error), {exit: exitCodes.USAGE_ERROR})\n }\n\n if (!token) {\n this.error(TOKEN_USAGE_HINT, {exit: exitCodes.USAGE_ERROR})\n }\n\n return token\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","isHttpError","rotateToken","readTokenFromStdin","tokensRotateDebug","TOKEN_USAGE_HINT","RotateTokenCommand","description","enableJsonFlag","examples","command","flags","token","string","char","helpValue","hiddenAliases","run","parse","json","trim","readTokenArg","robot","logJson","log","label","id","expiresAt","error","statusCode","exit","RUNTIME_ERROR","USAGE_ERROR"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,WAAW,QAAO,2BAA0B;AACpD,SAAQC,kBAAkB,QAAO,mCAAkC;AAEnE,MAAMC,oBAAoBL,SAAS;AAEnC,MAAMM,mBACJ;AAEF,OAAO,MAAMC,2BAA2BR;IACtC,OAAgBS,cAAc,2DAA0D;IAExF,OAAgBC,iBAAiB,KAAI;IAErC,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,OAAOhB,MAAMiB,MAAM,CAAC;YAClBC,MAAM;YACNP,aAAa;YACbQ,WAAW;QACb;IACF,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAqB;QAChC,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACZ;QACjC,MAAM,EAACa,IAAI,EAAC,GAAGR;QAEf,MAAMC,QAAQD,MAAMC,KAAK,EAAEQ,UAAW,MAAM,IAAI,CAACC,YAAY;QAE7D,IAAI;YACFjB,kBAAkB;YAClB,MAAMkB,QAAQ,MAAMpB,YAAYU;YAEhC,IAAIO,MAAM;gBACR,IAAI,CAACI,OAAO,CAACD;gBACb;YACF;YAEA,IAAI,CAACE,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC,CAAC,OAAO,EAAEF,MAAMG,KAAK,EAAE;YAChC,IAAI,CAACD,GAAG,CAAC,CAAC,IAAI,EAAEF,MAAMI,EAAE,EAAE;YAC1B,IAAIJ,MAAMK,SAAS,EAAE;gBACnB,IAAI,CAACH,GAAG,CAAC,CAAC,SAAS,EAAEF,MAAMK,SAAS,EAAE;YACxC;YACA,IAAI,CAACH,GAAG,CAAC,CAAC,OAAO,EAAEF,MAAMV,KAAK,EAAE;YAChC,IAAI,CAACY,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC;QACX,EAAE,OAAOI,OAAO;YACdxB,kBAAkB,wBAAwBwB;YAE1C,IAAI3B,YAAY2B,UAAUA,MAAMC,UAAU,KAAK,KAAK;gBAClD,IAAI,CAACD,KAAK,CACR,+GACA;oBAACE,MAAMjC,UAAUkC,aAAa;gBAAA;YAElC;YACA,IAAI9B,YAAY2B,UAAUA,MAAMC,UAAU,KAAK,KAAK;gBAClD,IAAI,CAACD,KAAK,CACR,yGACA;oBAACE,MAAMjC,UAAUkC,aAAa;gBAAA;YAElC;YAEA,IAAI,CAACH,KAAK,CAAC,CAAC,wBAAwB,EAAE5B,gBAAgB4B,QAAQ,EAAE;gBAC9DE,MAAMjC,UAAUkC,aAAa;YAC/B;QACF;IACF;IAEA,MAAcV,eAAgC;QAC5C,IAAIT;QACJ,IAAI;YACFA,QAAQ,MAAMT,mBAAmBE;QACnC,EAAE,OAAOuB,OAAO;YACd,OAAO,IAAI,CAACA,KAAK,CAAC5B,gBAAgB4B,QAAQ;gBAACE,MAAMjC,UAAUmC,WAAW;YAAA;QACxE;QAEA,IAAI,CAACpB,OAAO;YACV,IAAI,CAACgB,KAAK,CAACvB,kBAAkB;gBAACyB,MAAMjC,UAAUmC,WAAW;YAAA;QAC3D;QAEA,OAAOpB;IACT;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/tokens/rotate.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {isHttpError} from '@sanity/client'\n\nimport {rotateToken} from '../../services/tokens.js'\nimport {readTokenFromStdin} from '../../util/readTokenFromStdin.js'\nimport {defineCommandTelemetry} from '../../util/telemetry/commandTelemetry.js'\n\nconst tokensRotateDebug = subdebug('tokens:rotate')\n\nconst TOKEN_USAGE_HINT =\n 'Token is required. Pipe it on standard input (`echo \"$SANITY_TOKEN\" | sanity tokens rotate`) to keep it out of shell history, or pass it with `--token`.'\n\nexport class RotateTokenCommand extends SanityCommand<typeof RotateTokenCommand> {\n static override description = 'Rotate an API token, replacing its secret with a new one'\n\n static override enableJsonFlag = true\n\n static override examples = [\n {\n command: 'echo \"$SANITY_TOKEN\" | <%= config.bin %> <%= command.id %>',\n description: 'Rotate the token piped on standard input',\n },\n {\n command: '<%= config.bin %> <%= command.id %> < token.txt',\n description: 'Rotate a token read from a file',\n },\n {\n command: 'echo \"$SANITY_TOKEN\" | <%= config.bin %> <%= command.id %> --json',\n description: 'Output the rotated token as JSON',\n },\n ]\n\n static override flags = {\n token: Flags.string({\n char: 't',\n description: 'Token to rotate (prefer standard input to keep it out of shell history)',\n helpValue: '<token>',\n }),\n }\n\n static override hiddenAliases: string[] = ['token:rotate']\n\n static telemetry = defineCommandTelemetry(this.flags, {redact: ['token']})\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(RotateTokenCommand)\n const {json} = flags\n\n const token = flags.token?.trim() || (await this.readTokenArg())\n\n try {\n tokensRotateDebug('Rotating API token')\n const robot = await rotateToken(token)\n\n if (json) {\n this.logJson(robot)\n return\n }\n\n this.log('API token rotated')\n this.log(`Label: ${robot.label}`)\n this.log(`ID: ${robot.id}`)\n if (robot.expiresAt) {\n this.log(`Expires: ${robot.expiresAt}`)\n }\n this.log(`Token: ${robot.token}`)\n this.log('')\n this.log(\"Copy the token now. It won't be shown again.\")\n this.log('The previous token was revoked and no longer works.')\n } catch (error) {\n tokensRotateDebug('Error rotating token', error)\n\n if (isHttpError(error) && error.statusCode === 401) {\n this.error(\n 'Token is invalid, expired, or was already rotated or revoked. Check that you are passing the current token.',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n if (isHttpError(error) && error.statusCode === 403) {\n this.error(\n 'The token is not an API token and cannot be rotated. Personal tokens are renewed by logging in again.',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n this.error(`Token rotation failed:\\n${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async readTokenArg(): Promise<string> {\n let token: string\n try {\n token = await readTokenFromStdin(TOKEN_USAGE_HINT)\n } catch (error) {\n return this.error(getErrorMessage(error), {exit: exitCodes.USAGE_ERROR})\n }\n\n if (!token) {\n this.error(TOKEN_USAGE_HINT, {exit: exitCodes.USAGE_ERROR})\n }\n\n return token\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","isHttpError","rotateToken","readTokenFromStdin","defineCommandTelemetry","tokensRotateDebug","TOKEN_USAGE_HINT","RotateTokenCommand","description","enableJsonFlag","examples","command","flags","token","string","char","helpValue","hiddenAliases","telemetry","redact","run","parse","json","trim","readTokenArg","robot","logJson","log","label","id","expiresAt","error","statusCode","exit","RUNTIME_ERROR","USAGE_ERROR"],"mappings":"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"}
@@ -10,9 +10,11 @@ import once from 'lodash-es/once.js';
10
10
  import { formatPath } from '../../actions/typegen/formatPath.js';
11
11
  import { generateResourceTypes, resolveResourceSchemas } from '../../actions/typegen/generateResourceTypes.js';
12
12
  import { parseTypegenConfig } from '../../actions/typegen/parseTypegenConfig.js';
13
- import { parseTypegenResources } from '../../actions/typegen/parseTypegenResources.js';
13
+ import { getResourceKey, parseTypegenResources } from '../../actions/typegen/parseTypegenResources.js';
14
14
  import { createTypegenProgressRenderer } from '../../actions/typegen/renderTypegenProgress.js';
15
15
  import { watchResourceTypes } from '../../actions/typegen/watchResourceTypes.js';
16
+ import { TypegenResourcesTrace } from '../../telemetry/typegen.telemetry.js';
17
+ import { defineCommandTelemetry } from '../../util/telemetry/commandTelemetry.js';
16
18
  const description = `Sanity TypeGen
17
19
 
18
20
  ${styleText('bold', 'Configuration:')}
@@ -52,6 +54,11 @@ export class TypegenGenerateCommand extends SanityCommand {
52
54
  static hiddenAliases = [
53
55
  'typegen:generate'
54
56
  ];
57
+ static telemetry = defineCommandTelemetry(this.flags, {
58
+ redact: [
59
+ 'config-path'
60
+ ]
61
+ });
55
62
  async run() {
56
63
  const { flags } = await this.parse(TypegenGenerateCommand);
57
64
  if (flags.watch) {
@@ -133,6 +140,19 @@ export class TypegenGenerateCommand extends SanityCommand {
133
140
  }
134
141
  }
135
142
  /**
143
+ * Records that this run uses `typegen.resources`, which the codegen traces do not distinguish.
144
+ */ logResourcesUsage(resources, mode) {
145
+ const trace = this.telemetry.trace(TypegenResourcesTrace);
146
+ trace.start();
147
+ trace.log({
148
+ boundSchemaCount: resources.resources.filter((resource)=>resource.schema === undefined).length,
149
+ mode,
150
+ resourceCount: resources.resources.length,
151
+ resourceKeys: resources.resources.map((resource)=>getResourceKey(resource))
152
+ });
153
+ trace.complete();
154
+ }
155
+ /**
136
156
  * Prints the resources' configuration warnings, then locates every resource's schema, reporting
137
157
  * each one on the spinner.
138
158
  */ async resolveResources(resources, spin, workDir, { checkSchemaFiles }) {
@@ -158,6 +178,7 @@ export class TypegenGenerateCommand extends SanityCommand {
158
178
  const { config: typegenConfig, resources, type: typegenConfigMethod, workDir } = await this.getConfig();
159
179
  trace.start();
160
180
  if (resources) {
181
+ this.logResourcesUsage(resources, 'generate');
161
182
  const resourceSpin = spinner({});
162
183
  spin = resourceSpin;
163
184
  const resolved = await this.resolveResources(resources, resourceSpin, workDir, {
@@ -212,6 +233,9 @@ export class TypegenGenerateCommand extends SanityCommand {
212
233
  try {
213
234
  const { config: typegenConfig, resources, workDir } = await this.getConfig();
214
235
  trace.start();
236
+ if (resources) {
237
+ this.logResourcesUsage(resources, 'watch');
238
+ }
215
239
  let resolve = ()=>{};
216
240
  const promise = new Promise((res)=>{
217
241
  resolve = res;