@sanity/cli 7.12.0 → 7.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/actions/build/buildApp.js +1 -1
  2. package/dist/actions/build/buildApp.js.map +1 -1
  3. package/dist/actions/build/buildStudio.js +1 -1
  4. package/dist/actions/build/buildStudio.js.map +1 -1
  5. package/dist/commands/backups/disable.js +4 -4
  6. package/dist/commands/backups/disable.js.map +1 -1
  7. package/dist/commands/backups/download.js +7 -7
  8. package/dist/commands/backups/download.js.map +1 -1
  9. package/dist/commands/backups/enable.js +4 -4
  10. package/dist/commands/backups/enable.js.map +1 -1
  11. package/dist/commands/backups/list.js +7 -7
  12. package/dist/commands/backups/list.js.map +1 -1
  13. package/dist/commands/codemod.js +5 -5
  14. package/dist/commands/codemod.js.map +1 -1
  15. package/dist/commands/cors/add.js +1 -1
  16. package/dist/commands/cors/add.js.map +1 -1
  17. package/dist/commands/cors/delete.js +4 -4
  18. package/dist/commands/cors/delete.js.map +1 -1
  19. package/dist/commands/cors/list.js +2 -2
  20. package/dist/commands/cors/list.js.map +1 -1
  21. package/dist/commands/datasets/alias/create.js +5 -5
  22. package/dist/commands/datasets/alias/create.js.map +1 -1
  23. package/dist/commands/datasets/alias/delete.js +2 -2
  24. package/dist/commands/datasets/alias/delete.js.map +1 -1
  25. package/dist/commands/datasets/alias/link.js +5 -5
  26. package/dist/commands/datasets/alias/link.js.map +1 -1
  27. package/dist/commands/datasets/alias/unlink.js +3 -3
  28. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  29. package/dist/commands/datasets/copy.js +7 -7
  30. package/dist/commands/datasets/copy.js.map +1 -1
  31. package/dist/commands/datasets/create.js +3 -3
  32. package/dist/commands/datasets/create.js.map +1 -1
  33. package/dist/commands/datasets/delete.js +2 -2
  34. package/dist/commands/datasets/delete.js.map +1 -1
  35. package/dist/commands/datasets/embeddings/disable.js +3 -3
  36. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  37. package/dist/commands/datasets/embeddings/enable.js +5 -5
  38. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  39. package/dist/commands/datasets/embeddings/status.js +3 -3
  40. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  41. package/dist/commands/datasets/export.js +6 -6
  42. package/dist/commands/datasets/export.js.map +1 -1
  43. package/dist/commands/datasets/import.js +3 -3
  44. package/dist/commands/datasets/import.js.map +1 -1
  45. package/dist/commands/datasets/list.js +2 -2
  46. package/dist/commands/datasets/list.js.map +1 -1
  47. package/dist/commands/datasets/visibility/get.js +2 -2
  48. package/dist/commands/datasets/visibility/get.js.map +1 -1
  49. package/dist/commands/datasets/visibility/set.js +3 -3
  50. package/dist/commands/datasets/visibility/set.js.map +1 -1
  51. package/dist/commands/deploy.js +2 -2
  52. package/dist/commands/deploy.js.map +1 -1
  53. package/dist/commands/dev.js +2 -2
  54. package/dist/commands/dev.js.map +1 -1
  55. package/dist/commands/docs/read.js +1 -1
  56. package/dist/commands/docs/read.js.map +1 -1
  57. package/dist/commands/docs/search.js +3 -3
  58. package/dist/commands/docs/search.js.map +1 -1
  59. package/dist/commands/doctor.js +3 -3
  60. package/dist/commands/doctor.js.map +1 -1
  61. package/dist/commands/documents/create.js +3 -3
  62. package/dist/commands/documents/create.js.map +1 -1
  63. package/dist/commands/documents/delete.js +3 -3
  64. package/dist/commands/documents/delete.js.map +1 -1
  65. package/dist/commands/documents/get.js +2 -2
  66. package/dist/commands/documents/get.js.map +1 -1
  67. package/dist/commands/documents/query.js +2 -2
  68. package/dist/commands/documents/query.js.map +1 -1
  69. package/dist/commands/documents/validate.js +3 -3
  70. package/dist/commands/documents/validate.js.map +1 -1
  71. package/dist/commands/graphql/deploy.js +13 -13
  72. package/dist/commands/graphql/deploy.js.map +1 -1
  73. package/dist/commands/graphql/list.js +2 -2
  74. package/dist/commands/graphql/list.js.map +1 -1
  75. package/dist/commands/graphql/undeploy.js +2 -2
  76. package/dist/commands/graphql/undeploy.js.map +1 -1
  77. package/dist/commands/hooks/attempt.js +2 -2
  78. package/dist/commands/hooks/attempt.js.map +1 -1
  79. package/dist/commands/hooks/create.js +3 -3
  80. package/dist/commands/hooks/create.js.map +1 -1
  81. package/dist/commands/hooks/delete.js +4 -4
  82. package/dist/commands/hooks/delete.js.map +1 -1
  83. package/dist/commands/hooks/list.js +2 -2
  84. package/dist/commands/hooks/list.js.map +1 -1
  85. package/dist/commands/hooks/logs.js +5 -5
  86. package/dist/commands/hooks/logs.js.map +1 -1
  87. package/dist/commands/login.js +2 -2
  88. package/dist/commands/login.js.map +1 -1
  89. package/dist/commands/logout.js +2 -2
  90. package/dist/commands/logout.js.map +1 -1
  91. package/dist/commands/manifest/extract.js +3 -3
  92. package/dist/commands/manifest/extract.js.map +1 -1
  93. package/dist/commands/mcp/configure.js +4 -4
  94. package/dist/commands/mcp/configure.js.map +1 -1
  95. package/dist/commands/media/create-aspect.js +3 -3
  96. package/dist/commands/media/create-aspect.js.map +1 -1
  97. package/dist/commands/media/delete-aspect.js +1 -1
  98. package/dist/commands/media/delete-aspect.js.map +1 -1
  99. package/dist/commands/media/deploy-aspect.js +4 -4
  100. package/dist/commands/media/deploy-aspect.js.map +1 -1
  101. package/dist/commands/media/export.js +7 -7
  102. package/dist/commands/media/export.js.map +1 -1
  103. package/dist/commands/media/import.js +6 -6
  104. package/dist/commands/media/import.js.map +1 -1
  105. package/dist/commands/migrations/create.js +4 -4
  106. package/dist/commands/migrations/create.js.map +1 -1
  107. package/dist/commands/migrations/list.js +2 -2
  108. package/dist/commands/migrations/list.js.map +1 -1
  109. package/dist/commands/migrations/run.js +14 -14
  110. package/dist/commands/migrations/run.js.map +1 -1
  111. package/dist/commands/openapi/get.js +3 -3
  112. package/dist/commands/openapi/get.js.map +1 -1
  113. package/dist/commands/openapi/list.js +2 -2
  114. package/dist/commands/openapi/list.js.map +1 -1
  115. package/dist/commands/organizations/create.js +5 -5
  116. package/dist/commands/organizations/create.js.map +1 -1
  117. package/dist/commands/organizations/delete.js +6 -6
  118. package/dist/commands/organizations/delete.js.map +1 -1
  119. package/dist/commands/organizations/get.js +3 -3
  120. package/dist/commands/organizations/get.js.map +1 -1
  121. package/dist/commands/organizations/list.js +2 -2
  122. package/dist/commands/organizations/list.js.map +1 -1
  123. package/dist/commands/organizations/update.js +6 -6
  124. package/dist/commands/organizations/update.js.map +1 -1
  125. package/dist/commands/preview.js +2 -2
  126. package/dist/commands/preview.js.map +1 -1
  127. package/dist/commands/projects/create.js +2 -2
  128. package/dist/commands/projects/create.js.map +1 -1
  129. package/dist/commands/projects/list.js +2 -2
  130. package/dist/commands/projects/list.js.map +1 -1
  131. package/dist/commands/schemas/delete.js +2 -2
  132. package/dist/commands/schemas/delete.js.map +1 -1
  133. package/dist/commands/schemas/deploy.js +2 -2
  134. package/dist/commands/schemas/deploy.js.map +1 -1
  135. package/dist/commands/schemas/list.js +1 -1
  136. package/dist/commands/schemas/list.js.map +1 -1
  137. package/dist/commands/schemas/validate.js +2 -1
  138. package/dist/commands/schemas/validate.js.map +1 -1
  139. package/dist/commands/skills/install.js +2 -2
  140. package/dist/commands/skills/install.js.map +1 -1
  141. package/dist/commands/telemetry/disable.js +2 -2
  142. package/dist/commands/telemetry/disable.js.map +1 -1
  143. package/dist/commands/telemetry/enable.js +2 -2
  144. package/dist/commands/telemetry/enable.js.map +1 -1
  145. package/dist/commands/tokens/create.js +2 -2
  146. package/dist/commands/tokens/create.js.map +1 -1
  147. package/dist/commands/tokens/delete.js +2 -2
  148. package/dist/commands/tokens/delete.js.map +1 -1
  149. package/dist/commands/tokens/list.js +2 -2
  150. package/dist/commands/tokens/list.js.map +1 -1
  151. package/dist/commands/users/invite.js +3 -3
  152. package/dist/commands/users/invite.js.map +1 -1
  153. package/oclif.manifest.json +512 -512
  154. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/codemod.ts"],"sourcesContent":["import {execSync, spawn} from 'node:child_process'\nimport {existsSync} from 'node:fs'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {codemods} from '../actions/codemods/index.js'\nimport {type CodeMod} from '../actions/codemods/types.js'\n\nconst codemodeDebug = subdebug('codemod')\n\nexport class CodemodCommand extends SanityCommand<typeof CodemodCommand> {\n static override args = {\n codemodName: Args.string({\n description: 'Name of the codemod to run',\n required: false,\n }),\n }\n\n static override description = 'Updates Sanity Studio codebase with a code modification script'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Show available code mods',\n },\n {\n command: '<%= config.bin %> <%= command.id %> reactIconsV3 --dry',\n description: 'Run codemod to transform react-icons imports (dry run)',\n },\n ]\n\n static override flags = {\n dry: Flags.boolean({\n default: false,\n description: 'Dry run (no changes are made to files)',\n }),\n extensions: Flags.string({\n default: 'js,ts,tsx',\n description: 'Transform files with these file extensions (comma separated)',\n }),\n 'no-verify': Flags.boolean({\n default: false,\n description: 'Skip verification steps before running codemod',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CodemodCommand)\n const {codemodName} = args\n const workDir = process.cwd()\n\n if (!codemodName) {\n this.printMods()\n return\n }\n\n // Make a record where all the keys of the available codemods are lowercased,\n // eg `reactIconsV3` turns into `{reacticonsv3: CodeMod}`\n const normalizedMods: Map<string, CodeMod> = new Map()\n for (const [originalName, mod] of Object.entries(codemods)) {\n normalizedMods.set(originalName.toLowerCase(), mod)\n }\n\n // Verify that mod exists\n const mod = normalizedMods.get(codemodName.toLowerCase())\n if (!mod) {\n this.error(`Codemod with name \"${codemodName}\" not found`, {exit: 1})\n }\n\n // Verify if there is any verification defined, and user has not opted out of it\n if (typeof mod.verify === 'function' && !flags['no-verify']) {\n try {\n await mod.verify({workDir})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n codemodeDebug('Verification failed: %s', err.message)\n this.error(`Verification failed: ${err.message}`, {exit: 1})\n }\n }\n\n // If extensions are defined, they come in as CSV, so split and normalize them\n const exts = flags.extensions\n ? flags.extensions.split(',').map((ext) => ext.trim().replace(/^\\./, ''))\n : ['js', 'ts', 'tsx']\n\n const dryRun = flags.dry\n\n // We use npx to run jscodeshift, so verify that it exists and works before using it\n this.ensureNpx()\n\n // If there is a gitignore in the target folder, we want to use that to know\n // which folders to ignore - eg `dist`, `coverage` or whatever\n const hasGitIgnore = existsSync(path.join(workDir, '.gitignore'))\n\n // Build the CLI command arguments\n const cliRoot = path.resolve(import.meta.dirname, '../..')\n const modPath = path.resolve(path.join(cliRoot, 'codemods', mod.filename))\n const cmdArgs = [\n 'jscodeshift',\n '--ignore-pattern',\n 'node_modules',\n '--ignore-pattern',\n 'dist',\n hasGitIgnore && '--ignore-config',\n hasGitIgnore && '.gitignore',\n '-t',\n modPath,\n '--extensions',\n exts.join(','),\n dryRun && '--dry',\n workDir,\n ].filter((item): item is string => typeof item === 'string')\n\n const child = spawn('npx', cmdArgs, {\n stdio: 'inherit',\n })\n\n const handleSigint = () => {\n child.kill(2)\n }\n\n process.on('SIGINT', handleSigint)\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', handleSigint)\n this.exit(code || undefined)\n })\n }\n\n private ensureNpx(): void {\n try {\n const npxHelp = execSync('npx --help', {encoding: 'utf8'})\n if (!npxHelp.includes('npm')) {\n this.error('Not the npx we expected', {exit: 1})\n }\n } catch {\n this.error(\n `Failed to run \"npx\" - required to run codemods. Do you have a recent version of npm installed?`,\n {exit: 1},\n )\n }\n }\n\n private printMods(): void {\n this.log('Available code modifications:\\n')\n\n for (const [modName, mod] of Object.entries(codemods)) {\n this.log(`${modName} - ${mod.purpose}`)\n }\n }\n}\n"],"names":["execSync","spawn","existsSync","path","Args","Flags","SanityCommand","subdebug","codemods","codemodeDebug","CodemodCommand","args","codemodName","string","description","required","examples","command","flags","dry","boolean","default","extensions","run","parse","workDir","process","cwd","printMods","normalizedMods","Map","originalName","mod","Object","entries","set","toLowerCase","get","error","exit","verify","err","Error","String","message","exts","split","map","ext","trim","replace","dryRun","ensureNpx","hasGitIgnore","join","cliRoot","resolve","dirname","modPath","filename","cmdArgs","filter","item","child","stdio","handleSigint","kill","on","code","removeListener","undefined","npxHelp","encoding","includes","log","modName","purpose"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/codemod.ts"],"sourcesContent":["import {execSync, spawn} from 'node:child_process'\nimport {existsSync} from 'node:fs'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {codemods} from '../actions/codemods/index.js'\nimport {type CodeMod} from '../actions/codemods/types.js'\n\nconst codemodeDebug = subdebug('codemod')\n\nexport class CodemodCommand extends SanityCommand<typeof CodemodCommand> {\n static override args = {\n codemodName: Args.string({\n description: 'Name of the codemod to run',\n required: false,\n }),\n }\n\n static override description = 'Updates Sanity Studio codebase with a code modification script'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Show available code mods',\n },\n {\n command: '<%= config.bin %> <%= command.id %> reactIconsV3 --dry',\n description: 'Run codemod to transform react-icons imports (dry run)',\n },\n ]\n\n static override flags = {\n dry: Flags.boolean({\n default: false,\n description: 'Dry run (no changes are made to files)',\n }),\n extensions: Flags.string({\n default: 'js,ts,tsx',\n description: 'Transform files with these file extensions (comma separated)',\n }),\n 'no-verify': Flags.boolean({\n default: false,\n description: 'Skip verification steps before running codemod',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CodemodCommand)\n const {codemodName} = args\n const workDir = process.cwd()\n\n if (!codemodName) {\n this.printMods()\n return\n }\n\n // Make a record where all the keys of the available codemods are lowercased,\n // eg `reactIconsV3` turns into `{reacticonsv3: CodeMod}`\n const normalizedMods: Map<string, CodeMod> = new Map()\n for (const [originalName, mod] of Object.entries(codemods)) {\n normalizedMods.set(originalName.toLowerCase(), mod)\n }\n\n // Verify that mod exists\n const mod = normalizedMods.get(codemodName.toLowerCase())\n if (!mod) {\n this.error(`Codemod with name \"${codemodName}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // Verify if there is any verification defined, and user has not opted out of it\n if (typeof mod.verify === 'function' && !flags['no-verify']) {\n try {\n await mod.verify({workDir})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n codemodeDebug('Verification failed: %s', err.message)\n this.error(`Verification failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n // If extensions are defined, they come in as CSV, so split and normalize them\n const exts = flags.extensions\n ? flags.extensions.split(',').map((ext) => ext.trim().replace(/^\\./, ''))\n : ['js', 'ts', 'tsx']\n\n const dryRun = flags.dry\n\n // We use npx to run jscodeshift, so verify that it exists and works before using it\n this.ensureNpx()\n\n // If there is a gitignore in the target folder, we want to use that to know\n // which folders to ignore - eg `dist`, `coverage` or whatever\n const hasGitIgnore = existsSync(path.join(workDir, '.gitignore'))\n\n // Build the CLI command arguments\n const cliRoot = path.resolve(import.meta.dirname, '../..')\n const modPath = path.resolve(path.join(cliRoot, 'codemods', mod.filename))\n const cmdArgs = [\n 'jscodeshift',\n '--ignore-pattern',\n 'node_modules',\n '--ignore-pattern',\n 'dist',\n hasGitIgnore && '--ignore-config',\n hasGitIgnore && '.gitignore',\n '-t',\n modPath,\n '--extensions',\n exts.join(','),\n dryRun && '--dry',\n workDir,\n ].filter((item): item is string => typeof item === 'string')\n\n const child = spawn('npx', cmdArgs, {\n stdio: 'inherit',\n })\n\n const handleSigint = () => {\n child.kill(2)\n }\n\n process.on('SIGINT', handleSigint)\n\n child.on('close', (code) => {\n process.removeListener('SIGINT', handleSigint)\n this.exit(code || undefined)\n })\n }\n\n private ensureNpx(): void {\n try {\n const npxHelp = execSync('npx --help', {encoding: 'utf8'})\n if (!npxHelp.includes('npm')) {\n this.error('Not the npx we expected', {exit: exitCodes.RUNTIME_ERROR})\n }\n } catch {\n this.error(\n `Failed to run \"npx\" - required to run codemods. Do you have a recent version of npm installed?`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n\n private printMods(): void {\n this.log('Available code modifications:\\n')\n\n for (const [modName, mod] of Object.entries(codemods)) {\n this.log(`${modName} - ${mod.purpose}`)\n }\n }\n}\n"],"names":["execSync","spawn","existsSync","path","Args","Flags","exitCodes","SanityCommand","subdebug","codemods","codemodeDebug","CodemodCommand","args","codemodName","string","description","required","examples","command","flags","dry","boolean","default","extensions","run","parse","workDir","process","cwd","printMods","normalizedMods","Map","originalName","mod","Object","entries","set","toLowerCase","get","error","exit","RUNTIME_ERROR","verify","err","Error","String","message","exts","split","map","ext","trim","replace","dryRun","ensureNpx","hasGitIgnore","join","cliRoot","resolve","dirname","modPath","filename","cmdArgs","filter","item","child","stdio","handleSigint","kill","on","code","removeListener","undefined","npxHelp","encoding","includes","log","modName","purpose"],"mappings":"AAAA,SAAQA,QAAQ,EAAEC,KAAK,QAAO,qBAAoB;AAClD,SAAQC,UAAU,QAAO,UAAS;AAClC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,QAAQ,QAAO,+BAA8B;AAGrD,MAAMC,gBAAgBF,SAAS;AAE/B,OAAO,MAAMG,uBAAuBJ;IAClC,OAAgBK,OAAO;QACrBC,aAAaT,KAAKU,MAAM,CAAC;YACvBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,iEAAgE;IAE9F,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,KAAKf,MAAMgB,OAAO,CAAC;YACjBC,SAAS;YACTP,aAAa;QACf;QACAQ,YAAYlB,MAAMS,MAAM,CAAC;YACvBQ,SAAS;YACTP,aAAa;QACf;QACA,aAAaV,MAAMgB,OAAO,CAAC;YACzBC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACZ,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACd;QACvC,MAAM,EAACE,WAAW,EAAC,GAAGD;QACtB,MAAMc,UAAUC,QAAQC,GAAG;QAE3B,IAAI,CAACf,aAAa;YAChB,IAAI,CAACgB,SAAS;YACd;QACF;QAEA,6EAA6E;QAC7E,yDAAyD;QACzD,MAAMC,iBAAuC,IAAIC;QACjD,KAAK,MAAM,CAACC,cAAcC,IAAI,IAAIC,OAAOC,OAAO,CAAC1B,UAAW;YAC1DqB,eAAeM,GAAG,CAACJ,aAAaK,WAAW,IAAIJ;QACjD;QAEA,yBAAyB;QACzB,MAAMA,MAAMH,eAAeQ,GAAG,CAACzB,YAAYwB,WAAW;QACtD,IAAI,CAACJ,KAAK;YACR,IAAI,CAACM,KAAK,CAAC,CAAC,mBAAmB,EAAE1B,YAAY,WAAW,CAAC,EAAE;gBAAC2B,MAAMlC,UAAUmC,aAAa;YAAA;QAC3F;QAEA,gFAAgF;QAChF,IAAI,OAAOR,IAAIS,MAAM,KAAK,cAAc,CAACvB,KAAK,CAAC,YAAY,EAAE;YAC3D,IAAI;gBACF,MAAMc,IAAIS,MAAM,CAAC;oBAAChB;gBAAO;YAC3B,EAAE,OAAOa,OAAO;gBACd,MAAMI,MAAMJ,iBAAiBK,QAAQL,QAAQ,IAAIK,MAAMC,OAAON;gBAC9D7B,cAAc,2BAA2BiC,IAAIG,OAAO;gBACpD,IAAI,CAACP,KAAK,CAAC,CAAC,qBAAqB,EAAEI,IAAIG,OAAO,EAAE,EAAE;oBAACN,MAAMlC,UAAUmC,aAAa;gBAAA;YAClF;QACF;QAEA,8EAA8E;QAC9E,MAAMM,OAAO5B,MAAMI,UAAU,GACzBJ,MAAMI,UAAU,CAACyB,KAAK,CAAC,KAAKC,GAAG,CAAC,CAACC,MAAQA,IAAIC,IAAI,GAAGC,OAAO,CAAC,OAAO,OACnE;YAAC;YAAM;YAAM;SAAM;QAEvB,MAAMC,SAASlC,MAAMC,GAAG;QAExB,oFAAoF;QACpF,IAAI,CAACkC,SAAS;QAEd,4EAA4E;QAC5E,8DAA8D;QAC9D,MAAMC,eAAerD,WAAWC,KAAKqD,IAAI,CAAC9B,SAAS;QAEnD,kCAAkC;QAClC,MAAM+B,UAAUtD,KAAKuD,OAAO,CAAC,YAAYC,OAAO,EAAE;QAClD,MAAMC,UAAUzD,KAAKuD,OAAO,CAACvD,KAAKqD,IAAI,CAACC,SAAS,YAAYxB,IAAI4B,QAAQ;QACxE,MAAMC,UAAU;YACd;YACA;YACA;YACA;YACA;YACAP,gBAAgB;YAChBA,gBAAgB;YAChB;YACAK;YACA;YACAb,KAAKS,IAAI,CAAC;YACVH,UAAU;YACV3B;SACD,CAACqC,MAAM,CAAC,CAACC,OAAyB,OAAOA,SAAS;QAEnD,MAAMC,QAAQhE,MAAM,OAAO6D,SAAS;YAClCI,OAAO;QACT;QAEA,MAAMC,eAAe;YACnBF,MAAMG,IAAI,CAAC;QACb;QAEAzC,QAAQ0C,EAAE,CAAC,UAAUF;QAErBF,MAAMI,EAAE,CAAC,SAAS,CAACC;YACjB3C,QAAQ4C,cAAc,CAAC,UAAUJ;YACjC,IAAI,CAAC3B,IAAI,CAAC8B,QAAQE;QACpB;IACF;IAEQlB,YAAkB;QACxB,IAAI;YACF,MAAMmB,UAAUzE,SAAS,cAAc;gBAAC0E,UAAU;YAAM;YACxD,IAAI,CAACD,QAAQE,QAAQ,CAAC,QAAQ;gBAC5B,IAAI,CAACpC,KAAK,CAAC,2BAA2B;oBAACC,MAAMlC,UAAUmC,aAAa;gBAAA;YACtE;QACF,EAAE,OAAM;YACN,IAAI,CAACF,KAAK,CACR,CAAC,8FAA8F,CAAC,EAChG;gBAACC,MAAMlC,UAAUmC,aAAa;YAAA;QAElC;IACF;IAEQZ,YAAkB;QACxB,IAAI,CAAC+C,GAAG,CAAC;QAET,KAAK,MAAM,CAACC,SAAS5C,IAAI,IAAIC,OAAOC,OAAO,CAAC1B,UAAW;YACrD,IAAI,CAACmE,GAAG,CAAC,GAAGC,QAAQ,GAAG,EAAE5C,IAAI6C,OAAO,EAAE;QACxC;IACF;AACF"}
