@sanity/cli 7.11.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 (171) hide show
  1. package/dist/actions/build/buildApp.js +10 -7
  2. package/dist/actions/build/buildApp.js.map +1 -1
  3. package/dist/actions/build/buildStudio.js +9 -6
  4. package/dist/actions/build/buildStudio.js.map +1 -1
  5. package/dist/actions/build/types.js.map +1 -1
  6. package/dist/actions/deploy/deployApp.js +205 -162
  7. package/dist/actions/deploy/deployApp.js.map +1 -1
  8. package/dist/actions/deploy/deployChecks.js +1 -1
  9. package/dist/actions/deploy/deployChecks.js.map +1 -1
  10. package/dist/actions/deploy/deployStudio.js +126 -87
  11. package/dist/actions/deploy/deployStudio.js.map +1 -1
  12. package/dist/actions/deploy/resolveDeployTarget.js +5 -9
  13. package/dist/actions/deploy/resolveDeployTarget.js.map +1 -1
  14. package/dist/actions/dev/devAction.js +1 -2
  15. package/dist/actions/dev/devAction.js.map +1 -1
  16. package/dist/actions/dev/servers/getDevServerConfig.js +8 -2
  17. package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -1
  18. package/dist/actions/init/bootstrapLocalTemplate.js +18 -9
  19. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  20. package/dist/actions/init/createAppCliConfig.js.map +1 -1
  21. package/dist/actions/init/createCliConfig.js.map +1 -1
  22. package/dist/commands/backups/disable.js +4 -4
  23. package/dist/commands/backups/disable.js.map +1 -1
  24. package/dist/commands/backups/download.js +7 -7
  25. package/dist/commands/backups/download.js.map +1 -1
  26. package/dist/commands/backups/enable.js +4 -4
  27. package/dist/commands/backups/enable.js.map +1 -1
  28. package/dist/commands/backups/list.js +7 -7
  29. package/dist/commands/backups/list.js.map +1 -1
  30. package/dist/commands/codemod.js +5 -5
  31. package/dist/commands/codemod.js.map +1 -1
  32. package/dist/commands/cors/add.js +1 -1
  33. package/dist/commands/cors/add.js.map +1 -1
  34. package/dist/commands/cors/delete.js +4 -4
  35. package/dist/commands/cors/delete.js.map +1 -1
  36. package/dist/commands/cors/list.js +2 -2
  37. package/dist/commands/cors/list.js.map +1 -1
  38. package/dist/commands/datasets/alias/create.js +5 -5
  39. package/dist/commands/datasets/alias/create.js.map +1 -1
  40. package/dist/commands/datasets/alias/delete.js +2 -2
  41. package/dist/commands/datasets/alias/delete.js.map +1 -1
  42. package/dist/commands/datasets/alias/link.js +5 -5
  43. package/dist/commands/datasets/alias/link.js.map +1 -1
  44. package/dist/commands/datasets/alias/unlink.js +3 -3
  45. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  46. package/dist/commands/datasets/copy.js +7 -7
  47. package/dist/commands/datasets/copy.js.map +1 -1
  48. package/dist/commands/datasets/create.js +3 -3
  49. package/dist/commands/datasets/create.js.map +1 -1
  50. package/dist/commands/datasets/delete.js +2 -2
  51. package/dist/commands/datasets/delete.js.map +1 -1
  52. package/dist/commands/datasets/embeddings/disable.js +3 -3
  53. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  54. package/dist/commands/datasets/embeddings/enable.js +5 -5
  55. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  56. package/dist/commands/datasets/embeddings/status.js +3 -3
  57. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  58. package/dist/commands/datasets/export.js +6 -6
  59. package/dist/commands/datasets/export.js.map +1 -1
  60. package/dist/commands/datasets/import.js +3 -3
  61. package/dist/commands/datasets/import.js.map +1 -1
  62. package/dist/commands/datasets/list.js +2 -2
  63. package/dist/commands/datasets/list.js.map +1 -1
  64. package/dist/commands/datasets/visibility/get.js +2 -2
  65. package/dist/commands/datasets/visibility/get.js.map +1 -1
  66. package/dist/commands/datasets/visibility/set.js +3 -3
  67. package/dist/commands/datasets/visibility/set.js.map +1 -1
  68. package/dist/commands/deploy.js +2 -2
  69. package/dist/commands/deploy.js.map +1 -1
  70. package/dist/commands/dev.js +2 -2
  71. package/dist/commands/dev.js.map +1 -1
  72. package/dist/commands/docs/read.js +1 -1
  73. package/dist/commands/docs/read.js.map +1 -1
  74. package/dist/commands/docs/search.js +3 -3
  75. package/dist/commands/docs/search.js.map +1 -1
  76. package/dist/commands/doctor.js +3 -3
  77. package/dist/commands/doctor.js.map +1 -1
  78. package/dist/commands/documents/create.js +3 -3
  79. package/dist/commands/documents/create.js.map +1 -1
  80. package/dist/commands/documents/delete.js +3 -3
  81. package/dist/commands/documents/delete.js.map +1 -1
  82. package/dist/commands/documents/get.js +2 -2
  83. package/dist/commands/documents/get.js.map +1 -1
  84. package/dist/commands/documents/query.js +2 -2
  85. package/dist/commands/documents/query.js.map +1 -1
  86. package/dist/commands/documents/validate.js +3 -3
  87. package/dist/commands/documents/validate.js.map +1 -1
  88. package/dist/commands/graphql/deploy.js +13 -13
  89. package/dist/commands/graphql/deploy.js.map +1 -1
  90. package/dist/commands/graphql/list.js +2 -2
  91. package/dist/commands/graphql/list.js.map +1 -1
  92. package/dist/commands/graphql/undeploy.js +2 -2
  93. package/dist/commands/graphql/undeploy.js.map +1 -1
  94. package/dist/commands/hooks/attempt.js +2 -2
  95. package/dist/commands/hooks/attempt.js.map +1 -1
  96. package/dist/commands/hooks/create.js +3 -3
  97. package/dist/commands/hooks/create.js.map +1 -1
  98. package/dist/commands/hooks/delete.js +4 -4
  99. package/dist/commands/hooks/delete.js.map +1 -1
  100. package/dist/commands/hooks/list.js +2 -2
  101. package/dist/commands/hooks/list.js.map +1 -1
  102. package/dist/commands/hooks/logs.js +5 -5
  103. package/dist/commands/hooks/logs.js.map +1 -1
  104. package/dist/commands/login.js +2 -2
  105. package/dist/commands/login.js.map +1 -1
  106. package/dist/commands/logout.js +2 -2
  107. package/dist/commands/logout.js.map +1 -1
  108. package/dist/commands/manifest/extract.js +3 -3
  109. package/dist/commands/manifest/extract.js.map +1 -1
  110. package/dist/commands/mcp/configure.js +4 -4
  111. package/dist/commands/mcp/configure.js.map +1 -1
  112. package/dist/commands/media/create-aspect.js +3 -3
  113. package/dist/commands/media/create-aspect.js.map +1 -1
  114. package/dist/commands/media/delete-aspect.js +1 -1
  115. package/dist/commands/media/delete-aspect.js.map +1 -1
  116. package/dist/commands/media/deploy-aspect.js +4 -4
  117. package/dist/commands/media/deploy-aspect.js.map +1 -1
  118. package/dist/commands/media/export.js +7 -7
  119. package/dist/commands/media/export.js.map +1 -1
  120. package/dist/commands/media/import.js +6 -6
  121. package/dist/commands/media/import.js.map +1 -1
  122. package/dist/commands/migrations/create.js +4 -4
  123. package/dist/commands/migrations/create.js.map +1 -1
  124. package/dist/commands/migrations/list.js +2 -2
  125. package/dist/commands/migrations/list.js.map +1 -1
  126. package/dist/commands/migrations/run.js +14 -14
  127. package/dist/commands/migrations/run.js.map +1 -1
  128. package/dist/commands/openapi/get.js +3 -3
  129. package/dist/commands/openapi/get.js.map +1 -1
  130. package/dist/commands/openapi/list.js +2 -2
  131. package/dist/commands/openapi/list.js.map +1 -1
  132. package/dist/commands/organizations/create.js +5 -5
  133. package/dist/commands/organizations/create.js.map +1 -1
  134. package/dist/commands/organizations/delete.js +6 -6
  135. package/dist/commands/organizations/delete.js.map +1 -1
  136. package/dist/commands/organizations/get.js +3 -3
  137. package/dist/commands/organizations/get.js.map +1 -1
  138. package/dist/commands/organizations/list.js +2 -2
  139. package/dist/commands/organizations/list.js.map +1 -1
  140. package/dist/commands/organizations/update.js +6 -6
  141. package/dist/commands/organizations/update.js.map +1 -1
  142. package/dist/commands/preview.js +2 -2
  143. package/dist/commands/preview.js.map +1 -1
  144. package/dist/commands/projects/create.js +2 -2
  145. package/dist/commands/projects/create.js.map +1 -1
  146. package/dist/commands/projects/list.js +2 -2
  147. package/dist/commands/projects/list.js.map +1 -1
  148. package/dist/commands/schemas/delete.js +2 -2
  149. package/dist/commands/schemas/delete.js.map +1 -1
  150. package/dist/commands/schemas/deploy.js +2 -2
  151. package/dist/commands/schemas/deploy.js.map +1 -1
  152. package/dist/commands/schemas/list.js +1 -1
  153. package/dist/commands/schemas/list.js.map +1 -1
  154. package/dist/commands/schemas/validate.js +2 -1
  155. package/dist/commands/schemas/validate.js.map +1 -1
  156. package/dist/commands/skills/install.js +2 -2
  157. package/dist/commands/skills/install.js.map +1 -1
  158. package/dist/commands/telemetry/disable.js +2 -2
  159. package/dist/commands/telemetry/disable.js.map +1 -1
  160. package/dist/commands/telemetry/enable.js +2 -2
  161. package/dist/commands/telemetry/enable.js.map +1 -1
  162. package/dist/commands/tokens/create.js +2 -2
  163. package/dist/commands/tokens/create.js.map +1 -1
  164. package/dist/commands/tokens/delete.js +2 -2
  165. package/dist/commands/tokens/delete.js.map +1 -1
  166. package/dist/commands/tokens/list.js +2 -2
  167. package/dist/commands/tokens/list.js.map +1 -1
  168. package/dist/commands/users/invite.js +3 -3
  169. package/dist/commands/users/invite.js.map +1 -1
  170. package/oclif.manifest.json +331 -331
  171. package/package.json +5 -5
