@sanity/cli 6.1.7 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -103
- package/dist/actions/build/buildStudio.js +1 -1
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/actions/debug/gatherDebugInfo.js +130 -81
- package/dist/actions/debug/gatherDebugInfo.js.map +1 -1
- package/dist/actions/debug/output.js +25 -0
- package/dist/actions/debug/output.js.map +1 -0
- package/dist/actions/debug/types.js.map +1 -1
- package/dist/actions/mcp/setupMCP.js +5 -5
- package/dist/actions/mcp/setupMCP.js.map +1 -1
- package/dist/actions/schema/getExtractOptions.js.map +1 -1
- package/dist/commands/{backup → backups}/disable.js +3 -0
- package/dist/commands/backups/disable.js.map +1 -0
- package/dist/commands/{backup → backups}/download.js +3 -0
- package/dist/commands/backups/download.js.map +1 -0
- package/dist/commands/{backup → backups}/enable.js +3 -0
- package/dist/commands/backups/enable.js.map +1 -0
- package/dist/commands/{backup → backups}/list.js +3 -0
- package/dist/commands/backups/list.js.map +1 -0
- package/dist/commands/{dataset → datasets}/alias/create.js +3 -0
- package/dist/commands/datasets/alias/create.js.map +1 -0
- package/dist/commands/{dataset → datasets}/alias/delete.js +3 -0
- package/dist/commands/datasets/alias/delete.js.map +1 -0
- package/dist/commands/{dataset → datasets}/alias/link.js +3 -0
- package/dist/commands/datasets/alias/link.js.map +1 -0
- package/dist/commands/{dataset → datasets}/alias/unlink.js +3 -0
- package/dist/commands/datasets/alias/unlink.js.map +1 -0
- package/dist/commands/{dataset → datasets}/copy.js +3 -0
- package/dist/commands/datasets/copy.js.map +1 -0
- package/dist/commands/{dataset → datasets}/create.js +3 -0
- package/dist/commands/datasets/create.js.map +1 -0
- package/dist/commands/{dataset → datasets}/delete.js +3 -0
- package/dist/commands/datasets/delete.js.map +1 -0
- package/dist/commands/{dataset → datasets}/embeddings/disable.js +3 -0
- package/dist/commands/datasets/embeddings/disable.js.map +1 -0
- package/dist/commands/{dataset → datasets}/embeddings/enable.js +3 -0
- package/dist/commands/datasets/embeddings/enable.js.map +1 -0
- package/dist/commands/{dataset → datasets}/embeddings/status.js +3 -0
- package/dist/commands/datasets/embeddings/status.js.map +1 -0
- package/dist/commands/{dataset → datasets}/export.js +3 -0
- package/dist/commands/datasets/export.js.map +1 -0
- package/dist/commands/{dataset → datasets}/import.js +3 -0
- package/dist/commands/datasets/import.js.map +1 -0
- package/dist/commands/{dataset → datasets}/list.js +3 -0
- package/dist/commands/datasets/list.js.map +1 -0
- package/dist/commands/{dataset → datasets}/visibility/get.js +3 -0
- package/dist/commands/datasets/visibility/get.js.map +1 -0
- package/dist/commands/{dataset → datasets}/visibility/set.js +3 -0
- package/dist/commands/datasets/visibility/set.js.map +1 -0
- package/dist/commands/debug.js +189 -74
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/documents/create.js +3 -0
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +3 -0
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +3 -0
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +3 -0
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +3 -0
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/{hook → hooks}/attempt.js +3 -0
- package/dist/commands/hooks/attempt.js.map +1 -0
- package/dist/commands/{hook → hooks}/create.js +3 -0
- package/dist/commands/hooks/create.js.map +1 -0
- package/dist/commands/{hook → hooks}/delete.js +3 -0
- package/dist/commands/hooks/delete.js.map +1 -0
- package/dist/commands/{hook → hooks}/list.js +3 -0
- package/dist/commands/hooks/list.js.map +1 -0
- package/dist/commands/{hook → hooks}/logs.js +3 -0
- package/dist/commands/hooks/logs.js.map +1 -0
- package/dist/commands/init.js +65 -13
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp/configure.js +3 -2
- package/dist/commands/mcp/configure.js.map +1 -1
- package/dist/commands/preview.js +1 -0
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/projects/create.js +3 -0
- package/dist/commands/projects/create.js.map +1 -1
- package/dist/commands/projects/list.js +3 -0
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/{schema → schemas}/delete.js +3 -0
- package/dist/commands/schemas/delete.js.map +1 -0
- package/dist/commands/{schema → schemas}/deploy.js +3 -0
- package/dist/commands/schemas/deploy.js.map +1 -0
- package/dist/commands/{schema → schemas}/extract.js +3 -0
- package/dist/commands/schemas/extract.js.map +1 -0
- package/dist/commands/{schema → schemas}/list.js +3 -0
- package/dist/commands/schemas/list.js.map +1 -0
- package/dist/commands/{schema → schemas}/validate.js +3 -0
- package/dist/commands/schemas/validate.js.map +1 -0
- package/dist/commands/tokens/add.js +3 -0
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/tokens/delete.js +3 -0
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +3 -0
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +3 -0
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +3 -0
- package/dist/commands/users/list.js.map +1 -1
- package/dist/hooks/commandNotFound/topicAliases.js +71 -0
- package/dist/hooks/commandNotFound/topicAliases.js.map +1 -0
- package/dist/services/mcp.js +32 -44
- package/dist/services/mcp.js.map +1 -1
- package/dist/topicAliases.js +51 -0
- package/dist/topicAliases.js.map +1 -0
- package/oclif.config.js +20 -7
- package/oclif.manifest.json +321 -209
- package/package.json +22 -21
- package/dist/actions/debug/formatters.js +0 -22
- package/dist/actions/debug/formatters.js.map +0 -1
- package/dist/actions/debug/getGlobalConfigLocation.js +0 -7
- package/dist/actions/debug/getGlobalConfigLocation.js.map +0 -1
- package/dist/commands/backup/disable.js.map +0 -1
- package/dist/commands/backup/download.js.map +0 -1
- package/dist/commands/backup/enable.js.map +0 -1
- package/dist/commands/backup/list.js.map +0 -1
- package/dist/commands/dataset/alias/create.js.map +0 -1
- package/dist/commands/dataset/alias/delete.js.map +0 -1
- package/dist/commands/dataset/alias/link.js.map +0 -1
- package/dist/commands/dataset/alias/unlink.js.map +0 -1
- package/dist/commands/dataset/copy.js.map +0 -1
- package/dist/commands/dataset/create.js.map +0 -1
- package/dist/commands/dataset/delete.js.map +0 -1
- package/dist/commands/dataset/embeddings/disable.js.map +0 -1
- package/dist/commands/dataset/embeddings/enable.js.map +0 -1
- package/dist/commands/dataset/embeddings/status.js.map +0 -1
- package/dist/commands/dataset/export.js.map +0 -1
- package/dist/commands/dataset/import.js.map +0 -1
- package/dist/commands/dataset/list.js.map +0 -1
- package/dist/commands/dataset/visibility/get.js.map +0 -1
- package/dist/commands/dataset/visibility/set.js.map +0 -1
- package/dist/commands/hook/attempt.js.map +0 -1
- package/dist/commands/hook/create.js.map +0 -1
- package/dist/commands/hook/delete.js.map +0 -1
- package/dist/commands/hook/list.js.map +0 -1
- package/dist/commands/hook/logs.js.map +0 -1
- package/dist/commands/schema/delete.js.map +0 -1
- package/dist/commands/schema/deploy.js.map +0 -1
- package/dist/commands/schema/extract.js.map +0 -1
- package/dist/commands/schema/list.js.map +0 -1
- package/dist/commands/schema/validate.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/projects/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport {DatasetResponse} from '@sanity/client'\n\nimport {createDataset} from '../../actions/dataset/create.js'\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {getOrganization} from '../../actions/organizations/getOrganization.js'\nimport {getManageUrl} from '../../actions/projects/getManageUrl.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForDefaultConfig} from '../../prompts/promptForDefaultConfig.js'\nimport {promptForProjectName} from '../../prompts/promptForProjectName.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {getProjectFeatures} from '../../services/getProjectFeatures.js'\nimport {OrganizationCreateResponse, ProjectOrganization} from '../../services/organizations.js'\nimport {createProject, CreateProjectResult} from '../../services/projects.js'\nimport {getCliUser} from '../../services/user.js'\n\nconst debug = subdebug('projects:create')\n\nexport class CreateProjectCommand extends SanityCommand<typeof CreateProjectCommand> {\n static override args = {\n projectName: Args.string({\n description: 'Name of the project to create',\n required: false,\n }),\n }\n\n static override description = 'Create a new Sanity project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create a project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My New Project\"',\n description: 'Create a project named \"My New Project\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My Project\" --organization=my-org',\n description: 'Create a project in a specific organization',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \"My Project\" --dataset=staging --dataset-visibility=private',\n description: 'Create a project with a private dataset named \"staging\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"CI Project\" --yes --json',\n description: 'Create a project non-interactively with JSON output',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n description: 'Create a dataset. Prompts for visibility unless specified or --yes used',\n parse: async (input) => {\n const datasetNameError = validateDatasetName(input)\n if (datasetNameError) {\n throw new CLIError(datasetNameError, {exit: 1})\n }\n\n return input\n },\n }),\n 'dataset-visibility': Flags.string({\n description: 'Dataset visibility: public or private',\n options: ['private', 'public'],\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output in JSON format',\n }),\n organization: Flags.string({\n description: 'Organization to create the project in',\n helpValue: '<slug|id>',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Skip prompts and use defaults (project: \"My Sanity Project\", dataset: production, visibility: public)',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateProjectCommand)\n const {projectName} = args\n const {dataset, 'dataset-visibility': datasetVisibility, organization, yes} = flags\n const user = await getCliUser()\n\n const finalProjectName =\n projectName ||\n (yes || this.isUnattended() ? 'My Sanity Project' : await promptForProjectName())\n\n debug('Creating project with options: %O', {\n dataset,\n datasetVisibility,\n organizationId: organization,\n projectName,\n unattended: yes,\n })\n\n let chosenOrganization: OrganizationCreateResponse | ProjectOrganization | undefined\n try {\n chosenOrganization = await getOrganization({\n isUnattended: this.isUnattended(),\n output: this.output,\n requestedId: organization,\n user,\n })\n } catch (error) {\n const errorText = organization\n ? `Failed to retrieve organization ${organization}`\n : 'Failed to retrieve an organization'\n this.error(`${errorText}: ${error}`, {exit: 1})\n }\n\n const spin = spinner('Creating project').start()\n let newProject\n try {\n newProject = await createProject({\n displayName: finalProjectName,\n metadata: {\n integration: 'cli',\n },\n organizationId: chosenOrganization?.id,\n })\n spin.succeed('Project created successfully')\n } catch (error) {\n spin.fail()\n debug(`Failed to create project: ${error}`)\n this.error(`Failed to create project: ${error}`, {exit: 1})\n }\n\n const newDataset = await this.handleDatasetCreation(\n newProject.projectId,\n dataset,\n datasetVisibility,\n )\n\n this.printProjectCreationSuccess(chosenOrganization, newProject, newDataset)\n }\n\n private async handleDatasetCreation(\n projectId: string,\n datasetFromFlag?: string,\n datasetVisibility?: string,\n ): Promise<DatasetResponse | undefined> {\n try {\n let datasetName: string | undefined = datasetFromFlag\n const existingDatasets = await listDatasets(projectId)\n const existingDatasetNames = existingDatasets.map((ds) => ds.name)\n\n // Prompt for dataset in interactive mode if not provided\n if (!datasetName && !this.isUnattended()) {\n const wantsDataset = await confirm({\n default: true,\n message: 'Would you like to create a dataset?',\n })\n\n if (wantsDataset) {\n const defaultConfig = await promptForDefaultConfig()\n\n datasetName = defaultConfig\n ? 'production'\n : await promptForDatasetName({}, existingDatasetNames)\n }\n }\n\n // Create dataset if we have a name\n if (datasetName) {\n const projectFeatures = await getProjectFeatures(projectId)\n return await createDataset({\n datasetName,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectFeatures,\n projectId,\n visibility: datasetVisibility,\n })\n }\n\n return\n } catch (error) {\n debug(`Error creating dataset: ${error}`)\n this.warn(`Project created but dataset creation failed: ${error}`)\n return\n }\n }\n\n private async printProjectCreationSuccess(\n organization: OrganizationCreateResponse | ProjectOrganization | undefined,\n project: CreateProjectResult,\n dataset: DatasetResponse | undefined,\n ) {\n if (this.flags.json) {\n this.log(JSON.stringify(project, null, 2))\n return\n }\n\n this.log(`Project created successfully!`)\n this.log(`ID: ${project.projectId}`)\n this.log(`Name: ${project.displayName}`)\n this.log(`Organization: ${organization?.name || 'Personal'}`)\n\n if (dataset) {\n this.log(`Dataset: ${dataset.datasetName} (${dataset.aclMode})`)\n }\n\n this.log(``)\n this.log(`Manage your project: ${getManageUrl(project.projectId)}`)\n }\n}\n"],"names":["Args","Flags","CLIError","SanityCommand","subdebug","confirm","spinner","createDataset","validateDatasetName","getOrganization","getManageUrl","promptForDatasetName","promptForDefaultConfig","promptForProjectName","listDatasets","getProjectFeatures","createProject","getCliUser","debug","CreateProjectCommand","args","projectName","string","description","required","examples","command","flags","dataset","parse","input","datasetNameError","exit","options","json","boolean","default","organization","helpValue","yes","char","run","datasetVisibility","user","finalProjectName","isUnattended","organizationId","unattended","chosenOrganization","output","requestedId","error","errorText","spin","start","newProject","displayName","metadata","integration","id","succeed","fail","newDataset","handleDatasetCreation","projectId","printProjectCreationSuccess","datasetFromFlag","datasetName","existingDatasets","existingDatasetNames","map","ds","name","wantsDataset","message","defaultConfig","projectFeatures","visibility","warn","project","log","JSON","stringify","aclMode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/projects/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport {DatasetResponse} from '@sanity/client'\n\nimport {createDataset} from '../../actions/dataset/create.js'\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {getOrganization} from '../../actions/organizations/getOrganization.js'\nimport {getManageUrl} from '../../actions/projects/getManageUrl.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForDefaultConfig} from '../../prompts/promptForDefaultConfig.js'\nimport {promptForProjectName} from '../../prompts/promptForProjectName.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {getProjectFeatures} from '../../services/getProjectFeatures.js'\nimport {OrganizationCreateResponse, ProjectOrganization} from '../../services/organizations.js'\nimport {createProject, CreateProjectResult} from '../../services/projects.js'\nimport {getCliUser} from '../../services/user.js'\n\nconst debug = subdebug('projects:create')\n\nexport class CreateProjectCommand extends SanityCommand<typeof CreateProjectCommand> {\n static override args = {\n projectName: Args.string({\n description: 'Name of the project to create',\n required: false,\n }),\n }\n\n static override description = 'Create a new Sanity project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create a project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My New Project\"',\n description: 'Create a project named \"My New Project\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My Project\" --organization=my-org',\n description: 'Create a project in a specific organization',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \"My Project\" --dataset=staging --dataset-visibility=private',\n description: 'Create a project with a private dataset named \"staging\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"CI Project\" --yes --json',\n description: 'Create a project non-interactively with JSON output',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n description: 'Create a dataset. Prompts for visibility unless specified or --yes used',\n parse: async (input) => {\n const datasetNameError = validateDatasetName(input)\n if (datasetNameError) {\n throw new CLIError(datasetNameError, {exit: 1})\n }\n\n return input\n },\n }),\n 'dataset-visibility': Flags.string({\n description: 'Dataset visibility: public or private',\n options: ['private', 'public'],\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output in JSON format',\n }),\n organization: Flags.string({\n description: 'Organization to create the project in',\n helpValue: '<slug|id>',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Skip prompts and use defaults (project: \"My Sanity Project\", dataset: production, visibility: public)',\n }),\n }\n\n static override hiddenAliases: string[] = ['project:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateProjectCommand)\n const {projectName} = args\n const {dataset, 'dataset-visibility': datasetVisibility, organization, yes} = flags\n const user = await getCliUser()\n\n const finalProjectName =\n projectName ||\n (yes || this.isUnattended() ? 'My Sanity Project' : await promptForProjectName())\n\n debug('Creating project with options: %O', {\n dataset,\n datasetVisibility,\n organizationId: organization,\n projectName,\n unattended: yes,\n })\n\n let chosenOrganization: OrganizationCreateResponse | ProjectOrganization | undefined\n try {\n chosenOrganization = await getOrganization({\n isUnattended: this.isUnattended(),\n output: this.output,\n requestedId: organization,\n user,\n })\n } catch (error) {\n const errorText = organization\n ? `Failed to retrieve organization ${organization}`\n : 'Failed to retrieve an organization'\n this.error(`${errorText}: ${error}`, {exit: 1})\n }\n\n const spin = spinner('Creating project').start()\n let newProject\n try {\n newProject = await createProject({\n displayName: finalProjectName,\n metadata: {\n integration: 'cli',\n },\n organizationId: chosenOrganization?.id,\n })\n spin.succeed('Project created successfully')\n } catch (error) {\n spin.fail()\n debug(`Failed to create project: ${error}`)\n this.error(`Failed to create project: ${error}`, {exit: 1})\n }\n\n const newDataset = await this.handleDatasetCreation(\n newProject.projectId,\n dataset,\n datasetVisibility,\n )\n\n this.printProjectCreationSuccess(chosenOrganization, newProject, newDataset)\n }\n\n private async handleDatasetCreation(\n projectId: string,\n datasetFromFlag?: string,\n datasetVisibility?: string,\n ): Promise<DatasetResponse | undefined> {\n try {\n let datasetName: string | undefined = datasetFromFlag\n const existingDatasets = await listDatasets(projectId)\n const existingDatasetNames = existingDatasets.map((ds) => ds.name)\n\n // Prompt for dataset in interactive mode if not provided\n if (!datasetName && !this.isUnattended()) {\n const wantsDataset = await confirm({\n default: true,\n message: 'Would you like to create a dataset?',\n })\n\n if (wantsDataset) {\n const defaultConfig = await promptForDefaultConfig()\n\n datasetName = defaultConfig\n ? 'production'\n : await promptForDatasetName({}, existingDatasetNames)\n }\n }\n\n // Create dataset if we have a name\n if (datasetName) {\n const projectFeatures = await getProjectFeatures(projectId)\n return await createDataset({\n datasetName,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectFeatures,\n projectId,\n visibility: datasetVisibility,\n })\n }\n\n return\n } catch (error) {\n debug(`Error creating dataset: ${error}`)\n this.warn(`Project created but dataset creation failed: ${error}`)\n return\n }\n }\n\n private async printProjectCreationSuccess(\n organization: OrganizationCreateResponse | ProjectOrganization | undefined,\n project: CreateProjectResult,\n dataset: DatasetResponse | undefined,\n ) {\n if (this.flags.json) {\n this.log(JSON.stringify(project, null, 2))\n return\n }\n\n this.log(`Project created successfully!`)\n this.log(`ID: ${project.projectId}`)\n this.log(`Name: ${project.displayName}`)\n this.log(`Organization: ${organization?.name || 'Personal'}`)\n\n if (dataset) {\n this.log(`Dataset: ${dataset.datasetName} (${dataset.aclMode})`)\n }\n\n this.log(``)\n this.log(`Manage your project: ${getManageUrl(project.projectId)}`)\n }\n}\n"],"names":["Args","Flags","CLIError","SanityCommand","subdebug","confirm","spinner","createDataset","validateDatasetName","getOrganization","getManageUrl","promptForDatasetName","promptForDefaultConfig","promptForProjectName","listDatasets","getProjectFeatures","createProject","getCliUser","debug","CreateProjectCommand","args","projectName","string","description","required","examples","command","flags","dataset","parse","input","datasetNameError","exit","options","json","boolean","default","organization","helpValue","yes","char","hiddenAliases","run","datasetVisibility","user","finalProjectName","isUnattended","organizationId","unattended","chosenOrganization","output","requestedId","error","errorText","spin","start","newProject","displayName","metadata","integration","id","succeed","fail","newDataset","handleDatasetCreation","projectId","printProjectCreationSuccess","datasetFromFlag","datasetName","existingDatasets","existingDatasetNames","map","ds","name","wantsDataset","message","defaultConfig","projectFeatures","visibility","warn","project","log","JSON","stringify","aclMode"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/projects/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport size from 'lodash-es/size.js'\nimport sortBy from 'lodash-es/sortBy.js'\n\nimport {listProjects} from '../../services/projects.js'\n\nconst sortFields = ['id', 'members', 'name', 'url', 'created']\n\nconst projectsDebug = subdebug('projects')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'Lists projects connected to your user'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List projects',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort=members --order=asc',\n description: 'List all users of the project, but exclude pending invitations and robots',\n },\n ]\n\n static override flags = {\n order: Flags.string({\n default: 'desc',\n options: ['asc', 'desc'],\n }),\n sort: Flags.string({\n default: 'created',\n options: sortFields,\n }),\n }\n\n public async run() {\n const {order, sort} = this.flags\n\n try {\n const projects = await listProjects()\n const ordered = sortBy(\n projects.map(({createdAt, displayName, id, members = []}) => {\n const manage = `https://www.sanity.io/manage/project/${id}`\n return [id, members.length, displayName, manage, createdAt].map(String)\n }),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n // Initialize maxWidths with the width of each header\n const maxWidths = sortFields.map((str) => size(str))\n\n // Calculate maximum width for each column\n for (const row of rows) {\n for (const [i, element] of row.entries()) {\n maxWidths[i] = Math.max(size(element), maxWidths[i])\n }\n }\n\n const printRow = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n this.log(styleText('cyan', printRow(sortFields)))\n for (const row of rows) this.log(printRow(row))\n } catch (error) {\n projectsDebug('Error listing projects', error)\n this.error('Failed to list projects', {exit: 1})\n }\n }\n}\n"],"names":["styleText","Flags","SanityCommand","subdebug","size","sortBy","listProjects","sortFields","projectsDebug","List","description","examples","command","flags","order","string","default","options","sort","run","projects","ordered","map","createdAt","displayName","id","members","manage","length","String","indexOf","rows","toReversed","maxWidths","str","row","i","element","entries","Math","max","printRow","col","padEnd","join","log","error","exit"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,OAAOC,UAAU,oBAAmB;AACpC,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,YAAY,QAAO,6BAA4B;AAEvD,MAAMC,aAAa;IAAC;IAAM;IAAW;IAAQ;IAAO;CAAU;AAE9D,MAAMC,gBAAgBL,SAAS;AAE/B,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,wCAAuC;IACrE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,OAAOb,MAAMc,MAAM,CAAC;YAClBC,SAAS;YACTC,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,MAAMjB,MAAMc,MAAM,CAAC;YACjBC,SAAS;YACTC,SAASV;QACX;IACF,EAAC;IAED,
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/projects/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport size from 'lodash-es/size.js'\nimport sortBy from 'lodash-es/sortBy.js'\n\nimport {listProjects} from '../../services/projects.js'\n\nconst sortFields = ['id', 'members', 'name', 'url', 'created']\n\nconst projectsDebug = subdebug('projects')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'Lists projects connected to your user'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List projects',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort=members --order=asc',\n description: 'List all users of the project, but exclude pending invitations and robots',\n },\n ]\n\n static override flags = {\n order: Flags.string({\n default: 'desc',\n options: ['asc', 'desc'],\n }),\n sort: Flags.string({\n default: 'created',\n options: sortFields,\n }),\n }\n\n static override hiddenAliases: string[] = ['project:list']\n\n public async run() {\n const {order, sort} = this.flags\n\n try {\n const projects = await listProjects()\n const ordered = sortBy(\n projects.map(({createdAt, displayName, id, members = []}) => {\n const manage = `https://www.sanity.io/manage/project/${id}`\n return [id, members.length, displayName, manage, createdAt].map(String)\n }),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n // Initialize maxWidths with the width of each header\n const maxWidths = sortFields.map((str) => size(str))\n\n // Calculate maximum width for each column\n for (const row of rows) {\n for (const [i, element] of row.entries()) {\n maxWidths[i] = Math.max(size(element), maxWidths[i])\n }\n }\n\n const printRow = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n this.log(styleText('cyan', printRow(sortFields)))\n for (const row of rows) this.log(printRow(row))\n } catch (error) {\n projectsDebug('Error listing projects', error)\n this.error('Failed to list projects', {exit: 1})\n }\n }\n}\n"],"names":["styleText","Flags","SanityCommand","subdebug","size","sortBy","listProjects","sortFields","projectsDebug","List","description","examples","command","flags","order","string","default","options","sort","hiddenAliases","run","projects","ordered","map","createdAt","displayName","id","members","manage","length","String","indexOf","rows","toReversed","maxWidths","str","row","i","element","entries","Math","max","printRow","col","padEnd","join","log","error","exit"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,OAAOC,UAAU,oBAAmB;AACpC,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,YAAY,QAAO,6BAA4B;AAEvD,MAAMC,aAAa;IAAC;IAAM;IAAW;IAAQ;IAAO;CAAU;AAE9D,MAAMC,gBAAgBL,SAAS;AAE/B,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,wCAAuC;IACrE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,OAAOb,MAAMc,MAAM,CAAC;YAClBC,SAAS;YACTC,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,MAAMjB,MAAMc,MAAM,CAAC;YACjBC,SAAS;YACTC,SAASV;QACX;IACF,EAAC;IAED,OAAgBY,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACN,KAAK,EAAEI,IAAI,EAAC,GAAG,IAAI,CAACL,KAAK;QAEhC,IAAI;YACF,MAAMQ,WAAW,MAAMf;YACvB,MAAMgB,UAAUjB,OACdgB,SAASE,GAAG,CAAC,CAAC,EAACC,SAAS,EAAEC,WAAW,EAAEC,EAAE,EAAEC,UAAU,EAAE,EAAC;gBACtD,MAAMC,SAAS,CAAC,qCAAqC,EAAEF,IAAI;gBAC3D,OAAO;oBAACA;oBAAIC,QAAQE,MAAM;oBAAEJ;oBAAaG;oBAAQJ;iBAAU,CAACD,GAAG,CAACO;YAClE,IACA;gBAACvB,WAAWwB,OAAO,CAACb;aAAM;YAG5B,MAAMc,OAAOlB,UAAU,QAAQQ,UAAUA,QAAQW,UAAU;YAE3D,qDAAqD;YACrD,MAAMC,YAAY3B,WAAWgB,GAAG,CAAC,CAACY,MAAQ/B,KAAK+B;YAE/C,0CAA0C;YAC1C,KAAK,MAAMC,OAAOJ,KAAM;gBACtB,KAAK,MAAM,CAACK,GAAGC,QAAQ,IAAIF,IAAIG,OAAO,GAAI;oBACxCL,SAAS,CAACG,EAAE,GAAGG,KAAKC,GAAG,CAACrC,KAAKkC,UAAUJ,SAAS,CAACG,EAAE;gBACrD;YACF;YAEA,MAAMK,WAAW,CAACN,MAChBA,IAAIb,GAAG,CAAC,CAACoB,KAAKN,IAAM,GAAGM,KAAK,CAACC,MAAM,CAACV,SAAS,CAACG,EAAE,GAAGQ,IAAI,CAAC;YAE1D,IAAI,CAACC,GAAG,CAAC9C,UAAU,QAAQ0C,SAASnC;YACpC,KAAK,MAAM6B,OAAOJ,KAAM,IAAI,CAACc,GAAG,CAACJ,SAASN;QAC5C,EAAE,OAAOW,OAAO;YACdvC,cAAc,0BAA0BuC;YACxC,IAAI,CAACA,KAAK,CAAC,2BAA2B;gBAACC,MAAM;YAAC;QAChD;IACF;AACF"}
|
|
@@ -47,6 +47,9 @@ export class DeleteSchemaCommand extends SanityCommand {
|
|
|
47
47
|
description: 'Enable verbose logging'
|
|
48
48
|
})
|
|
49
49
|
};
|
|
50
|
+
static hiddenAliases = [
|
|
51
|
+
'schema:delete'
|
|
52
|
+
];
|
|
50
53
|
async run() {
|
|
51
54
|
const { flags } = await this.parse(DeleteSchemaCommand);
|
|
52
55
|
const { dataset } = flags;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/schemas/delete.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\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 }\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} = flags\n\n deleteSchemaDebug('Running schema delete with flags: %O', flags)\n\n const ids = parseIds(flags.ids)\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})\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: 1},\n )\n }\n }\n}\n"],"names":["Flags","CLIError","SanityCommand","subdebug","deleteSchemaAction","parseIds","promptForProject","getDatasetFlag","getProjectIdFlag","deleteSchemaDebug","DeleteSchemaCommand","description","examples","command","flags","semantics","boolean","allowNo","default","hidden","ids","string","required","directory","verbose","hiddenAliases","run","parse","dataset","workDir","getProjectRoot","projectId","getProjectId","fallback","requiredPermissions","grant","permission","configPath","path","output","error","message","exit","Error","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,kBAAkB,QAAO,6CAA4C;AAC7E,SAAQC,QAAQ,QAAO,sDAAqD;AAC5E,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,EAAEC,gBAAgB,QAAO,4BAA2B;AAE1E,MAAMC,oBAAoBN,SAAS;AAEnC,OAAO,MAAMO,4BAA4BR;IACvC,OAAgBS,cAAc,gCAA+B;IAE7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SACE;YACFF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;QACF,GAAGR,eAAe;YAChBI,aAAa;YACbI,WAAW;QACb,EAAE;QACF,oBAAoBf,MAAMgB,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTP,aAAa;YACbQ,QAAQ;QACV;QACAC,KAAKpB,MAAMqB,MAAM,CAAC;YAChBV,aAAa;YACbW,UAAU;QACZ;QACA,gBAAgBtB,MAAMuB,SAAS,CAAC;YAC9BL,SAAS;YACTP,aAAa;YACbQ,QAAQ;QACV;QACAK,SAASxB,MAAMgB,OAAO,CAAC;YACrBE,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,OAAgBc,gBAA0B;QAAC;KAAgB,CAAA;IAE3D,MAAaC,MAAqB;QAChC,MAAM,EAACZ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACa,KAAK,CAACjB;QACjC,MAAM,EAACkB,OAAO,EAAC,GAAGd;QAElBL,kBAAkB,wCAAwCK;QAE1D,MAAMM,MAAMf,SAASS,MAAMM,GAAG;QAE9B,IAAI;YACF,MAAMS,UAAU,MAAM,IAAI,CAACC,cAAc;YACzC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;gBACxCC,UAAU,IACR3B,iBAAiB;wBACf4B,qBAAqB;4BAAC;gCAACC,OAAO;gCAAgBC,YAAY;4BAAgB;yBAAE;oBAC9E;YACJ;YAEA,MAAMhC,mBAAmB;gBACvBiC,YAAYR,QAAQS,IAAI;gBACxBV;gBACAR;gBACAmB,QAAQ,IAAI,CAACA,MAAM;gBACnBR;gBACAP,SAASV,KAAK,CAAC,UAAU;gBACzBe,SAASA,QAAQN,SAAS;YAC5B;QACF,EAAE,OAAOiB,OAAO;YACd,IAAIA,iBAAiBvC,UAAU;gBAC7B,IAAI,CAACuC,KAAK,CAACA,MAAMC,OAAO,EAAE;oBAACC,MAAM;gBAAC;YACpC;YAEAjC,kBAAkB,0BAA0B+B;YAC5C,IAAI,CAACA,KAAK,CACR,CAAC,0BAA0B,EAAEA,iBAAiBG,QAAQH,MAAMC,OAAO,GAAGG,OAAOJ,QAAQ,EACrF;gBAACE,MAAM;YAAC;QAEZ;IACF;AACF"}
|
|
@@ -0,0 +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 {SanityCommand} from '@sanity/cli-core'\n\nimport {deploySchemas} from '../../actions/schema/deploySchemas.js'\nimport {formatSchemaValidation} from '../../actions/schema/formatSchemaValidation.js'\nimport {schemasDeployDebug} from '../../actions/schema/utils/debug.js'\nimport {SchemaExtractionError} from '../../actions/schema/utils/SchemaExtractionError.js'\nimport {parseTag} from '../../actions/schema/utils/schemaStoreValidation.js'\n\nconst description = `\nDeploy schema documents into workspace datasets.\n\n**Note**: This command is experimental and subject to change.\n\nThis operation (re-)generates a manifest file describing the sanity config workspace by default.\nTo re-use an existing manifest file, 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: 'Disables manifest generation - the command will fail if no manifest exists',\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) throw new CLIError('workspace argument cannot be empty if specified', {exit: 1})\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)\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: 1})\n }\n }\n}\n"],"names":["styleText","Flags","CLIError","SanityCommand","deploySchemas","formatSchemaValidation","schemasDeployDebug","SchemaExtractionError","parseTag","description","trim","DeploySchemaCommand","examples","command","flags","boolean","allowNo","default","directory","helpValue","tag","string","parse","verbose","workspace","input","exit","hiddenAliases","run","workDir","getProjectRoot","workspaceName","log","error","validation","length","output","errorMessage","Error","message","String"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,aAAa,QAAO,wCAAuC;AACnE,SAAQC,sBAAsB,QAAO,iDAAgD;AACrF,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,qBAAqB,QAAO,sDAAqD;AACzF,SAAQC,QAAQ,QAAO,sDAAqD;AAE5E,MAAMC,cAAc,CAAC;;;;;;;AAOrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,4BAA4BR;IACvC,OAAgBM,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,oBAAoBb,MAAMc,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACA,gBAAgBR,MAAMiB,SAAS,CAAC;YAC9BD,SAAS;YACTR,aAAa;YACbU,WAAW;QACb;QACAC,KAAKnB,MAAMoB,MAAM,CAAC;YAChBZ,aAAa;YACbU,WAAW;YACXG,OAAOd;QACT;QACAe,SAAStB,MAAMc,OAAO,CAAC;YACrBE,SAAS;YACTR,aAAa;QACf;QACAe,WAAWvB,MAAMoB,MAAM,CAAC;YACtBZ,aAAa;YACbU,WAAW;YACXG,OAAO,OAAOG;gBACZ,IAAI,CAACA,OAAO,MAAM,IAAIvB,SAAS,mDAAmD;oBAACwB,MAAM;gBAAC;gBAC1F,OAAOD;YACT;QACF;IACF,EAAC;IAED,OAAgBE,gBAA0B;QAAC;KAAgB,CAAA;IAE3D,MAAaC,MAAqB;QAChC,MAAM,EAACd,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACX;QACjC,MAAM,EAACS,GAAG,EAAEI,SAAS,EAAC,GAAGV;QAEzB,IAAI;YACF,MAAMe,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGZ,SAAS;YAEvD,MAAMd,cAAc;gBAClBgB;gBACAG,SAAST,KAAK,CAAC,UAAU;gBACzBe;gBACAE,eAAeP;YACjB;YAEA,IAAI,CAACQ,GAAG,CACN,GAAGhC,UAAU,QAAQ,iCAAiC,CAAC,EAAEA,UAAU,QAAQ,uBAAuB;QAEtG,EAAE,OAAOiC,OAAO;YACd,IACEA,iBAAiB1B,yBACjB0B,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACJ,GAAG,CAAC3B,uBAAuB4B,MAAMC,UAAU;gBACvD,IAAI,CAACR,IAAI,CAAC;YACZ;YAEApB,mBAAmB,4BAA4B2B;YAC/C,MAAMI,eAAeJ,iBAAiBK,QAAQL,MAAMM,OAAO,GAAGC,OAAOP;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,2BAA2B,EAAEI,cAAc,EAAE;gBAACX,MAAM;YAAC;QACnE;IACF;AACF"}
|
|
@@ -49,6 +49,9 @@ export class ExtractSchemaCommand extends SanityCommand {
|
|
|
49
49
|
helpValue: '<name>'
|
|
50
50
|
})
|
|
51
51
|
};
|
|
52
|
+
static hiddenAliases = [
|
|
53
|
+
'schema:extract'
|
|
54
|
+
];
|
|
52
55
|
async run() {
|
|
53
56
|
const { flags } = await this.parse(ExtractSchemaCommand);
|
|
54
57
|
const projectRoot = await this.getProjectRoot();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/schemas/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {extractSchema} from '../../actions/schema/extractSchema.js'\nimport {getExtractOptions} from '../../actions/schema/getExtractOptions.js'\nimport {watchExtractSchema} from '../../actions/schema/watchExtractSchema.js'\n\nconst description = `\nExtracts a JSON representation of a Sanity schema within a Studio context.\n\n**Note**: This command is experimental and subject to change.\n`.trim()\n\nexport class ExtractSchemaCommand extends SanityCommand<typeof ExtractSchemaCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Extracts schema types in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --watch',\n description: 'Watch mode - re-extract on changes',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --watch --watch-patterns \"lib/**/*.ts\"',\n description: 'Watch with custom glob patterns',\n },\n ]\n\n static override flags = {\n 'enforce-required-fields': Flags.boolean({\n description: 'Makes the schema generated treat fields marked as required as non-optional',\n }),\n format: Flags.string({\n default: 'groq-type-nodes',\n description: 'Format the schema as GROQ type nodes. Only available format at the moment.',\n helpValue: '<format>',\n }),\n path: Flags.string({\n description: 'Optional path to specify destination of the schema file',\n }),\n watch: Flags.boolean({\n description: 'Enable watch mode to re-extract schema on file changes',\n }),\n 'watch-patterns': Flags.string({\n description: 'Additional glob pattern(s) to watch (can be specified multiple times)',\n helpValue: '<glob>',\n multiple: true,\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to generate a schema for',\n helpValue: '<name>',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:extract']\n\n public async run(): Promise<{close?: () => Promise<void>} | void> {\n const {flags} = await this.parse(ExtractSchemaCommand)\n const projectRoot = await this.getProjectRoot()\n\n const {schemaExtraction} = await this.getCliConfig()\n const extractOptions = getExtractOptions({\n flags,\n projectRoot,\n schemaExtraction,\n })\n\n if (flags.watch) {\n return watchExtractSchema({\n extractOptions,\n output: this.output,\n })\n }\n\n return extractSchema({\n extractOptions,\n output: this.output,\n })\n }\n}\n"],"names":["Flags","SanityCommand","extractSchema","getExtractOptions","watchExtractSchema","description","trim","ExtractSchemaCommand","examples","command","flags","boolean","format","string","default","helpValue","path","watch","multiple","workspace","hiddenAliases","run","parse","projectRoot","getProjectRoot","schemaExtraction","getCliConfig","extractOptions","output"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,aAAa,QAAO,wCAAuC;AACnE,SAAQC,iBAAiB,QAAO,4CAA2C;AAC3E,SAAQC,kBAAkB,QAAO,6CAA4C;AAE7E,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,6BAA6BN;IACxC,OAAgBI,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtB,2BAA2BV,MAAMW,OAAO,CAAC;YACvCN,aAAa;QACf;QACAO,QAAQZ,MAAMa,MAAM,CAAC;YACnBC,SAAS;YACTT,aAAa;YACbU,WAAW;QACb;QACAC,MAAMhB,MAAMa,MAAM,CAAC;YACjBR,aAAa;QACf;QACAY,OAAOjB,MAAMW,OAAO,CAAC;YACnBN,aAAa;QACf;QACA,kBAAkBL,MAAMa,MAAM,CAAC;YAC7BR,aAAa;YACbU,WAAW;YACXG,UAAU;QACZ;QACAC,WAAWnB,MAAMa,MAAM,CAAC;YACtBR,aAAa;YACbU,WAAW;QACb;IACF,EAAC;IAED,OAAgBK,gBAA0B;QAAC;KAAiB,CAAA;IAE5D,MAAaC,MAAqD;QAChE,MAAM,EAACX,KAAK,EAAC,GAAG,MAAM,IAAI,CAACY,KAAK,CAACf;QACjC,MAAMgB,cAAc,MAAM,IAAI,CAACC,cAAc;QAE7C,MAAM,EAACC,gBAAgB,EAAC,GAAG,MAAM,IAAI,CAACC,YAAY;QAClD,MAAMC,iBAAiBxB,kBAAkB;YACvCO;YACAa;YACAE;QACF;QAEA,IAAIf,MAAMO,KAAK,EAAE;YACf,OAAOb,mBAAmB;gBACxBuB;gBACAC,QAAQ,IAAI,CAACA,MAAM;YACrB;QACF;QAEA,OAAO1B,cAAc;YACnByB;YACAC,QAAQ,IAAI,CAACA,MAAM;QACrB;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/schemas/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {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 = `\nLists all schemas in the current dataset.\n\n**Note**: This command is experimental and subject to change.\n\nThis operation (re-)generates a manifest file describing the sanity config workspace by default.\nTo re-use an existing manifest file, 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: 'Disables manifest generation - the command will fail if no manifest exists',\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\n try {\n const projectRoot = await this.getProjectRoot()\n\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: 1,\n })\n }\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})\n }\n }\n}\n"],"names":["Flags","SanityCommand","listSchemas","schemasListDebug","parseWorkspaceSchemaId","description","trim","ListSchemaCommand","examples","command","flags","boolean","allowNo","default","hidden","id","string","helpValue","json","directory","hiddenAliases","run","parse","projectRoot","getProjectRoot","errors","schemaId","length","error","map","join","exit","configPath","path","output","workDir","errorMessage","Error","message","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,WAAW,QAAO,sCAAqC;AAC/D,SAAQC,gBAAgB,QAAO,sCAAqC;AACpE,SAAQC,sBAAsB,QAAO,sDAAqD;AAE1F,MAAMC,cAAc,CAAC;;;;;;;AAOrB,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,oBAAoBV,MAAMW,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTR,aAAa;YACbS,QAAQ;QACV;QACAC,IAAIf,MAAMgB,MAAM,CAAC;YACfX,aAAa;YACbY,WAAW;QACb;QACAC,MAAMlB,MAAMW,OAAO,CAAC;YAClBN,aAAa;QACf;QACA,gBAAgBL,MAAMmB,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;QAEjC,IAAI;YACF,MAAMgB,cAAc,MAAM,IAAI,CAACC,cAAc;YAE7C,MAAMC,SAAmB,EAAE;YAC3B,MAAMV,KAAKX,uBAAuBqB,QAAQf,MAAMK,EAAE,GAAGW;YACrD,IAAID,OAAOE,MAAM,GAAG,GAAG;gBACrB,IAAI,CAACC,KAAK,CAAC,CAAC,oBAAoB,EAAEH,OAAOI,GAAG,CAAC,CAACD,QAAU,CAAC,IAAI,EAAEA,OAAO,EAAEE,IAAI,CAAC,OAAO,EAAE;oBACpFC,MAAM;gBACR;YACF;YAEA,MAAM7B,YAAY;gBAChB8B,YAAYT,YAAYU,IAAI;gBAC5BlB;gBACAG,MAAM,CAAC,CAACR,MAAMQ,IAAI;gBAClBgB,QAAQ,IAAI,CAACA,MAAM;gBACnBC,SAASZ,YAAYJ,SAAS;YAChC;QACF,EAAE,OAAOS,OAAO;YACdzB,iBAAiB,0BAA0ByB;YAE3C,MAAMQ,eAAeR,iBAAiBS,QAAQT,MAAMU,OAAO,GAAGC,OAAOX;YACrE,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEQ,cAAc,EAAE;gBAACL,MAAM;YAAC;QACjE;IACF;AACF"}
|
|
@@ -48,6 +48,9 @@ export class SchemaValidate extends SanityCommand {
|
|
|
48
48
|
description: 'The name of the workspace to use when validating all schema types'
|
|
49
49
|
})
|
|
50
50
|
};
|
|
51
|
+
static hiddenAliases = [
|
|
52
|
+
'schema:validate'
|
|
53
|
+
];
|
|
51
54
|
async run() {
|
|
52
55
|
const { flags } = await this.parse(SchemaValidate);
|
|
53
56
|
const workDir = (await this.getProjectRoot()).directory;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/schemas/validate.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\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 this.error(\n `Error validating schema: ${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Flags","SanityCommand","subdebug","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"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,cAAc,QAAO,yCAAwC;AAErE,MAAMC,QAAQF,SAAS;AACvB,OAAO,MAAMG,uBAAuBJ;IAClC,OAAgBK,cAAc,sDAAqD;IAEnF,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aACE;QACJ;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,uBAAuBT,MAAMU,MAAM,CAAC;YAClCJ,aACE;YACFK,WAAW;QACb;QACAC,QAAQZ,MAAMU,MAAM,CAAC;YACnBG,SAAS;YACTP,aAAa;YACbQ,SAAS;gBAAC;gBAAU;gBAAU;aAAO;QACvC;QACAC,OAAOf,MAAMU,MAAM,CAAC;YAClBG,SAAS;YACTP,aAAa;YACbQ,SAAS;gBAAC;gBAAS;aAAU;QAC/B;QACAE,WAAWhB,MAAMU,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,IAAI,CAACA,KAAK,CACR,CAAC,yBAAyB,EAAEA,iBAAiBC,QAAQD,MAAME,OAAO,GAAGC,OAAOH,QAAQ,EACpF;gBAACI,MAAM;YAAC;QAEZ;IACF;AACF"}
|
|
@@ -55,6 +55,9 @@ export class AddTokenCommand extends SanityCommand {
|
|
|
55
55
|
description: 'Skip prompts and use defaults (unattended mode)'
|
|
56
56
|
})
|
|
57
57
|
};
|
|
58
|
+
static hiddenAliases = [
|
|
59
|
+
'token:add'
|
|
60
|
+
];
|
|
58
61
|
async run() {
|
|
59
62
|
const { args, flags } = await this.parse(AddTokenCommand);
|
|
60
63
|
const { label: givenLabel } = args;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/tokens/add.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {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 tokensAddDebug = subdebug('tokens:add')\n\nexport class AddTokenCommand extends SanityCommand<typeof AddTokenCommand> {\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 this 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({description: 'Project ID to add token to', semantics: 'override'}),\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',\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 public async run(): Promise<void> {\n const {args, flags} = await this.parse(AddTokenCommand)\n const {label: givenLabel} = args\n const {json, role} = flags\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 try {\n const label = givenLabel || (await this.promptForLabel())\n const roleName = await (role ? validateRole(role, projectId) : this.promptForRole(projectId))\n\n tokensAddDebug(`Creating token for project ${projectId}`, {label, roleName})\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('Token created successfully!')\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 above – this is your only chance to do so!')\n } catch (error) {\n const err = error as Error\n\n tokensAddDebug(`Error creating token for project ${projectId}`, err)\n this.error(`Token creation failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForLabel(): Promise<string> {\n if (this.isUnattended()) {\n this.error(\n 'Token label is required in non-interactive mode. Provide a label as an argument.',\n {\n exit: 1,\n },\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\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 tokensAddDebug('Robot roles', {robotRoles})\n\n if (robotRoles.length === 0) {\n this.error('No roles available for tokens', {exit: 1})\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","SanityCommand","subdebug","input","select","validateRole","promptForProject","createToken","getTokenRoles","getProjectIdFlag","tokensAddDebug","AddTokenCommand","args","label","string","description","required","examples","command","flags","semantics","json","boolean","default","role","helpValue","yes","char","run","parse","givenLabel","projectId","getProjectId","fallback","requiredPermissions","grant","permission","promptForLabel","roleName","promptForRole","token","log","JSON","stringify","id","roles","map","r","title","join","key","error","err","message","exit","isUnattended","validate","value","trim","robotRoles","filter","appliesToRobots","length","selectedRoleName","choices","name","short"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,EAAEC,MAAM,QAAO,sBAAqB;AAEjD,SAAQC,YAAY,QAAO,uCAAsC;AACjE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,WAAW,EAAEC,aAAa,QAAO,2BAA0B;AACnE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,iBAAiBR,SAAS;AAEhC,OAAO,MAAMS,wBAAwBV;IACnC,OAAgBW,OAAO;QACrBC,OAAOd,KAAKe,MAAM,CAAC;YACjBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,0CAAyC;IAEvE,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;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAACM,aAAa;YAA8BK,WAAW;QAAU,EAAE;QACvFC,MAAMrB,MAAMsB,OAAO,CAAC;YAClBC,SAAS;YACTR,aAAa;QACf;QACAS,MAAMxB,MAAMc,MAAM,CAAC;YACjBC,aAAa;YACbU,WAAW;QACb;QACAC,KAAK1B,MAAMsB,OAAO,CAAC;YACjBK,MAAM;YACNJ,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/tokens/add.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {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 tokensAddDebug = subdebug('tokens:add')\n\nexport class AddTokenCommand extends SanityCommand<typeof AddTokenCommand> {\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 this 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({description: 'Project ID to add token to', semantics: 'override'}),\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',\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[] = ['token:add']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(AddTokenCommand)\n const {label: givenLabel} = args\n const {json, role} = flags\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 try {\n const label = givenLabel || (await this.promptForLabel())\n const roleName = await (role ? validateRole(role, projectId) : this.promptForRole(projectId))\n\n tokensAddDebug(`Creating token for project ${projectId}`, {label, roleName})\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('Token created successfully!')\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 above – this is your only chance to do so!')\n } catch (error) {\n const err = error as Error\n\n tokensAddDebug(`Error creating token for project ${projectId}`, err)\n this.error(`Token creation failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForLabel(): Promise<string> {\n if (this.isUnattended()) {\n this.error(\n 'Token label is required in non-interactive mode. Provide a label as an argument.',\n {\n exit: 1,\n },\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\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 tokensAddDebug('Robot roles', {robotRoles})\n\n if (robotRoles.length === 0) {\n this.error('No roles available for tokens', {exit: 1})\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","SanityCommand","subdebug","input","select","validateRole","promptForProject","createToken","getTokenRoles","getProjectIdFlag","tokensAddDebug","AddTokenCommand","args","label","string","description","required","examples","command","flags","semantics","json","boolean","default","role","helpValue","yes","char","hiddenAliases","run","parse","givenLabel","projectId","getProjectId","fallback","requiredPermissions","grant","permission","promptForLabel","roleName","promptForRole","token","log","JSON","stringify","id","roles","map","r","title","join","key","error","err","message","exit","isUnattended","validate","value","trim","robotRoles","filter","appliesToRobots","length","selectedRoleName","choices","name","short"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/tokens/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {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 {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 this 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 private projectId!: string\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteTokensCommand)\n\n const unattended = flags.yes\n const {tokenId: givenTokenId} = args\n\n if (unattended && !givenTokenId) {\n this.error(\n 'Token ID is required in non-interactive mode. Provide a token ID as an argument.',\n {exit: 1},\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 let tokenId: string | undefined\n\n try {\n tokenId = givenTokenId || (await this.getTokenIdFromList())\n\n if (!unattended) {\n const confirmed = await confirm({\n default: false,\n message: `Are you sure you want to delete the token with ID \"${tokenId}\"?`,\n })\n\n if (!confirmed) {\n this.error('Operation cancelled', {exit: 1})\n }\n }\n\n await deleteToken({\n projectId: this.projectId,\n tokenId,\n })\n\n this.log('Token deleted successfully')\n } catch (error) {\n if (error instanceof ClientError && error.response.statusCode === 404) {\n this.error(`Token with ID \"${tokenId}\" not found`, {exit: 1})\n }\n\n const err = error as Error\n deleteTokenDebug(`Error deleting token`, err)\n this.error(`Token deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async getTokenIdFromList() {\n const tokens = await getTokens(this.projectId)\n\n if (tokens.length === 0) {\n this.error('No tokens found', {exit: 1})\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","SanityCommand","subdebug","confirm","select","ClientError","promptForProject","deleteToken","getTokens","getProjectIdFlag","deleteTokenDebug","DeleteTokensCommand","args","tokenId","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","projectId","run","parse","unattended","givenTokenId","error","exit","getProjectId","fallback","requiredPermissions","grant","permission","getTokenIdFromList","confirmed","default","message","log","response","statusCode","err","tokens","length","choices","map","token","name","label","roles","r","title","join","value","id"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,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,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBR,SAAS;AAElC,OAAO,MAAMS,4BAA4BV;IACvC,OAAgBW,OAAO;QACrBC,SAASd,KAAKe,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,wCAAuC;IAErE,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,KAAKrB,MAAMsB,OAAO,CAAC;YACjBC,SAAS;gBAAC;aAAI;YACdR,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/tokens/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {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 {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 this 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 unattended = flags.yes\n const {tokenId: givenTokenId} = args\n\n if (unattended && !givenTokenId) {\n this.error(\n 'Token ID is required in non-interactive mode. Provide a token ID as an argument.',\n {exit: 1},\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 let tokenId: string | undefined\n\n try {\n tokenId = givenTokenId || (await this.getTokenIdFromList())\n\n if (!unattended) {\n const confirmed = await confirm({\n default: false,\n message: `Are you sure you want to delete the token with ID \"${tokenId}\"?`,\n })\n\n if (!confirmed) {\n this.error('Operation cancelled', {exit: 1})\n }\n }\n\n await deleteToken({\n projectId: this.projectId,\n tokenId,\n })\n\n this.log('Token deleted successfully')\n } catch (error) {\n if (error instanceof ClientError && error.response.statusCode === 404) {\n this.error(`Token with ID \"${tokenId}\" not found`, {exit: 1})\n }\n\n const err = error as Error\n deleteTokenDebug(`Error deleting token`, err)\n this.error(`Token deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async getTokenIdFromList() {\n const tokens = await getTokens(this.projectId)\n\n if (tokens.length === 0) {\n this.error('No tokens found', {exit: 1})\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","SanityCommand","subdebug","confirm","select","ClientError","promptForProject","deleteToken","getTokens","getProjectIdFlag","deleteTokenDebug","DeleteTokensCommand","args","tokenId","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","hiddenAliases","projectId","run","parse","unattended","givenTokenId","error","exit","getProjectId","fallback","requiredPermissions","grant","permission","getTokenIdFromList","confirmed","default","message","log","response","statusCode","err","tokens","length","choices","map","token","name","label","roles","r","title","join","value","id"],"mappings":"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"}
|
|
@@ -32,6 +32,9 @@ export class TokensListCommand extends SanityCommand {
|
|
|
32
32
|
description: 'Output tokens in JSON format'
|
|
33
33
|
})
|
|
34
34
|
};
|
|
35
|
+
static hiddenAliases = [
|
|
36
|
+
'token:list'
|
|
37
|
+
];
|
|
35
38
|
async run() {
|
|
36
39
|
const { flags } = await this.parse(TokensListCommand);
|
|
37
40
|
const { json } = flags;
|
|
@@ -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 {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 {getErrorMessage} from '../../util/getErrorMessage.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 current project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List tokens for the current 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 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})\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","SanityCommand","subdebug","Table","promptForProject","getTokens","getErrorMessage","getProjectIdFlag","listTokenDebug","TokensListCommand","description","examples","command","flags","semantics","json","boolean","default","run","parse","outputJson","projectId","getProjectId","fallback","requiredPermissions","grant","permission","tokens","error","message","exit","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,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,QAAO,wBAAuB;AAG3C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,SAAS,QAAO,2BAA0B;AAClD,SAAQC,eAAe,QAAO,gCAA+B;AAC7D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,iBAAiBN,SAAS;AAEhC,OAAO,MAAMO,0BAA0BR;IACrC,OAAgBS,cAAc,0CAAyC;IACvE,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,MAAMf,MAAMgB,OAAO,CAAC;YAClBC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/tokens/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\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 {getErrorMessage} from '../../util/getErrorMessage.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 current project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List tokens for the current 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})\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","SanityCommand","subdebug","Table","promptForProject","getTokens","getErrorMessage","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","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,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,QAAO,wBAAuB;AAG3C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,SAAS,QAAO,2BAA0B;AAClD,SAAQC,eAAe,QAAO,gCAA+B;AAC7D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,iBAAiBN,SAAS;AAEhC,OAAO,MAAMO,0BAA0BR;IACrC,OAAgBS,cAAc,0CAAyC;IACvE,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,MAAMf,MAAMgB,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,IACRpB,iBAAiB;oBACfqB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAuB;qBAAE;gBAC7E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,SAAS,MAAMvB,UAAUiB;QAC3B,EAAE,OAAOO,OAAO;YACd,MAAMC,UAAUxB,gBAAgBuB;YAChCrB,eAAe,CAAC,kCAAkC,EAAEc,WAAW,EAAEO;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEC,SAAS,EAAE;gBAACC,MAAM;YAAC;QACjE;QAEA,IAAIV,YAAY;YACd,IAAI,CAACW,GAAG,CAACC,KAAKC,SAAS,CAACN,QAAQ,MAAM;YACtC;QACF;QAEA,IAAIA,OAAOO,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,EAAEb,OAAOO,MAAM,CAAC,WAAW,CAAC;QAC5C;QAEA,KAAK,MAAMO,SAASd,OAAQ;YAC1B,MAAMe,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/users/invite.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {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 {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 public async run(): Promise<void> {\n const {email: selectedEmail} = this.args\n const {role: selectedRole} = this.flags\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})\n }\n\n const email = selectedEmail || (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: 1},\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: 1})\n }\n\n this.error(`Error inviting user`, {exit: 1})\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","SanityCommand","subdebug","input","select","validateEmail","promptForProject","getProjectRoles","inviteUser","getProjectIdFlag","QUOTA_ERROR_MESSAGE","usersInviteDebug","UsersInviteCommand","args","email","string","description","required","examples","command","flags","semantics","role","run","selectedEmail","selectedRole","projectId","getProjectId","fallback","requiredPermissions","grant","permission","roles","filter","appliesToUsers","error","exit","promptForEmail","roleSelection","promptForRole","find","name","toLowerCase","map","r","join","log","statusCode","message","transformer","val","trim","validate","choices","title","value"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,EAAEC,MAAM,QAAO,sBAAqB;AAGjD,SAAQC,aAAa,QAAO,uCAAsC;AAClE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,eAAe,EAAEC,UAAU,QAAO,6BAA4B;AACtE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,sBACJ;AAEF,MAAMC,mBAAmBT,SAAS;AAElC,OAAO,MAAMU,2BAA2BX;IACtC,OAAgBY,OAAO;QACrBC,OAAOf,KAAKgB,MAAM,CAAC;YACjBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,mCAAkC;IAEhE,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,GAAGX,iBAAiB;YAClBO,aAAa;YACbK,WAAW;QACb,EAAE;QACFC,MAAMtB,MAAMe,MAAM,CAAC;YACjBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/users/invite.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {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 {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\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})\n }\n\n const email = selectedEmail || (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: 1},\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: 1})\n }\n\n this.error(`Error inviting user`, {exit: 1})\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","SanityCommand","subdebug","input","select","validateEmail","promptForProject","getProjectRoles","inviteUser","getProjectIdFlag","QUOTA_ERROR_MESSAGE","usersInviteDebug","UsersInviteCommand","args","email","string","description","required","examples","command","flags","semantics","role","hiddenAliases","run","selectedEmail","selectedRole","projectId","getProjectId","fallback","requiredPermissions","grant","permission","roles","filter","appliesToUsers","error","exit","promptForEmail","roleSelection","promptForRole","find","name","toLowerCase","map","r","join","log","statusCode","message","transformer","val","trim","validate","choices","title","value"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/users/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {Table} from 'console-table-printer'\nimport sortBy from 'lodash-es/sortBy.js'\n\nimport {getMembersForProject} from '../../actions/users/getMembersForProject.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst sortFields = ['id', 'name', 'role', 'date']\n\nfunction dimText(value: string, isDim: boolean): string {\n return isDim ? styleText('dim', value) : value\n}\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List all users of the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all users of the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --no-invitations --no-robots',\n description: 'List all users of the project, but exclude pending invitations and robots',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort role',\n description: 'List all users, sorted by role',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List users for a specific project',\n },\n ]\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list users for',\n semantics: 'override',\n }),\n invitations: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Includes or excludes pending invitations',\n }),\n order: Flags.string({\n default: 'asc',\n description: 'Sort output ascending/descending',\n options: ['asc', 'desc'],\n }),\n robots: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Includes or excludes robots (token users)',\n }),\n sort: Flags.string({\n default: 'date',\n description: 'Sort users by specified column',\n options: ['id', 'name', 'role', 'date'],\n }),\n }\n\n public async run(): Promise<void> {\n const {invitations, order, robots, sort} = this.flags\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project'},\n {grant: 'read', permission: 'sanity.project.members'},\n ],\n }),\n })\n\n const members = await getMembersForProject({\n includeInvitations: invitations,\n includeRobots: robots,\n projectId,\n })\n\n const ordered = sortBy(\n members.map(({date, id, name, roles}) => [\n id,\n name,\n roles\n ?.map((role) => role.title)\n .join(', ')\n .trim() || '-',\n date,\n ]),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n const table = new Table({\n columns: [\n {alignment: 'left', maxLen: 30, name: 'id', title: 'ID'},\n {alignment: 'left', maxLen: 40, name: 'name', title: 'Name'},\n {alignment: 'left', maxLen: 30, name: 'roles', title: 'Roles'},\n {alignment: 'left', maxLen: 12, name: 'date', title: 'Date'},\n ],\n rowSeparator: true,\n })\n\n for (const [id, name, roles, date] of rows) {\n const isPending = id === '<pending>'\n table.addRow({\n date: dimText(date, isPending),\n id: dimText(id, isPending),\n name: dimText(name, isPending),\n roles: dimText(roles, isPending),\n })\n }\n\n table.printTable()\n }\n}\n"],"names":["styleText","Flags","SanityCommand","Table","sortBy","getMembersForProject","promptForProject","getProjectIdFlag","sortFields","dimText","value","isDim","List","description","examples","command","flags","semantics","invitations","boolean","allowNo","default","order","string","options","robots","sort","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","members","includeInvitations","includeRobots","ordered","map","date","id","name","roles","role","title","join","trim","indexOf","rows","toReversed","table","columns","alignment","maxLen","rowSeparator","isPending","addRow","printTable"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAC9C,SAAQC,KAAK,QAAO,wBAAuB;AAC3C,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,oBAAoB,QAAO,8CAA6C;AAChF,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,aAAa;IAAC;IAAM;IAAQ;IAAQ;CAAO;AAEjD,SAASC,QAAQC,KAAa,EAAEC,KAAc;IAC5C,OAAOA,QAAQX,UAAU,OAAOU,SAASA;AAC3C;AAEA,OAAO,MAAME,aAAaV;IACxB,OAAgBW,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtB,GAAGT,iBAAiB;YAClBM,aAAa;YACbI,WAAW;QACb,EAAE;QACFC,aAAajB,MAAMkB,OAAO,CAAC;YACzBC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACAS,OAAOrB,MAAMsB,MAAM,CAAC;YAClBF,SAAS;YACTR,aAAa;YACbW,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,QAAQxB,MAAMkB,OAAO,CAAC;YACpBC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACAa,MAAMzB,MAAMsB,MAAM,CAAC;YACjBF,SAAS;YACTR,aAAa;YACbW,SAAS;gBAAC;gBAAM;gBAAQ;gBAAQ;aAAO;QACzC;IACF,EAAC;IAED,
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/users/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {Table} from 'console-table-printer'\nimport sortBy from 'lodash-es/sortBy.js'\n\nimport {getMembersForProject} from '../../actions/users/getMembersForProject.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst sortFields = ['id', 'name', 'role', 'date']\n\nfunction dimText(value: string, isDim: boolean): string {\n return isDim ? styleText('dim', value) : value\n}\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List all users of the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all users of the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --no-invitations --no-robots',\n description: 'List all users of the project, but exclude pending invitations and robots',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort role',\n description: 'List all users, sorted by role',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List users for a specific project',\n },\n ]\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list users for',\n semantics: 'override',\n }),\n invitations: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Includes or excludes pending invitations',\n }),\n order: Flags.string({\n default: 'asc',\n description: 'Sort output ascending/descending',\n options: ['asc', 'desc'],\n }),\n robots: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Includes or excludes robots (token users)',\n }),\n sort: Flags.string({\n default: 'date',\n description: 'Sort users by specified column',\n options: ['id', 'name', 'role', 'date'],\n }),\n }\n\n static override hiddenAliases: string[] = ['user:list']\n\n public async run(): Promise<void> {\n const {invitations, order, robots, sort} = this.flags\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project'},\n {grant: 'read', permission: 'sanity.project.members'},\n ],\n }),\n })\n\n const members = await getMembersForProject({\n includeInvitations: invitations,\n includeRobots: robots,\n projectId,\n })\n\n const ordered = sortBy(\n members.map(({date, id, name, roles}) => [\n id,\n name,\n roles\n ?.map((role) => role.title)\n .join(', ')\n .trim() || '-',\n date,\n ]),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n const table = new Table({\n columns: [\n {alignment: 'left', maxLen: 30, name: 'id', title: 'ID'},\n {alignment: 'left', maxLen: 40, name: 'name', title: 'Name'},\n {alignment: 'left', maxLen: 30, name: 'roles', title: 'Roles'},\n {alignment: 'left', maxLen: 12, name: 'date', title: 'Date'},\n ],\n rowSeparator: true,\n })\n\n for (const [id, name, roles, date] of rows) {\n const isPending = id === '<pending>'\n table.addRow({\n date: dimText(date, isPending),\n id: dimText(id, isPending),\n name: dimText(name, isPending),\n roles: dimText(roles, isPending),\n })\n }\n\n table.printTable()\n }\n}\n"],"names":["styleText","Flags","SanityCommand","Table","sortBy","getMembersForProject","promptForProject","getProjectIdFlag","sortFields","dimText","value","isDim","List","description","examples","command","flags","semantics","invitations","boolean","allowNo","default","order","string","options","robots","sort","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","members","includeInvitations","includeRobots","ordered","map","date","id","name","roles","role","title","join","trim","indexOf","rows","toReversed","table","columns","alignment","maxLen","rowSeparator","isPending","addRow","printTable"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAC9C,SAAQC,KAAK,QAAO,wBAAuB;AAC3C,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,oBAAoB,QAAO,8CAA6C;AAChF,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,aAAa;IAAC;IAAM;IAAQ;IAAQ;CAAO;AAEjD,SAASC,QAAQC,KAAa,EAAEC,KAAc;IAC5C,OAAOA,QAAQX,UAAU,OAAOU,SAASA;AAC3C;AAEA,OAAO,MAAME,aAAaV;IACxB,OAAgBW,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtB,GAAGT,iBAAiB;YAClBM,aAAa;YACbI,WAAW;QACb,EAAE;QACFC,aAAajB,MAAMkB,OAAO,CAAC;YACzBC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACAS,OAAOrB,MAAMsB,MAAM,CAAC;YAClBF,SAAS;YACTR,aAAa;YACbW,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,QAAQxB,MAAMkB,OAAO,CAAC;YACpBC,SAAS;YACTC,SAAS;YACTR,aAAa;QACf;QACAa,MAAMzB,MAAMsB,MAAM,CAAC;YACjBF,SAAS;YACTR,aAAa;YACbW,SAAS;gBAAC;gBAAM;gBAAQ;gBAAQ;aAAO;QACzC;IACF,EAAC;IAED,OAAgBG,gBAA0B;QAAC;KAAY,CAAA;IAEvD,MAAaC,MAAqB;QAChC,MAAM,EAACV,WAAW,EAAEI,KAAK,EAAEG,MAAM,EAAEC,IAAI,EAAC,GAAG,IAAI,CAACV,KAAK;QAErD,MAAMa,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRzB,iBAAiB;oBACf0B,qBAAqB;wBACnB;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;wBAC5C;4BAACD,OAAO;4BAAQC,YAAY;wBAAwB;qBACrD;gBACH;QACJ;QAEA,MAAMC,UAAU,MAAM9B,qBAAqB;YACzC+B,oBAAoBlB;YACpBmB,eAAeZ;YACfI;QACF;QAEA,MAAMS,UAAUlC,OACd+B,QAAQI,GAAG,CAAC,CAAC,EAACC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAEC,KAAK,EAAC,GAAK;gBACvCF;gBACAC;gBACAC,OACIJ,IAAI,CAACK,OAASA,KAAKC,KAAK,EACzBC,KAAK,MACLC,UAAU;gBACbP;aACD,GACD;YAAChC,WAAWwC,OAAO,CAACtB;SAAM;QAG5B,MAAMuB,OAAO3B,UAAU,QAAQgB,UAAUA,QAAQY,UAAU;QAE3D,MAAMC,QAAQ,IAAIhD,MAAM;YACtBiD,SAAS;gBACP;oBAACC,WAAW;oBAAQC,QAAQ;oBAAIZ,MAAM;oBAAMG,OAAO;gBAAI;gBACvD;oBAACQ,WAAW;oBAAQC,QAAQ;oBAAIZ,MAAM;oBAAQG,OAAO;gBAAM;gBAC3D;oBAACQ,WAAW;oBAAQC,QAAQ;oBAAIZ,MAAM;oBAASG,OAAO;gBAAO;gBAC7D;oBAACQ,WAAW;oBAAQC,QAAQ;oBAAIZ,MAAM;oBAAQG,OAAO;gBAAM;aAC5D;YACDU,cAAc;QAChB;QAEA,KAAK,MAAM,CAACd,IAAIC,MAAMC,OAAOH,KAAK,IAAIS,KAAM;YAC1C,MAAMO,YAAYf,OAAO;YACzBU,MAAMM,MAAM,CAAC;gBACXjB,MAAM/B,QAAQ+B,MAAMgB;gBACpBf,IAAIhC,QAAQgC,IAAIe;gBAChBd,MAAMjC,QAAQiC,MAAMc;gBACpBb,OAAOlC,QAAQkC,OAAOa;YACxB;QACF;QAEAL,MAAMO,UAAU;IAClB;AACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook: Topic Alias Resolution + Command Not Found
|
|
3
|
+
*
|
|
4
|
+
* Replaces oclif plugin-not-found as a plugin, calling it as a fallback instead.
|
|
5
|
+
* This avoids a race condition where both hooks run concurrently via Promise.all.
|
|
6
|
+
*
|
|
7
|
+
* This hook only fires for names oclif doesn't recognize. Registered topics
|
|
8
|
+
* and commands (including hiddenAliases) are resolved by oclif before this runs.
|
|
9
|
+
*
|
|
10
|
+
* Flow:
|
|
11
|
+
* 1. Check if the unrecognized name is a known alias (eg "dataset" for "datasets")
|
|
12
|
+
* 2. If yes: rewrite and run the resolved command (or show topic help for bare topics)
|
|
13
|
+
* 3. If no: fall back to oclif plugin-not-found's "did you mean?" behavior
|
|
14
|
+
*/ import { toStandardizedId } from '@oclif/core';
|
|
15
|
+
import { subdebug } from '@sanity/cli-core';
|
|
16
|
+
import { topicAliases } from '../../topicAliases.js';
|
|
17
|
+
const debug = subdebug('hooks:topicAliases');
|
|
18
|
+
// Build a lookup from alias names to candidate topics.
|
|
19
|
+
// This hook only fires for names oclif doesn't recognize. Since canonical
|
|
20
|
+
// topics (eg "datasets") are registered and resolved by oclif directly,
|
|
21
|
+
// only aliases (eg "dataset") reach here. We still map both directions
|
|
22
|
+
// so the hook is resilient to future renames or plugin-provided topics
|
|
23
|
+
// where the canonical name may not be a registered topic.
|
|
24
|
+
const topicMappings = new Map();
|
|
25
|
+
for (const [canonical, aliases] of Object.entries(topicAliases)){
|
|
26
|
+
// canonical -> all aliases
|
|
27
|
+
topicMappings.set(canonical, aliases);
|
|
28
|
+
// each alias -> [canonical]
|
|
29
|
+
for (const alias of aliases){
|
|
30
|
+
topicMappings.set(alias, [
|
|
31
|
+
canonical
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const hook = async function(opts) {
|
|
36
|
+
const { config, id } = opts;
|
|
37
|
+
// Standardize the ID (handles topic separator differences)
|
|
38
|
+
const standardId = toStandardizedId(id, config);
|
|
39
|
+
const parts = standardId.split(':');
|
|
40
|
+
const topic = parts[0];
|
|
41
|
+
const candidates = topicMappings.get(topic);
|
|
42
|
+
if (candidates) {
|
|
43
|
+
// Find which candidate topic actually has commands registered
|
|
44
|
+
const resolvedTopic = candidates.find((candidate)=>parts.length === 1 ? config.findTopic(candidate) : config.findCommand([
|
|
45
|
+
candidate,
|
|
46
|
+
...parts.slice(1)
|
|
47
|
+
].join(':')));
|
|
48
|
+
if (resolvedTopic) {
|
|
49
|
+
debug('Rewriting topic: %s -> %s', topic, resolvedTopic);
|
|
50
|
+
// Bare topic (eg "sanity dataset" with no subcommand) -> show topic help
|
|
51
|
+
if (parts.length === 1) {
|
|
52
|
+
return config.runCommand('help', [
|
|
53
|
+
resolvedTopic
|
|
54
|
+
]);
|
|
55
|
+
}
|
|
56
|
+
// Full command (eg "sanity dataset create") -> run the resolved command
|
|
57
|
+
const rewrittenId = [
|
|
58
|
+
resolvedTopic,
|
|
59
|
+
...parts.slice(1)
|
|
60
|
+
].join(':');
|
|
61
|
+
return config.runCommand(rewrittenId, opts.argv ?? []);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// No alias match - fall back to oclif plugin-not-found's "did you mean?" behavior
|
|
65
|
+
// eslint-disable-next-line no-restricted-syntax -- package import, not a file path
|
|
66
|
+
const { default: notFoundHook } = await import('@oclif/plugin-not-found');
|
|
67
|
+
return notFoundHook.call(this, opts);
|
|
68
|
+
};
|
|
69
|
+
export default hook;
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=topicAliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/commandNotFound/topicAliases.ts"],"sourcesContent":["/**\n * Hook: Topic Alias Resolution + Command Not Found\n *\n * Replaces oclif plugin-not-found as a plugin, calling it as a fallback instead.\n * This avoids a race condition where both hooks run concurrently via Promise.all.\n *\n * This hook only fires for names oclif doesn't recognize. Registered topics\n * and commands (including hiddenAliases) are resolved by oclif before this runs.\n *\n * Flow:\n * 1. Check if the unrecognized name is a known alias (eg \"dataset\" for \"datasets\")\n * 2. If yes: rewrite and run the resolved command (or show topic help for bare topics)\n * 3. If no: fall back to oclif plugin-not-found's \"did you mean?\" behavior\n */\n\nimport {type Hook, toStandardizedId} from '@oclif/core'\nimport {subdebug} from '@sanity/cli-core'\n\nimport {topicAliases} from '../../topicAliases.js'\n\nconst debug = subdebug('hooks:topicAliases')\n\n// Build a lookup from alias names to candidate topics.\n// This hook only fires for names oclif doesn't recognize. Since canonical\n// topics (eg \"datasets\") are registered and resolved by oclif directly,\n// only aliases (eg \"dataset\") reach here. We still map both directions\n// so the hook is resilient to future renames or plugin-provided topics\n// where the canonical name may not be a registered topic.\nconst topicMappings = new Map<string, string[]>()\nfor (const [canonical, aliases] of Object.entries(topicAliases)) {\n // canonical -> all aliases\n topicMappings.set(canonical, aliases)\n // each alias -> [canonical]\n for (const alias of aliases) {\n topicMappings.set(alias, [canonical])\n }\n}\n\nconst hook: Hook.CommandNotFound = async function (opts) {\n const {config, id} = opts\n\n // Standardize the ID (handles topic separator differences)\n const standardId = toStandardizedId(id, config)\n const parts = standardId.split(':')\n const topic = parts[0]\n\n const candidates = topicMappings.get(topic)\n if (candidates) {\n // Find which candidate topic actually has commands registered\n const resolvedTopic = candidates.find((candidate) =>\n parts.length === 1\n ? config.findTopic(candidate)\n : config.findCommand([candidate, ...parts.slice(1)].join(':')),\n )\n\n if (resolvedTopic) {\n debug('Rewriting topic: %s -> %s', topic, resolvedTopic)\n\n // Bare topic (eg \"sanity dataset\" with no subcommand) -> show topic help\n if (parts.length === 1) {\n return config.runCommand('help', [resolvedTopic])\n }\n\n // Full command (eg \"sanity dataset create\") -> run the resolved command\n const rewrittenId = [resolvedTopic, ...parts.slice(1)].join(':')\n return config.runCommand(rewrittenId, opts.argv ?? [])\n }\n }\n\n // No alias match - fall back to oclif plugin-not-found's \"did you mean?\" behavior\n // eslint-disable-next-line no-restricted-syntax -- package import, not a file path\n const {default: notFoundHook} = await import('@oclif/plugin-not-found')\n return notFoundHook.call(this, opts)\n}\n\nexport default hook\n"],"names":["toStandardizedId","subdebug","topicAliases","debug","topicMappings","Map","canonical","aliases","Object","entries","set","alias","hook","opts","config","id","standardId","parts","split","topic","candidates","get","resolvedTopic","find","candidate","length","findTopic","findCommand","slice","join","runCommand","rewrittenId","argv","default","notFoundHook","call"],"mappings":"AAAA;;;;;;;;;;;;;CAaC,GAED,SAAmBA,gBAAgB,QAAO,cAAa;AACvD,SAAQC,QAAQ,QAAO,mBAAkB;AAEzC,SAAQC,YAAY,QAAO,wBAAuB;AAElD,MAAMC,QAAQF,SAAS;AAEvB,uDAAuD;AACvD,0EAA0E;AAC1E,wEAAwE;AACxE,uEAAuE;AACvE,uEAAuE;AACvE,0DAA0D;AAC1D,MAAMG,gBAAgB,IAAIC;AAC1B,KAAK,MAAM,CAACC,WAAWC,QAAQ,IAAIC,OAAOC,OAAO,CAACP,cAAe;IAC/D,2BAA2B;IAC3BE,cAAcM,GAAG,CAACJ,WAAWC;IAC7B,4BAA4B;IAC5B,KAAK,MAAMI,SAASJ,QAAS;QAC3BH,cAAcM,GAAG,CAACC,OAAO;YAACL;SAAU;IACtC;AACF;AAEA,MAAMM,OAA6B,eAAgBC,IAAI;IACrD,MAAM,EAACC,MAAM,EAAEC,EAAE,EAAC,GAAGF;IAErB,2DAA2D;IAC3D,MAAMG,aAAahB,iBAAiBe,IAAID;IACxC,MAAMG,QAAQD,WAAWE,KAAK,CAAC;IAC/B,MAAMC,QAAQF,KAAK,CAAC,EAAE;IAEtB,MAAMG,aAAahB,cAAciB,GAAG,CAACF;IACrC,IAAIC,YAAY;QACd,8DAA8D;QAC9D,MAAME,gBAAgBF,WAAWG,IAAI,CAAC,CAACC,YACrCP,MAAMQ,MAAM,KAAK,IACbX,OAAOY,SAAS,CAACF,aACjBV,OAAOa,WAAW,CAAC;gBAACH;mBAAcP,MAAMW,KAAK,CAAC;aAAG,CAACC,IAAI,CAAC;QAG7D,IAAIP,eAAe;YACjBnB,MAAM,6BAA6BgB,OAAOG;YAE1C,yEAAyE;YACzE,IAAIL,MAAMQ,MAAM,KAAK,GAAG;gBACtB,OAAOX,OAAOgB,UAAU,CAAC,QAAQ;oBAACR;iBAAc;YAClD;YAEA,wEAAwE;YACxE,MAAMS,cAAc;gBAACT;mBAAkBL,MAAMW,KAAK,CAAC;aAAG,CAACC,IAAI,CAAC;YAC5D,OAAOf,OAAOgB,UAAU,CAACC,aAAalB,KAAKmB,IAAI,IAAI,EAAE;QACvD;IACF;IAEA,kFAAkF;IAClF,mFAAmF;IACnF,MAAM,EAACC,SAASC,YAAY,EAAC,GAAG,MAAM,MAAM,CAAC;IAC7C,OAAOA,aAAaC,IAAI,CAAC,IAAI,EAAEtB;AACjC;AAEA,eAAeD,KAAI"}
|