@@ -105,7 +105,7 @@ export class Add extends SanityCommand {
105
105
  const err = error;
106
106
  addCorsDebug(`Error adding CORS origin`, err);
107
107
  this.error(`CORS origin addition failed:\n${err.message}`, {
108
- exit: 1
108
+ exit: exitCodes.RUNTIME_ERROR
109
109
  });
110
110
  }
111
111
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/cors/add.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm, logSymbols} from '@sanity/cli-core/ux'\nimport {oneline} from 'oneline'\n\nimport {filterAndValidateOrigin} from '../../actions/cors/filterAndValidateOrigin.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {createCorsOrigin} from '../../services/cors.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst addCorsDebug = subdebug('cors:add')\n\nexport class Add extends SanityCommand<typeof Add> {\n static override args = {\n origin: Args.string({\n description: 'Origin to allow (e.g., https://example.com)',\n required: true,\n }),\n }\n\n static override description = 'Add a CORS origin to the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively add a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> http://localhost:3000 --no-credentials',\n description: 'Add a localhost origin without credentials',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://myapp.com --credentials',\n description: 'Add a production origin with credentials allowed',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://myapp.com --project-id abc123',\n description: 'Add a CORS origin for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to add CORS origin to',\n semantics: 'override',\n }),\n credentials: Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Allow credentials (token/cookie) to be sent from this origin',\n required: false,\n }),\n yes: Flags.boolean({\n char: 'y',\n description: 'Confirm risky wildcard origins without prompting',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(Add)\n const {origin} = args\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'create', permission: 'sanity.project.cors'}],\n }),\n })\n\n // Check if the origin argument looks like a file path and warn\n try {\n const isFile = fs.existsSync(path.join(process.cwd(), args.origin))\n if (isFile) {\n this.warn(`Origin \"${args.origin}?\" Remember to quote values (sanity cors add \"*\")`)\n }\n } catch {\n // Ignore errors checking if it's a file\n }\n\n const filteredOrigin = await filterAndValidateOrigin(origin, this.output)\n const hasWildcard = origin.includes('*')\n\n if (hasWildcard) {\n if (this.isUnattended() && !flags.yes) {\n this.error('Wildcard origins require confirmation. Pass `--yes` to continue.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n const confirmed = flags.yes || (await this.promptForWildcardConfirmation(origin))\n if (!confirmed) {\n this.log('CORS origin not added')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n const allowCredentials =\n flags.credentials === undefined\n ? this.isUnattended()\n ? false\n : await this.promptForCredentials(hasWildcard)\n : Boolean(flags.credentials)\n\n if (filteredOrigin !== origin) {\n this.log(`Normalized origin to: ${filteredOrigin}`)\n }\n\n try {\n const response = await createCorsOrigin({\n allowCredentials,\n origin: filteredOrigin,\n projectId,\n })\n\n addCorsDebug(`CORS origin added successfully`, response)\n\n this.log('CORS origin added')\n } catch (error) {\n const err = error as Error\n\n addCorsDebug(`Error adding CORS origin`, err)\n this.error(`CORS origin addition failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n /**\n * Prompt the user for credentials\n *\n * @param hasWildcard - Whether the origin contains a wildcard\n * @returns - Whether to allow credentials\n */\n private async promptForCredentials(hasWildcard: boolean) {\n this.log('')\n if (hasWildcard) {\n this.log(oneline`\n ${styleText('yellow', `${logSymbols.warning} Warning:`)}\n We ${styleText(['red', 'underline'], 'HIGHLY')} recommend NOT allowing credentials\n on origins containing wildcards. If you are logged in to a Sanity studio or an app built with\n the Sanity App SDK, people will be able to send requests ${styleText('underline', 'on your behalf')}\n to read and modify data, from any matching origin. Please tread carefully!\n `)\n } else {\n this.log(oneline`\n ${styleText('yellow', `${logSymbols.warning} Warning:`)}\n Should this origin be allowed to send requests using authentication tokens or\n session cookies? Be aware that any script on this origin will be able to send\n requests ${styleText('underline', 'on your behalf')} to read and modify data if you\n are logged in to a Sanity studio or app. If this origin hosts a studio or an app built with\n the Sanity App SDK, you will need this, otherwise you should probably answer \"No\" (n).\n `)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Allow credentials to be sent from this origin? Please read the warning above.\n `,\n })\n }\n\n /**\n * Prompt the user for wildcard confirmation\n *\n * @param origin - The origin to check for wildcards\n * @returns - Whether to allow the origin\n */\n private async promptForWildcardConfirmation(origin: string) {\n this.log('')\n this.log(styleText('yellow', `${logSymbols.warning} Warning: Examples of allowed origins:`))\n\n if (origin === '*') {\n this.log('- http://www.some-malicious.site')\n this.log('- https://not.what-you-were-expecting.com')\n this.log('- https://high-traffic-site.com')\n this.log('- http://192.168.1.1:8080')\n } else {\n this.log(`- ${origin.replace(/:\\*/, ':1234').replaceAll('*', 'foo')}`)\n this.log(`- ${origin.replace(/:\\*/, ':3030').replaceAll('*', 'foo.bar')}`)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Using wildcards can be ${styleText('red', 'risky')}.\n Are you ${styleText('underline', 'absolutely sure')} you want to allow this origin?`,\n })\n }\n}\n"],"names":["fs","path","styleText","Args","Flags","exitCodes","SanityCommand","subdebug","confirm","logSymbols","oneline","filterAndValidateOrigin","promptForProject","createCorsOrigin","getProjectIdFlag","addCorsDebug","Add","args","origin","string","description","required","examples","command","flags","semantics","credentials","boolean","allowNo","default","undefined","yes","char","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isFile","existsSync","join","process","cwd","warn","filteredOrigin","output","hasWildcard","includes","isUnattended","error","exit","USAGE_ERROR","confirmed","promptForWildcardConfirmation","log","USER_ABORT","allowCredentials","promptForCredentials","Boolean","response","err","message","warning","replace","replaceAll"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/cors/add.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm, logSymbols} from '@sanity/cli-core/ux'\nimport {oneline} from 'oneline'\n\nimport {filterAndValidateOrigin} from '../../actions/cors/filterAndValidateOrigin.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {createCorsOrigin} from '../../services/cors.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst addCorsDebug = subdebug('cors:add')\n\nexport class Add extends SanityCommand<typeof Add> {\n static override args = {\n origin: Args.string({\n description: 'Origin to allow (e.g., https://example.com)',\n required: true,\n }),\n }\n\n static override description = 'Add a CORS origin to the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively add a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> http://localhost:3000 --no-credentials',\n description: 'Add a localhost origin without credentials',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://myapp.com --credentials',\n description: 'Add a production origin with credentials allowed',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://myapp.com --project-id abc123',\n description: 'Add a CORS origin for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to add CORS origin to',\n semantics: 'override',\n }),\n credentials: Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Allow credentials (token/cookie) to be sent from this origin',\n required: false,\n }),\n yes: Flags.boolean({\n char: 'y',\n description: 'Confirm risky wildcard origins without prompting',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(Add)\n const {origin} = args\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'create', permission: 'sanity.project.cors'}],\n }),\n })\n\n // Check if the origin argument looks like a file path and warn\n try {\n const isFile = fs.existsSync(path.join(process.cwd(), args.origin))\n if (isFile) {\n this.warn(`Origin \"${args.origin}?\" Remember to quote values (sanity cors add \"*\")`)\n }\n } catch {\n // Ignore errors checking if it's a file\n }\n\n const filteredOrigin = await filterAndValidateOrigin(origin, this.output)\n const hasWildcard = origin.includes('*')\n\n if (hasWildcard) {\n if (this.isUnattended() && !flags.yes) {\n this.error('Wildcard origins require confirmation. Pass `--yes` to continue.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n const confirmed = flags.yes || (await this.promptForWildcardConfirmation(origin))\n if (!confirmed) {\n this.log('CORS origin not added')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n const allowCredentials =\n flags.credentials === undefined\n ? this.isUnattended()\n ? false\n : await this.promptForCredentials(hasWildcard)\n : Boolean(flags.credentials)\n\n if (filteredOrigin !== origin) {\n this.log(`Normalized origin to: ${filteredOrigin}`)\n }\n\n try {\n const response = await createCorsOrigin({\n allowCredentials,\n origin: filteredOrigin,\n projectId,\n })\n\n addCorsDebug(`CORS origin added successfully`, response)\n\n this.log('CORS origin added')\n } catch (error) {\n const err = error as Error\n\n addCorsDebug(`Error adding CORS origin`, err)\n this.error(`CORS origin addition failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n /**\n * Prompt the user for credentials\n *\n * @param hasWildcard - Whether the origin contains a wildcard\n * @returns - Whether to allow credentials\n */\n private async promptForCredentials(hasWildcard: boolean) {\n this.log('')\n if (hasWildcard) {\n this.log(oneline`\n ${styleText('yellow', `${logSymbols.warning} Warning:`)}\n We ${styleText(['red', 'underline'], 'HIGHLY')} recommend NOT allowing credentials\n on origins containing wildcards. If you are logged in to a Sanity studio or an app built with\n the Sanity App SDK, people will be able to send requests ${styleText('underline', 'on your behalf')}\n to read and modify data, from any matching origin. Please tread carefully!\n `)\n } else {\n this.log(oneline`\n ${styleText('yellow', `${logSymbols.warning} Warning:`)}\n Should this origin be allowed to send requests using authentication tokens or\n session cookies? Be aware that any script on this origin will be able to send\n requests ${styleText('underline', 'on your behalf')} to read and modify data if you\n are logged in to a Sanity studio or app. If this origin hosts a studio or an app built with\n the Sanity App SDK, you will need this, otherwise you should probably answer \"No\" (n).\n `)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Allow credentials to be sent from this origin? Please read the warning above.\n `,\n })\n }\n\n /**\n * Prompt the user for wildcard confirmation\n *\n * @param origin - The origin to check for wildcards\n * @returns - Whether to allow the origin\n */\n private async promptForWildcardConfirmation(origin: string) {\n this.log('')\n this.log(styleText('yellow', `${logSymbols.warning} Warning: Examples of allowed origins:`))\n\n if (origin === '*') {\n this.log('- http://www.some-malicious.site')\n this.log('- https://not.what-you-were-expecting.com')\n this.log('- https://high-traffic-site.com')\n this.log('- http://192.168.1.1:8080')\n } else {\n this.log(`- ${origin.replace(/:\\*/, ':1234').replaceAll('*', 'foo')}`)\n this.log(`- ${origin.replace(/:\\*/, ':3030').replaceAll('*', 'foo.bar')}`)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Using wildcards can be ${styleText('red', 'risky')}.\n Are you ${styleText('underline', 'absolutely sure')} you want to allow this origin?`,\n })\n }\n}\n"],"names":["fs","path","styleText","Args","Flags","exitCodes","SanityCommand","subdebug","confirm","logSymbols","oneline","filterAndValidateOrigin","promptForProject","createCorsOrigin","getProjectIdFlag","addCorsDebug","Add","args","origin","string","description","required","examples","command","flags","semantics","credentials","boolean","allowNo","default","undefined","yes","char","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isFile","existsSync","join","process","cwd","warn","filteredOrigin","output","hasWildcard","includes","isUnattended","error","exit","USAGE_ERROR","confirmed","promptForWildcardConfirmation","log","USER_ABORT","allowCredentials","promptForCredentials","Boolean","response","err","message","RUNTIME_ERROR","warning","replace","replaceAll"],"mappings":"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"}
@@ -63,7 +63,7 @@ export class Delete extends SanityCommand {
63
63
  const err = error;
64
64
  deleteCorsDebug(`Error deleting CORS origin ${originId} for project ${projectId}`, err);
65
65
  this.error(`Origin deletion failed:\n${err.message}`, {
66
- exit: 1
66
+ exit: exitCodes.RUNTIME_ERROR
67
67
  });
68
68
  }
69
69
  }