@@ -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":"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"}
@@ -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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"}
@@ -263,7 +263,7 @@ export class CopyDatasetCommand extends SanityCommand {
263
263
  copyDatasetDebug('Attaching to copy job %s', jobId);
264
264
  if (jobId.trim() === '') {
265
265
  return this.output.error('Please supply a valid jobId', {
266
- exit: 1
266
+ exit: exitCodes.RUNTIME_ERROR
267
267
  });
268
268
  }
269
269
  try {
@@ -273,7 +273,7 @@ export class CopyDatasetCommand extends SanityCommand {
273
273
  const message = error instanceof Error ? error.message : String(error);
274
274
  copyDatasetDebug('Failed to attach to copy job: %s', message, error);
275
275
  return this.output.error(`Failed to attach to copy job: ${message}`, {
276
- exit: 1
276
+ exit: exitCodes.RUNTIME_ERROR
277
277
  });
278
278
  }
279
279
  }
@@ -298,7 +298,7 @@ export class CopyDatasetCommand extends SanityCommand {
298
298
  const message = error instanceof Error ? error.message : String(error);
299
299
  copyDatasetDebug('Failed to fetch datasets: %s', message, error);
300
300
  return this.output.error(`Failed to fetch datasets: ${message}`, {
301
- exit: 1
301
+ exit: exitCodes.RUNTIME_ERROR
302
302
  });
303
303
  }
304
304
  const datasetNames = new Set(datasetsResponse.map((ds)=>ds.name));
@@ -310,7 +310,7 @@ export class CopyDatasetCommand extends SanityCommand {
310
310
  }
311
311
  if (!datasetNames.has(sourceDataset)) {
312
312
  return this.output.error(`Source dataset "${sourceDataset}" doesn't exist`, {
313
- exit: 1
313
+ exit: exitCodes.RUNTIME_ERROR
314
314
  });
315
315
  }
316
316
  // Get and validate target dataset
@@ -329,7 +329,7 @@ export class CopyDatasetCommand extends SanityCommand {
329
329
  }
330
330
  if (datasetNames.has(targetDataset)) {
331
331
  return this.output.error(`Target dataset "${targetDataset}" already exists`, {
332
- exit: 1
332
+ exit: exitCodes.RUNTIME_ERROR
333
333
  });
334
334
  }
335
335
  // Start the copy job
@@ -355,7 +355,7 @@ export class CopyDatasetCommand extends SanityCommand {
355
355
  const message = error instanceof Error ? error.message : String(error);
356
356
  copyDatasetDebug('Dataset copying failed: %s', message, error);
357
357
  return this.output.error(`Dataset copying failed: ${message}`, {
358
- exit: 1
358
+ exit: exitCodes.RUNTIME_ERROR
359
359
  });
360
360
  }
361
361
  }
