@sanity/cli 8.23.0 → 8.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +401 -87
  2. package/bin/run.js +7 -1
  3. package/dist/actions/codemods/dashboard.js +136 -8
  4. package/dist/actions/codemods/dashboard.js.map +1 -1
  5. package/dist/actions/codemods/types.js.map +1 -1
  6. package/dist/actions/dev/devAction.js +48 -44
  7. package/dist/actions/dev/devAction.js.map +1 -1
  8. package/dist/actions/init/initHelpers.js +1 -1
  9. package/dist/actions/init/initHelpers.js.map +1 -1
  10. package/dist/actions/init/initStudio.js +1 -1
  11. package/dist/actions/init/initStudio.js.map +1 -1
  12. package/dist/actions/init/project/getOrCreateDataset.js +10 -12
  13. package/dist/actions/init/project/getOrCreateDataset.js.map +1 -1
  14. package/dist/actions/init/project/getOrCreateProject.js +7 -5
  15. package/dist/actions/init/project/getOrCreateProject.js.map +1 -1
  16. package/dist/actions/init/project/promptUserForOrganization.js +6 -4
  17. package/dist/actions/init/project/promptUserForOrganization.js.map +1 -1
  18. package/dist/commands/api.js +1 -1
  19. package/dist/commands/api.js.map +1 -1
  20. package/dist/commands/assets/upload.js +1 -1
  21. package/dist/commands/assets/upload.js.map +1 -1
  22. package/dist/commands/codemod.js +1 -0
  23. package/dist/commands/codemod.js.map +1 -1
  24. package/dist/commands/cors/add.js +1 -1
  25. package/dist/commands/cors/add.js.map +1 -1
  26. package/dist/commands/cors/delete.js +1 -1
  27. package/dist/commands/cors/delete.js.map +1 -1
  28. package/dist/commands/cors/list.js +1 -1
  29. package/dist/commands/cors/list.js.map +1 -1
  30. package/dist/commands/datasets/alias/create.js +1 -1
  31. package/dist/commands/datasets/alias/create.js.map +1 -1
  32. package/dist/commands/datasets/import.js +0 -8
  33. package/dist/commands/datasets/import.js.map +1 -1
  34. package/dist/commands/datasets/list.js +1 -1
  35. package/dist/commands/datasets/list.js.map +1 -1
  36. package/dist/commands/documents/create.js +1 -1
  37. package/dist/commands/documents/create.js.map +1 -1
  38. package/dist/commands/documents/delete.js +1 -1
  39. package/dist/commands/documents/delete.js.map +1 -1
  40. package/dist/commands/documents/get.js +1 -1
  41. package/dist/commands/documents/get.js.map +1 -1
  42. package/dist/commands/documents/query.js +1 -9
  43. package/dist/commands/documents/query.js.map +1 -1
  44. package/dist/commands/documents/validate.js +2 -2
  45. package/dist/commands/documents/validate.js.map +1 -1
  46. package/dist/commands/graphql/list.js +1 -1
  47. package/dist/commands/graphql/list.js.map +1 -1
  48. package/dist/commands/graphql/undeploy.js +1 -11
  49. package/dist/commands/graphql/undeploy.js.map +1 -1
  50. package/dist/commands/hooks/attempt.js +1 -1
  51. package/dist/commands/hooks/attempt.js.map +1 -1
  52. package/dist/commands/hooks/create.js +1 -1
  53. package/dist/commands/hooks/create.js.map +1 -1
  54. package/dist/commands/hooks/delete.js +1 -1
  55. package/dist/commands/hooks/delete.js.map +1 -1
  56. package/dist/commands/hooks/list.js +1 -1
  57. package/dist/commands/hooks/list.js.map +1 -1
  58. package/dist/commands/hooks/logs.js +1 -1
  59. package/dist/commands/hooks/logs.js.map +1 -1
  60. package/dist/commands/init.js +3 -5
  61. package/dist/commands/init.js.map +1 -1
  62. package/dist/commands/migrations/run.js +5 -5
  63. package/dist/commands/migrations/run.js.map +1 -1
  64. package/dist/commands/projects/unclaimed.js +6 -5
  65. package/dist/commands/projects/unclaimed.js.map +1 -1
  66. package/dist/commands/tokens/create.js +4 -4
  67. package/dist/commands/tokens/create.js.map +1 -1
  68. package/dist/commands/tokens/delete.js +2 -2
  69. package/dist/commands/tokens/delete.js.map +1 -1
  70. package/dist/commands/tokens/list.js +2 -2
  71. package/dist/commands/tokens/list.js.map +1 -1
  72. package/dist/commands/users/invite.js +1 -1
  73. package/dist/commands/users/invite.js.map +1 -1
  74. package/dist/commands/users/list.js +1 -1
  75. package/dist/commands/users/list.js.map +1 -1
  76. package/dist/exports/invokeSanityCli/index.js +1 -1
  77. package/dist/exports/invokeSanityCli/index.js.map +1 -1
  78. package/dist/hooks/prerun/injectEnvVariables.js +1 -1
  79. package/dist/hooks/prerun/injectEnvVariables.js.map +1 -1
  80. package/dist/util/searchChoices.js +52 -0
  81. package/dist/util/searchChoices.js.map +1 -0
  82. package/dist/util/sharedFlags.js +8 -4
  83. package/dist/util/sharedFlags.js.map +1 -1
  84. package/dist/util/warnOnNonProductionEnvironment.js +4 -3
  85. package/dist/util/warnOnNonProductionEnvironment.js.map +1 -1
  86. package/oclif.manifest.json +515 -351
  87. package/package.json +8 -8
  88. package/dist/util/getSanityEnv.js +0 -8
  89. package/dist/util/getSanityEnv.js.map +0 -1
  90. package/templates/shopify/.gitignore +0 -26
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/documents/validate.ts"],"sourcesContent":["import {stat} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes} from '@sanity/cli-core'\nimport {ProjectRootNotFoundError} from '@sanity/cli-core/errors'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {type CliConfig} from '@sanity/cli-core/types'\nimport {confirm, logSymbols} from '@sanity/cli-core/ux'\n\nimport {type Level} from '../../actions/documents/types.js'\nimport {validateDocuments} from '../../actions/documents/validate.js'\nimport {reporters} from '../../actions/documents/validation/reporters/index.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nexport class ValidateDocumentsCommand extends SanityCommand<typeof ValidateDocumentsCommand> {\n static description = 'Validate documents in a dataset against the studio schema'\n\n static examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Validates all documents in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default --dataset staging',\n description: 'Override the dataset specified in the workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --yes > report.txt',\n description: 'Save the results of the report into a file',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --level info',\n description: 'Report out info level validation markers too',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123 --dataset production',\n description: 'Validate documents in a specific project and dataset',\n },\n ]\n\n static flags = {\n ...getProjectIdFlag({\n description:\n 'Override the project ID used. By default, this is derived from the given workspace',\n semantics: 'specify',\n }),\n ...getDatasetFlag({\n description:\n 'Override the dataset used. By default, this is derived from the given workspace',\n semantics: 'specify',\n }),\n file: Flags.string({\n description:\n 'Path to an NDJSON file or tar archive containing an NDJSON file (optionally gzip-compressed)',\n }),\n format: Flags.string({\n description:\n 'The output format used to print the found validation markers and report progress',\n options: ['json', 'ndjson', 'pretty'],\n }),\n level: Flags.custom<Level>({\n default: 'warning',\n description: 'The minimum level reported. Defaults to warning',\n options: ['error', 'warning', 'info'],\n })(),\n 'max-custom-validation-concurrency': Flags.integer({\n default: 5,\n description: 'Specify how many custom validators can run concurrently',\n }),\n 'max-fetch-concurrency': Flags.integer({\n default: 25,\n description: 'Specify how many `client.fetch` requests are allowed to run concurrently',\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to use when downloading and validating all documents',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Skips the first confirmation prompt',\n }),\n }\n\n static override hiddenAliases: string[] = ['document:validate']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ValidateDocumentsCommand)\n const {\n dataset,\n file,\n format,\n level,\n 'max-custom-validation-concurrency': maxCustomValidationConcurrency,\n 'max-fetch-concurrency': maxFetchConcurrency,\n 'project-id': projectId,\n workspace,\n } = flags\n const unattendedMode = this.isUnattended()\n\n let workDir: string\n let cliConfig: CliConfig\n try {\n const root = await this.getProjectRoot()\n workDir = root.directory\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n return this.output.error(\n 'This command must be run from within a Sanity project directory (requires studio schema for validation)',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n throw err\n }\n\n let ndjsonFilePath\n if (file) {\n const filePath = path.resolve(workDir, file)\n\n let fileStat\n try {\n fileStat = await stat(filePath)\n } catch {\n return this.output.error(\n `File not found: ${file}. Pass an existing NDJSON file or tar archive with \\`--file <path>\\`.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n if (!fileStat.isFile()) {\n return this.output.error(\n `Invalid file path: ${file} is not a file. Pass an NDJSON file or tar archive with \\`--file <path>\\`.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n ndjsonFilePath = filePath\n }\n\n if (!unattendedMode) {\n this.output.log(\n `${styleText('yellow', `${logSymbols.warning} Warning:`)} This command ${\n file\n ? 'reads all documents from your input file'\n : 'downloads all documents from your dataset'\n } and processes them through your local schema within a ` +\n `simulated browser environment.\\n`,\n )\n this.output.log(`Potential pitfalls:\\n`)\n this.output.log(\n `- Processes all documents locally (excluding assets). Large datasets may require more resources.`,\n )\n this.output.log(\n `- Executes all custom validation functions. Some functions may need to be refactored for compatibility.`,\n )\n this.output.log(\n `- Not all standard browser features are available and may cause issues while loading your Studio.`,\n )\n this.output.log(\n `- Adheres to document permissions. Ensure this account can see all desired documents.`,\n )\n if (file) {\n this.output.log(\n `- Checks for missing document references against the live dataset if not found in your file.`,\n )\n }\n\n const confirmed = await confirm({\n default: true,\n message: `Are you sure you want to continue?`,\n })\n\n if (!confirmed) {\n this.output.log('Validation cancelled')\n return this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const overallLevel = await validateDocuments({\n dataset,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n ndjsonFilePath,\n projectId,\n reporter: (worker) => {\n const reporter =\n format && format in reporters\n ? reporters[format as keyof typeof reporters]\n : reporters.pretty\n\n return reporter({flags, output: this.output, worker})\n },\n studioHost: cliConfig.studioHost,\n workDir,\n workspace,\n })\n\n if (overallLevel === 'error') {\n return this.exit(exitCodes.RUNTIME_ERROR)\n }\n } catch (err) {\n return this.output.error(err instanceof Error ? err.message : String(err), {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["stat","path","styleText","Flags","exitCodes","ProjectRootNotFoundError","SanityCommand","confirm","logSymbols","validateDocuments","reporters","getDatasetFlag","getProjectIdFlag","ValidateDocumentsCommand","description","examples","command","flags","semantics","file","string","format","options","level","custom","default","integer","workspace","yes","boolean","char","hiddenAliases","run","parse","dataset","maxCustomValidationConcurrency","maxFetchConcurrency","projectId","unattendedMode","isUnattended","workDir","cliConfig","root","getProjectRoot","directory","getCliConfig","err","output","error","exit","RUNTIME_ERROR","ndjsonFilePath","filePath","resolve","fileStat","USAGE_ERROR","isFile","log","warning","confirmed","message","USER_ABORT","overallLevel","reporter","worker","pretty","studioHost","Error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/documents/validate.ts"],"sourcesContent":["import {stat} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes} from '@sanity/cli-core'\nimport {ProjectRootNotFoundError} from '@sanity/cli-core/errors'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {type CliConfig} from '@sanity/cli-core/types'\nimport {confirm, logSymbols} from '@sanity/cli-core/ux'\n\nimport {type Level} from '../../actions/documents/types.js'\nimport {validateDocuments} from '../../actions/documents/validate.js'\nimport {reporters} from '../../actions/documents/validation/reporters/index.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nexport class ValidateDocumentsCommand extends SanityCommand<typeof ValidateDocumentsCommand> {\n static description = 'Validate documents in a dataset against the studio schema'\n\n static examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default',\n description: 'Validates all documents in a Sanity project with more than one workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --workspace default --dataset staging',\n description: 'Override the dataset specified in the workspace',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --yes > report.txt',\n description: 'Save the results of the report into a file',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --level info',\n description: 'Report out info level validation markers too',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123 --dataset production',\n description: 'Validate documents in a specific project and dataset',\n },\n ]\n\n static flags = {\n ...getProjectIdFlag({\n description:\n 'Override the project ID used. By default, this is derived from the given workspace',\n semantics: 'specify',\n }),\n ...getDatasetFlag({\n description:\n 'Override the dataset used. By default, this is derived from the given workspace',\n semantics: 'specify',\n }),\n file: Flags.string({\n description:\n 'Path to an NDJSON file or tar archive containing an NDJSON file (optionally gzip-compressed)',\n }),\n format: Flags.string({\n description:\n 'The output format used to print the found validation markers and report progress',\n options: ['json', 'ndjson', 'pretty'],\n }),\n level: Flags.custom<Level>({\n default: 'warning',\n description: 'The minimum level reported. Defaults to warning',\n options: ['error', 'warning', 'info'],\n })(),\n 'max-custom-validation-concurrency': Flags.integer({\n default: 5,\n description: 'Specify how many custom validators can run concurrently',\n }),\n 'max-fetch-concurrency': Flags.integer({\n default: 25,\n description: 'Specify how many `client.fetch` requests are allowed to run concurrently',\n }),\n workspace: Flags.string({\n description: 'The name of the workspace to use when downloading and validating all documents',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Skips the first confirmation prompt',\n }),\n }\n\n static override hiddenAliases: string[] = ['document:validate']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ValidateDocumentsCommand)\n const {\n dataset,\n file,\n format,\n level,\n 'max-custom-validation-concurrency': maxCustomValidationConcurrency,\n 'max-fetch-concurrency': maxFetchConcurrency,\n project: projectId,\n workspace,\n } = flags\n const unattendedMode = this.isUnattended()\n\n let workDir: string\n let cliConfig: CliConfig\n try {\n const root = await this.getProjectRoot()\n workDir = root.directory\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n return this.output.error(\n 'This command must be run from within a Sanity project directory (requires studio schema for validation)',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n throw err\n }\n\n let ndjsonFilePath\n if (file) {\n const filePath = path.resolve(workDir, file)\n\n let fileStat\n try {\n fileStat = await stat(filePath)\n } catch {\n return this.output.error(\n `File not found: ${file}. Pass an existing NDJSON file or tar archive with \\`--file <path>\\`.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n if (!fileStat.isFile()) {\n return this.output.error(\n `Invalid file path: ${file} is not a file. Pass an NDJSON file or tar archive with \\`--file <path>\\`.`,\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n ndjsonFilePath = filePath\n }\n\n if (!unattendedMode) {\n this.output.log(\n `${styleText('yellow', `${logSymbols.warning} Warning:`)} This command ${\n file\n ? 'reads all documents from your input file'\n : 'downloads all documents from your dataset'\n } and processes them through your local schema within a ` +\n `simulated browser environment.\\n`,\n )\n this.output.log(`Potential pitfalls:\\n`)\n this.output.log(\n `- Processes all documents locally (excluding assets). Large datasets may require more resources.`,\n )\n this.output.log(\n `- Executes all custom validation functions. Some functions may need to be refactored for compatibility.`,\n )\n this.output.log(\n `- Not all standard browser features are available and may cause issues while loading your Studio.`,\n )\n this.output.log(\n `- Adheres to document permissions. Ensure this account can see all desired documents.`,\n )\n if (file) {\n this.output.log(\n `- Checks for missing document references against the live dataset if not found in your file.`,\n )\n }\n\n const confirmed = await confirm({\n default: true,\n message: `Are you sure you want to continue?`,\n })\n\n if (!confirmed) {\n this.output.log('Validation cancelled')\n return this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const overallLevel = await validateDocuments({\n dataset,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n ndjsonFilePath,\n projectId,\n reporter: (worker) => {\n const reporter =\n format && format in reporters\n ? reporters[format as keyof typeof reporters]\n : reporters.pretty\n\n return reporter({flags, output: this.output, worker})\n },\n studioHost: cliConfig.studioHost,\n workDir,\n workspace,\n })\n\n if (overallLevel === 'error') {\n return this.exit(exitCodes.RUNTIME_ERROR)\n }\n } catch (err) {\n return this.output.error(err instanceof Error ? err.message : String(err), {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["stat","path","styleText","Flags","exitCodes","ProjectRootNotFoundError","SanityCommand","confirm","logSymbols","validateDocuments","reporters","getDatasetFlag","getProjectIdFlag","ValidateDocumentsCommand","description","examples","command","flags","semantics","file","string","format","options","level","custom","default","integer","workspace","yes","boolean","char","hiddenAliases","run","parse","dataset","maxCustomValidationConcurrency","maxFetchConcurrency","project","projectId","unattendedMode","isUnattended","workDir","cliConfig","root","getProjectRoot","directory","getCliConfig","err","output","error","exit","RUNTIME_ERROR","ndjsonFilePath","filePath","resolve","fileStat","USAGE_ERROR","isFile","log","warning","confirmed","message","USER_ABORT","overallLevel","reporter","worker","pretty","studioHost","Error","String"],"mappings":"AAAA,SAAQA,IAAI,QAAO,mBAAkB;AACrC,OAAOC,UAAU,YAAW;AAC5B,SAAQC,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,QAAO,mBAAkB;AAC1C,SAAQC,wBAAwB,QAAO,0BAAyB;AAChE,SAAQC,aAAa,QAAO,iCAAgC;AAE5D,SAAQC,OAAO,EAAEC,UAAU,QAAO,sBAAqB;AAGvD,SAAQC,iBAAiB,QAAO,sCAAqC;AACrE,SAAQC,SAAS,QAAO,wDAAuD;AAC/E,SAAQC,cAAc,EAAEC,gBAAgB,QAAO,4BAA2B;AAE1E,OAAO,MAAMC,iCAAiCP;IAC5C,OAAOQ,cAAc,4DAA2D;IAEhF,OAAOC,WAAW;QAChB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAOG,QAAQ;QACb,GAAGL,iBAAiB;YAClBE,aACE;YACFI,WAAW;QACb,EAAE;QACF,GAAGP,eAAe;YAChBG,aACE;YACFI,WAAW;QACb,EAAE;QACFC,MAAMhB,MAAMiB,MAAM,CAAC;YACjBN,aACE;QACJ;QACAO,QAAQlB,MAAMiB,MAAM,CAAC;YACnBN,aACE;YACFQ,SAAS;gBAAC;gBAAQ;gBAAU;aAAS;QACvC;QACAC,OAAOpB,MAAMqB,MAAM,CAAQ;YACzBC,SAAS;YACTX,aAAa;YACbQ,SAAS;gBAAC;gBAAS;gBAAW;aAAO;QACvC;QACA,qCAAqCnB,MAAMuB,OAAO,CAAC;YACjDD,SAAS;YACTX,aAAa;QACf;QACA,yBAAyBX,MAAMuB,OAAO,CAAC;YACrCD,SAAS;YACTX,aAAa;QACf;QACAa,WAAWxB,MAAMiB,MAAM,CAAC;YACtBN,aAAa;QACf;QACAc,KAAKzB,MAAM0B,OAAO,CAAC;YACjBC,MAAM;YACNL,SAAS;YACTX,aAAa;QACf;IACF,EAAC;IAED,OAAgBiB,gBAA0B;QAAC;KAAoB,CAAA;IAE/D,MAAaC,MAAqB;QAChC,MAAM,EAACf,KAAK,EAAC,GAAG,MAAM,IAAI,CAACgB,KAAK,CAACpB;QACjC,MAAM,EACJqB,OAAO,EACPf,IAAI,EACJE,MAAM,EACNE,KAAK,EACL,qCAAqCY,8BAA8B,EACnE,yBAAyBC,mBAAmB,EAC5CC,SAASC,SAAS,EAClBX,SAAS,EACV,GAAGV;QACJ,MAAMsB,iBAAiB,IAAI,CAACC,YAAY;QAExC,IAAIC;QACJ,IAAIC;QACJ,IAAI;YACF,MAAMC,OAAO,MAAM,IAAI,CAACC,cAAc;YACtCH,UAAUE,KAAKE,SAAS;YACxBH,YAAY,MAAM,IAAI,CAACI,YAAY;QACrC,EAAE,OAAOC,KAAK;YACZ,IAAIA,eAAe1C,0BAA0B;gBAC3C,OAAO,IAAI,CAAC2C,MAAM,CAACC,KAAK,CACtB,2GACA;oBAACC,MAAM9C,UAAU+C,aAAa;gBAAA;YAElC;YACA,MAAMJ;QACR;QAEA,IAAIK;QACJ,IAAIjC,MAAM;YACR,MAAMkC,WAAWpD,KAAKqD,OAAO,CAACb,SAAStB;YAEvC,IAAIoC;YACJ,IAAI;gBACFA,WAAW,MAAMvD,KAAKqD;YACxB,EAAE,OAAM;gBACN,OAAO,IAAI,CAACL,MAAM,CAACC,KAAK,CACtB,CAAC,gBAAgB,EAAE9B,KAAK,qEAAqE,CAAC,EAC9F;oBAAC+B,MAAM9C,UAAUoD,WAAW;gBAAA;YAEhC;YAEA,IAAI,CAACD,SAASE,MAAM,IAAI;gBACtB,OAAO,IAAI,CAACT,MAAM,CAACC,KAAK,CACtB,CAAC,mBAAmB,EAAE9B,KAAK,0EAA0E,CAAC,EACtG;oBAAC+B,MAAM9C,UAAUoD,WAAW;gBAAA;YAEhC;YAEAJ,iBAAiBC;QACnB;QAEA,IAAI,CAACd,gBAAgB;YACnB,IAAI,CAACS,MAAM,CAACU,GAAG,CACb,GAAGxD,UAAU,UAAU,GAAGM,WAAWmD,OAAO,CAAC,SAAS,CAAC,EAAE,cAAc,EACrExC,OACI,6CACA,4CACL,uDAAuD,CAAC,GACvD,CAAC,gCAAgC,CAAC;YAEtC,IAAI,CAAC6B,MAAM,CAACU,GAAG,CAAC,CAAC,qBAAqB,CAAC;YACvC,IAAI,CAACV,MAAM,CAACU,GAAG,CACb,CAAC,gGAAgG,CAAC;YAEpG,IAAI,CAACV,MAAM,CAACU,GAAG,CACb,CAAC,uGAAuG,CAAC;YAE3G,IAAI,CAACV,MAAM,CAACU,GAAG,CACb,CAAC,iGAAiG,CAAC;YAErG,IAAI,CAACV,MAAM,CAACU,GAAG,CACb,CAAC,qFAAqF,CAAC;YAEzF,IAAIvC,MAAM;gBACR,IAAI,CAAC6B,MAAM,CAACU,GAAG,CACb,CAAC,4FAA4F,CAAC;YAElG;YAEA,MAAME,YAAY,MAAMrD,QAAQ;gBAC9BkB,SAAS;gBACToC,SAAS,CAAC,kCAAkC,CAAC;YAC/C;YAEA,IAAI,CAACD,WAAW;gBACd,IAAI,CAACZ,MAAM,CAACU,GAAG,CAAC;gBAChB,OAAO,IAAI,CAACR,IAAI,CAAC9C,UAAU0D,UAAU;YACvC;QACF;QAEA,IAAI;YACF,MAAMC,eAAe,MAAMtD,kBAAkB;gBAC3CyB;gBACAX;gBACAY;gBACAC;gBACAgB;gBACAd;gBACA0B,UAAU,CAACC;oBACT,MAAMD,WACJ3C,UAAUA,UAAUX,YAChBA,SAAS,CAACW,OAAiC,GAC3CX,UAAUwD,MAAM;oBAEtB,OAAOF,SAAS;wBAAC/C;wBAAO+B,QAAQ,IAAI,CAACA,MAAM;wBAAEiB;oBAAM;gBACrD;gBACAE,YAAYzB,UAAUyB,UAAU;gBAChC1B;gBACAd;YACF;YAEA,IAAIoC,iBAAiB,SAAS;gBAC5B,OAAO,IAAI,CAACb,IAAI,CAAC9C,UAAU+C,aAAa;YAC1C;QACF,EAAE,OAAOJ,KAAK;YACZ,OAAO,IAAI,CAACC,MAAM,CAACC,KAAK,CAACF,eAAeqB,QAAQrB,IAAIc,OAAO,GAAGQ,OAAOtB,MAAM;gBACzEG,MAAM9C,UAAU+C,aAAa;YAC/B;QACF;IACF;AACF"}
@@ -12,7 +12,7 @@ export class List extends SanityCommand {
12
12
  description: 'List GraphQL endpoints for the project'
13
13
  },
14
14
  {
15
- command: '<%= config.bin %> <%= command.id %> --project-id abc123',
15
+ command: '<%= config.bin %> <%= command.id %> --project abc123',
16
16
  description: 'List GraphQL endpoints for a specific project'
17
17
  }
18
18
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/graphql/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n GRAPHQL_API_VERSION,\n type GraphQLEndpoint,\n listGraphQLEndpoints,\n} from '../../services/graphql.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listGraphQLDebug = subdebug('graphql:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List deployed GraphQL endpoints for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List GraphQL endpoints for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List GraphQL endpoints for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list GraphQL endpoints for',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n await this.parse(List)\n\n const projectId = await this.getProjectId({\n fallback: () => promptForProject({}),\n })\n\n let endpoints: GraphQLEndpoint[] | undefined\n try {\n endpoints = await listGraphQLEndpoints(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n\n listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error)\n this.error(`GraphQL endpoints list retrieval failed:\\n${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (!endpoints || endpoints.length === 0) {\n this.log(\"This project doesn't have any GraphQL endpoints deployed.\")\n return\n }\n\n const client = await getProjectCliClient({\n apiVersion: GRAPHQL_API_VERSION,\n projectId,\n })\n\n this.log('Here are the GraphQL endpoints deployed for this project:')\n for (const [index, endpoint] of endpoints.entries()) {\n const {dataset, tag} = endpoint\n const url = client.getUrl(`/graphql/${dataset}/${tag}`)\n\n this.log(`${index + 1}. ${styleText('bold', 'Dataset:')} ${dataset}`)\n this.log(` ${styleText('bold', 'Tag:')} ${tag}`)\n this.log(` ${styleText('bold', 'Generation:')} ${endpoint.generation}`)\n this.log(` ${styleText('bold', 'Playground:')} ${endpoint.playgroundEnabled}`)\n this.log(` ${styleText('bold', 'URL:')} ${url}\\n`)\n }\n }\n}\n"],"names":["styleText","exitCodes","getProjectCliClient","SanityCommand","subdebug","promptForProject","GRAPHQL_API_VERSION","listGraphQLEndpoints","getProjectIdFlag","listGraphQLDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","endpoints","error","message","Error","String","exit","RUNTIME_ERROR","length","log","client","apiVersion","index","endpoint","entries","dataset","tag","url","getUrl","generation","playgroundEnabled"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,SAAS,EAAEC,mBAAmB,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExF,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SACEC,mBAAmB,EAEnBC,oBAAoB,QACf,4BAA2B;AAClC,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,kDAAiD;IAC/E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACP;QAEjB,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IAAMf,iBAAiB,CAAC;QACpC;QAEA,IAAIgB;QACJ,IAAI;YACFA,YAAY,MAAMd,qBAAqBW;QACzC,EAAE,OAAOI,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAEhEb,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEI;YAC9E,IAAI,CAACA,KAAK,CAAC,CAAC,0CAA0C,EAAEC,SAAS,EAAE;gBACjEG,MAAMzB,UAAU0B,aAAa;YAC/B;QACF;QAEA,IAAI,CAACN,aAAaA,UAAUO,MAAM,KAAK,GAAG;YACxC,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,SAAS,MAAM5B,oBAAoB;YACvC6B,YAAYzB;YACZY;QACF;QAEA,IAAI,CAACW,GAAG,CAAC;QACT,KAAK,MAAM,CAACG,OAAOC,SAAS,IAAIZ,UAAUa,OAAO,GAAI;YACnD,MAAM,EAACC,OAAO,EAAEC,GAAG,EAAC,GAAGH;YACvB,MAAMI,MAAMP,OAAOQ,MAAM,CAAC,CAAC,SAAS,EAAEH,QAAQ,CAAC,EAAEC,KAAK;YAEtD,IAAI,CAACP,GAAG,CAAC,GAAGG,QAAQ,EAAE,GAAG,EAAEhC,UAAU,QAAQ,YAAY,KAAK,EAAEmC,SAAS;YACzE,IAAI,CAACN,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,QAAQ,SAAS,EAAEoC,KAAK;YAC1D,IAAI,CAACP,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,eAAe,EAAE,EAAEiC,SAASM,UAAU,EAAE;YAC1E,IAAI,CAACV,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,eAAe,EAAE,EAAEiC,SAASO,iBAAiB,EAAE;YACjF,IAAI,CAACX,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,QAAQ,EAAE,EAAEqC,IAAI,EAAE,CAAC;QACvD;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/graphql/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n GRAPHQL_API_VERSION,\n type GraphQLEndpoint,\n listGraphQLEndpoints,\n} from '../../services/graphql.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listGraphQLDebug = subdebug('graphql:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List deployed GraphQL endpoints for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List GraphQL endpoints for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123',\n description: 'List GraphQL endpoints for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list GraphQL endpoints for',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n await this.parse(List)\n\n const projectId = await this.getProjectId({\n fallback: () => promptForProject({}),\n })\n\n let endpoints: GraphQLEndpoint[] | undefined\n try {\n endpoints = await listGraphQLEndpoints(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n\n listGraphQLDebug(`Error fetching GraphQL endpoints for project ${projectId}`, error)\n this.error(`GraphQL endpoints list retrieval failed:\\n${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (!endpoints || endpoints.length === 0) {\n this.log(\"This project doesn't have any GraphQL endpoints deployed.\")\n return\n }\n\n const client = await getProjectCliClient({\n apiVersion: GRAPHQL_API_VERSION,\n projectId,\n })\n\n this.log('Here are the GraphQL endpoints deployed for this project:')\n for (const [index, endpoint] of endpoints.entries()) {\n const {dataset, tag} = endpoint\n const url = client.getUrl(`/graphql/${dataset}/${tag}`)\n\n this.log(`${index + 1}. ${styleText('bold', 'Dataset:')} ${dataset}`)\n this.log(` ${styleText('bold', 'Tag:')} ${tag}`)\n this.log(` ${styleText('bold', 'Generation:')} ${endpoint.generation}`)\n this.log(` ${styleText('bold', 'Playground:')} ${endpoint.playgroundEnabled}`)\n this.log(` ${styleText('bold', 'URL:')} ${url}\\n`)\n }\n }\n}\n"],"names":["styleText","exitCodes","getProjectCliClient","SanityCommand","subdebug","promptForProject","GRAPHQL_API_VERSION","listGraphQLEndpoints","getProjectIdFlag","listGraphQLDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","endpoints","error","message","Error","String","exit","RUNTIME_ERROR","length","log","client","apiVersion","index","endpoint","entries","dataset","tag","url","getUrl","generation","playgroundEnabled"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,SAAS,EAAEC,mBAAmB,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExF,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SACEC,mBAAmB,EAEnBC,oBAAoB,QACf,4BAA2B;AAClC,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,aAAaP;IACxB,OAAgBQ,cAAc,kDAAiD;IAC/E,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACP;QAEjB,MAAMQ,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IAAMf,iBAAiB,CAAC;QACpC;QAEA,IAAIgB;QACJ,IAAI;YACFA,YAAY,MAAMd,qBAAqBW;QACzC,EAAE,OAAOI,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAEhEb,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEI;YAC9E,IAAI,CAACA,KAAK,CAAC,CAAC,0CAA0C,EAAEC,SAAS,EAAE;gBACjEG,MAAMzB,UAAU0B,aAAa;YAC/B;QACF;QAEA,IAAI,CAACN,aAAaA,UAAUO,MAAM,KAAK,GAAG;YACxC,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,SAAS,MAAM5B,oBAAoB;YACvC6B,YAAYzB;YACZY;QACF;QAEA,IAAI,CAACW,GAAG,CAAC;QACT,KAAK,MAAM,CAACG,OAAOC,SAAS,IAAIZ,UAAUa,OAAO,GAAI;YACnD,MAAM,EAACC,OAAO,EAAEC,GAAG,EAAC,GAAGH;YACvB,MAAMI,MAAMP,OAAOQ,MAAM,CAAC,CAAC,SAAS,EAAEH,QAAQ,CAAC,EAAEC,KAAK;YAEtD,IAAI,CAACP,GAAG,CAAC,GAAGG,QAAQ,EAAE,GAAG,EAAEhC,UAAU,QAAQ,YAAY,KAAK,EAAEmC,SAAS;YACzE,IAAI,CAACN,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,QAAQ,SAAS,EAAEoC,KAAK;YAC1D,IAAI,CAACP,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,eAAe,EAAE,EAAEiC,SAASM,UAAU,EAAE;YAC1E,IAAI,CAACV,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,eAAe,EAAE,EAAEiC,SAASO,iBAAiB,EAAE;YACjF,IAAI,CAACX,GAAG,CAAC,CAAC,IAAI,EAAE7B,UAAU,QAAQ,QAAQ,EAAE,EAAEqC,IAAI,EAAE,CAAC;QACvD;IACF;AACF"}
@@ -31,7 +31,7 @@ export class Undeploy extends SanityCommand {
31
31
  description: 'Undeploy GraphQL API without confirmation prompt'
32
32
  },
33
33
  {
34
- command: '<%= config.bin %> <%= command.id %> --project-id abc123 --dataset production',
34
+ command: '<%= config.bin %> <%= command.id %> --project abc123 --dataset production',
35
35
  description: 'Undeploy GraphQL API for a specific project and dataset'
36
36
  }
37
37
  ];
@@ -43,7 +43,6 @@ export class Undeploy extends SanityCommand {
43
43
  api: Flags.string({
44
44
  description: 'Undeploy API with this ID',
45
45
  exclusive: [
46
- 'project-id',
47
46
  'project'
48
47
  ],
49
48
  required: false
@@ -55,14 +54,6 @@ export class Undeploy extends SanityCommand {
55
54
  force: requiredWhenUnattended(Flags.boolean({
56
55
  description: 'Skip confirmation prompt'
57
56
  })),
58
- project: Flags.string({
59
- deprecated: {
60
- to: 'project-id'
61
- },
62
- description: 'Project ID to delete GraphQL API for',
63
- hidden: true,
64
- required: false
65
- }),
66
57
  tag: Flags.string({
67
58
  default: 'default',
68
59
  description: 'Tag to undeploy GraphQL API from',
@@ -100,7 +91,6 @@ export class Undeploy extends SanityCommand {
100
91
  // Get projectId from config if not specified
101
92
  if (!projectId) {
102
93
  projectId = await this.getProjectId({
103
- deprecatedFlagName: 'project',
104
94
  fallback: ()=>promptForProject({
105
95
  requiredPermissions: [
106
96
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/graphql/undeploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {requiredWhenUnattended} from '@sanity/cli-core/flags'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {getGraphQLAPIs} from '../../actions/graphql/getGraphQLAPIs.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteGraphQLAPI} from '../../services/graphql.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst undeployGraphqlDebug = subdebug('graphql:undeploy')\n\nexport class Undeploy extends SanityCommand<typeof Undeploy> {\n static override description = 'Remove a deployed GraphQL API'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Undeploy GraphQL API for current project and dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api ios',\n description: 'Undeploy API with ID \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging',\n description: 'Undeploy GraphQL API for staging dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging --tag next',\n description: 'Undeploy GraphQL API for staging dataset with \"next\" tag',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --force',\n description: 'Undeploy GraphQL API without confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123 --dataset production',\n description: 'Undeploy GraphQL API for a specific project and dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to undeploy GraphQL API from',\n semantics: 'override',\n }),\n api: Flags.string({\n description: 'Undeploy API with this ID',\n exclusive: ['project-id', 'project'],\n required: false,\n }),\n ...getDatasetFlag({description: 'Dataset to undeploy GraphQL API from', semantics: 'override'}),\n force: requiredWhenUnattended(\n Flags.boolean({\n description: 'Skip confirmation prompt',\n }),\n ),\n project: Flags.string({\n deprecated: {to: 'project-id'},\n description: 'Project ID to delete GraphQL API for',\n hidden: true,\n required: false,\n }),\n tag: Flags.string({\n default: 'default',\n description: 'Tag to undeploy GraphQL API from',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(Undeploy)\n const {api: apiFlag, dataset: datasetFlag, force, tag: tagFlag} = flags\n\n let projectId: string | undefined\n let dataset = datasetFlag\n let tag = tagFlag\n\n // If specifying --api, use it for the flags not provided\n if (apiFlag) {\n const workDir = (await this.getProjectRoot()).directory\n const apiDefs = await getGraphQLAPIs(workDir)\n const apiDef = apiDefs.find((def) => def.id === apiFlag)\n\n if (!apiDef) {\n this.error(`GraphQL API \"${apiFlag}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n projectId = apiDef.projectId\n\n if (dataset && dataset !== apiDef.dataset) {\n this.warn(`Both --api and --dataset specified, using --dataset ${dataset}`)\n } else {\n dataset = apiDef.dataset\n }\n\n if (tag && tag !== 'default' && apiDef.tag && tag !== apiDef.tag) {\n this.warn(`Both --api and --tag specified, using --tag ${tag}`)\n } else {\n tag = apiDef.tag || 'default'\n }\n }\n\n // Get projectId from config if not specified\n if (!projectId) {\n projectId = await this.getProjectId({\n deprecatedFlagName: 'project',\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'manage', permission: 'sanity.project.graphql'}],\n }),\n })\n }\n\n // Get dataset from CLI config if not specified\n if (!dataset) {\n const cliConfig = await this.tryGetCliConfig()\n dataset = cliConfig.api?.dataset\n }\n\n if (!dataset) {\n this.error(\n 'Dataset is required. Pass it with `--dataset <name>` or configure it in your project.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n // Confirm deletion unless --force is used\n if (!force) {\n const confirmMessage =\n tag === 'default'\n ? `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId}?`\n : `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId} with tag \"${tag}\"?`\n\n const confirmed = await confirm({\n default: false,\n message: confirmMessage,\n })\n\n if (!confirmed) {\n this.log('GraphQL API undeploy cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n await deleteGraphQLAPI({\n dataset,\n projectId,\n tag,\n })\n\n this.log('GraphQL API deleted')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n undeployGraphqlDebug(`Error deleting GraphQL API for ${dataset}/${tag}`, err)\n this.error(`GraphQL API deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","requiredWhenUnattended","confirm","getGraphQLAPIs","promptForProject","deleteGraphQLAPI","getDatasetFlag","getProjectIdFlag","undeployGraphqlDebug","Undeploy","description","examples","command","flags","semantics","api","string","exclusive","required","force","boolean","project","deprecated","to","hidden","tag","default","run","parse","apiFlag","dataset","datasetFlag","tagFlag","projectId","workDir","getProjectRoot","directory","apiDefs","apiDef","find","def","id","error","exit","RUNTIME_ERROR","warn","getProjectId","deprecatedFlagName","fallback","requiredPermissions","grant","permission","cliConfig","tryGetCliConfig","USAGE_ERROR","confirmMessage","confirmed","message","log","USER_ABORT","err","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/graphql/undeploy.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {requiredWhenUnattended} from '@sanity/cli-core/flags'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {getGraphQLAPIs} from '../../actions/graphql/getGraphQLAPIs.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteGraphQLAPI} from '../../services/graphql.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst undeployGraphqlDebug = subdebug('graphql:undeploy')\n\nexport class Undeploy extends SanityCommand<typeof Undeploy> {\n static override description = 'Remove a deployed GraphQL API'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Undeploy GraphQL API for current project and dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --api ios',\n description: 'Undeploy API with ID \"ios\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging',\n description: 'Undeploy GraphQL API for staging dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --dataset staging --tag next',\n description: 'Undeploy GraphQL API for staging dataset with \"next\" tag',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --force',\n description: 'Undeploy GraphQL API without confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123 --dataset production',\n description: 'Undeploy GraphQL API for a specific project and dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to undeploy GraphQL API from',\n semantics: 'override',\n }),\n api: Flags.string({\n description: 'Undeploy API with this ID',\n exclusive: ['project'],\n required: false,\n }),\n ...getDatasetFlag({description: 'Dataset to undeploy GraphQL API from', semantics: 'override'}),\n force: requiredWhenUnattended(\n Flags.boolean({\n description: 'Skip confirmation prompt',\n }),\n ),\n tag: Flags.string({\n default: 'default',\n description: 'Tag to undeploy GraphQL API from',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(Undeploy)\n const {api: apiFlag, dataset: datasetFlag, force, tag: tagFlag} = flags\n\n let projectId: string | undefined\n let dataset = datasetFlag\n let tag = tagFlag\n\n // If specifying --api, use it for the flags not provided\n if (apiFlag) {\n const workDir = (await this.getProjectRoot()).directory\n const apiDefs = await getGraphQLAPIs(workDir)\n const apiDef = apiDefs.find((def) => def.id === apiFlag)\n\n if (!apiDef) {\n this.error(`GraphQL API \"${apiFlag}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n projectId = apiDef.projectId\n\n if (dataset && dataset !== apiDef.dataset) {\n this.warn(`Both --api and --dataset specified, using --dataset ${dataset}`)\n } else {\n dataset = apiDef.dataset\n }\n\n if (tag && tag !== 'default' && apiDef.tag && tag !== apiDef.tag) {\n this.warn(`Both --api and --tag specified, using --tag ${tag}`)\n } else {\n tag = apiDef.tag || 'default'\n }\n }\n\n // Get projectId from config if not specified\n if (!projectId) {\n projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'manage', permission: 'sanity.project.graphql'}],\n }),\n })\n }\n\n // Get dataset from CLI config if not specified\n if (!dataset) {\n const cliConfig = await this.tryGetCliConfig()\n dataset = cliConfig.api?.dataset\n }\n\n if (!dataset) {\n this.error(\n 'Dataset is required. Pass it with `--dataset <name>` or configure it in your project.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n // Confirm deletion unless --force is used\n if (!force) {\n const confirmMessage =\n tag === 'default'\n ? `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId}?`\n : `Delete the GraphQL API for dataset \"${dataset}\" in project ${projectId} with tag \"${tag}\"?`\n\n const confirmed = await confirm({\n default: false,\n message: confirmMessage,\n })\n\n if (!confirmed) {\n this.log('GraphQL API undeploy cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n await deleteGraphQLAPI({\n dataset,\n projectId,\n tag,\n })\n\n this.log('GraphQL API deleted')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n undeployGraphqlDebug(`Error deleting GraphQL API for ${dataset}/${tag}`, err)\n this.error(`GraphQL API deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","requiredWhenUnattended","confirm","getGraphQLAPIs","promptForProject","deleteGraphQLAPI","getDatasetFlag","getProjectIdFlag","undeployGraphqlDebug","Undeploy","description","examples","command","flags","semantics","api","string","exclusive","required","force","boolean","tag","default","run","parse","apiFlag","dataset","datasetFlag","tagFlag","projectId","workDir","getProjectRoot","directory","apiDefs","apiDef","find","def","id","error","exit","RUNTIME_ERROR","warn","getProjectId","fallback","requiredPermissions","grant","permission","cliConfig","tryGetCliConfig","USAGE_ERROR","confirmMessage","confirmed","message","log","USER_ABORT","err","Error"],"mappings":"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"}
@@ -19,7 +19,7 @@ export class AttemptHookCommand extends SanityCommand {
19
19
  description: 'Print details of webhook delivery attempt with ID abc123'
20
20
  },
21
21
  {
22
- command: '<%= config.bin %> <%= command.id %> abc123 --project-id projectId',
22
+ command: '<%= config.bin %> <%= command.id %> abc123 --project projectId',
23
23
  description: 'Get attempt details for a specific project'
24
24
  }
25
25
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/attempt.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt} from '../../actions/hook/types.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getHookAttempt} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst attemptDebug = subdebug('hook:attempt')\n\nexport class AttemptHookCommand extends SanityCommand<typeof AttemptHookCommand> {\n static override args = {\n attemptId: Args.string({\n description: 'The delivery attempt ID to get details for',\n required: true,\n }),\n }\n static override description = 'Print details of a given webhook delivery attempt'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> abc123',\n description: 'Print details of webhook delivery attempt with ID abc123',\n },\n {\n command: '<%= config.bin %> <%= command.id %> abc123 --project-id projectId',\n description: 'Get attempt details for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook attempt for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:attempt']\n\n public async run() {\n const {args} = await this.parse(AttemptHookCommand)\n const {attemptId} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let attempt: DeliveryAttempt\n try {\n attempt = await getHookAttempt({attemptId, projectId})\n } catch (error) {\n const err = error as Error\n attemptDebug(`Error fetching hook attempt ${attemptId}`, err)\n this.error(`Hook attempt retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const {createdAt, failureReason, inProgress, resultBody, resultCode} = attempt\n\n this.log(`Date: ${createdAt}`)\n this.log(`Status: ${this.getStatus(attempt)}`)\n this.log(`Status code: ${resultCode}`)\n\n if (attempt.isFailure) {\n this.log(`Failure: ${formatFailure(attempt)}`)\n }\n\n if (!inProgress && (!failureReason || failureReason === 'http')) {\n const body = resultBody ? `\\n---\\n${resultBody}\\n---\\n` : '<empty>'\n this.log(`Response body: ${body}`)\n }\n }\n\n private getStatus(attempt: DeliveryAttempt): string {\n if (attempt.isFailure) {\n return 'Failed'\n }\n\n if (attempt.inProgress) {\n return 'In progress'\n }\n\n return 'Delivered'\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","formatFailure","promptForProject","getHookAttempt","getProjectIdFlag","attemptDebug","AttemptHookCommand","args","attemptId","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","attempt","error","err","message","exit","RUNTIME_ERROR","createdAt","failureReason","inProgress","resultBody","resultCode","log","getStatus","isFailure","body"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,aAAa,QAAO,sCAAqC;AAEjE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,0BAAyB;AACtD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,eAAeL,SAAS;AAE9B,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,OAAO;QACrBC,WAAWX,KAAKY,MAAM,CAAC;YACrBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IACD,OAAgBD,cAAc,oDAAmD;IAEjF,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,MAAM,EAACE,SAAS,EAAC,GAAGD;QAEpB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMtB,eAAe;gBAACK;gBAAWW;YAAS;QACtD,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZrB,aAAa,CAAC,4BAA4B,EAAEG,WAAW,EAAEmB;YACzD,IAAI,CAACD,KAAK,CAAC,CAAC,gCAAgC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM/B,UAAUgC,aAAa;YAAA;QAC7F;QAEA,MAAM,EAACC,SAAS,EAAEC,aAAa,EAAEC,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAC,GAAGV;QAEvE,IAAI,CAACW,GAAG,CAAC,CAAC,MAAM,EAAEL,WAAW;QAC7B,IAAI,CAACK,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAACC,SAAS,CAACZ,UAAU;QAC7C,IAAI,CAACW,GAAG,CAAC,CAAC,aAAa,EAAED,YAAY;QAErC,IAAIV,QAAQa,SAAS,EAAE;YACrB,IAAI,CAACF,GAAG,CAAC,CAAC,SAAS,EAAEnC,cAAcwB,UAAU;QAC/C;QAEA,IAAI,CAACQ,cAAe,CAAA,CAACD,iBAAiBA,kBAAkB,MAAK,GAAI;YAC/D,MAAMO,OAAOL,aAAa,CAAC,OAAO,EAAEA,WAAW,OAAO,CAAC,GAAG;YAC1D,IAAI,CAACE,GAAG,CAAC,CAAC,eAAe,EAAEG,MAAM;QACnC;IACF;IAEQF,UAAUZ,OAAwB,EAAU;QAClD,IAAIA,QAAQa,SAAS,EAAE;YACrB,OAAO;QACT;QAEA,IAAIb,QAAQQ,UAAU,EAAE;YACtB,OAAO;QACT;QAEA,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/attempt.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt} from '../../actions/hook/types.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getHookAttempt} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst attemptDebug = subdebug('hook:attempt')\n\nexport class AttemptHookCommand extends SanityCommand<typeof AttemptHookCommand> {\n static override args = {\n attemptId: Args.string({\n description: 'The delivery attempt ID to get details for',\n required: true,\n }),\n }\n static override description = 'Print details of a given webhook delivery attempt'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> abc123',\n description: 'Print details of webhook delivery attempt with ID abc123',\n },\n {\n command: '<%= config.bin %> <%= command.id %> abc123 --project projectId',\n description: 'Get attempt details for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook attempt for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:attempt']\n\n public async run() {\n const {args} = await this.parse(AttemptHookCommand)\n const {attemptId} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let attempt: DeliveryAttempt\n try {\n attempt = await getHookAttempt({attemptId, projectId})\n } catch (error) {\n const err = error as Error\n attemptDebug(`Error fetching hook attempt ${attemptId}`, err)\n this.error(`Hook attempt retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const {createdAt, failureReason, inProgress, resultBody, resultCode} = attempt\n\n this.log(`Date: ${createdAt}`)\n this.log(`Status: ${this.getStatus(attempt)}`)\n this.log(`Status code: ${resultCode}`)\n\n if (attempt.isFailure) {\n this.log(`Failure: ${formatFailure(attempt)}`)\n }\n\n if (!inProgress && (!failureReason || failureReason === 'http')) {\n const body = resultBody ? `\\n---\\n${resultBody}\\n---\\n` : '<empty>'\n this.log(`Response body: ${body}`)\n }\n }\n\n private getStatus(attempt: DeliveryAttempt): string {\n if (attempt.isFailure) {\n return 'Failed'\n }\n\n if (attempt.inProgress) {\n return 'In progress'\n }\n\n return 'Delivered'\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","formatFailure","promptForProject","getHookAttempt","getProjectIdFlag","attemptDebug","AttemptHookCommand","args","attemptId","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","attempt","error","err","message","exit","RUNTIME_ERROR","createdAt","failureReason","inProgress","resultBody","resultCode","log","getStatus","isFailure","body"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,aAAa,QAAO,sCAAqC;AAEjE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,0BAAyB;AACtD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,eAAeL,SAAS;AAE9B,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,OAAO;QACrBC,WAAWX,KAAKY,MAAM,CAAC;YACrBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IACD,OAAgBD,cAAc,oDAAmD;IAEjF,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,MAAM,EAACE,SAAS,EAAC,GAAGD;QAEpB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMtB,eAAe;gBAACK;gBAAWW;YAAS;QACtD,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZrB,aAAa,CAAC,4BAA4B,EAAEG,WAAW,EAAEmB;YACzD,IAAI,CAACD,KAAK,CAAC,CAAC,gCAAgC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM/B,UAAUgC,aAAa;YAAA;QAC7F;QAEA,MAAM,EAACC,SAAS,EAAEC,aAAa,EAAEC,UAAU,EAAEC,UAAU,EAAEC,UAAU,EAAC,GAAGV;QAEvE,IAAI,CAACW,GAAG,CAAC,CAAC,MAAM,EAAEL,WAAW;QAC7B,IAAI,CAACK,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAACC,SAAS,CAACZ,UAAU;QAC7C,IAAI,CAACW,GAAG,CAAC,CAAC,aAAa,EAAED,YAAY;QAErC,IAAIV,QAAQa,SAAS,EAAE;YACrB,IAAI,CAACF,GAAG,CAAC,CAAC,SAAS,EAAEnC,cAAcwB,UAAU;QAC/C;QAEA,IAAI,CAACQ,cAAe,CAAA,CAACD,iBAAiBA,kBAAkB,MAAK,GAAI;YAC/D,MAAMO,OAAOL,aAAa,CAAC,OAAO,EAAEA,WAAW,OAAO,CAAC,GAAG;YAC1D,IAAI,CAACE,GAAG,CAAC,CAAC,eAAe,EAAEG,MAAM;QACnC;IACF;IAEQF,UAAUZ,OAAwB,EAAU;QAClD,IAAIA,QAAQa,SAAS,EAAE;YACrB,OAAO;QACT;QAEA,IAAIb,QAAQQ,UAAU,EAAE;YACtB,OAAO;QACT;QAEA,OAAO;IACT;AACF"}
@@ -12,7 +12,7 @@ export class CreateHookCommand extends SanityCommand {
12
12
  description: 'Create a new webhook for the project'
13
13
  },
14
14
  {
15
- command: '<%= config.bin %> <%= command.id %> --project-id abc123',
15
+ command: '<%= config.bin %> <%= command.id %> --project abc123',
16
16
  description: 'Create a webhook for a specific project'
17
17
  }
18
18
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/create.ts"],"sourcesContent":["import {exitCodes, getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Create a webhook for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create webhook for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:create']\n\n public async run() {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({requiredPermissions: [{grant: 'read', permission: 'sanity.project'}]}),\n })\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl = getSanityUrl(\n `/organizations/${organizationId}/project/${projectId}/api/webhooks/new`,\n )\n\n if (this.isUnattended()) {\n this.log(`Create a webhook at ${manageUrl}`)\n return\n }\n\n this.log(`Opening ${manageUrl}`)\n\n try {\n await open(manageUrl)\n } catch (error) {\n const err = error as Error\n createHookDebug('Error opening browser', err)\n this.error(`Failed to open browser:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","getSanityUrl","SanityCommand","subdebug","open","promptForProject","getProjectById","getProjectIdFlag","createHookDebug","CreateHookCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectInfo","error","err","message","exit","RUNTIME_ERROR","organizationId","manageUrl","isUnattended","log"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,YAAY,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACjF,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,6BAA4B;AACzD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,0BAA0BP;IACrC,OAAgBQ,cAAc,uCAAsC;IACpE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAM;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBAACe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;qBAAE;gBAAA;QAC1F;QAEA,IAAIC;QACJ,IAAI;YACFA,cAAc,MAAMjB,eAAeW;QACrC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACxE,IAAI,CAACD,KAAK,CAAC,CAAC,sCAAsC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBACjEC,MAAM3B,UAAU4B,aAAa;YAC/B;QACF;QAEA,MAAMC,iBAAiBN,YAAYM,cAAc,IAAI;QACrD,MAAMC,YAAY7B,aAChB,CAAC,eAAe,EAAE4B,eAAe,SAAS,EAAEZ,UAAU,iBAAiB,CAAC;QAG1E,IAAI,IAAI,CAACc,YAAY,IAAI;YACvB,IAAI,CAACC,GAAG,CAAC,CAAC,oBAAoB,EAAEF,WAAW;YAC3C;QACF;QAEA,IAAI,CAACE,GAAG,CAAC,CAAC,QAAQ,EAAEF,WAAW;QAE/B,IAAI;YACF,MAAM1B,KAAK0B;QACb,EAAE,OAAON,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,yBAAyBiB;YACzC,IAAI,CAACD,KAAK,CAAC,CAAC,yBAAyB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM3B,UAAU4B,aAAa;YAAA;QACtF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/create.ts"],"sourcesContent":["import {exitCodes, getSanityUrl, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createHookDebug = subdebug('hook:create')\n\nexport class CreateHookCommand extends SanityCommand<typeof CreateHookCommand> {\n static override description = 'Create a new webhook for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new webhook for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123',\n description: 'Create a webhook for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create webhook for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:create']\n\n public async run() {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({requiredPermissions: [{grant: 'read', permission: 'sanity.project'}]}),\n })\n\n let projectInfo: {organizationId?: string | null}\n try {\n projectInfo = await getProjectById(projectId)\n } catch (error) {\n const err = error as Error\n createHookDebug(`Error fetching project info for project ${projectId}`, err)\n this.error(`Failed to fetch project information:\\n${err.message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const organizationId = projectInfo.organizationId || 'personal'\n const manageUrl = getSanityUrl(\n `/organizations/${organizationId}/project/${projectId}/api/webhooks/new`,\n )\n\n if (this.isUnattended()) {\n this.log(`Create a webhook at ${manageUrl}`)\n return\n }\n\n this.log(`Opening ${manageUrl}`)\n\n try {\n await open(manageUrl)\n } catch (error) {\n const err = error as Error\n createHookDebug('Error opening browser', err)\n this.error(`Failed to open browser:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","getSanityUrl","SanityCommand","subdebug","open","promptForProject","getProjectById","getProjectIdFlag","createHookDebug","CreateHookCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectInfo","error","err","message","exit","RUNTIME_ERROR","organizationId","manageUrl","isUnattended","log"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,YAAY,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACjF,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,QAAO,6BAA4B;AACzD,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,0BAA0BP;IACrC,OAAgBQ,cAAc,uCAAsC;IACpE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAc,CAAA;IAEzD,MAAaC,MAAM;QACjB,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBAACe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAgB;qBAAE;gBAAA;QAC1F;QAEA,IAAIC;QACJ,IAAI;YACFA,cAAc,MAAMjB,eAAeW;QACrC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACxE,IAAI,CAACD,KAAK,CAAC,CAAC,sCAAsC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBACjEC,MAAM3B,UAAU4B,aAAa;YAC/B;QACF;QAEA,MAAMC,iBAAiBN,YAAYM,cAAc,IAAI;QACrD,MAAMC,YAAY7B,aAChB,CAAC,eAAe,EAAE4B,eAAe,SAAS,EAAEZ,UAAU,iBAAiB,CAAC;QAG1E,IAAI,IAAI,CAACc,YAAY,IAAI;YACvB,IAAI,CAACC,GAAG,CAAC,CAAC,oBAAoB,EAAEF,WAAW;YAC3C;QACF;QAEA,IAAI,CAACE,GAAG,CAAC,CAAC,QAAQ,EAAEF,WAAW;QAE/B,IAAI;YACF,MAAM1B,KAAK0B;QACb,EAAE,OAAON,OAAO;YACd,MAAMC,MAAMD;YACZhB,gBAAgB,yBAAyBiB;YACzC,IAAI,CAACD,KAAK,CAAC,CAAC,yBAAyB,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM3B,UAAU4B,aAAa;YAAA;QACtF;IACF;AACF"}
@@ -23,7 +23,7 @@ export class Delete extends SanityCommand {
23
23
  description: 'Delete a specific webhook by name'
24
24
  },
25
25
  {
26
- command: '<%= config.bin %> <%= command.id %> --project-id abc123',
26
+ command: '<%= config.bin %> <%= command.id %> --project abc123',
27
27
  description: 'Delete a webhook from a specific project'
28
28
  }
29
29
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of webhook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a webhook from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a webhook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a webhook from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete webhook from',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:delete']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n if (!args.name && this.isUnattended()) {\n this.error('Webhook name is required. Pass the name as an argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","select","promptForProject","deleteHookForProject","listHooksForProject","getProjectIdFlag","deleteHookDebug","Delete","args","name","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hookId","promptForHook","log","err","message","RUNTIME_ERROR","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteHookForProject, listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteHookDebug = subdebug('hook:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n name: Args.string({\n description: 'Name of webhook to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a webhook from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a webhook',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-hook',\n description: 'Delete a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123',\n description: 'Delete a webhook from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete webhook from',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:delete']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n if (!args.name && this.isUnattended()) {\n this.error('Webhook name is required. Pass the name as an argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get the hook ID to delete\n const hookId = await this.promptForHook(args.name, projectId)\n\n try {\n await deleteHookForProject(projectId, hookId)\n\n this.log('Hook deleted')\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error deleting hook ${hookId} for project ${projectId}`, err)\n this.error(`Hook deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async promptForHook(\n specifiedName: string | undefined,\n projectId: string,\n ): Promise<string> {\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n deleteHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Failed to fetch hooks:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks configured for this project.', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // If hook name is specified, find it in the list\n if (specifiedName) {\n const specifiedNameLower = specifiedName.toLowerCase()\n const selectedHook = hooks.find((hook) => hook.name.toLowerCase() === specifiedNameLower)\n\n if (!selectedHook) {\n this.error(`Hook with name \"${specifiedName}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n return selectedHook.id\n }\n\n // If no hook name specified, prompt user to select one\n const choices = hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select hook to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","select","promptForProject","deleteHookForProject","listHooksForProject","getProjectIdFlag","deleteHookDebug","Delete","args","name","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hookId","promptForHook","log","err","message","RUNTIME_ERROR","specifiedName","hooks","length","specifiedNameLower","toLowerCase","selectedHook","find","hook","id","choices","map","value","selectedId"],"mappings":"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"}
@@ -11,7 +11,7 @@ export class List extends SanityCommand {
11
11
  description: 'List webhooks for the project'
12
12
  },
13
13
  {
14
- command: '<%= config.bin %> <%= command.id %> --project-id abc123',
14
+ command: '<%= config.bin %> <%= command.id %> --project abc123',
15
15
  description: 'List webhooks for a specific project'
16
16
  }
17
17
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/list.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List webhooks for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List webhooks for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List webhooks for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list webhooks for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:list']\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","promptForProject","listHooksForProject","getProjectIdFlag","listHookDebug","List","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","RUNTIME_ERROR","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGnE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,mBAAmB,QAAO,0BAAyB;AAC3D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAY,CAAA;IAEvD,MAAaC,MAAM;QACjB,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,QAAQ,MAAMjB,oBAAoBW;QACpC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,iCAAiC,EAAES,WAAW,EAAEQ;YAC/D,IAAI,CAACD,KAAK,CAAC,CAAC,6BAA6B,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAMzB,UAAU0B,aAAa;YAAA;QAC1F;QAEA,KAAK,MAAMC,QAAQN,MAAO;YACxB,IAAI,CAACO,GAAG,CAAC,CAAC,MAAM,EAAED,KAAKE,IAAI,EAAE;YAC7B,IAAI,CAACD,GAAG,CAAC,CAAC,SAAS,EAAED,KAAKG,OAAO,EAAE;YACnC,IAAI,CAACF,GAAG,CAAC,CAAC,KAAK,EAAED,KAAKI,GAAG,EAAE;YAE3B,IAAIJ,KAAKK,IAAI,KAAK,YAAY;gBAC5B,IAAI,CAACJ,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKM,UAAU,EAAE;gBAE1C,IAAIN,KAAKnB,WAAW,EAAE;oBACpB,IAAI,CAACoB,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKnB,WAAW,EAAE;gBAC7C;YACF;YAEA,IAAI,CAACoB,GAAG,CAAC;QACX;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/list.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type Hook} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listHooksForProject} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listHookDebug = subdebug('hook:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List webhooks for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List webhooks for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123',\n description: 'List webhooks for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list webhooks for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:list']\n\n public async run() {\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n let hooks: Hook[]\n try {\n hooks = await listHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n\n listHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n for (const hook of hooks) {\n this.log(`Name: ${hook.name}`)\n this.log(`Dataset: ${hook.dataset}`)\n this.log(`URL: ${hook.url}`)\n\n if (hook.type === 'document') {\n this.log(`HTTP method: ${hook.httpMethod}`)\n\n if (hook.description) {\n this.log(`Description: ${hook.description}`)\n }\n }\n\n this.log('')\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","promptForProject","listHooksForProject","getProjectIdFlag","listHookDebug","List","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","RUNTIME_ERROR","hook","log","name","dataset","url","type","httpMethod"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGnE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,mBAAmB,QAAO,0BAAyB;AAC3D,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,gCAA+B;IAC7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAY,CAAA;IAEvD,MAAaC,MAAM;QACjB,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,QAAQ,MAAMjB,oBAAoBW;QACpC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,iCAAiC,EAAES,WAAW,EAAEQ;YAC/D,IAAI,CAACD,KAAK,CAAC,CAAC,6BAA6B,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAMzB,UAAU0B,aAAa;YAAA;QAC1F;QAEA,KAAK,MAAMC,QAAQN,MAAO;YACxB,IAAI,CAACO,GAAG,CAAC,CAAC,MAAM,EAAED,KAAKE,IAAI,EAAE;YAC7B,IAAI,CAACD,GAAG,CAAC,CAAC,SAAS,EAAED,KAAKG,OAAO,EAAE;YACnC,IAAI,CAACF,GAAG,CAAC,CAAC,KAAK,EAAED,KAAKI,GAAG,EAAE;YAE3B,IAAIJ,KAAKK,IAAI,KAAK,YAAY;gBAC5B,IAAI,CAACJ,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKM,UAAU,EAAE;gBAE1C,IAAIN,KAAKnB,WAAW,EAAE;oBACpB,IAAI,CAACoB,GAAG,CAAC,CAAC,aAAa,EAAED,KAAKnB,WAAW,EAAE;gBAC7C;YACF;YAEA,IAAI,CAACoB,GAAG,CAAC;QACX;IACF;AACF"}
@@ -25,7 +25,7 @@ export class LogsHookCommand extends SanityCommand {
25
25
  description: 'Show log entries for a specific webhook by name'
26
26
  },
27
27
  {
28
- command: '<%= config.bin %> <%= command.id %> --project-id abc123',
28
+ command: '<%= config.bin %> <%= command.id %> --project abc123',
29
29
  description: 'Show log entries for a specific project'
30
30
  }
31
31
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/hooks/logs.ts"],"sourcesContent":["import {inspect, styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n getHookAttemptsForProject,\n getHookMessagesForProject,\n getHooksForProject,\n} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst logsHookDebug = subdebug('hook:logs')\n\nexport class LogsHookCommand extends SanityCommand<typeof LogsHookCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the webhook to show logs for',\n required: false,\n }),\n }\n\n static override description = 'Show log entries for project webhooks'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Show log entries for project webhooks',\n },\n {\n command: '<%= config.bin %> <%= command.id %> [NAME]',\n description: 'Show log entries for a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Show log entries for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook logs for',\n semantics: 'override',\n }),\n detailed: Flags.boolean({\n description: 'Include detailed payload and attempts',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:logs']\n\n public async run() {\n const {args, flags} = await this.parse(LogsHookCommand)\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get hooks for the project\n let hooks: Hook[]\n try {\n hooks = await getHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // If hook name is provided, find that specific hook\n let selectedHook: Hook | undefined\n if (args.name) {\n selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase())\n if (!selectedHook) {\n this.error(`Hook with name \"${args.name}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n } else if (hooks.length === 1) {\n // If only one hook exists, use that\n selectedHook = hooks[0]\n } else {\n // Otherwise prompt user to select a hook\n if (this.isUnattended()) {\n this.error(\n 'Webhook name is required when multiple webhooks exist. Pass the name as an argument.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // Fetch messages and attempts for the selected hook\n let messages: HookMessage[]\n let attempts: DeliveryAttempt[] = []\n try {\n ;[messages, attempts] = await Promise.all([\n getHookMessagesForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n getHookAttemptsForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n ])\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err)\n this.error(`Hook logs retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // Group attempts by message ID\n const groupedAttempts = Object.groupBy(attempts, (attempt) => attempt.messageId)\n\n // Populate messages with attempts\n const populated = messages.map((msg): HookMessage & {attempts: DeliveryAttempt[]} => ({\n ...msg,\n attempts: groupedAttempts[msg.id] || [],\n }))\n\n const totalMessages = messages.length - 1\n\n for (const [i, message] of populated.entries()) {\n this.printMessage(message, {detailed: flags.detailed})\n this.printSeparator(totalMessages === i)\n }\n }\n\n private formatAttemptDate(dateString: string): string {\n try {\n return new Date(dateString).toISOString().replace(/\\.\\d+Z$/, 'Z')\n } catch {\n return dateString // fallback to original if parsing fails\n }\n }\n\n private printMessage(\n message: HookMessage & {attempts: DeliveryAttempt[]},\n options: {detailed?: boolean},\n ) {\n const {detailed} = options\n\n this.log(`Date: ${message.createdAt}`)\n this.log(`Status: ${message.status}`)\n if (message.resultCode) {\n this.log(`Result code: ${message.resultCode}`)\n }\n\n if (message.failureCount > 0) {\n this.log(`Failures: ${message.failureCount}`)\n }\n\n if (detailed) {\n this.log('Payload:')\n try {\n const payload = JSON.parse(message.payload)\n this.log(inspect(payload, {colors: true}))\n } catch (error) {\n this.log(`Payload (raw): ${message.payload}`)\n logsHookDebug('Failed to parse payload JSON:', error)\n }\n }\n\n if (detailed && message.attempts && message.attempts.length > 0) {\n this.log('Attempts:')\n for (const attempt of message.attempts) {\n const date = this.formatAttemptDate(attempt.createdAt)\n const prefix = ` [${date}]`\n\n if (attempt.inProgress) {\n this.log(`${prefix} ${styleText('yellow', 'Pending')}`)\n } else if (attempt.isFailure) {\n const failure = formatFailure(attempt, {includeHelp: true})\n this.log(`${prefix} ${styleText('yellow', `Failure: ${failure}`)}`)\n } else {\n this.log(`${prefix} Success: HTTP ${attempt.resultCode} (${attempt.duration}ms)`)\n }\n }\n }\n\n // Leave some empty space between messages\n this.log('')\n }\n\n private printSeparator(skip: boolean) {\n if (!skip) {\n this.log('---\\n')\n }\n }\n\n private async selectHook(hooks: Hook[]) {\n const hookId = await select({\n choices: hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n })),\n message: 'Select hook to list logs for',\n })\n\n return hooks.find((hook) => hook.id === hookId)\n }\n}\n"],"names":["inspect","styleText","Args","Flags","exitCodes","SanityCommand","subdebug","select","formatFailure","promptForProject","getHookAttemptsForProject","getHookMessagesForProject","getHooksForProject","getProjectIdFlag","logsHookDebug","LogsHookCommand","args","name","string","description","required","examples","command","flags","semantics","detailed","boolean","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","RUNTIME_ERROR","length","selectedHook","find","hook","toLowerCase","isUnattended","USAGE_ERROR","selectHook","messages","attempts","Promise","all","hookId","id","groupedAttempts","Object","groupBy","attempt","messageId","populated","map","msg","totalMessages","i","entries","printMessage","printSeparator","formatAttemptDate","dateString","Date","toISOString","replace","options","log","createdAt","status","resultCode","failureCount","payload","JSON","colors","date","prefix","inProgress","isFailure","failure","includeHelp","duration","skip","choices","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/hooks/logs.ts"],"sourcesContent":["import {inspect, styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {formatFailure} from '../../actions/hook/formatFailure.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../../actions/hook/types'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n getHookAttemptsForProject,\n getHookMessagesForProject,\n getHooksForProject,\n} from '../../services/hooks.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst logsHookDebug = subdebug('hook:logs')\n\nexport class LogsHookCommand extends SanityCommand<typeof LogsHookCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the webhook to show logs for',\n required: false,\n }),\n }\n\n static override description = 'Show log entries for project webhooks'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Show log entries for project webhooks',\n },\n {\n command: '<%= config.bin %> <%= command.id %> [NAME]',\n description: 'Show log entries for a specific webhook by name',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project abc123',\n description: 'Show log entries for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to view webhook logs for',\n semantics: 'override',\n }),\n detailed: Flags.boolean({\n description: 'Include detailed payload and attempts',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['hook:logs']\n\n public async run() {\n const {args, flags} = await this.parse(LogsHookCommand)\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.webhooks'}],\n }),\n })\n\n // Get hooks for the project\n let hooks: Hook[]\n try {\n hooks = await getHooksForProject(projectId)\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching hooks for project ${projectId}`, err)\n this.error(`Hook list retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (hooks.length === 0) {\n this.error('No hooks currently registered', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // If hook name is provided, find that specific hook\n let selectedHook: Hook | undefined\n if (args.name) {\n selectedHook = hooks.find((hook) => hook.name.toLowerCase() === args.name?.toLowerCase())\n if (!selectedHook) {\n this.error(`Hook with name \"${args.name}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n } else if (hooks.length === 1) {\n // If only one hook exists, use that\n selectedHook = hooks[0]\n } else {\n // Otherwise prompt user to select a hook\n if (this.isUnattended()) {\n this.error(\n 'Webhook name is required when multiple webhooks exist. Pass the name as an argument.',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n selectedHook = await this.selectHook(hooks)\n }\n\n if (!selectedHook) {\n this.error('No hook selected', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // Fetch messages and attempts for the selected hook\n let messages: HookMessage[]\n let attempts: DeliveryAttempt[] = []\n try {\n ;[messages, attempts] = await Promise.all([\n getHookMessagesForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n getHookAttemptsForProject({\n hookId: selectedHook.id,\n projectId,\n }),\n ])\n } catch (error) {\n const err = error as Error\n logsHookDebug(`Error fetching logs for hook ${selectedHook.id}`, err)\n this.error(`Hook logs retrieval failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // Group attempts by message ID\n const groupedAttempts = Object.groupBy(attempts, (attempt) => attempt.messageId)\n\n // Populate messages with attempts\n const populated = messages.map((msg): HookMessage & {attempts: DeliveryAttempt[]} => ({\n ...msg,\n attempts: groupedAttempts[msg.id] || [],\n }))\n\n const totalMessages = messages.length - 1\n\n for (const [i, message] of populated.entries()) {\n this.printMessage(message, {detailed: flags.detailed})\n this.printSeparator(totalMessages === i)\n }\n }\n\n private formatAttemptDate(dateString: string): string {\n try {\n return new Date(dateString).toISOString().replace(/\\.\\d+Z$/, 'Z')\n } catch {\n return dateString // fallback to original if parsing fails\n }\n }\n\n private printMessage(\n message: HookMessage & {attempts: DeliveryAttempt[]},\n options: {detailed?: boolean},\n ) {\n const {detailed} = options\n\n this.log(`Date: ${message.createdAt}`)\n this.log(`Status: ${message.status}`)\n if (message.resultCode) {\n this.log(`Result code: ${message.resultCode}`)\n }\n\n if (message.failureCount > 0) {\n this.log(`Failures: ${message.failureCount}`)\n }\n\n if (detailed) {\n this.log('Payload:')\n try {\n const payload = JSON.parse(message.payload)\n this.log(inspect(payload, {colors: true}))\n } catch (error) {\n this.log(`Payload (raw): ${message.payload}`)\n logsHookDebug('Failed to parse payload JSON:', error)\n }\n }\n\n if (detailed && message.attempts && message.attempts.length > 0) {\n this.log('Attempts:')\n for (const attempt of message.attempts) {\n const date = this.formatAttemptDate(attempt.createdAt)\n const prefix = ` [${date}]`\n\n if (attempt.inProgress) {\n this.log(`${prefix} ${styleText('yellow', 'Pending')}`)\n } else if (attempt.isFailure) {\n const failure = formatFailure(attempt, {includeHelp: true})\n this.log(`${prefix} ${styleText('yellow', `Failure: ${failure}`)}`)\n } else {\n this.log(`${prefix} Success: HTTP ${attempt.resultCode} (${attempt.duration}ms)`)\n }\n }\n }\n\n // Leave some empty space between messages\n this.log('')\n }\n\n private printSeparator(skip: boolean) {\n if (!skip) {\n this.log('---\\n')\n }\n }\n\n private async selectHook(hooks: Hook[]) {\n const hookId = await select({\n choices: hooks.map((hook) => ({\n name: hook.name,\n value: hook.id,\n })),\n message: 'Select hook to list logs for',\n })\n\n return hooks.find((hook) => hook.id === hookId)\n }\n}\n"],"names":["inspect","styleText","Args","Flags","exitCodes","SanityCommand","subdebug","select","formatFailure","promptForProject","getHookAttemptsForProject","getHookMessagesForProject","getHooksForProject","getProjectIdFlag","logsHookDebug","LogsHookCommand","args","name","string","description","required","examples","command","flags","semantics","detailed","boolean","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","hooks","error","err","message","exit","RUNTIME_ERROR","length","selectedHook","find","hook","toLowerCase","isUnattended","USAGE_ERROR","selectHook","messages","attempts","Promise","all","hookId","id","groupedAttempts","Object","groupBy","attempt","messageId","populated","map","msg","totalMessages","i","entries","printMessage","printSeparator","formatAttemptDate","dateString","Date","toISOString","replace","options","log","createdAt","status","resultCode","failureCount","payload","JSON","colors","date","prefix","inProgress","isFailure","failure","includeHelp","duration","skip","choices","value"],"mappings":"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"}
@@ -4,6 +4,7 @@ import { SanityCommand } from '@sanity/cli-core';
4
4
  import { initAction } from '../actions/init/initAction.js';
5
5
  import { InitError } from '../actions/init/initError.js';
6
6
  import { flagsToInitOptions } from '../actions/init/types.js';
7
+ import { getProjectIdFlag } from '../util/sharedFlags.js';
7
8
  export class InitCommand extends SanityCommand {
8
9
  static args = {
9
10
  type: Args.string({
@@ -176,16 +177,13 @@ export class InitCommand extends SanityCommand {
176
177
  'pnpm'
177
178
  ]
178
179
  }),
179
- project: Flags.string({
180
- aliases: [
181
- 'project-id'
182
- ],
180
+ ...getProjectIdFlag({
183
181
  description: 'Project ID to use for the studio',
184
182
  exclusive: [
185
183
  'create-project',
186
184
  'project-name'
187
185
  ],
188
- helpValue: '<id>'
186
+ semantics: 'specify'
189
187
  }),
190
188
  'project-name': Flags.string({
191
189
  description: 'Create a new project with the given name',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import {Args, Command, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {initAction} from '../actions/init/initAction.js'\nimport {InitError} from '../actions/init/initError.js'\nimport {flagsToInitOptions} from '../actions/init/types.js'\n\nexport class InitCommand extends SanityCommand<typeof InitCommand> {\n static override args = {type: Args.string({hidden: true})}\n static override description = 'Initialize a new Sanity Studio, project and/or app'\n static override enableJsonFlag = true\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n {\n command: '<%= config.bin %> <%= command.id %> --dataset-default',\n description: 'Initialize a new project with a public dataset named \"production\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset production --output-path ~/myproj',\n description: 'Initialize a project with the given project ID and dataset to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset staging --template moviedb --output-path .',\n description:\n 'Initialize a project with the given project ID and dataset using the moviedb template to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project-name \"Movies Unlimited\" --dataset moviedb --visibility private --template moviedb --output-path /Users/espenh/movies-unlimited',\n description: 'Create a brand new project with name \"Movies Unlimited\"',\n },\n ] satisfies Array<Command.Example>\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable auto updates of studio versions',\n exclusive: ['bare'],\n }),\n bare: Flags.boolean({\n description:\n 'Skip the Studio initialization and only print the selected project ID and dataset name to stdout',\n }),\n coupon: Flags.string({\n description:\n 'Optionally select a coupon for a new project (cannot be used with --project-plan)',\n exclusive: ['project-plan'],\n helpValue: '<code>',\n }),\n 'create-project': Flags.string({\n deprecated: {message: 'Use --project-name instead'},\n description: 'Create a new project with the given name',\n helpValue: '<name>',\n hidden: true,\n }),\n dashboard: Flags.boolean({\n description: 'Set up the project to run in the Sanity Dashboard (beta)',\n exclusive: ['bare', 'env'],\n }),\n dataset: Flags.string({\n description: 'Dataset name for the studio',\n exclusive: ['dataset-default'],\n helpValue: '<name>',\n }),\n 'dataset-default': Flags.boolean({\n description: 'Set up a project with a public dataset named \"production\"',\n }),\n env: Flags.string({\n description: 'Write environment variables to file',\n exclusive: ['bare'],\n helpValue: '<filename>',\n parse: async (input) => {\n if (!input.startsWith('.env')) {\n throw new CLIError('Env filename (`--env`) must start with `.env`')\n }\n return input\n },\n }),\n 'from-create': Flags.boolean({\n description: 'Internal flag to indicate that the command is run from create-sanity',\n hidden: true,\n }),\n git: Flags.string({\n default: undefined,\n description: 'Specify a commit message for initial commit, or disable git init',\n exclusive: ['bare'],\n // oclif doesn't indent correctly with custom help labels, thus leading space :/\n helpLabel: ' --[no-]git',\n helpValue: '<message>',\n }),\n 'import-dataset': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Import template sample dataset',\n }),\n install: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Install dependencies after scaffolding',\n exclusive: ['bare'],\n }),\n mcp: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable AI editor integration (MCP) setup',\n }),\n 'nextjs-add-config-files': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Add config files to Next.js project',\n helpGroup: 'Next.js',\n }),\n 'nextjs-append-env': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Append project ID and dataset to .env file',\n helpGroup: 'Next.js',\n }),\n 'nextjs-embed-studio': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Embed the Studio in Next.js application',\n helpGroup: 'Next.js',\n }),\n // oclif doesn't support a boolean/string flag combination, but listing both a\n // `--git` and a `--no-git` flag in help breaks conventions, so we hide this one,\n // but use it to \"combine\" the two in the actual logic.\n 'no-git': Flags.boolean({\n description: 'Disable git initialization',\n exclusive: ['git'],\n hidden: true,\n }),\n organization: Flags.string({\n description:\n 'Organization ID to use for the project (required for unattended project creation)',\n helpValue: '<id>',\n }),\n 'output-path': Flags.string({\n description: 'Path to write studio project to',\n exclusive: ['bare'],\n helpValue: '<path>',\n }),\n 'overwrite-files': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Overwrite existing files',\n }),\n 'package-manager': Flags.string({\n description: 'Specify which package manager to use [allowed: npm, yarn, pnpm]',\n exclusive: ['bare'],\n helpValue: '<manager>',\n options: ['npm', 'yarn', 'pnpm'],\n }),\n project: Flags.string({\n aliases: ['project-id'],\n description: 'Project ID to use for the studio',\n exclusive: ['create-project', 'project-name'],\n helpValue: '<id>',\n }),\n 'project-name': Flags.string({\n description: 'Create a new project with the given name',\n exclusive: ['project', 'create-project'],\n helpValue: '<name>',\n }),\n 'project-plan': Flags.string({\n description: 'Optionally select a plan for a new project',\n helpValue: '<name>',\n }),\n provider: Flags.string({\n description: 'Login provider to use',\n helpValue: '<provider>',\n }),\n quickstart: Flags.boolean({\n deprecated: true,\n description:\n 'Used for initializing a project from a server schema that is saved in the Journey API',\n hidden: true,\n }),\n reconfigure: Flags.boolean({\n deprecated: {\n message: 'This flag is no longer supported',\n version: '3.0.0',\n },\n description: 'Reconfigure an existing project',\n hidden: true,\n }),\n skills: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Install Sanity agent skills globally for detected AI editors',\n }),\n template: Flags.string({\n description: 'Project template to use [default: \"clean\"]',\n exclusive: ['bare'],\n helpValue: '<template>',\n }),\n // Porting over a beta flag\n // Oclif doesn't seem to support something in beta so hiding for now\n 'template-token': Flags.string({\n description: 'Used for accessing private GitHub repo templates',\n hidden: true,\n }),\n typescript: Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Enable TypeScript support',\n exclusive: ['bare'],\n }),\n visibility: Flags.string({\n description: 'Visibility mode for dataset',\n helpValue: '<mode>',\n options: ['public', 'private'],\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n }\n\n public async run(): Promise<void> {\n let mcpMode: 'auto' | 'prompt' | 'skip' = 'prompt'\n if (!this.flags.mcp || !this.resolveIsInteractive()) {\n mcpMode = 'skip'\n } else if (this.isUnattended()) {\n // Any unattended run (e.g. --yes, --json) configures MCP with defaults rather than prompting\n mcpMode = 'auto'\n }\n\n // Mirror MCP's environment gating: skip install in test environments\n // ensure e2e / CI tests don't run the bundled skills CLI.\n let skillsMode: 'auto' | 'prompt' | 'skip' = 'auto'\n if (!this.flags.skills || !this.resolveIsInteractive()) {\n skillsMode = 'skip'\n }\n\n try {\n await initAction(\n flagsToInitOptions(this.flags, this.isUnattended(), this.args, mcpMode, skillsMode),\n {\n output: this.output,\n telemetry: this.telemetry,\n workDir: process.cwd(),\n },\n )\n } catch (error) {\n if (error instanceof InitError) {\n this.error(error.message, {exit: error.exitCode})\n }\n throw error\n }\n }\n}\n"],"names":["Args","Flags","CLIError","SanityCommand","initAction","InitError","flagsToInitOptions","InitCommand","args","type","string","hidden","description","enableJsonFlag","examples","command","flags","boolean","allowNo","default","exclusive","bare","coupon","helpValue","deprecated","message","dashboard","dataset","env","parse","input","startsWith","git","undefined","helpLabel","install","mcp","helpGroup","organization","options","project","aliases","provider","quickstart","reconfigure","version","skills","template","typescript","visibility","yes","char","run","mcpMode","resolveIsInteractive","isUnattended","skillsMode","output","telemetry","workDir","process","cwd","error","exit","exitCode"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import {Args, Command, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {initAction} from '../actions/init/initAction.js'\nimport {InitError} from '../actions/init/initError.js'\nimport {flagsToInitOptions} from '../actions/init/types.js'\nimport {getProjectIdFlag} from '../util/sharedFlags.js'\n\nexport class InitCommand extends SanityCommand<typeof InitCommand> {\n static override args = {type: Args.string({hidden: true})}\n static override description = 'Initialize a new Sanity Studio, project and/or app'\n static override enableJsonFlag = true\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n {\n command: '<%= config.bin %> <%= command.id %> --dataset-default',\n description: 'Initialize a new project with a public dataset named \"production\"',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset production --output-path ~/myproj',\n description: 'Initialize a project with the given project ID and dataset to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project abc123 --dataset staging --template moviedb --output-path .',\n description:\n 'Initialize a project with the given project ID and dataset using the moviedb template to the given path',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -y --project-name \"Movies Unlimited\" --dataset moviedb --visibility private --template moviedb --output-path /Users/espenh/movies-unlimited',\n description: 'Create a brand new project with name \"Movies Unlimited\"',\n },\n ] satisfies Array<Command.Example>\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable auto updates of studio versions',\n exclusive: ['bare'],\n }),\n bare: Flags.boolean({\n description:\n 'Skip the Studio initialization and only print the selected project ID and dataset name to stdout',\n }),\n coupon: Flags.string({\n description:\n 'Optionally select a coupon for a new project (cannot be used with --project-plan)',\n exclusive: ['project-plan'],\n helpValue: '<code>',\n }),\n 'create-project': Flags.string({\n deprecated: {message: 'Use --project-name instead'},\n description: 'Create a new project with the given name',\n helpValue: '<name>',\n hidden: true,\n }),\n dashboard: Flags.boolean({\n description: 'Set up the project to run in the Sanity Dashboard (beta)',\n exclusive: ['bare', 'env'],\n }),\n dataset: Flags.string({\n description: 'Dataset name for the studio',\n exclusive: ['dataset-default'],\n helpValue: '<name>',\n }),\n 'dataset-default': Flags.boolean({\n description: 'Set up a project with a public dataset named \"production\"',\n }),\n env: Flags.string({\n description: 'Write environment variables to file',\n exclusive: ['bare'],\n helpValue: '<filename>',\n parse: async (input) => {\n if (!input.startsWith('.env')) {\n throw new CLIError('Env filename (`--env`) must start with `.env`')\n }\n return input\n },\n }),\n 'from-create': Flags.boolean({\n description: 'Internal flag to indicate that the command is run from create-sanity',\n hidden: true,\n }),\n git: Flags.string({\n default: undefined,\n description: 'Specify a commit message for initial commit, or disable git init',\n exclusive: ['bare'],\n // oclif doesn't indent correctly with custom help labels, thus leading space :/\n helpLabel: ' --[no-]git',\n helpValue: '<message>',\n }),\n 'import-dataset': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Import template sample dataset',\n }),\n install: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Install dependencies after scaffolding',\n exclusive: ['bare'],\n }),\n mcp: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Enable AI editor integration (MCP) setup',\n }),\n 'nextjs-add-config-files': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Add config files to Next.js project',\n helpGroup: 'Next.js',\n }),\n 'nextjs-append-env': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Append project ID and dataset to .env file',\n helpGroup: 'Next.js',\n }),\n 'nextjs-embed-studio': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Embed the Studio in Next.js application',\n helpGroup: 'Next.js',\n }),\n // oclif doesn't support a boolean/string flag combination, but listing both a\n // `--git` and a `--no-git` flag in help breaks conventions, so we hide this one,\n // but use it to \"combine\" the two in the actual logic.\n 'no-git': Flags.boolean({\n description: 'Disable git initialization',\n exclusive: ['git'],\n hidden: true,\n }),\n organization: Flags.string({\n description:\n 'Organization ID to use for the project (required for unattended project creation)',\n helpValue: '<id>',\n }),\n 'output-path': Flags.string({\n description: 'Path to write studio project to',\n exclusive: ['bare'],\n helpValue: '<path>',\n }),\n 'overwrite-files': Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Overwrite existing files',\n }),\n 'package-manager': Flags.string({\n description: 'Specify which package manager to use [allowed: npm, yarn, pnpm]',\n exclusive: ['bare'],\n helpValue: '<manager>',\n options: ['npm', 'yarn', 'pnpm'],\n }),\n ...getProjectIdFlag({\n description: 'Project ID to use for the studio',\n exclusive: ['create-project', 'project-name'],\n semantics: 'specify',\n }),\n 'project-name': Flags.string({\n description: 'Create a new project with the given name',\n exclusive: ['project', 'create-project'],\n helpValue: '<name>',\n }),\n 'project-plan': Flags.string({\n description: 'Optionally select a plan for a new project',\n helpValue: '<name>',\n }),\n provider: Flags.string({\n description: 'Login provider to use',\n helpValue: '<provider>',\n }),\n quickstart: Flags.boolean({\n deprecated: true,\n description:\n 'Used for initializing a project from a server schema that is saved in the Journey API',\n hidden: true,\n }),\n reconfigure: Flags.boolean({\n deprecated: {\n message: 'This flag is no longer supported',\n version: '3.0.0',\n },\n description: 'Reconfigure an existing project',\n hidden: true,\n }),\n skills: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Install Sanity agent skills globally for detected AI editors',\n }),\n template: Flags.string({\n description: 'Project template to use [default: \"clean\"]',\n exclusive: ['bare'],\n helpValue: '<template>',\n }),\n // Porting over a beta flag\n // Oclif doesn't seem to support something in beta so hiding for now\n 'template-token': Flags.string({\n description: 'Used for accessing private GitHub repo templates',\n hidden: true,\n }),\n typescript: Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Enable TypeScript support',\n exclusive: ['bare'],\n }),\n visibility: Flags.string({\n description: 'Visibility mode for dataset',\n helpValue: '<mode>',\n options: ['public', 'private'],\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n }\n\n public async run(): Promise<void> {\n let mcpMode: 'auto' | 'prompt' | 'skip' = 'prompt'\n if (!this.flags.mcp || !this.resolveIsInteractive()) {\n mcpMode = 'skip'\n } else if (this.isUnattended()) {\n // Any unattended run (e.g. --yes, --json) configures MCP with defaults rather than prompting\n mcpMode = 'auto'\n }\n\n // Mirror MCP's environment gating: skip install in test environments\n // ensure e2e / CI tests don't run the bundled skills CLI.\n let skillsMode: 'auto' | 'prompt' | 'skip' = 'auto'\n if (!this.flags.skills || !this.resolveIsInteractive()) {\n skillsMode = 'skip'\n }\n\n try {\n await initAction(\n flagsToInitOptions(this.flags, this.isUnattended(), this.args, mcpMode, skillsMode),\n {\n output: this.output,\n telemetry: this.telemetry,\n workDir: process.cwd(),\n },\n )\n } catch (error) {\n if (error instanceof InitError) {\n this.error(error.message, {exit: error.exitCode})\n }\n throw error\n }\n }\n}\n"],"names":["Args","Flags","CLIError","SanityCommand","initAction","InitError","flagsToInitOptions","getProjectIdFlag","InitCommand","args","type","string","hidden","description","enableJsonFlag","examples","command","flags","boolean","allowNo","default","exclusive","bare","coupon","helpValue","deprecated","message","dashboard","dataset","env","parse","input","startsWith","git","undefined","helpLabel","install","mcp","helpGroup","organization","options","semantics","provider","quickstart","reconfigure","version","skills","template","typescript","visibility","yes","char","run","mcpMode","resolveIsInteractive","isUnattended","skillsMode","output","telemetry","workDir","process","cwd","error","exit","exitCode"],"mappings":"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"}
@@ -10,6 +10,7 @@ import { prettyFormat } from '../../actions/migration/prettyMutationFormatter.js
10
10
  import { resolveMigrations } from '../../actions/migration/resolveMigrations.js';
11
11
  import { isLoadableMigrationScript, resolveMigrationScript } from '../../actions/migration/resolveMigrationScript.js';
12
12
  import { Table } from '../../util/responsiveTable.js';
13
+ import { getProjectIdFlag } from '../../util/sharedFlags.js';
13
14
  const runMigrationDebug = subdebug('migration:run');
14
15
  /**
15
16
  * Renders the `cause` chain of an error the way oclif's own error printer would.
@@ -81,8 +82,9 @@ export class RunMigrationCommand extends SanityCommand {
81
82
  default: true,
82
83
  description: 'Display progress during migration (default: true). Use --no-progress to hide output.'
83
84
  }),
84
- project: Flags.string({
85
- description: 'Project ID of the dataset to migrate. Defaults to the projectId configured in your Sanity CLI config.'
85
+ ...getProjectIdFlag({
86
+ description: 'Project ID of the dataset to migrate',
87
+ semantics: 'override'
86
88
  })
87
89
  };
88
90
  static hiddenAliases = [
@@ -140,9 +142,7 @@ export class RunMigrationCommand extends SanityCommand {
140
142
  this.exit(exitCodes.RUNTIME_ERROR);
141
143
  }
142
144
  const cliConfig = await this.getCliConfig();
143
- const projectId = await this.getProjectId({
144
- deprecatedFlagName: 'project'
145
- });
145
+ const projectId = await this.getProjectId();
146
146
  const datasetFromConfig = cliConfig.api?.dataset;
147
147
  const fromExport = flags['from-export'];
148
148
  const dry = flags['dry-run'];