@@ -75,12 +75,12 @@ export class Delete extends SanityCommand {
75
75
  const err = error;
76
76
  deleteCorsDebug(`Error fetching CORS origins for project ${projectId}`, err);
77
77
  this.error(`Failed to fetch CORS origins:\n${err.message}`, {
78
- exit: 1
78
+ exit: exitCodes.RUNTIME_ERROR
79
79
  });
80
80
  }
81
81
  if (origins.length === 0) {
82
82
  this.error('No CORS origins configured for this project.', {
83
- exit: 1
83
+ exit: exitCodes.RUNTIME_ERROR
84
84
  });
85
85
  }
86
86
  // If origin is specified, find it in the list
@@ -89,7 +89,7 @@ export class Delete extends SanityCommand {
89
89
  const selectedOrigin = origins.find((origin)=>origin.origin.toLowerCase() === specifiedOriginLower);
90
90
  if (!selectedOrigin) {
91
91
  this.error(`Origin "${specifiedOrigin}" not found`, {
92
- exit: 1
92
+ exit: exitCodes.RUNTIME_ERROR
93
93
  });
94
94
  }
95
95
  return selectedOrigin.id;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/cors/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 {promptForProject} from '../../prompts/promptForProject.js'\nimport {type CorsOrigin, deleteCorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteCorsDebug = subdebug('cors:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n origin: Args.string({\n description: 'Origin to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a CORS origin from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://example.com',\n description: 'Delete a specific CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a CORS origin from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete CORS origin from',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n if (!args.origin && this.isUnattended()) {\n this.error('Origin is required. Pass it as the `<origin>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.cors'}],\n }),\n })\n\n // Get the origin ID to delete\n const originId = await this.promptForOrigin(args.origin, projectId)\n\n try {\n await deleteCorsOrigin({originId, projectId})\n\n this.log('Origin deleted')\n } catch (error) {\n const err = error as Error\n deleteCorsDebug(`Error deleting CORS origin ${originId} for project ${projectId}`, err)\n this.error(`Origin deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForOrigin(\n specifiedOrigin: string | undefined,\n projectId: string,\n ): Promise<number> {\n let origins: CorsOrigin[]\n try {\n origins = await listCorsOrigins(projectId)\n } catch (error) {\n const err = error as Error\n deleteCorsDebug(`Error fetching CORS origins for project ${projectId}`, err)\n this.error(`Failed to fetch CORS origins:\\n${err.message}`, {exit: 1})\n }\n\n if (origins.length === 0) {\n this.error('No CORS origins configured for this project.', {exit: 1})\n }\n\n // If origin is specified, find it in the list\n if (specifiedOrigin) {\n const specifiedOriginLower = specifiedOrigin.toLowerCase()\n const selectedOrigin = origins.find(\n (origin) => origin.origin.toLowerCase() === specifiedOriginLower,\n )\n\n if (!selectedOrigin) {\n this.error(`Origin \"${specifiedOrigin}\" not found`, {exit: 1})\n }\n\n return selectedOrigin.id\n }\n\n // If no origin specified, prompt user to select one\n const choices = origins.map((origin) => ({\n name: origin.origin,\n value: origin.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select origin to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","select","promptForProject","deleteCorsOrigin","listCorsOrigins","getProjectIdFlag","deleteCorsDebug","Delete","args","origin","string","description","required","examples","command","flags","semantics","run","parse","isUnattended","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","originId","promptForOrigin","log","err","message","specifiedOrigin","origins","length","specifiedOriginLower","toLowerCase","selectedOrigin","find","id","choices","map","name","value","selectedId"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/cors/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 {promptForProject} from '../../prompts/promptForProject.js'\nimport {type CorsOrigin, deleteCorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteCorsDebug = subdebug('cors:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n origin: Args.string({\n description: 'Origin to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete a CORS origin from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://example.com',\n description: 'Delete a specific CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'Delete a CORS origin from a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete CORS origin from',\n semantics: 'override',\n }),\n }\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n if (!args.origin && this.isUnattended()) {\n this.error('Origin is required. Pass it as the `<origin>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.cors'}],\n }),\n })\n\n // Get the origin ID to delete\n const originId = await this.promptForOrigin(args.origin, projectId)\n\n try {\n await deleteCorsOrigin({originId, projectId})\n\n this.log('Origin deleted')\n } catch (error) {\n const err = error as Error\n deleteCorsDebug(`Error deleting CORS origin ${originId} for project ${projectId}`, err)\n this.error(`Origin deletion failed:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async promptForOrigin(\n specifiedOrigin: string | undefined,\n projectId: string,\n ): Promise<number> {\n let origins: CorsOrigin[]\n try {\n origins = await listCorsOrigins(projectId)\n } catch (error) {\n const err = error as Error\n deleteCorsDebug(`Error fetching CORS origins for project ${projectId}`, err)\n this.error(`Failed to fetch CORS origins:\\n${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (origins.length === 0) {\n this.error('No CORS origins configured for this project.', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // If origin is specified, find it in the list\n if (specifiedOrigin) {\n const specifiedOriginLower = specifiedOrigin.toLowerCase()\n const selectedOrigin = origins.find(\n (origin) => origin.origin.toLowerCase() === specifiedOriginLower,\n )\n\n if (!selectedOrigin) {\n this.error(`Origin \"${specifiedOrigin}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n return selectedOrigin.id\n }\n\n // If no origin specified, prompt user to select one\n const choices = origins.map((origin) => ({\n name: origin.origin,\n value: origin.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select origin to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","select","promptForProject","deleteCorsOrigin","listCorsOrigins","getProjectIdFlag","deleteCorsDebug","Delete","args","origin","string","description","required","examples","command","flags","semantics","run","parse","isUnattended","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","originId","promptForOrigin","log","err","message","RUNTIME_ERROR","specifiedOrigin","origins","length","specifiedOriginLower","toLowerCase","selectedOrigin","find","id","choices","map","name","value","selectedId"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAyBC,gBAAgB,EAAEC,eAAe,QAAO,yBAAwB;AACzF,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,kBAAkBN,SAAS;AAEjC,OAAO,MAAMO,eAAeR;IAC1B,OAAgBS,OAAO;QACrBC,QAAQZ,KAAKa,MAAM,CAAC;YAClBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,wCAAuC;IAErE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,MAAaC,MAAqB;QAChC,MAAM,EAACT,IAAI,EAAC,GAAG,MAAM,IAAI,CAACU,KAAK,CAACX;QAEhC,IAAI,CAACC,KAAKC,MAAM,IAAI,IAAI,CAACU,YAAY,IAAI;YACvC,IAAI,CAACC,KAAK,CAAC,2DAA2D;gBACpEC,MAAMvB,UAAUwB,WAAW;YAC7B;QACF;QAEA,iCAAiC;QACjC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRvB,iBAAiB;oBACfwB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAUC,YAAY;wBAAqB;qBAAE;gBAC7E;QACJ;QAEA,8BAA8B;QAC9B,MAAMC,WAAW,MAAM,IAAI,CAACC,eAAe,CAACtB,KAAKC,MAAM,EAAEc;QAEzD,IAAI;YACF,MAAMpB,iBAAiB;gBAAC0B;gBAAUN;YAAS;YAE3C,IAAI,CAACQ,GAAG,CAAC;QACX,EAAE,OAAOX,OAAO;YACd,MAAMY,MAAMZ;YACZd,gBAAgB,CAAC,2BAA2B,EAAEuB,SAAS,aAAa,EAAEN,WAAW,EAAES;YACnF,IAAI,CAACZ,KAAK,CAAC,CAAC,yBAAyB,EAAEY,IAAIC,OAAO,EAAE,EAAE;gBAACZ,MAAMvB,UAAUoC,aAAa;YAAA;QACtF;IACF;IAEA,MAAcJ,gBACZK,eAAmC,EACnCZ,SAAiB,EACA;QACjB,IAAIa;QACJ,IAAI;YACFA,UAAU,MAAMhC,gBAAgBmB;QAClC,EAAE,OAAOH,OAAO;YACd,MAAMY,MAAMZ;YACZd,gBAAgB,CAAC,wCAAwC,EAAEiB,WAAW,EAAES;YACxE,IAAI,CAACZ,KAAK,CAAC,CAAC,+BAA+B,EAAEY,IAAIC,OAAO,EAAE,EAAE;gBAACZ,MAAMvB,UAAUoC,aAAa;YAAA;QAC5F;QAEA,IAAIE,QAAQC,MAAM,KAAK,GAAG;YACxB,IAAI,CAACjB,KAAK,CAAC,gDAAgD;gBAACC,MAAMvB,UAAUoC,aAAa;YAAA;QAC3F;QAEA,8CAA8C;QAC9C,IAAIC,iBAAiB;YACnB,MAAMG,uBAAuBH,gBAAgBI,WAAW;YACxD,MAAMC,iBAAiBJ,QAAQK,IAAI,CACjC,CAAChC,SAAWA,OAAOA,MAAM,CAAC8B,WAAW,OAAOD;YAG9C,IAAI,CAACE,gBAAgB;gBACnB,IAAI,CAACpB,KAAK,CAAC,CAAC,QAAQ,EAAEe,gBAAgB,WAAW,CAAC,EAAE;oBAACd,MAAMvB,UAAUoC,aAAa;gBAAA;YACpF;YAEA,OAAOM,eAAeE,EAAE;QAC1B;QAEA,oDAAoD;QACpD,MAAMC,UAAUP,QAAQQ,GAAG,CAAC,CAACnC,SAAY,CAAA;gBACvCoC,MAAMpC,OAAOA,MAAM;gBACnBqC,OAAOrC,OAAOiC,EAAE;YAClB,CAAA;QAEA,MAAMK,aAAa,MAAM9C,OAAO;YAC9B0C;YACAV,SAAS;QACX;QAEA,OAAOc;IACT;AACF"}
@@ -1,4 +1,4 @@
1
- import { SanityCommand, subdebug } from '@sanity/cli-core';
1
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
2
2
  import { promptForProject } from '../../prompts/promptForProject.js';
3
3
  import { listCorsOrigins } from '../../services/cors.js';
4
4
  import { getProjectIdFlag } from '../../util/sharedFlags.js';
@@ -40,7 +40,7 @@ export class List extends SanityCommand {
40
40
  const err = error;
41
41
  listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err);
42
42
  this.error(`CORS origins list retrieval failed:\n${err.message}`, {
43
- exit: 1
43
+ exit: exitCodes.RUNTIME_ERROR
44
44
  });
45
45
  }
46
46
  if (origins.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/cors/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {type CorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listCorsDebug = subdebug('cors:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List CORS origins for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List CORS origins for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List CORS origins for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list CORS origins 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: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.cors'}],\n }),\n })\n\n let origins: CorsOrigin[]\n try {\n origins = await listCorsOrigins(projectId)\n } catch (error) {\n const err = error as Error\n\n listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err)\n this.error(`CORS origins list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n if (origins.length === 0) {\n this.log('No CORS origins configured for this project.')\n return\n }\n\n // Output each origin on a new line, matching the original behavior\n this.log(origins.map((origin) => origin.origin).join('\\n'))\n }\n}\n"],"names":["SanityCommand","subdebug","promptForProject","listCorsOrigins","getProjectIdFlag","listCorsDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","origins","error","err","message","exit","length","log","map","origin","join"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAyBC,eAAe,QAAO,yBAAwB;AACvE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,oCAAmC;IACjE,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,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAqB;qBAAE;gBAC3E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMjB,gBAAgBW;QAClC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACtE,IAAI,CAACD,KAAK,CAAC,CAAC,qCAAqC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QAC5E;QAEA,IAAIJ,QAAQK,MAAM,KAAK,GAAG;YACxB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,mEAAmE;QACnE,IAAI,CAACA,GAAG,CAACN,QAAQO,GAAG,CAAC,CAACC,SAAWA,OAAOA,MAAM,EAAEC,IAAI,CAAC;IACvD;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/cors/list.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {type CorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listCorsDebug = subdebug('cors:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List CORS origins for the project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List CORS origins for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List CORS origins for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list CORS origins 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: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.cors'}],\n }),\n })\n\n let origins: CorsOrigin[]\n try {\n origins = await listCorsOrigins(projectId)\n } catch (error) {\n const err = error as Error\n\n listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err)\n this.error(`CORS origins list retrieval failed:\\n${err.message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (origins.length === 0) {\n this.log('No CORS origins configured for this project.')\n return\n }\n\n // Output each origin on a new line, matching the original behavior\n this.log(origins.map((origin) => origin.origin).join('\\n'))\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","promptForProject","listCorsOrigins","getProjectIdFlag","listCorsDebug","List","description","examples","command","flags","semantics","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","origins","error","err","message","exit","RUNTIME_ERROR","length","log","map","origin","join"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAyBC,eAAe,QAAO,yBAAwB;AACvE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,gBAAgBJ,SAAS;AAE/B,OAAO,MAAMK,aAAaN;IACxB,OAAgBO,cAAc,oCAAmC;IACjE,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,IACRd,iBAAiB;oBACfe,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAqB;qBAAE;gBAC3E;QACJ;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMjB,gBAAgBW;QAClC,EAAE,OAAOO,OAAO;YACd,MAAMC,MAAMD;YAEZhB,cAAc,CAAC,wCAAwC,EAAES,WAAW,EAAEQ;YACtE,IAAI,CAACD,KAAK,CAAC,CAAC,qCAAqC,EAAEC,IAAIC,OAAO,EAAE,EAAE;gBAChEC,MAAMzB,UAAU0B,aAAa;YAC/B;QACF;QAEA,IAAIL,QAAQM,MAAM,KAAK,GAAG;YACxB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,mEAAmE;QACnE,IAAI,CAACA,GAAG,CAACP,QAAQQ,GAAG,CAAC,CAACC,SAAWA,OAAOA,MAAM,EAAEC,IAAI,CAAC;IACvD;AACF"}
@@ -94,12 +94,12 @@ export class CreateAliasCommand extends SanityCommand {
94
94
  } catch (error) {
95
95
  createAliasDebug(`Error getting project features`, error);
96
96
  this.error('Failed to get project features', {
97
- exit: 1
97
+ exit: exitCodes.RUNTIME_ERROR
98
98
  });
99
99
  }
100
100
  if (!canCreateAlias) {
101
101
  this.error('This project cannot create a dataset alias - see https://www.sanity.io/pricing', {
102
- exit: 1
102
+ exit: exitCodes.RUNTIME_ERROR
103
103
  });
104
104
  }
105
105
  try {
@@ -118,13 +118,13 @@ export class CreateAliasCommand extends SanityCommand {
118
118
  }
119
119
  if (existingAliases.includes(aliasName)) {
120
120
  this.error(`Dataset alias "${aliasOutputName}" already exists`, {
121
- exit: 1
121
+ exit: exitCodes.RUNTIME_ERROR
122
122
  });
123
123
  }
124
124
  const targetDataset = args.targetDataset || (!this.isUnattended() && datasets.length > 0 ? await selectDataset(datasets) : null);
125
125
  if (targetDataset && !datasets.includes(targetDataset)) {
126
126
  this.error(`Dataset "${targetDataset}" does not exist. Available datasets: ${datasets.join(', ')}`, {
127
- exit: 1
127
+ exit: exitCodes.RUNTIME_ERROR
128
128
  });
129
129
  }
130
130
  await createAlias(projectId, aliasName, targetDataset);
@@ -134,7 +134,7 @@ export class CreateAliasCommand extends SanityCommand {
134
134
  if (error instanceof CLIError) throw error;
135
135
  createAliasDebug(`Error creating dataset alias`, error);
136
136
  this.error(`Dataset alias creation failed: ${error instanceof Error ? error.message : String(error)}`, {
137
- exit: 1
137
+ exit: exitCodes.RUNTIME_ERROR
138
138
  });
139
139
  }
140
140
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/alias/create.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForDatasetAliasName} from '../../../prompts/promptForDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {selectDataset} from '../../../prompts/selectDataset.js'\nimport {ALIAS_PREFIX, createAlias, listAliases} from '../../../services/datasetAliases.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {getProjectFeatures} from '../../../services/getProjectFeatures.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst createAliasDebug = subdebug('dataset:alias:create')\n\nexport class CreateAliasCommand extends SanityCommand<typeof CreateAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to create',\n required: false,\n }),\n targetDataset: Args.string({\n description: 'Target dataset name to link the alias to',\n required: false,\n }),\n }\n\n static override description = 'Create a dataset alias for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123 conference conf-2025',\n description: 'Create alias in a specific project',\n },\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create an alias with interactive prompts',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Create alias named \"conference\" with interactive dataset selection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference conf-2025',\n description: 'Create alias \"conference\" linked to \"conf-2025\" dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create dataset alias in',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:create']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(CreateAliasCommand)\n\n if (!args.aliasName && this.isUnattended()) {\n this.error('Dataset alias name is required. Pass it as the `<aliasName>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n if (args.aliasName) {\n const nameError = validateDatasetAliasName(args.aliasName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n if (args.targetDataset) {\n const datasetErr = validateDatasetName(args.targetDataset)\n if (datasetErr) {\n this.error(datasetErr, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'create', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n let canCreateAlias = false\n try {\n const features = await getProjectFeatures(projectId)\n canCreateAlias = features.includes('advancedDatasetManagement')\n } catch (error) {\n createAliasDebug(`Error getting project features`, error)\n this.error('Failed to get project features', {exit: 1})\n }\n if (!canCreateAlias) {\n this.error('This project cannot create a dataset alias - see https://www.sanity.io/pricing', {\n exit: 1,\n })\n }\n\n try {\n const [datasetsResponse, aliases] = await Promise.all([\n listDatasets(projectId),\n listAliases(projectId),\n ])\n\n const datasets = datasetsResponse.map((ds: {name: string}) => ds.name)\n const existingAliases = aliases.map((alias: {name: string}) => alias.name)\n\n let aliasName = args.aliasName || (await promptForDatasetAliasName())\n let aliasOutputName = aliasName\n\n if (aliasName.startsWith(ALIAS_PREFIX)) {\n aliasName = aliasName.slice(1)\n } else {\n aliasOutputName = `${ALIAS_PREFIX}${aliasName}`\n }\n\n if (existingAliases.includes(aliasName)) {\n this.error(`Dataset alias \"${aliasOutputName}\" already exists`, {exit: 1})\n }\n\n const targetDataset =\n args.targetDataset ||\n (!this.isUnattended() && datasets.length > 0 ? await selectDataset(datasets) : null)\n\n if (targetDataset && !datasets.includes(targetDataset)) {\n this.error(\n `Dataset \"${targetDataset}\" does not exist. Available datasets: ${datasets.join(', ')}`,\n {exit: 1},\n )\n }\n\n await createAlias(projectId, aliasName, targetDataset)\n\n const linkMessage = targetDataset ? ` and linked to ${targetDataset}` : ''\n this.log(`Dataset alias ${aliasOutputName} created${linkMessage} successfully`)\n } catch (error) {\n if (error instanceof CLIError) throw error\n createAliasDebug(`Error creating dataset alias`, error)\n this.error(\n `Dataset alias creation failed: ${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Args","CLIError","exitCodes","SanityCommand","subdebug","validateDatasetAliasName","validateDatasetName","promptForDatasetAliasName","promptForProject","selectDataset","ALIAS_PREFIX","createAlias","listAliases","listDatasets","getProjectFeatures","getProjectIdFlag","createAliasDebug","CreateAliasCommand","args","aliasName","string","description","required","targetDataset","examples","command","flags","semantics","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","nameError","datasetErr","projectId","getProjectId","fallback","requiredPermissions","grant","permission","canCreateAlias","features","includes","datasetsResponse","aliases","Promise","all","datasets","map","ds","name","existingAliases","alias","aliasOutputName","startsWith","slice","length","join","linkMessage","log","Error","message","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/alias/create.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForDatasetAliasName} from '../../../prompts/promptForDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {selectDataset} from '../../../prompts/selectDataset.js'\nimport {ALIAS_PREFIX, createAlias, listAliases} from '../../../services/datasetAliases.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {getProjectFeatures} from '../../../services/getProjectFeatures.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst createAliasDebug = subdebug('dataset:alias:create')\n\nexport class CreateAliasCommand extends SanityCommand<typeof CreateAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to create',\n required: false,\n }),\n targetDataset: Args.string({\n description: 'Target dataset name to link the alias to',\n required: false,\n }),\n }\n\n static override description = 'Create a dataset alias for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123 conference conf-2025',\n description: 'Create alias in a specific project',\n },\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create an alias with interactive prompts',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Create alias named \"conference\" with interactive dataset selection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference conf-2025',\n description: 'Create alias \"conference\" linked to \"conf-2025\" dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create dataset alias in',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:create']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(CreateAliasCommand)\n\n if (!args.aliasName && this.isUnattended()) {\n this.error('Dataset alias name is required. Pass it as the `<aliasName>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n if (args.aliasName) {\n const nameError = validateDatasetAliasName(args.aliasName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n if (args.targetDataset) {\n const datasetErr = validateDatasetName(args.targetDataset)\n if (datasetErr) {\n this.error(datasetErr, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'create', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n let canCreateAlias = false\n try {\n const features = await getProjectFeatures(projectId)\n canCreateAlias = features.includes('advancedDatasetManagement')\n } catch (error) {\n createAliasDebug(`Error getting project features`, error)\n this.error('Failed to get project features', {exit: exitCodes.RUNTIME_ERROR})\n }\n if (!canCreateAlias) {\n this.error('This project cannot create a dataset alias - see https://www.sanity.io/pricing', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n try {\n const [datasetsResponse, aliases] = await Promise.all([\n listDatasets(projectId),\n listAliases(projectId),\n ])\n\n const datasets = datasetsResponse.map((ds: {name: string}) => ds.name)\n const existingAliases = aliases.map((alias: {name: string}) => alias.name)\n\n let aliasName = args.aliasName || (await promptForDatasetAliasName())\n let aliasOutputName = aliasName\n\n if (aliasName.startsWith(ALIAS_PREFIX)) {\n aliasName = aliasName.slice(1)\n } else {\n aliasOutputName = `${ALIAS_PREFIX}${aliasName}`\n }\n\n if (existingAliases.includes(aliasName)) {\n this.error(`Dataset alias \"${aliasOutputName}\" already exists`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const targetDataset =\n args.targetDataset ||\n (!this.isUnattended() && datasets.length > 0 ? await selectDataset(datasets) : null)\n\n if (targetDataset && !datasets.includes(targetDataset)) {\n this.error(\n `Dataset \"${targetDataset}\" does not exist. Available datasets: ${datasets.join(', ')}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n await createAlias(projectId, aliasName, targetDataset)\n\n const linkMessage = targetDataset ? ` and linked to ${targetDataset}` : ''\n this.log(`Dataset alias ${aliasOutputName} created${linkMessage} successfully`)\n } catch (error) {\n if (error instanceof CLIError) throw error\n createAliasDebug(`Error creating dataset alias`, error)\n this.error(\n `Dataset alias creation failed: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Args","CLIError","exitCodes","SanityCommand","subdebug","validateDatasetAliasName","validateDatasetName","promptForDatasetAliasName","promptForProject","selectDataset","ALIAS_PREFIX","createAlias","listAliases","listDatasets","getProjectFeatures","getProjectIdFlag","createAliasDebug","CreateAliasCommand","args","aliasName","string","description","required","targetDataset","examples","command","flags","semantics","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","nameError","datasetErr","projectId","getProjectId","fallback","requiredPermissions","grant","permission","canCreateAlias","features","includes","RUNTIME_ERROR","datasetsResponse","aliases","Promise","all","datasets","map","ds","name","existingAliases","alias","aliasOutputName","startsWith","slice","length","join","linkMessage","log","Error","message","String"],"mappings":"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"}
@@ -68,7 +68,7 @@ export class DeleteAliasCommand extends SanityCommand {
68
68
  const existingAlias = aliases.find((alias)=>alias.name === apiName);
69
69
  if (!existingAlias) {
70
70
  this.error(`Dataset alias "${displayName}" does not exist`, {
71
- exit: 1
71
+ exit: exitCodes.RUNTIME_ERROR
72
72
  });
73
73
  }
74
74
  if (force) {
@@ -88,7 +88,7 @@ export class DeleteAliasCommand extends SanityCommand {
88
88
  const errorMessage = error instanceof Error ? error.message : String(error);
89
89
  deleteAliasDebug(`Error deleting dataset alias ${args.aliasName}`, error);
90
90
  this.error(`Dataset alias deletion failed: ${errorMessage}`, {
91
- exit: 1
91
+ exit: exitCodes.RUNTIME_ERROR
92
92
  });
93
93
  }
94
94
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/alias/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {processAliasName} from '../../../actions/dataset/processAliasName.js'\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {listAliases, removeAlias} from '../../../services/datasetAliases.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst deleteAliasDebug = subdebug('dataset:alias:delete')\n\nexport class DeleteAliasCommand extends SanityCommand<typeof DeleteAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete a dataset alias from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Delete alias named \"conference\" with confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference --force',\n description: 'Delete alias named \"conference\" without confirmation prompt',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete dataset alias from',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Skip confirmation prompt and delete immediately',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:delete']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteAliasCommand)\n const {force} = flags\n\n const {apiName, displayName} = processAliasName(args.aliasName)\n\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'delete', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n const aliases = await listAliases(projectId)\n const existingAlias = aliases.find((alias) => alias.name === apiName)\n\n if (!existingAlias) {\n this.error(`Dataset alias \"${displayName}\" does not exist`, {\n exit: 1,\n })\n }\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, deleting alias \"${displayName}\"`)\n } else {\n if (this.isUnattended()) {\n this.error('Dataset alias deletion requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n await this.confirmDeletion(apiName, existingAlias.datasetName)\n }\n\n await removeAlias(projectId, apiName)\n\n this.log('Dataset alias deleted successfully')\n } catch (error) {\n if (error instanceof CLIError) throw error\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n deleteAliasDebug(`Error deleting dataset alias ${args.aliasName}`, error)\n this.error(`Dataset alias deletion failed: ${errorMessage}`, {exit: 1})\n }\n }\n\n private async confirmDeletion(aliasName: string, linkedDataset?: string | null): Promise<void> {\n const message = linkedDataset\n ? `This dataset alias is linked to ${linkedDataset}. Are you ABSOLUTELY sure you want to delete this dataset alias?\\n Type the name of the dataset alias to confirm delete:`\n : `Are you ABSOLUTELY sure you want to delete this dataset alias?\\n Type the name of the dataset alias to confirm delete:`\n\n await input({\n message,\n validate: (input) => {\n const trimmed = input.trim().replace(/^~/, '')\n return trimmed === aliasName || 'Incorrect dataset alias name. Ctrl + C to cancel delete.'\n },\n })\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","input","processAliasName","validateDatasetAliasName","promptForProject","listAliases","removeAlias","getProjectIdFlag","deleteAliasDebug","DeleteAliasCommand","args","aliasName","string","description","required","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","apiName","displayName","nameError","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","aliases","existingAlias","find","alias","name","warn","isUnattended","confirmDeletion","datasetName","log","errorMessage","Error","message","String","linkedDataset","validate","trimmed","trim","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/alias/delete.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {processAliasName} from '../../../actions/dataset/processAliasName.js'\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {listAliases, removeAlias} from '../../../services/datasetAliases.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst deleteAliasDebug = subdebug('dataset:alias:delete')\n\nexport class DeleteAliasCommand extends SanityCommand<typeof DeleteAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete a dataset alias from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Delete alias named \"conference\" with confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference --force',\n description: 'Delete alias named \"conference\" without confirmation prompt',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete dataset alias from',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Skip confirmation prompt and delete immediately',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:delete']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteAliasCommand)\n const {force} = flags\n\n const {apiName, displayName} = processAliasName(args.aliasName)\n\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'delete', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n const aliases = await listAliases(projectId)\n const existingAlias = aliases.find((alias) => alias.name === apiName)\n\n if (!existingAlias) {\n this.error(`Dataset alias \"${displayName}\" does not exist`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, deleting alias \"${displayName}\"`)\n } else {\n if (this.isUnattended()) {\n this.error('Dataset alias deletion requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n await this.confirmDeletion(apiName, existingAlias.datasetName)\n }\n\n await removeAlias(projectId, apiName)\n\n this.log('Dataset alias deleted successfully')\n } catch (error) {\n if (error instanceof CLIError) throw error\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n deleteAliasDebug(`Error deleting dataset alias ${args.aliasName}`, error)\n this.error(`Dataset alias deletion failed: ${errorMessage}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private async confirmDeletion(aliasName: string, linkedDataset?: string | null): Promise<void> {\n const message = linkedDataset\n ? `This dataset alias is linked to ${linkedDataset}. Are you ABSOLUTELY sure you want to delete this dataset alias?\\n Type the name of the dataset alias to confirm delete:`\n : `Are you ABSOLUTELY sure you want to delete this dataset alias?\\n Type the name of the dataset alias to confirm delete:`\n\n await input({\n message,\n validate: (input) => {\n const trimmed = input.trim().replace(/^~/, '')\n return trimmed === aliasName || 'Incorrect dataset alias name. Ctrl + C to cancel delete.'\n },\n })\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","input","processAliasName","validateDatasetAliasName","promptForProject","listAliases","removeAlias","getProjectIdFlag","deleteAliasDebug","DeleteAliasCommand","args","aliasName","string","description","required","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","apiName","displayName","nameError","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","aliases","existingAlias","find","alias","name","RUNTIME_ERROR","warn","isUnattended","confirmDeletion","datasetName","log","errorMessage","Error","message","String","linkedDataset","validate","trimmed","trim","replace"],"mappings":"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"}
@@ -116,7 +116,7 @@ export class LinkAliasCommand extends SanityCommand {
116
116
  if (!existingAlias) {
117
117
  const availableAliases = aliases.map((a)=>`~${a.name}`).join(', ');
118
118
  this.error(`Dataset alias "${displayName}" does not exist. Available aliases: ${availableAliases}`, {
119
- exit: 1
119
+ exit: exitCodes.RUNTIME_ERROR
120
120
  });
121
121
  }
122
122
  const targetDataset = args.targetDataset || (datasets.length > 0 ? await selectDataset(datasets, {
@@ -124,17 +124,17 @@ export class LinkAliasCommand extends SanityCommand {
124
124
  }) : null);
125
125
  if (!targetDataset) {
126
126
  this.error('No datasets available to link to', {
127
- exit: 1
127
+ exit: exitCodes.RUNTIME_ERROR
128
128
  });
129
129
  }
130
130
  if (!datasets.includes(targetDataset)) {
131
131
  this.error(`Dataset "${targetDataset}" does not exist. Available datasets: ${datasets.join(', ')}`, {
132
- exit: 1
132
+ exit: exitCodes.RUNTIME_ERROR
133
133
  });
134
134
  }
135
135
  if (existingAlias.datasetName === targetDataset) {
136
136
  this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, {
137
- exit: 1
137
+ exit: exitCodes.RUNTIME_ERROR
138
138
  });
139
139
  }
140
140
  if (existingAlias.datasetName && !force) {
@@ -153,7 +153,7 @@ export class LinkAliasCommand extends SanityCommand {
153
153
  if (error instanceof CLIError) throw error;
154
154
  linkAliasDebug(`Error linking dataset alias`, error);
155
155
  this.error(`Dataset alias linking failed: ${error instanceof Error ? error.message : String(error)}`, {
156
- exit: 1
156
+ exit: exitCodes.RUNTIME_ERROR
157
157
  });
158
158
  }
159
159
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/alias/link.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {processAliasName} from '../../../actions/dataset/processAliasName.js'\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForDatasetAliasName} from '../../../prompts/promptForDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {selectDataset} from '../../../prompts/selectDataset.js'\nimport {listAliases, updateAlias} from '../../../services/datasetAliases.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {formatCliErrorMessages} from '../../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst linkAliasDebug = subdebug('dataset:alias:link')\n\nexport class LinkAliasCommand extends SanityCommand<typeof LinkAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to link',\n required: false,\n }),\n targetDataset: Args.string({\n description: 'Target dataset name to link the alias to',\n required: false,\n }),\n }\n\n static override description = 'Link a dataset alias to a dataset in the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Link an alias with interactive prompts',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Link alias named \"conference\" with interactive dataset selection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference conf-2025',\n description: 'Link alias \"conference\" to \"conf-2025\" dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference conf-2025 --force',\n description: 'Force link without confirmation (skip relink prompt)',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to link dataset alias in',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Skip confirmation prompt when relinking existing alias',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:link']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(LinkAliasCommand)\n const {force} = flags\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!args.aliasName) {\n errors.push('Dataset alias name is required. Pass it as the `<aliasName>` argument.')\n }\n if (!args.targetDataset) {\n errors.push('Target dataset is required. Pass it as the `<targetDataset>` argument.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n if (args.aliasName) {\n const {apiName} = processAliasName(args.aliasName)\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n if (args.targetDataset) {\n const datasetErr = validateDatasetName(args.targetDataset)\n if (datasetErr) {\n this.error(datasetErr, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n const [datasetsResponse, aliases] = await Promise.all([\n listDatasets(projectId),\n listAliases(projectId),\n ])\n\n const datasets = datasetsResponse.map((ds) => ds.name)\n\n const aliasNameInput = args.aliasName || (await promptForDatasetAliasName())\n\n const {apiName, displayName} = processAliasName(aliasNameInput)\n\n const existingAlias = aliases.find((alias) => alias.name === apiName)\n if (!existingAlias) {\n const availableAliases = aliases.map((a) => `~${a.name}`).join(', ')\n this.error(\n `Dataset alias \"${displayName}\" does not exist. Available aliases: ${availableAliases}`,\n {exit: 1},\n )\n }\n\n const targetDataset =\n args.targetDataset ||\n (datasets.length > 0\n ? await selectDataset(datasets, {\n message: 'Select target dataset to link alias to:',\n })\n : null)\n\n if (!targetDataset) {\n this.error('No datasets available to link to', {exit: 1})\n }\n\n if (!datasets.includes(targetDataset)) {\n this.error(\n `Dataset \"${targetDataset}\" does not exist. Available datasets: ${datasets.join(', ')}`,\n {exit: 1},\n )\n }\n\n if (existingAlias.datasetName === targetDataset) {\n this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, {exit: 1})\n }\n\n if (existingAlias.datasetName && !force) {\n if (this.isUnattended()) {\n this.error('Relinking a dataset alias requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n await this.confirmRelink(existingAlias.datasetName, targetDataset)\n } else if (force && existingAlias.datasetName) {\n this.warn(`'--force' used: skipping confirmation, linking alias to ${targetDataset}`)\n }\n\n await updateAlias(projectId, apiName, targetDataset)\n\n this.log(`Dataset alias ${displayName} linked to ${targetDataset} successfully`)\n } catch (error) {\n if (error instanceof CLIError) throw error\n linkAliasDebug(`Error linking dataset alias`, error)\n this.error(\n `Dataset alias linking failed: ${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n\n private async confirmRelink(currentDataset: string, newDataset: string): Promise<void> {\n await input({\n message: `This alias is linked to dataset <${currentDataset}>. Are you ABSOLUTELY sure you want to link this dataset alias to ${newDataset}?\\n Type YES/NO:`,\n validate: (input) => {\n const response = input.toLowerCase().trim()\n return response === 'yes' || 'Type YES to confirm or Ctrl + C to cancel dataset alias link.'\n },\n })\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","input","processAliasName","validateDatasetAliasName","validateDatasetName","promptForDatasetAliasName","promptForProject","selectDataset","listAliases","updateAlias","listDatasets","formatCliErrorMessages","getProjectIdFlag","linkAliasDebug","LinkAliasCommand","args","aliasName","string","description","required","targetDataset","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","isUnattended","errors","push","length","error","exit","USAGE_ERROR","apiName","nameError","datasetErr","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasetsResponse","aliases","Promise","all","datasets","map","ds","name","aliasNameInput","displayName","existingAlias","find","alias","availableAliases","a","join","message","includes","datasetName","confirmRelink","warn","log","Error","String","currentDataset","newDataset","validate","response","toLowerCase","trim"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/alias/link.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {processAliasName} from '../../../actions/dataset/processAliasName.js'\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForDatasetAliasName} from '../../../prompts/promptForDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {selectDataset} from '../../../prompts/selectDataset.js'\nimport {listAliases, updateAlias} from '../../../services/datasetAliases.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {formatCliErrorMessages} from '../../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst linkAliasDebug = subdebug('dataset:alias:link')\n\nexport class LinkAliasCommand extends SanityCommand<typeof LinkAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to link',\n required: false,\n }),\n targetDataset: Args.string({\n description: 'Target dataset name to link the alias to',\n required: false,\n }),\n }\n\n static override description = 'Link a dataset alias to a dataset in the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Link an alias with interactive prompts',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Link alias named \"conference\" with interactive dataset selection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference conf-2025',\n description: 'Link alias \"conference\" to \"conf-2025\" dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference conf-2025 --force',\n description: 'Force link without confirmation (skip relink prompt)',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to link dataset alias in',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Skip confirmation prompt when relinking existing alias',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:link']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(LinkAliasCommand)\n const {force} = flags\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!args.aliasName) {\n errors.push('Dataset alias name is required. Pass it as the `<aliasName>` argument.')\n }\n if (!args.targetDataset) {\n errors.push('Target dataset is required. Pass it as the `<targetDataset>` argument.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n if (args.aliasName) {\n const {apiName} = processAliasName(args.aliasName)\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n if (args.targetDataset) {\n const datasetErr = validateDatasetName(args.targetDataset)\n if (datasetErr) {\n this.error(datasetErr, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n const [datasetsResponse, aliases] = await Promise.all([\n listDatasets(projectId),\n listAliases(projectId),\n ])\n\n const datasets = datasetsResponse.map((ds) => ds.name)\n\n const aliasNameInput = args.aliasName || (await promptForDatasetAliasName())\n\n const {apiName, displayName} = processAliasName(aliasNameInput)\n\n const existingAlias = aliases.find((alias) => alias.name === apiName)\n if (!existingAlias) {\n const availableAliases = aliases.map((a) => `~${a.name}`).join(', ')\n this.error(\n `Dataset alias \"${displayName}\" does not exist. Available aliases: ${availableAliases}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n const targetDataset =\n args.targetDataset ||\n (datasets.length > 0\n ? await selectDataset(datasets, {\n message: 'Select target dataset to link alias to:',\n })\n : null)\n\n if (!targetDataset) {\n this.error('No datasets available to link to', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (!datasets.includes(targetDataset)) {\n this.error(\n `Dataset \"${targetDataset}\" does not exist. Available datasets: ${datasets.join(', ')}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n if (existingAlias.datasetName === targetDataset) {\n this.error(`Dataset alias ${displayName} already linked to ${targetDataset}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (existingAlias.datasetName && !force) {\n if (this.isUnattended()) {\n this.error('Relinking a dataset alias requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n await this.confirmRelink(existingAlias.datasetName, targetDataset)\n } else if (force && existingAlias.datasetName) {\n this.warn(`'--force' used: skipping confirmation, linking alias to ${targetDataset}`)\n }\n\n await updateAlias(projectId, apiName, targetDataset)\n\n this.log(`Dataset alias ${displayName} linked to ${targetDataset} successfully`)\n } catch (error) {\n if (error instanceof CLIError) throw error\n linkAliasDebug(`Error linking dataset alias`, error)\n this.error(\n `Dataset alias linking failed: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n\n private async confirmRelink(currentDataset: string, newDataset: string): Promise<void> {\n await input({\n message: `This alias is linked to dataset <${currentDataset}>. Are you ABSOLUTELY sure you want to link this dataset alias to ${newDataset}?\\n Type YES/NO:`,\n validate: (input) => {\n const response = input.toLowerCase().trim()\n return response === 'yes' || 'Type YES to confirm or Ctrl + C to cancel dataset alias link.'\n },\n })\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","input","processAliasName","validateDatasetAliasName","validateDatasetName","promptForDatasetAliasName","promptForProject","selectDataset","listAliases","updateAlias","listDatasets","formatCliErrorMessages","getProjectIdFlag","linkAliasDebug","LinkAliasCommand","args","aliasName","string","description","required","targetDataset","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","isUnattended","errors","push","length","error","exit","USAGE_ERROR","apiName","nameError","datasetErr","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasetsResponse","aliases","Promise","all","datasets","map","ds","name","aliasNameInput","displayName","existingAlias","find","alias","availableAliases","a","join","RUNTIME_ERROR","message","includes","datasetName","confirmRelink","warn","log","Error","String","currentDataset","newDataset","validate","response","toLowerCase","trim"],"mappings":"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"}
@@ -89,12 +89,12 @@ export class UnlinkAliasCommand extends SanityCommand {
89
89
  const linkedAlias = aliases.find((elem)=>elem.name === apiName);
90
90
  if (!linkedAlias) {
91
91
  this.error(`Dataset alias "${displayName}" does not exist`, {
92
- exit: 1
92
+ exit: exitCodes.RUNTIME_ERROR
93
93
  });
94
94
  }
95
95
  if (!linkedAlias.datasetName) {
96
96
  this.error(`Dataset alias "${displayName}" is not linked to a dataset`, {
97
- exit: 1
97
+ exit: exitCodes.RUNTIME_ERROR
98
98
  });
99
99
  }
100
100
  if (force) {
@@ -113,7 +113,7 @@ export class UnlinkAliasCommand extends SanityCommand {
113
113
  if (error instanceof CLIError) throw error;
114
114
  unlinkAliasDebug('Error unlinking dataset alias', error);
115
115
  this.error(`Dataset alias unlink failed: ${error instanceof Error ? error.message : String(error)}`, {
116
- exit: 1
116
+ exit: exitCodes.RUNTIME_ERROR
117
117
  });
118
118
  }
119
119
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/alias/unlink.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {processAliasName} from '../../../actions/dataset/processAliasName.js'\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {promptForDatasetAliasName} from '../../../prompts/promptForDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {listAliases, unlinkAlias} from '../../../services/datasetAliases.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst unlinkAliasDebug = subdebug('dataset:alias:unlink')\n\nexport class UnlinkAliasCommand extends SanityCommand<typeof UnlinkAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to unlink',\n required: false,\n }),\n }\n\n static override description = 'Unlink a dataset alias from its dataset in the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Unlink an alias with interactive selection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Unlink alias \"conference\" with confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference --force',\n description: 'Unlink alias \"conference\" without confirmation prompt',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to unlink dataset alias in',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Skip confirmation prompt and unlink immediately',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:unlink']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(UnlinkAliasCommand)\n const {force} = flags\n\n if (!args.aliasName && this.isUnattended()) {\n this.error('Dataset alias name is required. Pass it as the `<aliasName>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n if (args.aliasName) {\n const {apiName} = processAliasName(args.aliasName)\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n const aliasNameInput = args.aliasName || (await promptForDatasetAliasName())\n const {apiName, displayName} = processAliasName(aliasNameInput)\n\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n\n const aliases = await listAliases(projectId)\n\n // get the current alias from the remote alias list\n const linkedAlias = aliases.find((elem) => elem.name === apiName)\n if (!linkedAlias) {\n this.error(`Dataset alias \"${displayName}\" does not exist`, {exit: 1})\n }\n\n if (!linkedAlias.datasetName) {\n this.error(`Dataset alias \"${displayName}\" is not linked to a dataset`, {exit: 1})\n }\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, unlinking alias \"${displayName}\"`)\n } else {\n if (this.isUnattended()) {\n this.error('Unlinking a dataset alias requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n await this.confirmUnlink(linkedAlias.datasetName)\n }\n\n const result = await unlinkAlias(projectId, apiName)\n this.log(`Dataset alias ${displayName} unlinked from ${result.datasetName} successfully`)\n } catch (error) {\n if (error instanceof CLIError) throw error\n unlinkAliasDebug('Error unlinking dataset alias', error)\n this.error(\n `Dataset alias unlink failed: ${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n\n private async confirmUnlink(datasetName: string): Promise<void> {\n await input({\n message: `Are you ABSOLUTELY sure you want to unlink this alias from the \"${datasetName}\" dataset?\\n Type YES/NO:`,\n validate: (input) => {\n const response = input.toLowerCase().trim()\n return (\n response === 'yes' || 'Type YES to confirm or Ctrl + C to cancel dataset alias unlink.'\n )\n },\n })\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","input","processAliasName","validateDatasetAliasName","promptForDatasetAliasName","promptForProject","listAliases","unlinkAlias","getProjectIdFlag","unlinkAliasDebug","UnlinkAliasCommand","args","aliasName","string","description","required","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","apiName","nameError","projectId","getProjectId","fallback","requiredPermissions","grant","permission","aliasNameInput","displayName","aliases","linkedAlias","find","elem","name","datasetName","warn","confirmUnlink","result","log","Error","message","String","validate","response","toLowerCase","trim"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/alias/unlink.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {processAliasName} from '../../../actions/dataset/processAliasName.js'\nimport {validateDatasetAliasName} from '../../../actions/dataset/validateDatasetAliasName.js'\nimport {promptForDatasetAliasName} from '../../../prompts/promptForDatasetAliasName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {listAliases, unlinkAlias} from '../../../services/datasetAliases.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst unlinkAliasDebug = subdebug('dataset:alias:unlink')\n\nexport class UnlinkAliasCommand extends SanityCommand<typeof UnlinkAliasCommand> {\n static override args = {\n aliasName: Args.string({\n description: 'Dataset alias name to unlink',\n required: false,\n }),\n }\n\n static override description = 'Unlink a dataset alias from its dataset in the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Unlink an alias with interactive selection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference',\n description: 'Unlink alias \"conference\" with confirmation prompt',\n },\n {\n command: '<%= config.bin %> <%= command.id %> conference --force',\n description: 'Unlink alias \"conference\" without confirmation prompt',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to unlink dataset alias in',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Skip confirmation prompt and unlink immediately',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:alias:unlink']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(UnlinkAliasCommand)\n const {force} = flags\n\n if (!args.aliasName && this.isUnattended()) {\n this.error('Dataset alias name is required. Pass it as the `<aliasName>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n if (args.aliasName) {\n const {apiName} = processAliasName(args.aliasName)\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n const aliasNameInput = args.aliasName || (await promptForDatasetAliasName())\n const {apiName, displayName} = processAliasName(aliasNameInput)\n\n const nameError = validateDatasetAliasName(apiName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n\n const aliases = await listAliases(projectId)\n\n // get the current alias from the remote alias list\n const linkedAlias = aliases.find((elem) => elem.name === apiName)\n if (!linkedAlias) {\n this.error(`Dataset alias \"${displayName}\" does not exist`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (!linkedAlias.datasetName) {\n this.error(`Dataset alias \"${displayName}\" is not linked to a dataset`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, unlinking alias \"${displayName}\"`)\n } else {\n if (this.isUnattended()) {\n this.error('Unlinking a dataset alias requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n await this.confirmUnlink(linkedAlias.datasetName)\n }\n\n const result = await unlinkAlias(projectId, apiName)\n this.log(`Dataset alias ${displayName} unlinked from ${result.datasetName} successfully`)\n } catch (error) {\n if (error instanceof CLIError) throw error\n unlinkAliasDebug('Error unlinking dataset alias', error)\n this.error(\n `Dataset alias unlink failed: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n\n private async confirmUnlink(datasetName: string): Promise<void> {\n await input({\n message: `Are you ABSOLUTELY sure you want to unlink this alias from the \"${datasetName}\" dataset?\\n Type YES/NO:`,\n validate: (input) => {\n const response = input.toLowerCase().trim()\n return (\n response === 'yes' || 'Type YES to confirm or Ctrl + C to cancel dataset alias unlink.'\n )\n },\n })\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","input","processAliasName","validateDatasetAliasName","promptForDatasetAliasName","promptForProject","listAliases","unlinkAlias","getProjectIdFlag","unlinkAliasDebug","UnlinkAliasCommand","args","aliasName","string","description","required","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","isUnattended","error","exit","USAGE_ERROR","apiName","nameError","projectId","getProjectId","fallback","requiredPermissions","grant","permission","aliasNameInput","displayName","aliases","linkedAlias","find","elem","name","RUNTIME_ERROR","datasetName","warn","confirmUnlink","result","log","Error","message","String","validate","response","toLowerCase","trim"],"mappings":"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"}