@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.
- package/dist/actions/build/buildApp.js +1 -1
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStudio.js +1 -1
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/commands/backups/disable.js +4 -4
- package/dist/commands/backups/disable.js.map +1 -1
- package/dist/commands/backups/download.js +7 -7
- package/dist/commands/backups/download.js.map +1 -1
- package/dist/commands/backups/enable.js +4 -4
- package/dist/commands/backups/enable.js.map +1 -1
- package/dist/commands/backups/list.js +7 -7
- package/dist/commands/backups/list.js.map +1 -1
- package/dist/commands/codemod.js +5 -5
- package/dist/commands/codemod.js.map +1 -1
- package/dist/commands/cors/add.js +1 -1
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +4 -4
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -2
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/datasets/alias/create.js +5 -5
- package/dist/commands/datasets/alias/create.js.map +1 -1
- package/dist/commands/datasets/alias/delete.js +2 -2
- package/dist/commands/datasets/alias/delete.js.map +1 -1
- package/dist/commands/datasets/alias/link.js +5 -5
- package/dist/commands/datasets/alias/link.js.map +1 -1
- package/dist/commands/datasets/alias/unlink.js +3 -3
- package/dist/commands/datasets/alias/unlink.js.map +1 -1
- package/dist/commands/datasets/copy.js +7 -7
- package/dist/commands/datasets/copy.js.map +1 -1
- package/dist/commands/datasets/create.js +3 -3
- package/dist/commands/datasets/create.js.map +1 -1
- package/dist/commands/datasets/delete.js +2 -2
- package/dist/commands/datasets/delete.js.map +1 -1
- package/dist/commands/datasets/embeddings/disable.js +3 -3
- package/dist/commands/datasets/embeddings/disable.js.map +1 -1
- package/dist/commands/datasets/embeddings/enable.js +5 -5
- package/dist/commands/datasets/embeddings/enable.js.map +1 -1
- package/dist/commands/datasets/embeddings/status.js +3 -3
- package/dist/commands/datasets/embeddings/status.js.map +1 -1
- package/dist/commands/datasets/export.js +6 -6
- package/dist/commands/datasets/export.js.map +1 -1
- package/dist/commands/datasets/import.js +3 -3
- package/dist/commands/datasets/import.js.map +1 -1
- package/dist/commands/datasets/list.js +2 -2
- package/dist/commands/datasets/list.js.map +1 -1
- package/dist/commands/datasets/visibility/get.js +2 -2
- package/dist/commands/datasets/visibility/get.js.map +1 -1
- package/dist/commands/datasets/visibility/set.js +3 -3
- package/dist/commands/datasets/visibility/set.js.map +1 -1
- package/dist/commands/deploy.js +2 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/read.js +1 -1
- package/dist/commands/docs/read.js.map +1 -1
- package/dist/commands/docs/search.js +3 -3
- package/dist/commands/docs/search.js.map +1 -1
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/documents/create.js +3 -3
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +3 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -2
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -2
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +3 -3
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/deploy.js +13 -13
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +2 -2
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hooks/attempt.js +2 -2
- package/dist/commands/hooks/attempt.js.map +1 -1
- package/dist/commands/hooks/create.js +3 -3
- package/dist/commands/hooks/create.js.map +1 -1
- package/dist/commands/hooks/delete.js +4 -4
- package/dist/commands/hooks/delete.js.map +1 -1
- package/dist/commands/hooks/list.js +2 -2
- package/dist/commands/hooks/list.js.map +1 -1
- package/dist/commands/hooks/logs.js +5 -5
- package/dist/commands/hooks/logs.js.map +1 -1
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +2 -2
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/manifest/extract.js +3 -3
- package/dist/commands/manifest/extract.js.map +1 -1
- package/dist/commands/mcp/configure.js +4 -4
- package/dist/commands/mcp/configure.js.map +1 -1
- package/dist/commands/media/create-aspect.js +3 -3
- package/dist/commands/media/create-aspect.js.map +1 -1
- package/dist/commands/media/delete-aspect.js +1 -1
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/deploy-aspect.js +4 -4
- package/dist/commands/media/deploy-aspect.js.map +1 -1
- package/dist/commands/media/export.js +7 -7
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +6 -6
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/migrations/create.js +4 -4
- package/dist/commands/migrations/create.js.map +1 -1
- package/dist/commands/migrations/list.js +2 -2
- package/dist/commands/migrations/list.js.map +1 -1
- package/dist/commands/migrations/run.js +14 -14
- package/dist/commands/migrations/run.js.map +1 -1
- package/dist/commands/openapi/get.js +3 -3
- package/dist/commands/openapi/get.js.map +1 -1
- package/dist/commands/openapi/list.js +2 -2
- package/dist/commands/openapi/list.js.map +1 -1
- package/dist/commands/organizations/create.js +5 -5
- package/dist/commands/organizations/create.js.map +1 -1
- package/dist/commands/organizations/delete.js +6 -6
- package/dist/commands/organizations/delete.js.map +1 -1
- package/dist/commands/organizations/get.js +3 -3
- package/dist/commands/organizations/get.js.map +1 -1
- package/dist/commands/organizations/list.js +2 -2
- package/dist/commands/organizations/list.js.map +1 -1
- package/dist/commands/organizations/update.js +6 -6
- package/dist/commands/organizations/update.js.map +1 -1
- package/dist/commands/preview.js +2 -2
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/projects/create.js +2 -2
- package/dist/commands/projects/create.js.map +1 -1
- package/dist/commands/projects/list.js +2 -2
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schemas/delete.js +2 -2
- package/dist/commands/schemas/delete.js.map +1 -1
- package/dist/commands/schemas/deploy.js +2 -2
- package/dist/commands/schemas/deploy.js.map +1 -1
- package/dist/commands/schemas/list.js +1 -1
- package/dist/commands/schemas/list.js.map +1 -1
- package/dist/commands/schemas/validate.js +2 -1
- package/dist/commands/schemas/validate.js.map +1 -1
- package/dist/commands/skills/install.js +2 -2
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/telemetry/disable.js +2 -2
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +2 -2
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/tokens/create.js +2 -2
- package/dist/commands/tokens/create.js.map +1 -1
- package/dist/commands/tokens/delete.js +2 -2
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +2 -2
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +3 -3
- package/dist/commands/users/invite.js.map +1 -1
- package/oclif.manifest.json +512 -512
- package/package.json +6 -6
|
@@ -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 {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: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Delete schemas without prompting for confirmation',\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 && this.isUnattended()) {\n this.error('Schema deletion requires confirmation. Pass `--yes` to delete the schemas.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\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:
|
|
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 {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: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Delete schemas without prompting for confirmation',\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 && this.isUnattended()) {\n this.error('Schema deletion requires confirmation. Pass `--yes` to delete the schemas.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\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","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","isUnattended","error","exit","USAGE_ERROR","confirmed","message","length","log","USER_ABORT","workDir","getProjectRoot","projectId","getProjectId","fallback","requiredPermissions","grant","permission","configPath","path","output","RUNTIME_ERROR","Error","String"],"mappings":"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"}
|
|
@@ -76,12 +76,12 @@ export class DeploySchemaCommand extends SanityCommand {
|
|
|
76
76
|
} catch (error) {
|
|
77
77
|
if (error instanceof SchemaExtractionError && error.validation && error.validation.length > 0) {
|
|
78
78
|
this.output.log(formatSchemaValidation(error.validation));
|
|
79
|
-
this.exit(
|
|
79
|
+
this.exit(exitCodes.RUNTIME_ERROR);
|
|
80
80
|
}
|
|
81
81
|
schemasDeployDebug('Failed to deploy schemas', error);
|
|
82
82
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
83
83
|
this.error(`Failed to deploy schemas:\n${errorMessage}`, {
|
|
84
|
-
exit:
|
|
84
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
}
|
|
@@ -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(
|
|
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"}
|
|
@@ -76,7 +76,7 @@ export class ListSchemaCommand extends SanityCommand {
|
|
|
76
76
|
schemasListDebug('Failed to list schemas', error);
|
|
77
77
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
78
78
|
this.error(`Failed to list schemas:\n${errorMessage}`, {
|
|
79
|
-
exit:
|
|
79
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -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 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 json: Flags.boolean({\n description: 'Get schema as json',\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:
|
|
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 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 json: Flags.boolean({\n description: 'Get schema as json',\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","examples","command","flags","boolean","allowNo","default","hidden","id","string","helpValue","json","directory","hiddenAliases","run","parse","errors","schemaId","length","error","map","join","exit","USAGE_ERROR","projectRoot","getProjectRoot","configPath","path","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,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,oBAAoBX,MAAMY,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTR,aAAa;YACbS,QAAQ;QACV;QACAC,IAAIhB,MAAMiB,MAAM,CAAC;YACfX,aAAa;YACbY,WAAW;QACb;QACAC,MAAMnB,MAAMY,OAAO,CAAC;YAClBN,aAAa;QACf;QACA,gBAAgBN,MAAMoB,SAAS,CAAC;YAC9BN,SAAS;YACTR,aAAa;YACbY,WAAW;YACXH,QAAQ;QACV;IACF,EAAC;IAED,OAAgBM,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAqB;QAChC,MAAM,EAACX,KAAK,EAAC,GAAG,MAAM,IAAI,CAACY,KAAK,CAACf;QACjC,MAAMgB,SAAmB,EAAE;QAC3B,MAAMR,KAAKX,uBAAuBmB,QAAQb,MAAMK,EAAE,GAAGS;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;gBAC5BnB;gBACAG,MAAM,CAAC,CAACR,MAAMQ,IAAI;gBAClBiB,QAAQ,IAAI,CAACA,MAAM;gBACnBC,SAASL,YAAYZ,SAAS;YAChC;QACF,EAAE,OAAOO,OAAO;YACdvB,iBAAiB,0BAA0BuB;YAE3C,MAAMW,eAAeX,iBAAiBY,QAAQZ,MAAMa,OAAO,GAAGC,OAAOd;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEW,cAAc,EAAE;gBAACR,MAAM7B,UAAUyC,aAAa;YAAA;QACvF;IACF;AACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
2
|
import { subdebug } from '@sanity/cli-core/debug';
|
|
3
|
+
import { exitCodes } from '@sanity/cli-core/ExitCodes';
|
|
3
4
|
import { SanityCommand } from '@sanity/cli-core/SanityCommand';
|
|
4
5
|
import { validateAction } from '../../actions/schema/validateAction.js';
|
|
5
6
|
const debug = subdebug('schema:validate');
|
|
@@ -68,7 +69,7 @@ export class SchemaValidate extends SanityCommand {
|
|
|
68
69
|
} catch (error) {
|
|
69
70
|
debug('Error validating schema', error);
|
|
70
71
|
return this.output.error(`Error validating schema: ${error instanceof Error ? error.message : String(error)}`, {
|
|
71
|
-
exit:
|
|
72
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
72
73
|
});
|
|
73
74
|
}
|
|
74
75
|
}
|
|
@@ -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 {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:
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
1
|
+
import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
2
|
import { getErrorMessage, toError } from '@sanity/cli-core/errors';
|
|
3
3
|
import { configureSkills } from '../../actions/skills/configureSkills.js';
|
|
4
4
|
import { SkillsInstallTrace } from '../../telemetry/skills.telemetry.js';
|
|
@@ -31,7 +31,7 @@ export class InstallSkillsCommand extends SanityCommand {
|
|
|
31
31
|
debug('Skills installation failed: %O', error);
|
|
32
32
|
trace.error(toError(error));
|
|
33
33
|
this.error(getErrorMessage(error), {
|
|
34
|
-
exit:
|
|
34
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/skills/install.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage, toError} from '@sanity/cli-core/errors'\n\nimport {configureSkills} from '../../actions/skills/configureSkills.js'\nimport {SkillsInstallTrace} from '../../telemetry/skills.telemetry.js'\n\nconst debug = subdebug('skills:install')\n\nexport class InstallSkillsCommand extends SanityCommand<typeof InstallSkillsCommand> {\n static override description =\n 'Install Sanity agent skills for detected AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, VS Code, VS Code Insiders)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Install Sanity agent skills for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(SkillsInstallTrace)\n trace.start()\n\n try {\n const result = await configureSkills({output: this.output})\n\n trace.log({\n detectedEditors: result.detectedEditors,\n installedAgents: result.installedAgents,\n })\n\n if (result.error) {\n trace.error(result.error)\n } else {\n trace.complete()\n }\n } catch (error) {\n debug('Skills installation failed: %O', error)\n trace.error(toError(error))\n this.error(getErrorMessage(error), {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/skills/install.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage, toError} from '@sanity/cli-core/errors'\n\nimport {configureSkills} from '../../actions/skills/configureSkills.js'\nimport {SkillsInstallTrace} from '../../telemetry/skills.telemetry.js'\n\nconst debug = subdebug('skills:install')\n\nexport class InstallSkillsCommand extends SanityCommand<typeof InstallSkillsCommand> {\n static override description =\n 'Install Sanity agent skills for detected AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, VS Code, VS Code Insiders)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Install Sanity agent skills for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(SkillsInstallTrace)\n trace.start()\n\n try {\n const result = await configureSkills({output: this.output})\n\n trace.log({\n detectedEditors: result.detectedEditors,\n installedAgents: result.installedAgents,\n })\n\n if (result.error) {\n trace.error(result.error)\n } else {\n trace.complete()\n }\n } catch (error) {\n debug('Skills installation failed: %O', error)\n trace.error(toError(error))\n this.error(getErrorMessage(error), {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","getErrorMessage","toError","configureSkills","SkillsInstallTrace","debug","InstallSkillsCommand","description","examples","command","run","trace","telemetry","start","result","output","log","detectedEditors","installedAgents","error","complete","exit","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,eAAe,EAAEC,OAAO,QAAO,0BAAyB;AAEhE,SAAQC,eAAe,QAAO,0CAAyC;AACvE,SAAQC,kBAAkB,QAAO,sCAAqC;AAEtE,MAAMC,QAAQL,SAAS;AAEvB,OAAO,MAAMM,6BAA6BP;IACxC,OAAgBQ,cACd,2LAA0L;IAE5L,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACP;QACnCO,MAAME,KAAK;QAEX,IAAI;YACF,MAAMC,SAAS,MAAMX,gBAAgB;gBAACY,QAAQ,IAAI,CAACA,MAAM;YAAA;YAEzDJ,MAAMK,GAAG,CAAC;gBACRC,iBAAiBH,OAAOG,eAAe;gBACvCC,iBAAiBJ,OAAOI,eAAe;YACzC;YAEA,IAAIJ,OAAOK,KAAK,EAAE;gBAChBR,MAAMQ,KAAK,CAACL,OAAOK,KAAK;YAC1B,OAAO;gBACLR,MAAMS,QAAQ;YAChB;QACF,EAAE,OAAOD,OAAO;YACdd,MAAM,kCAAkCc;YACxCR,MAAMQ,KAAK,CAACjB,QAAQiB;YACpB,IAAI,CAACA,KAAK,CAAClB,gBAAgBkB,QAAQ;gBAACE,MAAMvB,UAAUwB,aAAa;YAAA;QACnE;IACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SanityCommand } from '@sanity/cli-core';
|
|
1
|
+
import { exitCodes, SanityCommand } from '@sanity/cli-core';
|
|
2
2
|
import { setConsent } from '../../actions/telemetry/setConsent.js';
|
|
3
3
|
import { telemetryLearnMoreMessage } from '../../actions/telemetry/telemetryLearnMoreMessage.js';
|
|
4
4
|
export class Disable extends SanityCommand {
|
|
@@ -24,7 +24,7 @@ export class Disable extends SanityCommand {
|
|
|
24
24
|
} catch (err) {
|
|
25
25
|
const message = err instanceof Error ? err.message : 'An unknown error occurred';
|
|
26
26
|
this.output.error(message, {
|
|
27
|
-
exit:
|
|
27
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/telemetry/disable.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {setConsent} from '../../actions/telemetry/setConsent.js'\nimport {telemetryLearnMoreMessage} from '../../actions/telemetry/telemetryLearnMoreMessage.js'\n\nexport class Disable extends SanityCommand<typeof Disable> {\n static override description = 'Disable telemetry for your account'\n\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> telemetry <%= command.id %>',\n description: 'Disable telemetry for your account',\n },\n ]\n\n static override flags = {} satisfies FlagInput\n\n public async run(): Promise<void> {\n // Parse to ensure no invalid flags are passed\n await this.parse(Disable)\n\n try {\n const result = await setConsent({\n status: 'denied',\n })\n\n this.output.log(result.message)\n\n if (result.changed) {\n this.output.log(`\\n${telemetryLearnMoreMessage('denied')}`)\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'An unknown error occurred'\n this.output.error(message, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/telemetry/disable.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {setConsent} from '../../actions/telemetry/setConsent.js'\nimport {telemetryLearnMoreMessage} from '../../actions/telemetry/telemetryLearnMoreMessage.js'\n\nexport class Disable extends SanityCommand<typeof Disable> {\n static override description = 'Disable telemetry for your account'\n\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> telemetry <%= command.id %>',\n description: 'Disable telemetry for your account',\n },\n ]\n\n static override flags = {} satisfies FlagInput\n\n public async run(): Promise<void> {\n // Parse to ensure no invalid flags are passed\n await this.parse(Disable)\n\n try {\n const result = await setConsent({\n status: 'denied',\n })\n\n this.output.log(result.message)\n\n if (result.changed) {\n this.output.log(`\\n${telemetryLearnMoreMessage('denied')}`)\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'An unknown error occurred'\n this.output.error(message, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","setConsent","telemetryLearnMoreMessage","Disable","description","examples","command","flags","run","parse","result","status","output","log","message","changed","err","Error","error","exit","RUNTIME_ERROR"],"mappings":"AAEA,SAAQA,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,UAAU,QAAO,wCAAuC;AAChE,SAAQC,yBAAyB,QAAO,uDAAsD;AAE9F,OAAO,MAAMC,gBAAgBH;IAC3B,OAAgBI,cAAc,qCAAoC;IAElE,OAAgBC,WAAmC;QACjD;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ,CAAC,EAAqB;IAE9C,MAAaC,MAAqB;QAChC,8CAA8C;QAC9C,MAAM,IAAI,CAACC,KAAK,CAACN;QAEjB,IAAI;YACF,MAAMO,SAAS,MAAMT,WAAW;gBAC9BU,QAAQ;YACV;YAEA,IAAI,CAACC,MAAM,CAACC,GAAG,CAACH,OAAOI,OAAO;YAE9B,IAAIJ,OAAOK,OAAO,EAAE;gBAClB,IAAI,CAACH,MAAM,CAACC,GAAG,CAAC,CAAC,EAAE,EAAEX,0BAA0B,WAAW;YAC5D;QACF,EAAE,OAAOc,KAAc;YACrB,MAAMF,UAAUE,eAAeC,QAAQD,IAAIF,OAAO,GAAG;YACrD,IAAI,CAACF,MAAM,CAACM,KAAK,CAACJ,SAAS;gBAACK,MAAMpB,UAAUqB,aAAa;YAAA;QAC3D;IACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SanityCommand } from '@sanity/cli-core';
|
|
1
|
+
import { exitCodes, SanityCommand } from '@sanity/cli-core';
|
|
2
2
|
import { setConsent } from '../../actions/telemetry/setConsent.js';
|
|
3
3
|
import { telemetryLearnMoreMessage } from '../../actions/telemetry/telemetryLearnMoreMessage.js';
|
|
4
4
|
export class Enable extends SanityCommand {
|
|
@@ -24,7 +24,7 @@ export class Enable extends SanityCommand {
|
|
|
24
24
|
} catch (err) {
|
|
25
25
|
const message = err instanceof Error ? err.message : 'An unknown error occurred';
|
|
26
26
|
return this.output.error(message, {
|
|
27
|
-
exit:
|
|
27
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/telemetry/enable.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {setConsent} from '../../actions/telemetry/setConsent.js'\nimport {telemetryLearnMoreMessage} from '../../actions/telemetry/telemetryLearnMoreMessage.js'\n\nexport class Enable extends SanityCommand<typeof Enable> {\n static override description = 'Enable telemetry for your account'\n\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> telemetry <%= command.id %>',\n description: 'Enable telemetry for your account',\n },\n ]\n\n static override flags = {} satisfies FlagInput\n\n public async run(): Promise<void> {\n // Parse to ensure no invalid flags are passed\n await this.parse(Enable)\n\n try {\n const result = await setConsent({\n status: 'granted',\n })\n\n this.output.log(result.message)\n\n if (result.changed) {\n this.output.log(`\\n${telemetryLearnMoreMessage('granted')}`)\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'An unknown error occurred'\n return this.output.error(message, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/telemetry/enable.ts"],"sourcesContent":["import {Command} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {setConsent} from '../../actions/telemetry/setConsent.js'\nimport {telemetryLearnMoreMessage} from '../../actions/telemetry/telemetryLearnMoreMessage.js'\n\nexport class Enable extends SanityCommand<typeof Enable> {\n static override description = 'Enable telemetry for your account'\n\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> telemetry <%= command.id %>',\n description: 'Enable telemetry for your account',\n },\n ]\n\n static override flags = {} satisfies FlagInput\n\n public async run(): Promise<void> {\n // Parse to ensure no invalid flags are passed\n await this.parse(Enable)\n\n try {\n const result = await setConsent({\n status: 'granted',\n })\n\n this.output.log(result.message)\n\n if (result.changed) {\n this.output.log(`\\n${telemetryLearnMoreMessage('granted')}`)\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'An unknown error occurred'\n return this.output.error(message, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","setConsent","telemetryLearnMoreMessage","Enable","description","examples","command","flags","run","parse","result","status","output","log","message","changed","err","Error","error","exit","RUNTIME_ERROR"],"mappings":"AAEA,SAAQA,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,UAAU,QAAO,wCAAuC;AAChE,SAAQC,yBAAyB,QAAO,uDAAsD;AAE9F,OAAO,MAAMC,eAAeH;IAC1B,OAAgBI,cAAc,oCAAmC;IAEjE,OAAgBC,WAAmC;QACjD;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ,CAAC,EAAqB;IAE9C,MAAaC,MAAqB;QAChC,8CAA8C;QAC9C,MAAM,IAAI,CAACC,KAAK,CAACN;QAEjB,IAAI;YACF,MAAMO,SAAS,MAAMT,WAAW;gBAC9BU,QAAQ;YACV;YAEA,IAAI,CAACC,MAAM,CAACC,GAAG,CAACH,OAAOI,OAAO;YAE9B,IAAIJ,OAAOK,OAAO,EAAE;gBAClB,IAAI,CAACH,MAAM,CAACC,GAAG,CAAC,CAAC,EAAE,EAAEX,0BAA0B,YAAY;YAC7D;QACF,EAAE,OAAOc,KAAc;YACrB,MAAMF,UAAUE,eAAeC,QAAQD,IAAIF,OAAO,GAAG;YACrD,OAAO,IAAI,CAACF,MAAM,CAACM,KAAK,CAACJ,SAAS;gBAACK,MAAMpB,UAAUqB,aAAa;YAAA;QAClE;IACF;AACF"}
|
|
@@ -110,7 +110,7 @@ export class CreateTokenCommand extends SanityCommand {
|
|
|
110
110
|
const err = error;
|
|
111
111
|
tokensCreateDebug(`Error creating token for project ${projectId}`, err);
|
|
112
112
|
this.error(`Token creation failed:\n${err.message}`, {
|
|
113
|
-
exit:
|
|
113
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
116
|
}
|
|
@@ -143,7 +143,7 @@ export class CreateTokenCommand extends SanityCommand {
|
|
|
143
143
|
});
|
|
144
144
|
if (robotRoles.length === 0) {
|
|
145
145
|
this.error('No roles available for tokens', {
|
|
146
|
-
exit:
|
|
146
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
147
147
|
});
|
|
148
148
|
}
|
|
149
149
|
const selectedRoleName = await select({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/tokens/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\n\nimport {validateRole} from '../../actions/tokens/validateRole.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {createToken, getTokenRoles} from '../../services/tokens.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst tokensCreateDebug = subdebug('tokens:create')\n\nexport class CreateTokenCommand extends SanityCommand<typeof CreateTokenCommand> {\n static override args = {\n label: Args.string({\n description: 'Label for the new token',\n required: false,\n }),\n }\n\n static override description = 'Create a new API token for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> \"My API Token\"',\n description: 'Create a token with a label',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My API Token\" --role=editor',\n description: 'Create a token with editor role',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"CI Token\" --role=editor --yes',\n description: 'Create a token in unattended mode',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"API Token\" --json',\n description: 'Output token information as JSON',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My Token\" --project-id abc123 --role=editor',\n description: 'Create a token for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create token in',\n semantics: 'override',\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output as JSON',\n }),\n role: Flags.string({\n description: 'Role to assign to the token (defaults to viewer in unattended mode)',\n helpValue: 'viewer',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Skip prompts and use defaults (unattended mode)',\n }),\n }\n\n static override hiddenAliases: string[] = ['tokens:add', 'token:add', 'token:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateTokenCommand)\n const {label: givenLabel} = args\n const {json, role} = flags\n\n const label = givenLabel === undefined ? await this.promptForLabel() : givenLabel.trim()\n if (!label) {\n this.error('Token label cannot be empty. Pass a non-empty value as the `<label>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.roles'},\n {grant: 'create', permission: 'sanity.project.tokens'},\n ],\n }),\n })\n\n const roleName = await (role\n ? validateRole(role, projectId, this.output)\n : this.promptForRole(projectId))\n\n try {\n tokensCreateDebug(`Creating token for project ${projectId}`, {\n label,\n roleName,\n })\n const token = await createToken({\n label,\n projectId,\n roleName,\n })\n\n if (json) {\n this.log(JSON.stringify(token, null, 2))\n return\n }\n\n this.log('API token created')\n this.log(`Label: ${token.label}`)\n this.log(`ID: ${token.id}`)\n this.log(`Role: ${token.roles.map((r) => r.title).join(', ')}`)\n this.log(`Token: ${token.key}`)\n this.log('')\n this.log(\"Copy the token now. It won't be shown again.\")\n } catch (error) {\n const err = error as Error\n\n tokensCreateDebug(`Error creating token for project ${projectId}`, err)\n this.error(`Token creation failed:\\n${err.message}`, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/tokens/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\n\nimport {validateRole} from '../../actions/tokens/validateRole.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {createToken, getTokenRoles} from '../../services/tokens.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst tokensCreateDebug = subdebug('tokens:create')\n\nexport class CreateTokenCommand extends SanityCommand<typeof CreateTokenCommand> {\n static override args = {\n label: Args.string({\n description: 'Label for the new token',\n required: false,\n }),\n }\n\n static override description = 'Create a new API token for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> \"My API Token\"',\n description: 'Create a token with a label',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My API Token\" --role=editor',\n description: 'Create a token with editor role',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"CI Token\" --role=editor --yes',\n description: 'Create a token in unattended mode',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"API Token\" --json',\n description: 'Output token information as JSON',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My Token\" --project-id abc123 --role=editor',\n description: 'Create a token for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create token in',\n semantics: 'override',\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output as JSON',\n }),\n role: Flags.string({\n description: 'Role to assign to the token (defaults to viewer in unattended mode)',\n helpValue: 'viewer',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Skip prompts and use defaults (unattended mode)',\n }),\n }\n\n static override hiddenAliases: string[] = ['tokens:add', 'token:add', 'token:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateTokenCommand)\n const {label: givenLabel} = args\n const {json, role} = flags\n\n const label = givenLabel === undefined ? await this.promptForLabel() : givenLabel.trim()\n if (!label) {\n this.error('Token label cannot be empty. Pass a non-empty value as the `<label>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.roles'},\n {grant: 'create', permission: 'sanity.project.tokens'},\n ],\n }),\n })\n\n const roleName = await (role\n ? validateRole(role, projectId, this.output)\n : this.promptForRole(projectId))\n\n try {\n tokensCreateDebug(`Creating token for project ${projectId}`, {\n label,\n roleName,\n })\n const token = await createToken({\n label,\n projectId,\n roleName,\n })\n\n if (json) {\n this.log(JSON.stringify(token, null, 2))\n return\n }\n\n this.log('API token created')\n this.log(`Label: ${token.label}`)\n this.log(`ID: ${token.id}`)\n this.log(`Role: ${token.roles.map((r) => r.title).join(', ')}`)\n this.log(`Token: ${token.key}`)\n this.log('')\n this.log(\"Copy the token now. It won't be shown again.\")\n } catch (error) {\n const err = error as Error\n\n tokensCreateDebug(`Error creating token for project ${projectId}`, err)\n this.error(`Token creation failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async promptForLabel(): Promise<string> {\n if (this.isUnattended()) {\n this.error('Token label is required. Pass it as the `<label>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const label = await input({\n message: 'Token label:',\n validate: (value) => {\n if (!value || !value.trim()) {\n return 'Label cannot be empty'\n }\n return true\n },\n })\n\n return label.trim()\n }\n\n private async promptForRole(projectId: string): Promise<string> {\n if (this.isUnattended()) {\n return 'viewer' // Default role for unattended mode\n }\n\n const roles = await getTokenRoles(projectId)\n const robotRoles = roles.filter((role) => role.appliesToRobots)\n\n tokensCreateDebug('Robot roles', {robotRoles})\n\n if (robotRoles.length === 0) {\n this.error('No roles available for tokens', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const selectedRoleName = await select({\n choices: robotRoles.map((role) => ({\n name: `${role.title} (${role.name})`,\n short: role.title,\n value: role.name,\n })),\n default: 'viewer',\n message: 'Select role for the token:',\n })\n\n return selectedRoleName\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","input","select","validateRole","promptForProject","createToken","getTokenRoles","getProjectIdFlag","tokensCreateDebug","CreateTokenCommand","args","label","string","description","required","examples","command","flags","semantics","json","boolean","default","role","helpValue","yes","char","hiddenAliases","run","parse","givenLabel","undefined","promptForLabel","trim","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","roleName","output","promptForRole","token","log","JSON","stringify","id","roles","map","r","title","join","key","err","message","RUNTIME_ERROR","isUnattended","validate","value","robotRoles","filter","appliesToRobots","length","selectedRoleName","choices","name","short"],"mappings":"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"}
|
|
@@ -101,13 +101,13 @@ export class DeleteTokensCommand extends SanityCommand {
|
|
|
101
101
|
} catch (error) {
|
|
102
102
|
if (error instanceof ClientError && error.response.statusCode === 404) {
|
|
103
103
|
this.error(`Token with ID "${tokenId}" not found`, {
|
|
104
|
-
exit:
|
|
104
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
105
105
|
});
|
|
106
106
|
}
|
|
107
107
|
const err = error;
|
|
108
108
|
deleteTokenDebug(`Error deleting token`, err);
|
|
109
109
|
this.error(`Token deletion failed:\n${err.message}`, {
|
|
110
|
-
exit:
|
|
110
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
111
111
|
});
|
|
112
112
|
}
|
|
113
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/tokens/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm, select} from '@sanity/cli-core/ux'\nimport {ClientError} from '@sanity/client'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteToken, getTokens} from '../../services/tokens.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteTokenDebug = subdebug('tokens:delete')\n\nexport class DeleteTokensCommand extends SanityCommand<typeof DeleteTokensCommand> {\n static override args = {\n tokenId: Args.string({\n description: 'Token ID to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete an API token from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a token',\n },\n {\n command: '<%= config.bin %> <%= command.id %> silJ2lFmK6dONB',\n description: 'Delete a specific token by ID',\n },\n {\n command: '<%= config.bin %> <%= command.id %> silJ2lFmK6dONB --yes',\n description: 'Delete a specific token without confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a token from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete token from',\n semantics: 'override',\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Skip confirmation prompt (unattended mode)',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['token:delete']\n\n private projectId!: string\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteTokensCommand)\n\n const skipConfirmation = flags.yes\n const unattended = this.isUnattended()\n const {tokenId: givenTokenId} = args\n\n if (unattended) {\n const errors: string[] = []\n\n if (!givenTokenId) {\n errors.push('Token ID is required. Pass it as the `<tokenId>` argument.')\n }\n if (!skipConfirmation) {\n errors.push('Deletion requires confirmation. Pass `--yes` to delete the token.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n }\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.tokens'}],\n }),\n })\n\n this.projectId = projectId\n\n const tokenId = givenTokenId || (await this.getTokenIdFromList())\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Delete API token \"${tokenId}\"?`,\n })\n\n if (!confirmed) {\n this.log('API token not deleted')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n await deleteToken({\n projectId: this.projectId,\n tokenId,\n })\n\n this.log('API token deleted')\n } catch (error) {\n if (error instanceof ClientError && error.response.statusCode === 404) {\n this.error(`Token with ID \"${tokenId}\" not found`, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/tokens/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm, select} from '@sanity/cli-core/ux'\nimport {ClientError} from '@sanity/client'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteToken, getTokens} from '../../services/tokens.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteTokenDebug = subdebug('tokens:delete')\n\nexport class DeleteTokensCommand extends SanityCommand<typeof DeleteTokensCommand> {\n static override args = {\n tokenId: Args.string({\n description: 'Token ID to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete an API token from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a token',\n },\n {\n command: '<%= config.bin %> <%= command.id %> silJ2lFmK6dONB',\n description: 'Delete a specific token by ID',\n },\n {\n command: '<%= config.bin %> <%= command.id %> silJ2lFmK6dONB --yes',\n description: 'Delete a specific token without confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a token from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete token from',\n semantics: 'override',\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Skip confirmation prompt (unattended mode)',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['token:delete']\n\n private projectId!: string\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteTokensCommand)\n\n const skipConfirmation = flags.yes\n const unattended = this.isUnattended()\n const {tokenId: givenTokenId} = args\n\n if (unattended) {\n const errors: string[] = []\n\n if (!givenTokenId) {\n errors.push('Token ID is required. Pass it as the `<tokenId>` argument.')\n }\n if (!skipConfirmation) {\n errors.push('Deletion requires confirmation. Pass `--yes` to delete the token.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n }\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.tokens'}],\n }),\n })\n\n this.projectId = projectId\n\n const tokenId = givenTokenId || (await this.getTokenIdFromList())\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Delete API token \"${tokenId}\"?`,\n })\n\n if (!confirmed) {\n this.log('API token not deleted')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n await deleteToken({\n projectId: this.projectId,\n tokenId,\n })\n\n this.log('API token deleted')\n } catch (error) {\n if (error instanceof ClientError && error.response.statusCode === 404) {\n this.error(`Token with ID \"${tokenId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const err = error as Error\n deleteTokenDebug(`Error deleting token`, err)\n this.error(`Token deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async getTokenIdFromList() {\n let tokens: Awaited<ReturnType<typeof getTokens>>\n try {\n tokens = await getTokens(this.projectId)\n } catch (error) {\n const err = error as Error\n deleteTokenDebug(`Error fetching tokens for project ${this.projectId}`, err)\n this.error(\n `Could not list API tokens:\\n${err.message}\\nCheck the project ID and your access permissions, then try again.`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n if (tokens.length === 0) {\n this.error('No API tokens found for this project.', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const choices = tokens.map((token) => ({\n name: `${token.label} (${(token.roles || []).map((r) => r.title).join(', ')})`,\n value: token.id,\n }))\n\n return select({\n choices,\n message: 'Select token to delete:',\n })\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","confirm","select","ClientError","promptForProject","deleteToken","getTokens","formatCliErrorMessages","getProjectIdFlag","deleteTokenDebug","DeleteTokensCommand","args","tokenId","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","hiddenAliases","projectId","run","parse","skipConfirmation","unattended","isUnattended","givenTokenId","errors","push","length","error","exit","USAGE_ERROR","getProjectId","fallback","requiredPermissions","grant","permission","getTokenIdFromList","confirmed","default","message","log","USER_ABORT","response","statusCode","RUNTIME_ERROR","err","tokens","choices","map","token","name","label","roles","r","title","join","value","id"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,OAAO,EAAEC,MAAM,QAAO,sBAAqB;AACnD,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,WAAW,EAAEC,SAAS,QAAO,2BAA0B;AAC/D,SAAQC,sBAAsB,QAAO,uCAAsC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBT,SAAS;AAElC,OAAO,MAAMU,4BAA4BX;IACvC,OAAgBY,OAAO;QACrBC,SAAShB,KAAKiB,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,uCAAsC;IAEpE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;QACFC,KAAKvB,MAAMwB,OAAO,CAAC;YACjBC,SAAS;gBAAC;aAAI;YACdR,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBQ,gBAA0B;QAAC;KAAe,CAAA;IAElDC,UAAkB;IAE1B,MAAaC,MAAqB;QAChC,MAAM,EAACd,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAAChB;QAEvC,MAAMiB,mBAAmBT,MAAME,GAAG;QAClC,MAAMQ,aAAa,IAAI,CAACC,YAAY;QACpC,MAAM,EAACjB,SAASkB,YAAY,EAAC,GAAGnB;QAEhC,IAAIiB,YAAY;YACd,MAAMG,SAAmB,EAAE;YAE3B,IAAI,CAACD,cAAc;gBACjBC,OAAOC,IAAI,CAAC;YACd;YACA,IAAI,CAACL,kBAAkB;gBACrBI,OAAOC,IAAI,CAAC;YACd;YAEA,IAAID,OAAOE,MAAM,GAAG,GAAG;gBACrB,IAAI,CAACC,KAAK,CAAC3B,uBAAuBwB,SAAS;oBACzCI,MAAMrC,UAAUsC,WAAW;gBAC7B;YACF;QACF;QAEA,iCAAiC;QACjC,MAAMZ,YAAY,MAAM,IAAI,CAACa,YAAY,CAAC;YACxCC,UAAU,IACRlC,iBAAiB;oBACfmC,qBAAqB;wBAAC;4BAACC,OAAO;4BAAUC,YAAY;wBAAuB;qBAAE;gBAC/E;QACJ;QAEA,IAAI,CAACjB,SAAS,GAAGA;QAEjB,MAAMZ,UAAUkB,gBAAiB,MAAM,IAAI,CAACY,kBAAkB;QAE9D,IAAI,CAACf,kBAAkB;YACrB,MAAMgB,YAAY,MAAM1C,QAAQ;gBAC9B2C,SAAS;gBACTC,SAAS,CAAC,kBAAkB,EAAEjC,QAAQ,EAAE,CAAC;YAC3C;YAEA,IAAI,CAAC+B,WAAW;gBACd,IAAI,CAACG,GAAG,CAAC;gBACT,IAAI,CAACX,IAAI,CAACrC,UAAUiD,UAAU;YAChC;QACF;QAEA,IAAI;YACF,MAAM1C,YAAY;gBAChBmB,WAAW,IAAI,CAACA,SAAS;gBACzBZ;YACF;YAEA,IAAI,CAACkC,GAAG,CAAC;QACX,EAAE,OAAOZ,OAAO;YACd,IAAIA,iBAAiB/B,eAAe+B,MAAMc,QAAQ,CAACC,UAAU,KAAK,KAAK;gBACrE,IAAI,CAACf,KAAK,CAAC,CAAC,eAAe,EAAEtB,QAAQ,WAAW,CAAC,EAAE;oBAACuB,MAAMrC,UAAUoD,aAAa;gBAAA;YACnF;YAEA,MAAMC,MAAMjB;YACZzB,iBAAiB,CAAC,oBAAoB,CAAC,EAAE0C;YACzC,IAAI,CAACjB,KAAK,CAAC,CAAC,wBAAwB,EAAEiB,IAAIN,OAAO,EAAE,EAAE;gBAACV,MAAMrC,UAAUoD,aAAa;YAAA;QACrF;IACF;IAEA,MAAcR,qBAAqB;QACjC,IAAIU;QACJ,IAAI;YACFA,SAAS,MAAM9C,UAAU,IAAI,CAACkB,SAAS;QACzC,EAAE,OAAOU,OAAO;YACd,MAAMiB,MAAMjB;YACZzB,iBAAiB,CAAC,kCAAkC,EAAE,IAAI,CAACe,SAAS,EAAE,EAAE2B;YACxE,IAAI,CAACjB,KAAK,CACR,CAAC,4BAA4B,EAAEiB,IAAIN,OAAO,CAAC,mEAAmE,CAAC,EAC/G;gBAACV,MAAMrC,UAAUoD,aAAa;YAAA;QAElC;QAEA,IAAIE,OAAOnB,MAAM,KAAK,GAAG;YACvB,IAAI,CAACC,KAAK,CAAC,yCAAyC;gBAClDC,MAAMrC,UAAUoD,aAAa;YAC/B;QACF;QAEA,MAAMG,UAAUD,OAAOE,GAAG,CAAC,CAACC,QAAW,CAAA;gBACrCC,MAAM,GAAGD,MAAME,KAAK,CAAC,EAAE,EAAE,AAACF,CAAAA,MAAMG,KAAK,IAAI,EAAE,AAAD,EAAGJ,GAAG,CAAC,CAACK,IAAMA,EAAEC,KAAK,EAAEC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9EC,OAAOP,MAAMQ,EAAE;YACjB,CAAA;QAEA,OAAO7D,OAAO;YACZmD;YACAR,SAAS;QACX;IACF;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { getErrorMessage } from '@sanity/cli-core/errors';
|
|
4
4
|
import { Table } from 'console-table-printer';
|
|
5
5
|
import { promptForProject } from '../../prompts/promptForProject.js';
|
|
@@ -57,7 +57,7 @@ export class TokensListCommand extends SanityCommand {
|
|
|
57
57
|
const message = getErrorMessage(error);
|
|
58
58
|
listTokenDebug(`Error fetching tokens for project ${projectId}`, error);
|
|
59
59
|
this.error(`Token list retrieval failed:\n${message}`, {
|
|
60
|
-
exit:
|
|
60
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
if (outputJson) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/tokens/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {Table} from 'console-table-printer'\n\nimport {type Token} from '../../actions/tokens/types.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getTokens} from '../../services/tokens.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listTokenDebug = subdebug('tokens:list')\n\nexport class TokensListCommand extends SanityCommand<typeof TokensListCommand> {\n static override description = 'List API tokens for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List tokens for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json',\n description: 'List tokens in JSON format',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List tokens for a specific project',\n },\n ]\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list tokens for',\n semantics: 'override',\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output tokens in JSON format',\n }),\n }\n\n static override hiddenAliases: string[] = ['token:list']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(TokensListCommand)\n const {json} = flags\n const outputJson = json ?? false\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.tokens'}],\n }),\n })\n\n let tokens: Token[]\n try {\n tokens = await getTokens(projectId)\n } catch (error) {\n const message = getErrorMessage(error)\n listTokenDebug(`Error fetching tokens for project ${projectId}`, error)\n this.error(`Token list retrieval failed:\\n${message}`, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/tokens/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {Table} from 'console-table-printer'\n\nimport {type Token} from '../../actions/tokens/types.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getTokens} from '../../services/tokens.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listTokenDebug = subdebug('tokens:list')\n\nexport class TokensListCommand extends SanityCommand<typeof TokensListCommand> {\n static override description = 'List API tokens for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List tokens for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json',\n description: 'List tokens in JSON format',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List tokens for a specific project',\n },\n ]\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list tokens for',\n semantics: 'override',\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output tokens in JSON format',\n }),\n }\n\n static override hiddenAliases: string[] = ['token:list']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(TokensListCommand)\n const {json} = flags\n const outputJson = json ?? false\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.tokens'}],\n }),\n })\n\n let tokens: Token[]\n try {\n tokens = await getTokens(projectId)\n } catch (error) {\n const message = getErrorMessage(error)\n listTokenDebug(`Error fetching tokens for project ${projectId}`, error)\n this.error(`Token list retrieval failed:\\n${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (outputJson) {\n this.log(JSON.stringify(tokens, null, 2))\n return\n }\n\n if (tokens.length === 0) {\n this.log('No API tokens found for this project.')\n return\n }\n\n const table = new Table({\n columns: [\n {alignment: 'left', maxLen: 40, name: 'label', title: 'Label'},\n {alignment: 'left', maxLen: 20, name: 'id', title: 'Token ID'},\n {alignment: 'left', maxLen: 30, name: 'roles', title: 'Roles'},\n ],\n title: `Found ${tokens.length} API tokens`,\n })\n\n for (const token of tokens) {\n const roles = token.roles?.map((role) => role.title).join(', ') || 'No roles'\n const truncatedLabel =\n token.label.length > 37 ? `${token.label.slice(0, 37)}...` : token.label\n const truncatedRoles = roles.length > 27 ? `${roles.slice(0, 27)}...` : roles\n\n table.addRow({\n id: token.id,\n label: truncatedLabel,\n roles: truncatedRoles,\n })\n }\n\n table.printTable()\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","Table","promptForProject","getTokens","getProjectIdFlag","listTokenDebug","TokensListCommand","description","examples","command","flags","semantics","json","boolean","default","hiddenAliases","run","parse","outputJson","projectId","getProjectId","fallback","requiredPermissions","grant","permission","tokens","error","message","exit","RUNTIME_ERROR","log","JSON","stringify","length","table","columns","alignment","maxLen","name","title","token","roles","map","role","join","truncatedLabel","label","slice","truncatedRoles","addRow","id","printTable"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,KAAK,QAAO,wBAAuB;AAG3C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,SAAS,QAAO,2BAA0B;AAClD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,iBAAiBN,SAAS;AAEhC,OAAO,MAAMO,0BAA0BR;IACrC,OAAgBS,cAAc,kCAAiC;IAC/D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;QACFC,MAAMhB,MAAMiB,OAAO,CAAC;YAClBC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,OAAgBQ,gBAA0B;QAAC;KAAa,CAAA;IAExD,MAAaC,MAAqB;QAChC,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACX;QACjC,MAAM,EAACM,IAAI,EAAC,GAAGF;QACf,MAAMQ,aAAaN,QAAQ;QAE3B,iCAAiC;QACjC,MAAMO,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAuB;qBAAE;gBAC7E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,SAAS,MAAMtB,UAAUgB;QAC3B,EAAE,OAAOO,OAAO;YACd,MAAMC,UAAU3B,gBAAgB0B;YAChCrB,eAAe,CAAC,kCAAkC,EAAEc,WAAW,EAAEO;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEC,SAAS,EAAE;gBAACC,MAAM/B,UAAUgC,aAAa;YAAA;QACvF;QAEA,IAAIX,YAAY;YACd,IAAI,CAACY,GAAG,CAACC,KAAKC,SAAS,CAACP,QAAQ,MAAM;YACtC;QACF;QAEA,IAAIA,OAAOQ,MAAM,KAAK,GAAG;YACvB,IAAI,CAACH,GAAG,CAAC;YACT;QACF;QAEA,MAAMI,QAAQ,IAAIjC,MAAM;YACtBkC,SAAS;gBACP;oBAACC,WAAW;oBAAQC,QAAQ;oBAAIC,MAAM;oBAASC,OAAO;gBAAO;gBAC7D;oBAACH,WAAW;oBAAQC,QAAQ;oBAAIC,MAAM;oBAAMC,OAAO;gBAAU;gBAC7D;oBAACH,WAAW;oBAAQC,QAAQ;oBAAIC,MAAM;oBAASC,OAAO;gBAAO;aAC9D;YACDA,OAAO,CAAC,MAAM,EAAEd,OAAOQ,MAAM,CAAC,WAAW,CAAC;QAC5C;QAEA,KAAK,MAAMO,SAASf,OAAQ;YAC1B,MAAMgB,QAAQD,MAAMC,KAAK,EAAEC,IAAI,CAACC,OAASA,KAAKJ,KAAK,EAAEK,KAAK,SAAS;YACnE,MAAMC,iBACJL,MAAMM,KAAK,CAACb,MAAM,GAAG,KAAK,GAAGO,MAAMM,KAAK,CAACC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,GAAGP,MAAMM,KAAK;YAC1E,MAAME,iBAAiBP,MAAMR,MAAM,GAAG,KAAK,GAAGQ,MAAMM,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,GAAGN;YAExEP,MAAMe,MAAM,CAAC;gBACXC,IAAIV,MAAMU,EAAE;gBACZJ,OAAOD;gBACPJ,OAAOO;YACT;QACF;QAEAd,MAAMiB,UAAU;IAClB;AACF"}
|
|
@@ -91,7 +91,7 @@ export class UsersInviteCommand extends SanityCommand {
|
|
|
91
91
|
} catch (error) {
|
|
92
92
|
usersInviteDebug('Error fetching roles', error);
|
|
93
93
|
this.error('Error fetching roles', {
|
|
94
|
-
exit:
|
|
94
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
const email = normalizedEmail || await this.promptForEmail();
|
|
@@ -113,11 +113,11 @@ export class UsersInviteCommand extends SanityCommand {
|
|
|
113
113
|
usersInviteDebug(`Error inviting user`, error);
|
|
114
114
|
if (error.statusCode === 402) {
|
|
115
115
|
this.error(QUOTA_ERROR_MESSAGE, {
|
|
116
|
-
exit:
|
|
116
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
119
|
this.error(`Error inviting user`, {
|
|
120
|
-
exit:
|
|
120
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
121
121
|
});
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/users/invite.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\n\nimport {type Role} from '../../actions/users/types.js'\nimport {validateEmail} from '../../actions/users/validateEmail.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectRoles, inviteUser} from '../../services/projects.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst QUOTA_ERROR_MESSAGE =\n 'Project is already at user quota, add billing details to the project in order to allow overage charges.'\n\nconst usersInviteDebug = subdebug('users:invite')\n\nexport class UsersInviteCommand extends SanityCommand<typeof UsersInviteCommand> {\n static override args = {\n email: Args.string({\n description: 'Email address to invite',\n required: false,\n }),\n }\n\n static override description = 'Invite a new user to the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Invite a new user to the project (prompt for details)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> pippi@sanity.io',\n description: 'Send a new user invite to the email \"pippi@sanity.io\", prompt for role',\n },\n {\n command: '<%= config.bin %> <%= command.id %> pippi@sanity.io --role administrator',\n description: 'Send a new user invite to the email \"pippi@sanity.io\", as administrator',\n },\n {\n command: '<%= config.bin %> <%= command.id %> pippi@sanity.io --project-id abc123',\n description: 'Invite a user to a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to invite user to',\n semantics: 'override',\n }),\n role: Flags.string({\n description: 'Role to invite the user as',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['user:invite']\n\n public async run(): Promise<void> {\n const {email: selectedEmail} = this.args\n const {role: selectedRole} = this.flags\n const normalizedEmail = selectedEmail?.trim()\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!normalizedEmail) {\n errors.push('Email address is required. Pass it as the `<email>` argument.')\n }\n if (!selectedRole) {\n errors.push('User role is required. Pass it with `--role <role>`.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n }\n\n if (selectedEmail !== undefined) {\n const validation = validateEmail(normalizedEmail ?? '')\n if (validation !== true) this.error(validation, {exit: exitCodes.USAGE_ERROR})\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.roles'},\n {grant: 'invite', permission: 'sanity.project.members'},\n ],\n }),\n })\n\n let roles: Role[]\n try {\n roles = (await getProjectRoles(projectId)).filter((role) => role.appliesToUsers)\n } catch (error) {\n usersInviteDebug('Error fetching roles', error)\n this.error('Error fetching roles', {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/users/invite.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\n\nimport {type Role} from '../../actions/users/types.js'\nimport {validateEmail} from '../../actions/users/validateEmail.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectRoles, inviteUser} from '../../services/projects.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst QUOTA_ERROR_MESSAGE =\n 'Project is already at user quota, add billing details to the project in order to allow overage charges.'\n\nconst usersInviteDebug = subdebug('users:invite')\n\nexport class UsersInviteCommand extends SanityCommand<typeof UsersInviteCommand> {\n static override args = {\n email: Args.string({\n description: 'Email address to invite',\n required: false,\n }),\n }\n\n static override description = 'Invite a new user to the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Invite a new user to the project (prompt for details)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> pippi@sanity.io',\n description: 'Send a new user invite to the email \"pippi@sanity.io\", prompt for role',\n },\n {\n command: '<%= config.bin %> <%= command.id %> pippi@sanity.io --role administrator',\n description: 'Send a new user invite to the email \"pippi@sanity.io\", as administrator',\n },\n {\n command: '<%= config.bin %> <%= command.id %> pippi@sanity.io --project-id abc123',\n description: 'Invite a user to a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to invite user to',\n semantics: 'override',\n }),\n role: Flags.string({\n description: 'Role to invite the user as',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['user:invite']\n\n public async run(): Promise<void> {\n const {email: selectedEmail} = this.args\n const {role: selectedRole} = this.flags\n const normalizedEmail = selectedEmail?.trim()\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!normalizedEmail) {\n errors.push('Email address is required. Pass it as the `<email>` argument.')\n }\n if (!selectedRole) {\n errors.push('User role is required. Pass it with `--role <role>`.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n }\n\n if (selectedEmail !== undefined) {\n const validation = validateEmail(normalizedEmail ?? '')\n if (validation !== true) this.error(validation, {exit: exitCodes.USAGE_ERROR})\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.roles'},\n {grant: 'invite', permission: 'sanity.project.members'},\n ],\n }),\n })\n\n let roles: Role[]\n try {\n roles = (await getProjectRoles(projectId)).filter((role) => role.appliesToUsers)\n } catch (error) {\n usersInviteDebug('Error fetching roles', error)\n this.error('Error fetching roles', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const email = normalizedEmail || (await this.promptForEmail())\n const roleSelection = selectedRole || (await this.promptForRole(roles))\n const role = roles.find(({name}) => name.toLowerCase() === roleSelection.toLowerCase())\n\n if (!role) {\n this.error(\n `Role name \"${roleSelection}\" not found. Available roles: ${roles.map((r) => r.name).join(', ')}`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n try {\n await inviteUser({email, projectId, role: role.name})\n\n this.log(`Invitation sent to ${email}`)\n } catch (error) {\n usersInviteDebug(`Error inviting user`, error)\n if ((error as Error & {statusCode: number}).statusCode === 402) {\n this.error(QUOTA_ERROR_MESSAGE, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n this.error(`Error inviting user`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async promptForEmail(): Promise<string> {\n return input({\n message: 'Email to invite:',\n transformer: (val: string) => val.trim(),\n validate: validateEmail,\n })\n }\n\n private async promptForRole(roles: Role[]): Promise<string> {\n return select({\n choices: roles.map((role) => ({\n name: `${role.title} (${role.description || 'No description'})`,\n value: role.name,\n })),\n message: 'Which role should the user have?',\n })\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","input","select","validateEmail","promptForProject","getProjectRoles","inviteUser","formatCliErrorMessages","getProjectIdFlag","QUOTA_ERROR_MESSAGE","usersInviteDebug","UsersInviteCommand","args","email","string","description","required","examples","command","flags","semantics","role","hiddenAliases","run","selectedEmail","selectedRole","normalizedEmail","trim","isUnattended","errors","push","length","error","exit","USAGE_ERROR","undefined","validation","projectId","getProjectId","fallback","requiredPermissions","grant","permission","roles","filter","appliesToUsers","RUNTIME_ERROR","promptForEmail","roleSelection","promptForRole","find","name","toLowerCase","map","r","join","log","statusCode","message","transformer","val","validate","choices","title","value"],"mappings":"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"}
|