@@ -376,7 +376,7 @@ export class CopyDatasetCommand extends SanityCommand {
376
376
  const message = error instanceof Error ? error.message : String(error);
377
377
  copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error);
378
378
  return this.output.error(`Failed to list dataset copy jobs: ${message}`, {
379
- exit: 1
379
+ exit: exitCodes.RUNTIME_ERROR
380
380
  });
381
381
  }
382
382
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/datasets/copy.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exit} from '@oclif/core/errors'\nimport {exitCodes} from '@sanity/cli-core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {Table} from 'console-table-printer'\nimport {formatDistance} from 'date-fns/formatDistance'\nimport {formatDistanceToNow} from 'date-fns/formatDistanceToNow'\nimport {parseISO} from 'date-fns/parseISO'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n copyDataset,\n type CopyJobProgressEvent,\n type DatasetCopyJob,\n followCopyJobProgress,\n listDatasetCopyJobs,\n listDatasets,\n} from '../../services/datasets.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst copyDatasetDebug = subdebug('dataset:copy')\n\nexport class CopyDatasetCommand extends SanityCommand<typeof CopyDatasetCommand> {\n static override args = {\n source: Args.string({\n description: 'Name of the dataset to copy from',\n required: false,\n }),\n target: Args.string({\n description: 'Name of the dataset to copy to',\n required: false,\n }),\n }\n\n static override description = 'Copy a dataset or manage copy jobs'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively copy a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset',\n description: 'Copy from source-dataset (prompts for target)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset target-dataset',\n description: 'Copy from source-dataset to target-dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-history source target',\n description: 'Copy without preserving document history (faster for large datasets)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-content-releases source target',\n description: 'Copy without content release documents',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --detach source target',\n description: 'Start copy job without waiting for completion',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --attach <job-id>',\n description: 'Attach to a running copy job to follow progress',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list',\n description: 'List all dataset copy jobs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list --offset 2 --limit 10',\n description: 'List copy jobs with pagination',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to copy dataset in',\n semantics: 'override',\n }),\n attach: Flags.string({\n description: 'Attach to the running copy process to show progress',\n exclusive: ['list', 'detach', 'skip-history'],\n required: false,\n }),\n detach: Flags.boolean({\n description: 'Start the copy without waiting for it to finish',\n exclusive: ['list', 'attach'],\n required: false,\n }),\n limit: Flags.integer({\n dependsOn: ['list'],\n description: 'Maximum number of jobs returned (default 10, max 1000)',\n max: 1000,\n required: false,\n }),\n list: Flags.boolean({\n description: 'Lists all dataset copy jobs',\n exclusive: ['attach', 'detach', 'skip-history'],\n required: false,\n }),\n offset: Flags.integer({\n dependsOn: ['list'],\n description: 'Start position in the list of jobs (default 0)',\n required: false,\n }),\n 'skip-content-releases': Flags.boolean({\n description: \"Don't copy content release documents to the target dataset\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n 'skip-history': Flags.boolean({\n description: \"Don't preserve document history on copy\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:copy']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CopyDatasetCommand)\n\n if (!flags.list && !flags.attach && this.isUnattended()) {\n const errors: string[] = []\n\n if (!args.source) {\n errors.push('Source dataset is required. Pass it as the `<source>` argument.')\n }\n if (!args.target) {\n errors.push('Target dataset is required. Pass it as the `<target>` argument.')\n }\n\n if (errors.length > 0) {\n this.output.error(formatCliErrorMessages(errors), {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 // Route to appropriate mode\n if (flags.list) {\n return this.handleListMode(projectId, flags)\n }\n\n if (flags.attach) {\n return this.handleAttachMode(projectId, flags.attach)\n }\n\n return this.handleCopyMode(projectId, args, flags)\n }\n\n private displayCopyJobsTable(jobs: DatasetCopyJob[]): void {\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'id', title: 'Job ID'},\n {alignment: 'left', name: 'sourceDataset', title: 'Source Dataset'},\n {alignment: 'left', name: 'targetDataset', title: 'Target Dataset'},\n {alignment: 'left', name: 'state', title: 'State'},\n {alignment: 'left', name: 'withHistory', title: 'With history'},\n {alignment: 'left', name: 'timeStarted', title: 'Time started'},\n {alignment: 'left', name: 'timeTaken', title: 'Time taken'},\n ],\n title: 'Dataset copy jobs for this project in descending order',\n })\n\n for (const job of jobs) {\n const {createdAt, id, sourceDataset, state, targetDataset, updatedAt, withHistory} = job\n\n let timeStarted = ''\n if (createdAt !== '') {\n timeStarted = formatDistanceToNow(parseISO(createdAt))\n }\n\n let timeTaken = ''\n if (updatedAt !== '') {\n timeTaken = formatDistance(parseISO(updatedAt), parseISO(createdAt))\n }\n\n let color: '' | 'green' | 'red' | 'yellow'\n switch (state) {\n case 'completed': {\n color = 'green'\n break\n }\n case 'failed': {\n color = 'red'\n break\n }\n case 'pending': {\n color = 'yellow'\n break\n }\n default: {\n color = ''\n }\n }\n\n table.addRow(\n {\n id,\n sourceDataset,\n state,\n targetDataset,\n timeStarted: `${timeStarted} ago`,\n timeTaken,\n withHistory,\n },\n {color},\n )\n }\n\n this.output.log(table.render())\n }\n\n private async handleAttachMode(projectId: string, jobId: string): Promise<void> {\n copyDatasetDebug('Attaching to copy job %s', jobId)\n\n if (jobId.trim() === '') {\n return this.output.error('Please supply a valid jobId', {exit: 1})\n }\n\n try {\n await this.subscribeToProgress(projectId, jobId)\n this.output.log(`Job ${styleText('green', jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to attach to copy job: %s', message, error)\n return this.output.error(`Failed to attach to copy job: ${message}`, {exit: 1})\n }\n }\n\n private async handleCopyMode(\n projectId: string,\n args: {source?: string; target?: string},\n flags: {detach?: boolean; 'skip-content-releases'?: boolean; 'skip-history'?: boolean},\n ): Promise<void> {\n copyDatasetDebug('Starting copy mode')\n\n const skipHistory = Boolean(flags['skip-history'])\n const skipContentReleases = Boolean(flags['skip-content-releases'])\n\n // Get and validate source dataset\n let sourceDataset = args.source\n if (sourceDataset) {\n const nameError = validateDatasetName(sourceDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n let datasetsResponse\n try {\n datasetsResponse = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to fetch datasets: %s', message, error)\n return this.output.error(`Failed to fetch datasets: ${message}`, {exit: 1})\n }\n\n const datasetNames = new Set(datasetsResponse.map((ds) => ds.name))\n\n // Prompt for source if not provided\n if (!sourceDataset) {\n sourceDataset = await promptForDataset({\n datasets: datasetsResponse,\n })\n }\n\n if (!datasetNames.has(sourceDataset)) {\n return this.output.error(`Source dataset \"${sourceDataset}\" doesn't exist`, {exit: 1})\n }\n\n // Get and validate target dataset\n let targetDataset = args.target\n if (targetDataset) {\n const nameError = validateDatasetName(targetDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n } else {\n targetDataset = await promptForDatasetName({\n message: 'Target dataset name:',\n })\n }\n\n if (datasetNames.has(targetDataset)) {\n return this.output.error(`Target dataset \"${targetDataset}\" already exists`, {exit: 1})\n }\n\n // Start the copy job\n try {\n this.output.log(\n `Copying dataset ${styleText('green', sourceDataset)} to ${styleText('green', targetDataset)}...`,\n )\n\n if (!skipHistory) {\n this.output.log(\n `Note: You can run this command with flag '--skip-history'. The flag will reduce copy time in larger datasets.`,\n )\n }\n\n const response = await copyDataset({\n projectId,\n skipContentReleases,\n skipHistory,\n sourceDataset,\n targetDataset,\n })\n\n this.output.log(`Job ${styleText('green', response.jobId)} started`)\n\n if (flags.detach) {\n return\n }\n\n await this.subscribeToProgress(projectId, response.jobId)\n this.output.log(`Job ${styleText('green', response.jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Dataset copying failed: %s', message, error)\n return this.output.error(`Dataset copying failed: ${message}`, {exit: 1})\n }\n }\n\n private async handleListMode(\n projectId: string,\n flags: {limit?: number; offset?: number},\n ): Promise<void> {\n copyDatasetDebug('Listing dataset copy jobs')\n\n try {\n const jobs = await listDatasetCopyJobs({\n limit: flags.limit,\n offset: flags.offset,\n projectId,\n })\n\n if (jobs.length === 0) {\n this.output.log(\"This project doesn't have any dataset copy jobs\")\n return\n }\n\n this.displayCopyJobsTable(jobs)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error)\n return this.output.error(`Failed to list dataset copy jobs: ${message}`, {exit: 1})\n }\n }\n\n private async subscribeToProgress(projectId: string, jobId: string): Promise<void> {\n const spin = spinner('').start()\n\n return new Promise<void>((resolve, reject) => {\n const sigintHandler = () => {\n subscription.unsubscribe()\n spin.fail('Copy interrupted.')\n exit(130)\n }\n\n const subscription = followCopyJobProgress({jobId, projectId}).subscribe({\n complete: () => {\n process.off('SIGINT', sigintHandler)\n spin.succeed('Copy finished.')\n resolve()\n },\n error: (err) => {\n process.off('SIGINT', sigintHandler)\n spin.fail('Copy failed.')\n reject(err)\n },\n next: (event: CopyJobProgressEvent) => {\n if (typeof event.progress === 'number') {\n spin.text = `Copy in progress: ${event.progress}%`\n }\n },\n })\n\n process.once('SIGINT', sigintHandler)\n })\n }\n}\n"],"names":["styleText","Args","Flags","exit","exitCodes","subdebug","SanityCommand","spinner","Table","formatDistance","formatDistanceToNow","parseISO","validateDatasetName","promptForDataset","promptForDatasetName","promptForProject","copyDataset","followCopyJobProgress","listDatasetCopyJobs","listDatasets","formatCliErrorMessages","getProjectIdFlag","copyDatasetDebug","CopyDatasetCommand","args","source","string","description","required","target","examples","command","flags","semantics","attach","exclusive","detach","boolean","limit","integer","dependsOn","max","list","offset","hiddenAliases","run","parse","isUnattended","errors","push","length","output","error","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","handleListMode","handleAttachMode","handleCopyMode","displayCopyJobsTable","jobs","table","columns","alignment","name","title","job","createdAt","id","sourceDataset","state","targetDataset","updatedAt","withHistory","timeStarted","timeTaken","color","addRow","log","render","jobId","trim","subscribeToProgress","message","Error","String","skipHistory","Boolean","skipContentReleases","nameError","datasetsResponse","datasetNames","Set","map","ds","datasets","has","response","spin","start","Promise","resolve","reject","sigintHandler","subscription","unsubscribe","fail","subscribe","complete","process","off","succeed","err","next","event","progress","text","once"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/datasets/copy.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exit} from '@oclif/core/errors'\nimport {exitCodes} from '@sanity/cli-core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {Table} from 'console-table-printer'\nimport {formatDistance} from 'date-fns/formatDistance'\nimport {formatDistanceToNow} from 'date-fns/formatDistanceToNow'\nimport {parseISO} from 'date-fns/parseISO'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n copyDataset,\n type CopyJobProgressEvent,\n type DatasetCopyJob,\n followCopyJobProgress,\n listDatasetCopyJobs,\n listDatasets,\n} from '../../services/datasets.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst copyDatasetDebug = subdebug('dataset:copy')\n\nexport class CopyDatasetCommand extends SanityCommand<typeof CopyDatasetCommand> {\n static override args = {\n source: Args.string({\n description: 'Name of the dataset to copy from',\n required: false,\n }),\n target: Args.string({\n description: 'Name of the dataset to copy to',\n required: false,\n }),\n }\n\n static override description = 'Copy a dataset or manage copy jobs'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively copy a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset',\n description: 'Copy from source-dataset (prompts for target)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset target-dataset',\n description: 'Copy from source-dataset to target-dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-history source target',\n description: 'Copy without preserving document history (faster for large datasets)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-content-releases source target',\n description: 'Copy without content release documents',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --detach source target',\n description: 'Start copy job without waiting for completion',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --attach <job-id>',\n description: 'Attach to a running copy job to follow progress',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list',\n description: 'List all dataset copy jobs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list --offset 2 --limit 10',\n description: 'List copy jobs with pagination',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to copy dataset in',\n semantics: 'override',\n }),\n attach: Flags.string({\n description: 'Attach to the running copy process to show progress',\n exclusive: ['list', 'detach', 'skip-history'],\n required: false,\n }),\n detach: Flags.boolean({\n description: 'Start the copy without waiting for it to finish',\n exclusive: ['list', 'attach'],\n required: false,\n }),\n limit: Flags.integer({\n dependsOn: ['list'],\n description: 'Maximum number of jobs returned (default 10, max 1000)',\n max: 1000,\n required: false,\n }),\n list: Flags.boolean({\n description: 'Lists all dataset copy jobs',\n exclusive: ['attach', 'detach', 'skip-history'],\n required: false,\n }),\n offset: Flags.integer({\n dependsOn: ['list'],\n description: 'Start position in the list of jobs (default 0)',\n required: false,\n }),\n 'skip-content-releases': Flags.boolean({\n description: \"Don't copy content release documents to the target dataset\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n 'skip-history': Flags.boolean({\n description: \"Don't preserve document history on copy\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:copy']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CopyDatasetCommand)\n\n if (!flags.list && !flags.attach && this.isUnattended()) {\n const errors: string[] = []\n\n if (!args.source) {\n errors.push('Source dataset is required. Pass it as the `<source>` argument.')\n }\n if (!args.target) {\n errors.push('Target dataset is required. Pass it as the `<target>` argument.')\n }\n\n if (errors.length > 0) {\n this.output.error(formatCliErrorMessages(errors), {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 // Route to appropriate mode\n if (flags.list) {\n return this.handleListMode(projectId, flags)\n }\n\n if (flags.attach) {\n return this.handleAttachMode(projectId, flags.attach)\n }\n\n return this.handleCopyMode(projectId, args, flags)\n }\n\n private displayCopyJobsTable(jobs: DatasetCopyJob[]): void {\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'id', title: 'Job ID'},\n {alignment: 'left', name: 'sourceDataset', title: 'Source Dataset'},\n {alignment: 'left', name: 'targetDataset', title: 'Target Dataset'},\n {alignment: 'left', name: 'state', title: 'State'},\n {alignment: 'left', name: 'withHistory', title: 'With history'},\n {alignment: 'left', name: 'timeStarted', title: 'Time started'},\n {alignment: 'left', name: 'timeTaken', title: 'Time taken'},\n ],\n title: 'Dataset copy jobs for this project in descending order',\n })\n\n for (const job of jobs) {\n const {createdAt, id, sourceDataset, state, targetDataset, updatedAt, withHistory} = job\n\n let timeStarted = ''\n if (createdAt !== '') {\n timeStarted = formatDistanceToNow(parseISO(createdAt))\n }\n\n let timeTaken = ''\n if (updatedAt !== '') {\n timeTaken = formatDistance(parseISO(updatedAt), parseISO(createdAt))\n }\n\n let color: '' | 'green' | 'red' | 'yellow'\n switch (state) {\n case 'completed': {\n color = 'green'\n break\n }\n case 'failed': {\n color = 'red'\n break\n }\n case 'pending': {\n color = 'yellow'\n break\n }\n default: {\n color = ''\n }\n }\n\n table.addRow(\n {\n id,\n sourceDataset,\n state,\n targetDataset,\n timeStarted: `${timeStarted} ago`,\n timeTaken,\n withHistory,\n },\n {color},\n )\n }\n\n this.output.log(table.render())\n }\n\n private async handleAttachMode(projectId: string, jobId: string): Promise<void> {\n copyDatasetDebug('Attaching to copy job %s', jobId)\n\n if (jobId.trim() === '') {\n return this.output.error('Please supply a valid jobId', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n try {\n await this.subscribeToProgress(projectId, jobId)\n this.output.log(`Job ${styleText('green', jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to attach to copy job: %s', message, error)\n return this.output.error(`Failed to attach to copy job: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async handleCopyMode(\n projectId: string,\n args: {source?: string; target?: string},\n flags: {detach?: boolean; 'skip-content-releases'?: boolean; 'skip-history'?: boolean},\n ): Promise<void> {\n copyDatasetDebug('Starting copy mode')\n\n const skipHistory = Boolean(flags['skip-history'])\n const skipContentReleases = Boolean(flags['skip-content-releases'])\n\n // Get and validate source dataset\n let sourceDataset = args.source\n if (sourceDataset) {\n const nameError = validateDatasetName(sourceDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n let datasetsResponse\n try {\n datasetsResponse = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to fetch datasets: %s', message, error)\n return this.output.error(`Failed to fetch datasets: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const datasetNames = new Set(datasetsResponse.map((ds) => ds.name))\n\n // Prompt for source if not provided\n if (!sourceDataset) {\n sourceDataset = await promptForDataset({\n datasets: datasetsResponse,\n })\n }\n\n if (!datasetNames.has(sourceDataset)) {\n return this.output.error(`Source dataset \"${sourceDataset}\" doesn't exist`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Get and validate target dataset\n let targetDataset = args.target\n if (targetDataset) {\n const nameError = validateDatasetName(targetDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n } else {\n targetDataset = await promptForDatasetName({\n message: 'Target dataset name:',\n })\n }\n\n if (datasetNames.has(targetDataset)) {\n return this.output.error(`Target dataset \"${targetDataset}\" already exists`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Start the copy job\n try {\n this.output.log(\n `Copying dataset ${styleText('green', sourceDataset)} to ${styleText('green', targetDataset)}...`,\n )\n\n if (!skipHistory) {\n this.output.log(\n `Note: You can run this command with flag '--skip-history'. The flag will reduce copy time in larger datasets.`,\n )\n }\n\n const response = await copyDataset({\n projectId,\n skipContentReleases,\n skipHistory,\n sourceDataset,\n targetDataset,\n })\n\n this.output.log(`Job ${styleText('green', response.jobId)} started`)\n\n if (flags.detach) {\n return\n }\n\n await this.subscribeToProgress(projectId, response.jobId)\n this.output.log(`Job ${styleText('green', response.jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Dataset copying failed: %s', message, error)\n return this.output.error(`Dataset copying failed: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async handleListMode(\n projectId: string,\n flags: {limit?: number; offset?: number},\n ): Promise<void> {\n copyDatasetDebug('Listing dataset copy jobs')\n\n try {\n const jobs = await listDatasetCopyJobs({\n limit: flags.limit,\n offset: flags.offset,\n projectId,\n })\n\n if (jobs.length === 0) {\n this.output.log(\"This project doesn't have any dataset copy jobs\")\n return\n }\n\n this.displayCopyJobsTable(jobs)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error)\n return this.output.error(`Failed to list dataset copy jobs: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async subscribeToProgress(projectId: string, jobId: string): Promise<void> {\n const spin = spinner('').start()\n\n return new Promise<void>((resolve, reject) => {\n const sigintHandler = () => {\n subscription.unsubscribe()\n spin.fail('Copy interrupted.')\n exit(130)\n }\n\n const subscription = followCopyJobProgress({jobId, projectId}).subscribe({\n complete: () => {\n process.off('SIGINT', sigintHandler)\n spin.succeed('Copy finished.')\n resolve()\n },\n error: (err) => {\n process.off('SIGINT', sigintHandler)\n spin.fail('Copy failed.')\n reject(err)\n },\n next: (event: CopyJobProgressEvent) => {\n if (typeof event.progress === 'number') {\n spin.text = `Copy in progress: ${event.progress}%`\n }\n },\n })\n\n process.once('SIGINT', sigintHandler)\n })\n }\n}\n"],"names":["styleText","Args","Flags","exit","exitCodes","subdebug","SanityCommand","spinner","Table","formatDistance","formatDistanceToNow","parseISO","validateDatasetName","promptForDataset","promptForDatasetName","promptForProject","copyDataset","followCopyJobProgress","listDatasetCopyJobs","listDatasets","formatCliErrorMessages","getProjectIdFlag","copyDatasetDebug","CopyDatasetCommand","args","source","string","description","required","target","examples","command","flags","semantics","attach","exclusive","detach","boolean","limit","integer","dependsOn","max","list","offset","hiddenAliases","run","parse","isUnattended","errors","push","length","output","error","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","handleListMode","handleAttachMode","handleCopyMode","displayCopyJobsTable","jobs","table","columns","alignment","name","title","job","createdAt","id","sourceDataset","state","targetDataset","updatedAt","withHistory","timeStarted","timeTaken","color","addRow","log","render","jobId","trim","RUNTIME_ERROR","subscribeToProgress","message","Error","String","skipHistory","Boolean","skipContentReleases","nameError","datasetsResponse","datasetNames","Set","map","ds","datasets","has","response","spin","start","Promise","resolve","reject","sigintHandler","subscription","unsubscribe","fail","subscribe","complete","process","off","succeed","err","next","event","progress","text","once"],"mappings":"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"}