@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,6 +1,6 @@
1
1
  import { text } from 'node:stream/consumers';
2
2
  import { Flags } from '@oclif/core';
3
- import { SanityCommand } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand } from '@sanity/cli-core';
4
4
  import { login } from '../actions/auth/login/login.js';
5
5
  import { LOGIN_PROVIDER_IDS } from '../actions/auth/login/loginInstructions.js';
6
6
  export class LoginCommand extends SanityCommand {
@@ -84,7 +84,7 @@ export class LoginCommand extends SanityCommand {
84
84
  } catch (error) {
85
85
  const message = error instanceof Error ? error.message : String(error);
86
86
  this.error(`Login failed: ${message}`, {
87
- exit: 1
87
+ exit: exitCodes.RUNTIME_ERROR
88
88
  });
89
89
  }
90
90
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import {text} from 'node:stream/consumers'\n\nimport {Command, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand} from '@sanity/cli-core'\n\nimport {login} from '../actions/auth/login/login.js'\nimport {LOGIN_PROVIDER_IDS} from '../actions/auth/login/loginInstructions.js'\n\nexport class LoginCommand extends SanityCommand<typeof LoginCommand> {\n static override description = 'Log in to your Sanity account'\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Log in using default settings',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --provider github --no-open',\n description: 'Login with GitHub provider, but do not open a browser window automatically',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sso my-organization',\n description: 'Log in using Single Sign-On with the \"my-organization\" slug',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --sso my-organization --sso-provider \"Okta SSO\"',\n description: 'Log in using a specific SSO provider within an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --with-token < token.txt',\n description: 'Log in using a token from standard input',\n },\n ]\n static override flags = {\n experimental: Flags.boolean({\n default: false,\n hidden: true,\n }),\n open: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Open a browser window to log in (`--no-open` only prints URL)',\n }),\n provider: Flags.string({\n description: `Log in using a provider ID (${LOGIN_PROVIDER_IDS.join(', ')})`,\n exclusive: ['sso', 'with-token'],\n helpValue: '<providerId>',\n }),\n sso: Flags.string({\n description: 'Log in using Single Sign-On, using the given organization slug',\n exclusive: ['provider', 'with-token'],\n helpValue: '<slug>',\n }),\n 'sso-provider': Flags.string({\n dependsOn: ['sso'],\n description: 'Select a specific SSO provider by name (use with --sso)',\n helpValue: '<name>',\n }),\n 'with-token': Flags.boolean({\n description: 'Read token from standard input',\n exclusive: ['provider', 'sso'],\n }),\n } satisfies FlagInput\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(LoginCommand)\n const {'sso-provider': ssoProvider, 'with-token': withToken, ...loginFlags} = flags\n\n try {\n const token = withToken ? await readTokenFromStdin() : undefined\n\n await login({\n ...loginFlags,\n output: this.output,\n ssoProvider,\n telemetry: this.telemetry,\n token,\n })\n this.log('Login successful')\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Login failed: ${message}`, {exit: 1})\n }\n }\n}\n\nasync function readTokenFromStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new Error(\n 'Token is required on standard input. Run `sanity login --with-token < token.txt`.',\n )\n }\n\n return text(process.stdin)\n}\n"],"names":["text","Flags","SanityCommand","login","LOGIN_PROVIDER_IDS","LoginCommand","description","examples","command","flags","experimental","boolean","default","hidden","open","allowNo","provider","string","join","exclusive","helpValue","sso","dependsOn","run","parse","ssoProvider","withToken","loginFlags","token","readTokenFromStdin","undefined","output","telemetry","log","error","message","Error","String","exit","process","stdin","isTTY"],"mappings":"AAAA,SAAQA,IAAI,QAAO,wBAAuB;AAE1C,SAAiBC,KAAK,QAAO,cAAa;AAE1C,SAAQC,aAAa,QAAO,mBAAkB;AAE9C,SAAQC,KAAK,QAAO,iCAAgC;AACpD,SAAQC,kBAAkB,QAAO,6CAA4C;AAE7E,OAAO,MAAMC,qBAAqBH;IAChC,OAAgBI,cAAc,gCAA+B;IAC7D,OAAgBC,WAAmC;QACjD;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SACE;YACFF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtBC,cAAcT,MAAMU,OAAO,CAAC;YAC1BC,SAAS;YACTC,QAAQ;QACV;QACAC,MAAMb,MAAMU,OAAO,CAAC;YAClBI,SAAS;YACTH,SAAS;YACTN,aAAa;QACf;QACAU,UAAUf,MAAMgB,MAAM,CAAC;YACrBX,aAAa,CAAC,4BAA4B,EAAEF,mBAAmBc,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5EC,WAAW;gBAAC;gBAAO;aAAa;YAChCC,WAAW;QACb;QACAC,KAAKpB,MAAMgB,MAAM,CAAC;YAChBX,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAa;YACrCC,WAAW;QACb;QACA,gBAAgBnB,MAAMgB,MAAM,CAAC;YAC3BK,WAAW;gBAAC;aAAM;YAClBhB,aAAa;YACbc,WAAW;QACb;QACA,cAAcnB,MAAMU,OAAO,CAAC;YAC1BL,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAM;QAChC;IACF,EAAqB;IAErB,MAAaI,MAAqB;QAChC,MAAM,EAACd,KAAK,EAAC,GAAG,MAAM,IAAI,CAACe,KAAK,CAACnB;QACjC,MAAM,EAAC,gBAAgBoB,WAAW,EAAE,cAAcC,SAAS,EAAE,GAAGC,YAAW,GAAGlB;QAE9E,IAAI;YACF,MAAMmB,QAAQF,YAAY,MAAMG,uBAAuBC;YAEvD,MAAM3B,MAAM;gBACV,GAAGwB,UAAU;gBACbI,QAAQ,IAAI,CAACA,MAAM;gBACnBN;gBACAO,WAAW,IAAI,CAACA,SAAS;gBACzBJ;YACF;YACA,IAAI,CAACK,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChE,IAAI,CAACA,KAAK,CAAC,CAAC,cAAc,EAAEC,SAAS,EAAE;gBAACG,MAAM;YAAC;QACjD;IACF;AACF;AAEA,eAAeT;IACb,IAAIU,QAAQC,KAAK,CAACC,KAAK,EAAE;QACvB,MAAM,IAAIL,MACR;IAEJ;IAEA,OAAOpC,KAAKuC,QAAQC,KAAK;AAC3B"}
1
+ {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import {text} from 'node:stream/consumers'\n\nimport {Command, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\n\nimport {login} from '../actions/auth/login/login.js'\nimport {LOGIN_PROVIDER_IDS} from '../actions/auth/login/loginInstructions.js'\n\nexport class LoginCommand extends SanityCommand<typeof LoginCommand> {\n static override description = 'Log in to your Sanity account'\n static override examples: Array<Command.Example> = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Log in using default settings',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --provider github --no-open',\n description: 'Login with GitHub provider, but do not open a browser window automatically',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sso my-organization',\n description: 'Log in using Single Sign-On with the \"my-organization\" slug',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --sso my-organization --sso-provider \"Okta SSO\"',\n description: 'Log in using a specific SSO provider within an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --with-token < token.txt',\n description: 'Log in using a token from standard input',\n },\n ]\n static override flags = {\n experimental: Flags.boolean({\n default: false,\n hidden: true,\n }),\n open: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Open a browser window to log in (`--no-open` only prints URL)',\n }),\n provider: Flags.string({\n description: `Log in using a provider ID (${LOGIN_PROVIDER_IDS.join(', ')})`,\n exclusive: ['sso', 'with-token'],\n helpValue: '<providerId>',\n }),\n sso: Flags.string({\n description: 'Log in using Single Sign-On, using the given organization slug',\n exclusive: ['provider', 'with-token'],\n helpValue: '<slug>',\n }),\n 'sso-provider': Flags.string({\n dependsOn: ['sso'],\n description: 'Select a specific SSO provider by name (use with --sso)',\n helpValue: '<name>',\n }),\n 'with-token': Flags.boolean({\n description: 'Read token from standard input',\n exclusive: ['provider', 'sso'],\n }),\n } satisfies FlagInput\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(LoginCommand)\n const {'sso-provider': ssoProvider, 'with-token': withToken, ...loginFlags} = flags\n\n try {\n const token = withToken ? await readTokenFromStdin() : undefined\n\n await login({\n ...loginFlags,\n output: this.output,\n ssoProvider,\n telemetry: this.telemetry,\n token,\n })\n this.log('Login successful')\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Login failed: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n\nasync function readTokenFromStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n throw new Error(\n 'Token is required on standard input. Run `sanity login --with-token < token.txt`.',\n )\n }\n\n return text(process.stdin)\n}\n"],"names":["text","Flags","exitCodes","SanityCommand","login","LOGIN_PROVIDER_IDS","LoginCommand","description","examples","command","flags","experimental","boolean","default","hidden","open","allowNo","provider","string","join","exclusive","helpValue","sso","dependsOn","run","parse","ssoProvider","withToken","loginFlags","token","readTokenFromStdin","undefined","output","telemetry","log","error","message","Error","String","exit","RUNTIME_ERROR","process","stdin","isTTY"],"mappings":"AAAA,SAAQA,IAAI,QAAO,wBAAuB;AAE1C,SAAiBC,KAAK,QAAO,cAAa;AAE1C,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AAEzD,SAAQC,KAAK,QAAO,iCAAgC;AACpD,SAAQC,kBAAkB,QAAO,6CAA4C;AAE7E,OAAO,MAAMC,qBAAqBH;IAChC,OAAgBI,cAAc,gCAA+B;IAC7D,OAAgBC,WAAmC;QACjD;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SACE;YACFF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IACD,OAAgBG,QAAQ;QACtBC,cAAcV,MAAMW,OAAO,CAAC;YAC1BC,SAAS;YACTC,QAAQ;QACV;QACAC,MAAMd,MAAMW,OAAO,CAAC;YAClBI,SAAS;YACTH,SAAS;YACTN,aAAa;QACf;QACAU,UAAUhB,MAAMiB,MAAM,CAAC;YACrBX,aAAa,CAAC,4BAA4B,EAAEF,mBAAmBc,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5EC,WAAW;gBAAC;gBAAO;aAAa;YAChCC,WAAW;QACb;QACAC,KAAKrB,MAAMiB,MAAM,CAAC;YAChBX,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAa;YACrCC,WAAW;QACb;QACA,gBAAgBpB,MAAMiB,MAAM,CAAC;YAC3BK,WAAW;gBAAC;aAAM;YAClBhB,aAAa;YACbc,WAAW;QACb;QACA,cAAcpB,MAAMW,OAAO,CAAC;YAC1BL,aAAa;YACba,WAAW;gBAAC;gBAAY;aAAM;QAChC;IACF,EAAqB;IAErB,MAAaI,MAAqB;QAChC,MAAM,EAACd,KAAK,EAAC,GAAG,MAAM,IAAI,CAACe,KAAK,CAACnB;QACjC,MAAM,EAAC,gBAAgBoB,WAAW,EAAE,cAAcC,SAAS,EAAE,GAAGC,YAAW,GAAGlB;QAE9E,IAAI;YACF,MAAMmB,QAAQF,YAAY,MAAMG,uBAAuBC;YAEvD,MAAM3B,MAAM;gBACV,GAAGwB,UAAU;gBACbI,QAAQ,IAAI,CAACA,MAAM;gBACnBN;gBACAO,WAAW,IAAI,CAACA,SAAS;gBACzBJ;YACF;YACA,IAAI,CAACK,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChE,IAAI,CAACA,KAAK,CAAC,CAAC,cAAc,EAAEC,SAAS,EAAE;gBAACG,MAAMrC,UAAUsC,aAAa;YAAA;QACvE;IACF;AACF;AAEA,eAAeV;IACb,IAAIW,QAAQC,KAAK,CAACC,KAAK,EAAE;QACvB,MAAM,IAAIN,MACR;IAEJ;IAEA,OAAOrC,KAAKyC,QAAQC,KAAK;AAC3B"}
@@ -1,4 +1,4 @@
1
- import { getCliToken, getUserConfig, SanityCommand, setCliUserConfig } from '@sanity/cli-core';
1
+ import { exitCodes, getCliToken, getUserConfig, SanityCommand, setCliUserConfig } from '@sanity/cli-core';
2
2
  import { isHttpError } from '@sanity/client';
3
3
  import { logout } from '../services/auth.js';
4
4
  export class LogoutCommand extends SanityCommand {
@@ -23,7 +23,7 @@ export class LogoutCommand extends SanityCommand {
23
23
  }
24
24
  const err = error instanceof Error ? error : new Error(`${error}`);
25
25
  this.error(`Failed to logout: ${err.message}`, {
26
- exit: 1
26
+ exit: exitCodes.RUNTIME_ERROR
27
27
  });
28
28
  }
29
29
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import {getCliToken, getUserConfig, SanityCommand, setCliUserConfig} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nimport {logout} from '../services/auth.js'\n\nexport class LogoutCommand extends SanityCommand<typeof LogoutCommand> {\n static override description = 'Log out of the current session'\n\n public async run(): Promise<void> {\n await this.parse(LogoutCommand)\n\n const previousToken = await getCliToken()\n if (!previousToken) {\n this.log('No login credentials found')\n return\n }\n\n try {\n await logout()\n\n this.clearConfig()\n } catch (error) {\n // In the case of session timeouts or missing sessions, we'll get a 401\n // This is an acceptable situation seen from a logout perspective - all we\n // need to do in this case is clear the session from the view of the CLI\n if (isHttpError(error) && error.response.statusCode === 401) {\n this.clearConfig()\n return\n }\n const err = error instanceof Error ? error : new Error(`${error}`)\n this.error(`Failed to logout: ${err.message}`, {exit: 1})\n }\n }\n\n private clearConfig() {\n setCliUserConfig('authToken', undefined)\n getUserConfig().delete('telemetryConsent')\n\n this.log('Logged out successfully')\n }\n}\n"],"names":["getCliToken","getUserConfig","SanityCommand","setCliUserConfig","isHttpError","logout","LogoutCommand","description","run","parse","previousToken","log","clearConfig","error","response","statusCode","err","Error","message","exit","undefined","delete"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,aAAa,EAAEC,aAAa,EAAEC,gBAAgB,QAAO,mBAAkB;AAC5F,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,OAAO,MAAMC,sBAAsBJ;IACjC,OAAgBK,cAAc,iCAAgC;IAE9D,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACH;QAEjB,MAAMI,gBAAgB,MAAMV;QAC5B,IAAI,CAACU,eAAe;YAClB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,IAAI;YACF,MAAMN;YAEN,IAAI,CAACO,WAAW;QAClB,EAAE,OAAOC,OAAO;YACd,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,IAAIT,YAAYS,UAAUA,MAAMC,QAAQ,CAACC,UAAU,KAAK,KAAK;gBAC3D,IAAI,CAACH,WAAW;gBAChB;YACF;YACA,MAAMI,MAAMH,iBAAiBI,QAAQJ,QAAQ,IAAII,MAAM,GAAGJ,OAAO;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,kBAAkB,EAAEG,IAAIE,OAAO,EAAE,EAAE;gBAACC,MAAM;YAAC;QACzD;IACF;IAEQP,cAAc;QACpBT,iBAAiB,aAAaiB;QAC9BnB,gBAAgBoB,MAAM,CAAC;QAEvB,IAAI,CAACV,GAAG,CAAC;IACX;AACF"}
1
+ {"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import {\n exitCodes,\n getCliToken,\n getUserConfig,\n SanityCommand,\n setCliUserConfig,\n} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nimport {logout} from '../services/auth.js'\n\nexport class LogoutCommand extends SanityCommand<typeof LogoutCommand> {\n static override description = 'Log out of the current session'\n\n public async run(): Promise<void> {\n await this.parse(LogoutCommand)\n\n const previousToken = await getCliToken()\n if (!previousToken) {\n this.log('No login credentials found')\n return\n }\n\n try {\n await logout()\n\n this.clearConfig()\n } catch (error) {\n // In the case of session timeouts or missing sessions, we'll get a 401\n // This is an acceptable situation seen from a logout perspective - all we\n // need to do in this case is clear the session from the view of the CLI\n if (isHttpError(error) && error.response.statusCode === 401) {\n this.clearConfig()\n return\n }\n const err = error instanceof Error ? error : new Error(`${error}`)\n this.error(`Failed to logout: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private clearConfig() {\n setCliUserConfig('authToken', undefined)\n getUserConfig().delete('telemetryConsent')\n\n this.log('Logged out successfully')\n }\n}\n"],"names":["exitCodes","getCliToken","getUserConfig","SanityCommand","setCliUserConfig","isHttpError","logout","LogoutCommand","description","run","parse","previousToken","log","clearConfig","error","response","statusCode","err","Error","message","exit","RUNTIME_ERROR","undefined","delete"],"mappings":"AAAA,SACEA,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,aAAa,EACbC,gBAAgB,QACX,mBAAkB;AACzB,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,OAAO,MAAMC,sBAAsBJ;IACjC,OAAgBK,cAAc,iCAAgC;IAE9D,MAAaC,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACH;QAEjB,MAAMI,gBAAgB,MAAMV;QAC5B,IAAI,CAACU,eAAe;YAClB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,IAAI;YACF,MAAMN;YAEN,IAAI,CAACO,WAAW;QAClB,EAAE,OAAOC,OAAO;YACd,uEAAuE;YACvE,0EAA0E;YAC1E,wEAAwE;YACxE,IAAIT,YAAYS,UAAUA,MAAMC,QAAQ,CAACC,UAAU,KAAK,KAAK;gBAC3D,IAAI,CAACH,WAAW;gBAChB;YACF;YACA,MAAMI,MAAMH,iBAAiBI,QAAQJ,QAAQ,IAAII,MAAM,GAAGJ,OAAO;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,kBAAkB,EAAEG,IAAIE,OAAO,EAAE,EAAE;gBAACC,MAAMpB,UAAUqB,aAAa;YAAA;QAC/E;IACF;IAEQR,cAAc;QACpBT,iBAAiB,aAAakB;QAC9BpB,gBAAgBqB,MAAM,CAAC;QAEvB,IAAI,CAACX,GAAG,CAAC;IACX;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import { formatSchemaValidation, SchemaExtractionError } from '@sanity/cli-build/_internal/extract';
3
- import { findProjectRoot, SanityCommand } from '@sanity/cli-core';
3
+ import { exitCodes, findProjectRoot, SanityCommand } from '@sanity/cli-core';
4
4
  import { manifestDebug } from '../../actions/manifest/debug.js';
5
5
  import { extractManifest } from '../../actions/manifest/extractManifest.js';
6
6
  const description = `
@@ -39,10 +39,10 @@ export class ExtractManifestCommand extends SanityCommand {
39
39
  manifestDebug('Error extracting manifest in command', error);
40
40
  if (error instanceof SchemaExtractionError && error.validation && error.validation.length > 0) {
41
41
  this.output.log(formatSchemaValidation(error.validation));
42
- this.exit(1);
42
+ this.exit(exitCodes.RUNTIME_ERROR);
43
43
  }
44
44
  this.error(`Failed to extract manifest:\n${error instanceof Error ? error.message : String(error)}`, {
45
- exit: 1
45
+ exit: exitCodes.RUNTIME_ERROR
46
46
  });
47
47
  }
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {findProjectRoot, SanityCommand} from '@sanity/cli-core'\n\nimport {manifestDebug} from '../../actions/manifest/debug.js'\nimport {extractManifest} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtract studio configuration as JSON manifest files.\n\nNote: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: 'dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n\n try {\n const projectRoot = await findProjectRoot(process.cwd())\n await extractManifest({\n outPath: flags.path,\n path: projectRoot.path,\n workDir: projectRoot.directory,\n })\n } catch (error) {\n manifestDebug('Error extracting manifest in command', error)\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(1)\n }\n\n this.error(\n `Failed to extract manifest:\\n${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Flags","formatSchemaValidation","SchemaExtractionError","findProjectRoot","SanityCommand","manifestDebug","extractManifest","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","projectRoot","process","cwd","outPath","workDir","directory","error","validation","length","output","log","exit","Error","message","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,eAAe,EAAEC,aAAa,QAAO,mBAAkB;AAE/D,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,eAAe,QAAO,4CAA2C;AAEzE,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BL;IAC1C,OAAgBG,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMb,MAAMc,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QAEjC,IAAI;YACF,MAAMS,cAAc,MAAMf,gBAAgBgB,QAAQC,GAAG;YACrD,MAAMd,gBAAgB;gBACpBe,SAAST,MAAMC,IAAI;gBACnBA,MAAMK,YAAYL,IAAI;gBACtBS,SAASJ,YAAYK,SAAS;YAChC;QACF,EAAE,OAAOC,OAAO;YACdnB,cAAc,wCAAwCmB;YACtD,IACEA,iBAAiBtB,yBACjBsB,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACC,GAAG,CAAC3B,uBAAuBuB,MAAMC,UAAU;gBACvD,IAAI,CAACI,IAAI,CAAC;YACZ;YAEA,IAAI,CAACL,KAAK,CACR,CAAC,6BAA6B,EAAEA,iBAAiBM,QAAQN,MAAMO,OAAO,GAAGC,OAAOR,QAAQ,EACxF;gBAACK,MAAM;YAAC;QAEZ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/manifest/extract.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {formatSchemaValidation, SchemaExtractionError} from '@sanity/cli-build/_internal/extract'\nimport {exitCodes, findProjectRoot, SanityCommand} from '@sanity/cli-core'\n\nimport {manifestDebug} from '../../actions/manifest/debug.js'\nimport {extractManifest} from '../../actions/manifest/extractManifest.js'\n\nconst description = `\nExtract studio configuration as JSON manifest files.\n\nNote: This command is experimental and subject to change. It is currently intended for use with Create only.\n`.trim()\n\nexport class ExtractManifestCommand extends SanityCommand<typeof ExtractManifestCommand> {\n static override description = description\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Extracts manifests',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --path /public/static',\n description: 'Extracts manifests into /public/static',\n },\n ]\n\n static override flags = {\n path: Flags.string({\n default: 'dist/static',\n description: 'Optional path to specify destination directory of the manifest files',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ExtractManifestCommand)\n\n try {\n const projectRoot = await findProjectRoot(process.cwd())\n await extractManifest({\n outPath: flags.path,\n path: projectRoot.path,\n workDir: projectRoot.directory,\n })\n } catch (error) {\n manifestDebug('Error extracting manifest in command', error)\n if (\n error instanceof SchemaExtractionError &&\n error.validation &&\n error.validation.length > 0\n ) {\n this.output.log(formatSchemaValidation(error.validation))\n this.exit(exitCodes.RUNTIME_ERROR)\n }\n\n this.error(\n `Failed to extract manifest:\\n${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n }\n}\n"],"names":["Flags","formatSchemaValidation","SchemaExtractionError","exitCodes","findProjectRoot","SanityCommand","manifestDebug","extractManifest","description","trim","ExtractManifestCommand","examples","command","flags","path","string","default","run","parse","projectRoot","process","cwd","outPath","workDir","directory","error","validation","length","output","log","exit","RUNTIME_ERROR","Error","message","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,sBAAsB,EAAEC,qBAAqB,QAAO,sCAAqC;AACjG,SAAQC,SAAS,EAAEC,eAAe,EAAEC,aAAa,QAAO,mBAAkB;AAE1E,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,eAAe,QAAO,4CAA2C;AAEzE,MAAMC,cAAc,CAAC;;;;AAIrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,+BAA+BL;IAC1C,OAAgBG,cAAcA,YAAW;IAEzC,OAAgBG,WAAW;QACzB;YACEC,SAAS;YACTJ,aAAa;QACf;QACA;YACEI,SAAS;YACTJ,aAAa;QACf;KACD,CAAA;IAED,OAAgBK,QAAQ;QACtBC,MAAMd,MAAMe,MAAM,CAAC;YACjBC,SAAS;YACTR,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACJ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACR;QAEjC,IAAI;YACF,MAAMS,cAAc,MAAMf,gBAAgBgB,QAAQC,GAAG;YACrD,MAAMd,gBAAgB;gBACpBe,SAAST,MAAMC,IAAI;gBACnBA,MAAMK,YAAYL,IAAI;gBACtBS,SAASJ,YAAYK,SAAS;YAChC;QACF,EAAE,OAAOC,OAAO;YACdnB,cAAc,wCAAwCmB;YACtD,IACEA,iBAAiBvB,yBACjBuB,MAAMC,UAAU,IAChBD,MAAMC,UAAU,CAACC,MAAM,GAAG,GAC1B;gBACA,IAAI,CAACC,MAAM,CAACC,GAAG,CAAC5B,uBAAuBwB,MAAMC,UAAU;gBACvD,IAAI,CAACI,IAAI,CAAC3B,UAAU4B,aAAa;YACnC;YAEA,IAAI,CAACN,KAAK,CACR,CAAC,6BAA6B,EAAEA,iBAAiBO,QAAQP,MAAMQ,OAAO,GAAGC,OAAOT,QAAQ,EACxF;gBAACK,MAAM3B,UAAU4B,aAAa;YAAA;QAElC;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { isInteractive, SanityCommand, subdebug } from '@sanity/cli-core';
1
+ import { exitCodes, isInteractive, SanityCommand, subdebug } from '@sanity/cli-core';
2
2
  import { getErrorMessage, toError } from '@sanity/cli-core/errors';
3
3
  import { ensureAuthenticated } from '../../actions/auth/ensureAuthenticated.js';
4
4
  import { setupMCP } from '../../actions/mcp/setupMCP.js';
@@ -26,11 +26,11 @@ export class ConfigureMcpCommand extends SanityCommand {
26
26
  trace.error(toError(error));
27
27
  if (error instanceof LoginError) {
28
28
  this.error(`Failed to verify authentication credentials: ${error.message}. Try running \`sanity login\`.`, {
29
- exit: 1
29
+ exit: exitCodes.RUNTIME_ERROR
30
30
  });
31
31
  }
32
32
  this.error(`Failed to check authentication: ${getErrorMessage(error)}`, {
33
- exit: 1
33
+ exit: exitCodes.RUNTIME_ERROR
34
34
  });
35
35
  }
36
36
  try {
@@ -52,7 +52,7 @@ export class ConfigureMcpCommand extends SanityCommand {
52
52
  } catch (error) {
53
53
  trace.error(toError(error));
54
54
  this.error(getErrorMessage(error), {
55
- exit: 1
55
+ exit: exitCodes.RUNTIME_ERROR
56
56
  });
57
57
  }
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/mcp/configure.ts"],"sourcesContent":["import {isInteractive, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage, toError} from '@sanity/cli-core/errors'\n\nimport {ensureAuthenticated} from '../../actions/auth/ensureAuthenticated.js'\nimport {setupMCP} from '../../actions/mcp/setupMCP.js'\nimport {LoginError} from '../../errors/LoginError.js'\nimport {MCPConfigureTrace} from '../../telemetry/mcp.telemetry.js'\n\nconst debug = subdebug('mcp:configure')\n\nexport class ConfigureMcpCommand extends SanityCommand<typeof ConfigureMcpCommand> {\n static override description =\n 'Configure Sanity MCP server for AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, MCPorter, OpenCode, VS Code, VS Code Insiders, Zed)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Configure Sanity MCP server for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(MCPConfigureTrace)\n trace.start()\n\n try {\n await ensureAuthenticated({output: this.output, telemetry: this.telemetry})\n } catch (error) {\n debug('Authentication check failed: %O', error)\n trace.error(toError(error))\n\n if (error instanceof LoginError) {\n this.error(\n `Failed to verify authentication credentials: ${error.message}. Try running \\`sanity login\\`.`,\n {exit: 1},\n )\n }\n\n this.error(`Failed to check authentication: ${getErrorMessage(error)}`, {exit: 1})\n }\n\n try {\n const mcpResult = await setupMCP({\n explicit: true,\n mode: isInteractive() ? 'prompt' : 'auto',\n output: this.output,\n skillsMode: 'skip',\n })\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n })\n\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n } else {\n trace.complete()\n }\n } catch (error) {\n trace.error(toError(error))\n this.error(getErrorMessage(error), {exit: 1})\n }\n }\n}\n"],"names":["isInteractive","SanityCommand","subdebug","getErrorMessage","toError","ensureAuthenticated","setupMCP","LoginError","MCPConfigureTrace","debug","ConfigureMcpCommand","description","examples","command","run","trace","telemetry","start","output","error","message","exit","mcpResult","explicit","mode","skillsMode","log","configuredEditors","detectedEditors","complete"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACvE,SAAQC,eAAe,EAAEC,OAAO,QAAO,0BAAyB;AAEhE,SAAQC,mBAAmB,QAAO,4CAA2C;AAC7E,SAAQC,QAAQ,QAAO,gCAA+B;AACtD,SAAQC,UAAU,QAAO,6BAA4B;AACrD,SAAQC,iBAAiB,QAAO,mCAAkC;AAElE,MAAMC,QAAQP,SAAS;AAEvB,OAAO,MAAMQ,4BAA4BT;IACvC,OAAgBU,cACd,iMAAgM;IAElM,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACP;QACnCO,MAAME,KAAK;QAEX,IAAI;YACF,MAAMZ,oBAAoB;gBAACa,QAAQ,IAAI,CAACA,MAAM;gBAAEF,WAAW,IAAI,CAACA,SAAS;YAAA;QAC3E,EAAE,OAAOG,OAAO;YACdV,MAAM,mCAAmCU;YACzCJ,MAAMI,KAAK,CAACf,QAAQe;YAEpB,IAAIA,iBAAiBZ,YAAY;gBAC/B,IAAI,CAACY,KAAK,CACR,CAAC,6CAA6C,EAAEA,MAAMC,OAAO,CAAC,+BAA+B,CAAC,EAC9F;oBAACC,MAAM;gBAAC;YAEZ;YAEA,IAAI,CAACF,KAAK,CAAC,CAAC,gCAAgC,EAAEhB,gBAAgBgB,QAAQ,EAAE;gBAACE,MAAM;YAAC;QAClF;QAEA,IAAI;YACF,MAAMC,YAAY,MAAMhB,SAAS;gBAC/BiB,UAAU;gBACVC,MAAMxB,kBAAkB,WAAW;gBACnCkB,QAAQ,IAAI,CAACA,MAAM;gBACnBO,YAAY;YACd;YAEAV,MAAMW,GAAG,CAAC;gBACRC,mBAAmBL,UAAUK,iBAAiB;gBAC9CC,iBAAiBN,UAAUM,eAAe;YAC5C;YAEA,IAAIN,UAAUH,KAAK,EAAE;gBACnBJ,MAAMI,KAAK,CAACG,UAAUH,KAAK;YAC7B,OAAO;gBACLJ,MAAMc,QAAQ;YAChB;QACF,EAAE,OAAOV,OAAO;YACdJ,MAAMI,KAAK,CAACf,QAAQe;YACpB,IAAI,CAACA,KAAK,CAAChB,gBAAgBgB,QAAQ;gBAACE,MAAM;YAAC;QAC7C;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/mcp/configure.ts"],"sourcesContent":["import {exitCodes, isInteractive, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage, toError} from '@sanity/cli-core/errors'\n\nimport {ensureAuthenticated} from '../../actions/auth/ensureAuthenticated.js'\nimport {setupMCP} from '../../actions/mcp/setupMCP.js'\nimport {LoginError} from '../../errors/LoginError.js'\nimport {MCPConfigureTrace} from '../../telemetry/mcp.telemetry.js'\n\nconst debug = subdebug('mcp:configure')\n\nexport class ConfigureMcpCommand extends SanityCommand<typeof ConfigureMcpCommand> {\n static override description =\n 'Configure Sanity MCP server for AI editors (Antigravity, Claude Code, Cline, Cline CLI, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, MCPorter, OpenCode, VS Code, VS Code Insiders, Zed)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Configure Sanity MCP server for detected AI editors',\n },\n ]\n\n public async run(): Promise<void> {\n const trace = this.telemetry.trace(MCPConfigureTrace)\n trace.start()\n\n try {\n await ensureAuthenticated({output: this.output, telemetry: this.telemetry})\n } catch (error) {\n debug('Authentication check failed: %O', error)\n trace.error(toError(error))\n\n if (error instanceof LoginError) {\n this.error(\n `Failed to verify authentication credentials: ${error.message}. Try running \\`sanity login\\`.`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n this.error(`Failed to check authentication: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n try {\n const mcpResult = await setupMCP({\n explicit: true,\n mode: isInteractive() ? 'prompt' : 'auto',\n output: this.output,\n skillsMode: 'skip',\n })\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n })\n\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n } else {\n trace.complete()\n }\n } catch (error) {\n trace.error(toError(error))\n this.error(getErrorMessage(error), {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["exitCodes","isInteractive","SanityCommand","subdebug","getErrorMessage","toError","ensureAuthenticated","setupMCP","LoginError","MCPConfigureTrace","debug","ConfigureMcpCommand","description","examples","command","run","trace","telemetry","start","output","error","message","exit","RUNTIME_ERROR","mcpResult","explicit","mode","skillsMode","log","configuredEditors","detectedEditors","complete"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAClF,SAAQC,eAAe,EAAEC,OAAO,QAAO,0BAAyB;AAEhE,SAAQC,mBAAmB,QAAO,4CAA2C;AAC7E,SAAQC,QAAQ,QAAO,gCAA+B;AACtD,SAAQC,UAAU,QAAO,6BAA4B;AACrD,SAAQC,iBAAiB,QAAO,mCAAkC;AAElE,MAAMC,QAAQP,SAAS;AAEvB,OAAO,MAAMQ,4BAA4BT;IACvC,OAAgBU,cACd,iMAAgM;IAElM,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAMC,QAAQ,IAAI,CAACC,SAAS,CAACD,KAAK,CAACP;QACnCO,MAAME,KAAK;QAEX,IAAI;YACF,MAAMZ,oBAAoB;gBAACa,QAAQ,IAAI,CAACA,MAAM;gBAAEF,WAAW,IAAI,CAACA,SAAS;YAAA;QAC3E,EAAE,OAAOG,OAAO;YACdV,MAAM,mCAAmCU;YACzCJ,MAAMI,KAAK,CAACf,QAAQe;YAEpB,IAAIA,iBAAiBZ,YAAY;gBAC/B,IAAI,CAACY,KAAK,CACR,CAAC,6CAA6C,EAAEA,MAAMC,OAAO,CAAC,+BAA+B,CAAC,EAC9F;oBAACC,MAAMtB,UAAUuB,aAAa;gBAAA;YAElC;YAEA,IAAI,CAACH,KAAK,CAAC,CAAC,gCAAgC,EAAEhB,gBAAgBgB,QAAQ,EAAE;gBACtEE,MAAMtB,UAAUuB,aAAa;YAC/B;QACF;QAEA,IAAI;YACF,MAAMC,YAAY,MAAMjB,SAAS;gBAC/BkB,UAAU;gBACVC,MAAMzB,kBAAkB,WAAW;gBACnCkB,QAAQ,IAAI,CAACA,MAAM;gBACnBQ,YAAY;YACd;YAEAX,MAAMY,GAAG,CAAC;gBACRC,mBAAmBL,UAAUK,iBAAiB;gBAC9CC,iBAAiBN,UAAUM,eAAe;YAC5C;YAEA,IAAIN,UAAUJ,KAAK,EAAE;gBACnBJ,MAAMI,KAAK,CAACI,UAAUJ,KAAK;YAC7B,OAAO;gBACLJ,MAAMe,QAAQ;YAChB;QACF,EAAE,OAAOX,OAAO;YACdJ,MAAMI,KAAK,CAACf,QAAQe;YACpB,IAAI,CAACA,KAAK,CAAChB,gBAAgBgB,QAAQ;gBAACE,MAAMtB,UAAUuB,aAAa;YAAA;QACnE;IACF;AACF"}
@@ -30,7 +30,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
30
30
  const mediaLibrary = getMediaLibraryConfig(cliConfig);
31
31
  if (mediaLibrary?.aspectsPath === undefined) {
32
32
  this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {
33
- exit: 1
33
+ exit: exitCodes.RUNTIME_ERROR
34
34
  });
35
35
  }
36
36
  const title = this.flags.title ?? (this.isUnattended() ? this.error('Aspect title is required. Pass it with `--title <title>`.', {
@@ -53,7 +53,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
53
53
  const destinationPathExists = await access(destinationPath).then(()=>true, ()=>false);
54
54
  if (destinationPathExists) {
55
55
  this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {
56
- exit: 1
56
+ exit: exitCodes.RUNTIME_ERROR
57
57
  });
58
58
  }
59
59
  await fs.writeFile(destinationPath, template({
@@ -74,7 +74,7 @@ export class MediaCreateAspectCommand extends SanityCommand {
74
74
  const message = error instanceof Error ? error.message : String(error);
75
75
  createAspectDebug('Failed to create aspect', error);
76
76
  this.error(`Failed to create aspect: ${message}`, {
77
- exit: 1
77
+ exit: exitCodes.RUNTIME_ERROR
78
78
  });
79
79
  }
80
80
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/create-aspect.ts"],"sourcesContent":["import fs, {access, mkdir} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\nimport {createPublishedId} from '@sanity/id-utils'\nimport camelCase from 'lodash-es/camelCase.js'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\n\nconst createAspectDebug = subdebug('media:create-aspect')\n\nexport class MediaCreateAspectCommand extends SanityCommand<typeof MediaCreateAspectCommand> {\n static override description = 'Create a new aspect definition file'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new aspect definition file',\n },\n ]\n\n static override flags = {\n name: Flags.string({description: 'Aspect name. Defaults to the title in camel case'}),\n title: Flags.string({description: 'Aspect title'}),\n }\n\n public async run(): Promise<void> {\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n if (mediaLibrary?.aspectsPath === undefined) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n const title =\n this.flags.title ??\n (this.isUnattended()\n ? this.error('Aspect title is required. Pass it with `--title <title>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n : await input({message: 'Title'}))\n\n const defaultName = createPublishedId(camelCase(title))\n const name =\n this.flags.name ??\n (this.isUnattended()\n ? defaultName\n : await input({\n default: defaultName,\n message: 'Name',\n }))\n\n try {\n const safeName = createPublishedId(camelCase(name))\n const destinationPath = path.resolve(mediaLibrary.aspectsPath, `${safeName}.ts`)\n const relativeDestinationPath = path.relative(process.cwd(), destinationPath)\n\n await mkdir(path.resolve(mediaLibrary.aspectsPath), {\n recursive: true,\n })\n\n const destinationPathExists = await access(destinationPath).then(\n () => true,\n () => false,\n )\n if (destinationPathExists) {\n this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {\n exit: 1,\n })\n }\n\n await fs.writeFile(\n destinationPath,\n template({\n name: safeName,\n title,\n }),\n )\n\n this.log(\n `${styleText('green', '✓')} Aspect created! ${styleText('bold', relativeDestinationPath)}`,\n )\n this.log()\n this.log('Next steps:')\n this.log(\n `Open ${styleText('bold', relativeDestinationPath)} in your code editor and customize the aspect.`,\n )\n this.log()\n this.log('Deploy this aspect by running:')\n this.log(styleText('bold', `sanity media deploy-aspect ${safeName}`))\n this.log()\n this.log('Deploy all aspects by running:')\n this.log(styleText('bold', `sanity media deploy-aspect --all`))\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createAspectDebug('Failed to create aspect', error)\n this.error(`Failed to create aspect: ${message}`, {exit: 1})\n }\n }\n}\n\nfunction template({name, title}: {name: string; title: string}) {\n return `import {defineAssetAspect, defineField} from 'sanity'\n\nexport default defineAssetAspect({\n name: '${name}',\n title: '${title}',\n type: 'object',\n fields: [\n defineField({\n name: 'string',\n title: 'Plain String',\n type: 'string',\n }),\n ],\n})\n`\n}\n"],"names":["fs","access","mkdir","path","styleText","Flags","exitCodes","SanityCommand","subdebug","input","createPublishedId","camelCase","getMediaLibraryConfig","NO_MEDIA_LIBRARY_ASPECTS_PATH","createAspectDebug","MediaCreateAspectCommand","description","examples","command","flags","name","string","title","run","cliConfig","getCliConfig","mediaLibrary","aspectsPath","undefined","error","exit","isUnattended","USAGE_ERROR","message","defaultName","default","safeName","destinationPath","resolve","relativeDestinationPath","relative","process","cwd","recursive","destinationPathExists","then","writeFile","template","log","Error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/create-aspect.ts"],"sourcesContent":["import fs, {access, mkdir} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\nimport {createPublishedId} from '@sanity/id-utils'\nimport camelCase from 'lodash-es/camelCase.js'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\n\nconst createAspectDebug = subdebug('media:create-aspect')\n\nexport class MediaCreateAspectCommand extends SanityCommand<typeof MediaCreateAspectCommand> {\n static override description = 'Create a new aspect definition file'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Create a new aspect definition file',\n },\n ]\n\n static override flags = {\n name: Flags.string({description: 'Aspect name. Defaults to the title in camel case'}),\n title: Flags.string({description: 'Aspect title'}),\n }\n\n public async run(): Promise<void> {\n const cliConfig = await this.getCliConfig()\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n if (mediaLibrary?.aspectsPath === undefined) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const title =\n this.flags.title ??\n (this.isUnattended()\n ? this.error('Aspect title is required. Pass it with `--title <title>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n : await input({message: 'Title'}))\n\n const defaultName = createPublishedId(camelCase(title))\n const name =\n this.flags.name ??\n (this.isUnattended()\n ? defaultName\n : await input({\n default: defaultName,\n message: 'Name',\n }))\n\n try {\n const safeName = createPublishedId(camelCase(name))\n const destinationPath = path.resolve(mediaLibrary.aspectsPath, `${safeName}.ts`)\n const relativeDestinationPath = path.relative(process.cwd(), destinationPath)\n\n await mkdir(path.resolve(mediaLibrary.aspectsPath), {\n recursive: true,\n })\n\n const destinationPathExists = await access(destinationPath).then(\n () => true,\n () => false,\n )\n if (destinationPathExists) {\n this.error(`A file already exists at ${styleText('bold', relativeDestinationPath)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n await fs.writeFile(\n destinationPath,\n template({\n name: safeName,\n title,\n }),\n )\n\n this.log(\n `${styleText('green', '✓')} Aspect created! ${styleText('bold', relativeDestinationPath)}`,\n )\n this.log()\n this.log('Next steps:')\n this.log(\n `Open ${styleText('bold', relativeDestinationPath)} in your code editor and customize the aspect.`,\n )\n this.log()\n this.log('Deploy this aspect by running:')\n this.log(styleText('bold', `sanity media deploy-aspect ${safeName}`))\n this.log()\n this.log('Deploy all aspects by running:')\n this.log(styleText('bold', `sanity media deploy-aspect --all`))\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createAspectDebug('Failed to create aspect', error)\n this.error(`Failed to create aspect: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n\nfunction template({name, title}: {name: string; title: string}) {\n return `import {defineAssetAspect, defineField} from 'sanity'\n\nexport default defineAssetAspect({\n name: '${name}',\n title: '${title}',\n type: 'object',\n fields: [\n defineField({\n name: 'string',\n title: 'Plain String',\n type: 'string',\n }),\n ],\n})\n`\n}\n"],"names":["fs","access","mkdir","path","styleText","Flags","exitCodes","SanityCommand","subdebug","input","createPublishedId","camelCase","getMediaLibraryConfig","NO_MEDIA_LIBRARY_ASPECTS_PATH","createAspectDebug","MediaCreateAspectCommand","description","examples","command","flags","name","string","title","run","cliConfig","getCliConfig","mediaLibrary","aspectsPath","undefined","error","exit","RUNTIME_ERROR","isUnattended","USAGE_ERROR","message","defaultName","default","safeName","destinationPath","resolve","relativeDestinationPath","relative","process","cwd","recursive","destinationPathExists","then","writeFile","template","log","Error","String"],"mappings":"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"}
@@ -93,7 +93,7 @@ export class MediaDeleteAspectCommand extends SanityCommand {
93
93
  const err = error;
94
94
  deleteAspectDebug('Failed to delete aspect', err);
95
95
  this.error(styleText('bold', 'Failed to delete aspect') + `\n - ${aspectName}\n\n${styleText('red', err.message)}`, {
96
- exit: 1
96
+ exit: exitCodes.RUNTIME_ERROR
97
97
  });
98
98
  }
99
99
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/delete-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deleteAspect} from '../../services/mediaLibraries.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteAspectDebug = subdebug('media:delete-aspect')\n\nexport class MediaDeleteAspectCommand extends SanityCommand<typeof MediaDeleteAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete an aspect definition'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Delete the aspect named \"someAspect\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete media aspect from',\n semantics: 'override',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Run without prompts and confirm deletion',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation} = this.flags\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!mediaLibraryIdFlag) {\n errors.push('Media library ID is required. Pass it with `--media-library-id <id>`.')\n }\n if (!skipConfirmation) {\n errors.push('Deletion requires confirmation. Pass `--yes` to delete the aspect.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Are you absolutely sure you want to undeploy the ${aspectName} aspect from the \"${mediaLibraryId}\" media library?`,\n })\n\n if (!confirmed) {\n this.log('Operation cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const response = await deleteAspect({\n aspectName,\n mediaLibraryId,\n projectId,\n })\n\n if (response.results.length === 0) {\n this.warn(styleText('bold', `There's no deployed aspect with that name`))\n this.log(` - ${aspectName}`)\n return\n }\n\n this.log()\n this.log(`${styleText('green', '✓')} ${styleText('bold', 'Deleted aspect')}`)\n this.log(` - ${aspectName}`)\n\n // TODO: Find existing aspect definition files matching the undeployed aspect name and offer\n // to delete them.\n } catch (error) {\n const err = error as Error\n deleteAspectDebug('Failed to delete aspect', err)\n this.error(\n styleText('bold', 'Failed to delete aspect') +\n `\\n - ${aspectName}\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","confirm","promptForProject","selectMediaLibrary","deleteAspect","formatCliErrorMessages","getProjectIdFlag","deleteAspectDebug","MediaDeleteAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","run","mediaLibraryIdFlag","skipConfirmation","isUnattended","errors","push","length","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","mediaLibraryId","confirmed","default","message","log","USER_ABORT","response","results","warn","err"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,kBAAkB,QAAO,sCAAqC;AACtE,SAAQC,YAAY,QAAO,mCAAkC;AAC7D,SAAQC,sBAAsB,QAAO,uCAAsC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,oBAAoBP,SAAS;AAEnC,OAAO,MAAMQ,iCAAiCT;IAC5C,OAAgBU,OAAO;QACrBC,YAAYd,KAAKe,MAAM,CAAC;YACtBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,8BAA6B;IAE3D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;QACF,oBAAoBpB,MAAMc,MAAM,CAAC;YAC/BC,aAAa;YACbC,UAAU;QACZ;QACAK,KAAKrB,MAAMsB,OAAO,CAAC;YACjBC,SAAS;gBAAC;aAAI;YACdR,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,MAAaQ,MAAqB;QAChC,MAAM,EAACX,UAAU,EAAC,GAAG,IAAI,CAACD,IAAI;QAC9B,MAAM,EAAC,oBAAoBa,kBAAkB,EAAEJ,KAAKK,gBAAgB,EAAC,GAAG,IAAI,CAACP,KAAK;QAElF,IAAI,IAAI,CAACQ,YAAY,IAAI;YACvB,MAAMC,SAAmB,EAAE;YAE3B,IAAI,CAACH,oBAAoB;gBACvBG,OAAOC,IAAI,CAAC;YACd;YACA,IAAI,CAACH,kBAAkB;gBACrBE,OAAOC,IAAI,CAAC;YACd;YAEA,IAAID,OAAOE,MAAM,GAAG,GAAG;gBACrB,IAAI,CAACC,KAAK,CAACvB,uBAAuBoB,SAAS;oBAACI,MAAM/B,UAAUgC,WAAW;gBAAA;YACzE;QACF;QAEA,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YAACC,UAAU,IAAM/B,iBAAiB,CAAC;QAAE;QAE/E,IAAIgC,iBAAiBZ;QACrB,IAAI,CAACY,gBAAgB;YACnBA,iBAAiB,MAAM/B,mBAAmB4B;QAC5C;QAEA,IAAI,CAACR,kBAAkB;YACrB,MAAMY,YAAY,MAAMlC,QAAQ;gBAC9BmC,SAAS;gBACTC,SAAS,CAAC,iDAAiD,EAAE3B,WAAW,kBAAkB,EAAEwB,eAAe,gBAAgB,CAAC;YAC9H;YAEA,IAAI,CAACC,WAAW;gBACd,IAAI,CAACG,GAAG,CAAC;gBACT,IAAI,CAACT,IAAI,CAAC/B,UAAUyC,UAAU;YAChC;QACF;QAEA,IAAI;YACF,MAAMC,WAAW,MAAMpC,aAAa;gBAClCM;gBACAwB;gBACAH;YACF;YAEA,IAAIS,SAASC,OAAO,CAACd,MAAM,KAAK,GAAG;gBACjC,IAAI,CAACe,IAAI,CAAC/C,UAAU,QAAQ,CAAC,yCAAyC,CAAC;gBACvE,IAAI,CAAC2C,GAAG,CAAC,CAAC,IAAI,EAAE5B,YAAY;gBAC5B;YACF;YAEA,IAAI,CAAC4B,GAAG;YACR,IAAI,CAACA,GAAG,CAAC,GAAG3C,UAAU,SAAS,KAAK,CAAC,EAAEA,UAAU,QAAQ,mBAAmB;YAC5E,IAAI,CAAC2C,GAAG,CAAC,CAAC,IAAI,EAAE5B,YAAY;QAE5B,4FAA4F;QAC5F,kBAAkB;QACpB,EAAE,OAAOkB,OAAO;YACd,MAAMe,MAAMf;YACZrB,kBAAkB,2BAA2BoC;YAC7C,IAAI,CAACf,KAAK,CACRjC,UAAU,QAAQ,6BAChB,CAAC,MAAM,EAAEe,WAAW,IAAI,EAAEf,UAAU,OAAOgD,IAAIN,OAAO,GAAG,EAC3D;gBACER,MAAM;YACR;QAEJ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/media/delete-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deleteAspect} from '../../services/mediaLibraries.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteAspectDebug = subdebug('media:delete-aspect')\n\nexport class MediaDeleteAspectCommand extends SanityCommand<typeof MediaDeleteAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete an aspect definition'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Delete the aspect named \"someAspect\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete media aspect from',\n semantics: 'override',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n yes: Flags.boolean({\n aliases: ['y'],\n description: 'Run without prompts and confirm deletion',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {'media-library-id': mediaLibraryIdFlag, yes: skipConfirmation} = this.flags\n\n if (this.isUnattended()) {\n const errors: string[] = []\n\n if (!mediaLibraryIdFlag) {\n errors.push('Media library ID is required. Pass it with `--media-library-id <id>`.')\n }\n if (!skipConfirmation) {\n errors.push('Deletion requires confirmation. Pass `--yes` to delete the aspect.')\n }\n\n if (errors.length > 0) {\n this.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n if (!skipConfirmation) {\n const confirmed = await confirm({\n default: false,\n message: `Are you absolutely sure you want to undeploy the ${aspectName} aspect from the \"${mediaLibraryId}\" media library?`,\n })\n\n if (!confirmed) {\n this.log('Operation cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const response = await deleteAspect({\n aspectName,\n mediaLibraryId,\n projectId,\n })\n\n if (response.results.length === 0) {\n this.warn(styleText('bold', `There's no deployed aspect with that name`))\n this.log(` - ${aspectName}`)\n return\n }\n\n this.log()\n this.log(`${styleText('green', '✓')} ${styleText('bold', 'Deleted aspect')}`)\n this.log(` - ${aspectName}`)\n\n // TODO: Find existing aspect definition files matching the undeployed aspect name and offer\n // to delete them.\n } catch (error) {\n const err = error as Error\n deleteAspectDebug('Failed to delete aspect', err)\n this.error(\n styleText('bold', 'Failed to delete aspect') +\n `\\n - ${aspectName}\\n\\n${styleText('red', err.message)}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","confirm","promptForProject","selectMediaLibrary","deleteAspect","formatCliErrorMessages","getProjectIdFlag","deleteAspectDebug","MediaDeleteAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","yes","boolean","aliases","run","mediaLibraryIdFlag","skipConfirmation","isUnattended","errors","push","length","error","exit","USAGE_ERROR","projectId","getProjectId","fallback","mediaLibraryId","confirmed","default","message","log","USER_ABORT","response","results","warn","err","RUNTIME_ERROR"],"mappings":"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"}
@@ -65,7 +65,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
65
65
  } catch (err) {
66
66
  if (err instanceof ProjectRootNotFoundError) {
67
67
  this.error('This command must be run from within a Sanity project directory (requires media library configuration)', {
68
- exit: 1
68
+ exit: exitCodes.RUNTIME_ERROR
69
69
  });
70
70
  }
71
71
  throw err;
@@ -73,7 +73,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
73
73
  const mediaLibrary = getMediaLibraryConfig(cliConfig);
74
74
  if (!mediaLibrary?.aspectsPath) {
75
75
  this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {
76
- exit: 1
76
+ exit: exitCodes.RUNTIME_ERROR
77
77
  });
78
78
  }
79
79
  const projectId = await this.getProjectId({
@@ -115,7 +115,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
115
115
  if (!all && result.valid.length === 0 && result.invalid.length === 0) {
116
116
  this.log();
117
117
  this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {
118
- exit: 1
118
+ exit: exitCodes.RUNTIME_ERROR
119
119
  });
120
120
  }
121
121
  // Deploy valid aspects
@@ -147,7 +147,7 @@ export class MediaDeployAspectCommand extends SanityCommand {
147
147
  mediaLibraryId: mediaLibraryIdFlag
148
148
  });
149
149
  this.error(styleText('bold', 'Failed to deploy aspects') + `\n\n${styleText('red', err.message)}`, {
150
- exit: 1
150
+ exit: exitCodes.RUNTIME_ERROR
151
151
  });
152
152
  }
153
153
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/deploy-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {\n type CliConfig,\n exitCodes,\n ProjectRootNotFoundError,\n SanityCommand,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isAssetAspect, type SchemaValidationProblem} from '@sanity/types'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {importAspects} from '../../actions/media/importAspects.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deployAspects} from '../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\nimport {pluralize} from '../../util/pluralize.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deployAspectDebug = subdebug('media:deploy-aspect')\n\nexport class MediaDeployAspectCommand extends SanityCommand<typeof MediaDeployAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to deploy',\n required: false,\n }),\n }\n\n static override description = 'Deploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Deploy the aspect named \"someAspect\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --all',\n description: 'Deploy all aspects',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to deploy media aspect to',\n semantics: 'override',\n }),\n all: Flags.boolean({\n description: 'Deploy all aspects',\n required: false,\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {all, 'media-library-id': mediaLibraryIdFlag} = this.flags\n\n // Validation: must provide either aspect name or --all flag\n if (!all && !aspectName) {\n this.error(\n 'Aspect name is required. Pass it as the `<aspectName>` argument, or pass `--all`.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n // Validation: cannot provide both aspect name and --all flag\n if (all && aspectName) {\n this.error('Specify either the `<aspectName>` argument or `--all`, but not both.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n let cliConfig: CliConfig\n try {\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n this.error(\n 'This command must be run from within a Sanity project directory (requires media library configuration)',\n {exit: 1},\n )\n }\n throw err\n }\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n\n if (!mediaLibrary?.aspectsPath) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: 1})\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n if (!mediaLibraryIdFlag && this.isUnattended()) {\n this.error('Media library ID is required. Pass it with `--media-library-id <id>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n try {\n // Determine target media library\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n // Import and validate aspects\n const spin = spinner('Loading aspect definitions').start()\n const result = await importAspects({\n aspectsPath: mediaLibrary.aspectsPath,\n filterAspects: (aspect) => {\n if (all) {\n return true\n }\n\n if (typeof aspect === 'object' && aspect !== null && '_id' in aspect) {\n return aspect._id === aspectName\n }\n\n return false\n },\n })\n spin.stop()\n\n // Handle invalid aspects\n if (result.invalid.length > 0) {\n this.logToStderr('')\n this.warn(\n styleText(\n 'bold',\n `Skipped ${result.invalid.length} invalid ${pluralize('aspect', result.invalid.length)}`,\n ),\n )\n this.logToStderr(this.formatAspectList(result.invalid))\n }\n\n // Check if we found the requested aspect (when not using --all)\n if (!all && result.valid.length === 0 && result.invalid.length === 0) {\n this.log()\n this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {exit: 1})\n }\n\n // Deploy valid aspects\n if (result.valid.length === 0) {\n this.logToStderr('')\n this.warn('No valid aspects to deploy')\n return\n }\n\n const deploySpin = spinner(\n `Deploying ${result.valid.length} ${pluralize('aspect', result.valid.length)}`,\n ).start()\n\n const deployResponse = await deployAspects({\n aspects: result.valid.map((a) => a.aspect),\n mediaLibraryId,\n })\n\n deploySpin.succeed()\n\n // Display success message\n this.log()\n this.log(\n `${styleText('green', '✓')} ${styleText('bold', `Deployed ${result.valid.length} ${pluralize('aspect', result.valid.length)}`)}`,\n )\n this.log(this.formatAspectList(result.valid))\n\n deployAspectDebug('Deployed aspects', {\n count: result.valid.length,\n results: deployResponse.results,\n })\n } catch (error) {\n const err = error as Error\n deployAspectDebug('Failed to deploy aspects', {\n all,\n aspectName,\n error: err,\n mediaLibraryId: mediaLibraryIdFlag,\n })\n this.error(\n styleText('bold', 'Failed to deploy aspects') + `\\n\\n${styleText('red', err.message)}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n /**\n * Format a list of aspects for display\n */\n private formatAspectList(\n aspects: Array<{\n aspect: unknown\n filename: string\n validationErrors?: SchemaValidationProblem[][]\n }>,\n ): string {\n return aspects\n .map(({aspect, filename, validationErrors = []}) => {\n const label = isAssetAspect(aspect) ? aspect._id : 'Unnamed aspect'\n\n // Flatten the nested validation errors and extract messages\n const simplifiedErrors = validationErrors.flatMap((group) =>\n group.map(({message}) => message),\n )\n\n const errorLabel =\n simplifiedErrors.length > 0 ? ` ${styleText('bgRed', simplifiedErrors[0])}` : ''\n\n const remainingErrorsCount = simplifiedErrors.length - 1\n const remainingErrorsLabel =\n remainingErrorsCount > 0\n ? styleText(\n 'italic',\n ` and ${remainingErrorsCount} other ${pluralize('error', remainingErrorsCount)}`,\n )\n : ''\n\n return ` - ${label} ${styleText('dim', filename)}${errorLabel}${remainingErrorsLabel}`\n })\n .join('\\n')\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","ProjectRootNotFoundError","SanityCommand","subdebug","spinner","isAssetAspect","getMediaLibraryConfig","importAspects","promptForProject","selectMediaLibrary","deployAspects","NO_MEDIA_LIBRARY_ASPECTS_PATH","pluralize","getProjectIdFlag","deployAspectDebug","MediaDeployAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","all","boolean","run","mediaLibraryIdFlag","error","exit","USAGE_ERROR","cliConfig","getCliConfig","err","mediaLibrary","aspectsPath","projectId","getProjectId","fallback","isUnattended","mediaLibraryId","spin","start","result","filterAspects","aspect","_id","stop","invalid","length","logToStderr","warn","formatAspectList","valid","log","deploySpin","deployResponse","aspects","map","a","succeed","count","results","message","filename","validationErrors","label","simplifiedErrors","flatMap","group","errorLabel","remainingErrorsCount","remainingErrorsLabel","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/deploy-aspect.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {\n type CliConfig,\n exitCodes,\n ProjectRootNotFoundError,\n SanityCommand,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isAssetAspect, type SchemaValidationProblem} from '@sanity/types'\n\nimport {getMediaLibraryConfig} from '../../actions/media/getMediaLibraryConfig.js'\nimport {importAspects} from '../../actions/media/importAspects.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {selectMediaLibrary} from '../../prompts/selectMediaLibrary.js'\nimport {deployAspects} from '../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH} from '../../util/errorMessages.js'\nimport {pluralize} from '../../util/pluralize.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deployAspectDebug = subdebug('media:deploy-aspect')\n\nexport class MediaDeployAspectCommand extends SanityCommand<typeof MediaDeployAspectCommand> {\n static override args = {\n aspectName: Args.string({\n description: 'Name of the aspect to deploy',\n required: false,\n }),\n }\n\n static override description = 'Deploy an aspect'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> someAspect',\n description: 'Deploy the aspect named \"someAspect\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --all',\n description: 'Deploy all aspects',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to deploy media aspect to',\n semantics: 'override',\n }),\n all: Flags.boolean({\n description: 'Deploy all aspects',\n required: false,\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {aspectName} = this.args\n const {all, 'media-library-id': mediaLibraryIdFlag} = this.flags\n\n // Validation: must provide either aspect name or --all flag\n if (!all && !aspectName) {\n this.error(\n 'Aspect name is required. Pass it as the `<aspectName>` argument, or pass `--all`.',\n {exit: exitCodes.USAGE_ERROR},\n )\n }\n\n // Validation: cannot provide both aspect name and --all flag\n if (all && aspectName) {\n this.error('Specify either the `<aspectName>` argument or `--all`, but not both.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n let cliConfig: CliConfig\n try {\n cliConfig = await this.getCliConfig()\n } catch (err) {\n if (err instanceof ProjectRootNotFoundError) {\n this.error(\n 'This command must be run from within a Sanity project directory (requires media library configuration)',\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n throw err\n }\n const mediaLibrary = getMediaLibraryConfig(cliConfig)\n\n if (!mediaLibrary?.aspectsPath) {\n this.error(NO_MEDIA_LIBRARY_ASPECTS_PATH, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n if (!mediaLibraryIdFlag && this.isUnattended()) {\n this.error('Media library ID is required. Pass it with `--media-library-id <id>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n try {\n // Determine target media library\n let mediaLibraryId = mediaLibraryIdFlag\n if (!mediaLibraryId) {\n mediaLibraryId = await selectMediaLibrary(projectId)\n }\n\n // Import and validate aspects\n const spin = spinner('Loading aspect definitions').start()\n const result = await importAspects({\n aspectsPath: mediaLibrary.aspectsPath,\n filterAspects: (aspect) => {\n if (all) {\n return true\n }\n\n if (typeof aspect === 'object' && aspect !== null && '_id' in aspect) {\n return aspect._id === aspectName\n }\n\n return false\n },\n })\n spin.stop()\n\n // Handle invalid aspects\n if (result.invalid.length > 0) {\n this.logToStderr('')\n this.warn(\n styleText(\n 'bold',\n `Skipped ${result.invalid.length} invalid ${pluralize('aspect', result.invalid.length)}`,\n ),\n )\n this.logToStderr(this.formatAspectList(result.invalid))\n }\n\n // Check if we found the requested aspect (when not using --all)\n if (!all && result.valid.length === 0 && result.invalid.length === 0) {\n this.log()\n this.error(`Could not find aspect: ${styleText('bold', aspectName ?? '')}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Deploy valid aspects\n if (result.valid.length === 0) {\n this.logToStderr('')\n this.warn('No valid aspects to deploy')\n return\n }\n\n const deploySpin = spinner(\n `Deploying ${result.valid.length} ${pluralize('aspect', result.valid.length)}`,\n ).start()\n\n const deployResponse = await deployAspects({\n aspects: result.valid.map((a) => a.aspect),\n mediaLibraryId,\n })\n\n deploySpin.succeed()\n\n // Display success message\n this.log()\n this.log(\n `${styleText('green', '✓')} ${styleText('bold', `Deployed ${result.valid.length} ${pluralize('aspect', result.valid.length)}`)}`,\n )\n this.log(this.formatAspectList(result.valid))\n\n deployAspectDebug('Deployed aspects', {\n count: result.valid.length,\n results: deployResponse.results,\n })\n } catch (error) {\n const err = error as Error\n deployAspectDebug('Failed to deploy aspects', {\n all,\n aspectName,\n error: err,\n mediaLibraryId: mediaLibraryIdFlag,\n })\n this.error(\n styleText('bold', 'Failed to deploy aspects') + `\\n\\n${styleText('red', err.message)}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n\n /**\n * Format a list of aspects for display\n */\n private formatAspectList(\n aspects: Array<{\n aspect: unknown\n filename: string\n validationErrors?: SchemaValidationProblem[][]\n }>,\n ): string {\n return aspects\n .map(({aspect, filename, validationErrors = []}) => {\n const label = isAssetAspect(aspect) ? aspect._id : 'Unnamed aspect'\n\n // Flatten the nested validation errors and extract messages\n const simplifiedErrors = validationErrors.flatMap((group) =>\n group.map(({message}) => message),\n )\n\n const errorLabel =\n simplifiedErrors.length > 0 ? ` ${styleText('bgRed', simplifiedErrors[0])}` : ''\n\n const remainingErrorsCount = simplifiedErrors.length - 1\n const remainingErrorsLabel =\n remainingErrorsCount > 0\n ? styleText(\n 'italic',\n ` and ${remainingErrorsCount} other ${pluralize('error', remainingErrorsCount)}`,\n )\n : ''\n\n return ` - ${label} ${styleText('dim', filename)}${errorLabel}${remainingErrorsLabel}`\n })\n .join('\\n')\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","ProjectRootNotFoundError","SanityCommand","subdebug","spinner","isAssetAspect","getMediaLibraryConfig","importAspects","promptForProject","selectMediaLibrary","deployAspects","NO_MEDIA_LIBRARY_ASPECTS_PATH","pluralize","getProjectIdFlag","deployAspectDebug","MediaDeployAspectCommand","args","aspectName","string","description","required","examples","command","flags","semantics","all","boolean","run","mediaLibraryIdFlag","error","exit","USAGE_ERROR","cliConfig","getCliConfig","err","RUNTIME_ERROR","mediaLibrary","aspectsPath","projectId","getProjectId","fallback","isUnattended","mediaLibraryId","spin","start","result","filterAspects","aspect","_id","stop","invalid","length","logToStderr","warn","formatAspectList","valid","log","deploySpin","deployResponse","aspects","map","a","succeed","count","results","message","filename","validationErrors","label","simplifiedErrors","flatMap","group","errorLabel","remainingErrorsCount","remainingErrorsLabel","join"],"mappings":"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"}
@@ -71,12 +71,12 @@ export class MediaExportCommand extends SanityCommand {
71
71
  } catch (error) {
72
72
  exportDebug('Error listing media libraries', error);
73
73
  this.error(`Failed to list media libraries:\n${error instanceof Error ? error.message : error}`, {
74
- exit: 1
74
+ exit: exitCodes.RUNTIME_ERROR
75
75
  });
76
76
  }
77
77
  if (mediaLibraries.length === 0) {
78
78
  this.error('No active media libraries found in this project', {
79
- exit: 1
79
+ exit: exitCodes.RUNTIME_ERROR
80
80
  });
81
81
  }
82
82
  let mediaLibraryId = flags['media-library-id'];
@@ -93,13 +93,13 @@ export class MediaExportCommand extends SanityCommand {
93
93
  } catch (error) {
94
94
  exportDebug('Error selecting media library', error);
95
95
  this.error(`Failed to select media library:\n${error instanceof Error ? error.message : error}`, {
96
- exit: 1
96
+ exit: exitCodes.RUNTIME_ERROR
97
97
  });
98
98
  }
99
99
  }
100
100
  if (!mediaLibraries.some((library)=>library.id === mediaLibraryId)) {
101
101
  this.error(`Media library with id "${mediaLibraryId}" not found`, {
102
- exit: 1
102
+ exit: exitCodes.RUNTIME_ERROR
103
103
  });
104
104
  }
105
105
  this.log(boxen(`Exporting from:
@@ -117,7 +117,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, {
117
117
  const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags);
118
118
  if (!outputPath) {
119
119
  this.error('Cancelled', {
120
- exit: 1
120
+ exit: exitCodes.RUNTIME_ERROR
121
121
  });
122
122
  }
123
123
  const { fail, onProgress, succeed } = this.createProgressHandler();
@@ -139,7 +139,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, {
139
139
  const err = error instanceof Error ? error : new Error(String(error));
140
140
  exportDebug('Export failed', err);
141
141
  this.error(`Export failed: ${err.message}`, {
142
- exit: 1
142
+ exit: exitCodes.RUNTIME_ERROR
143
143
  });
144
144
  }
145
145
  }
@@ -183,7 +183,7 @@ mediaLibraryId: ${mediaLibraryId.padEnd(37)}`, {
183
183
  } catch (error) {
184
184
  const err = error instanceof Error ? error : new Error(String(error));
185
185
  this.error(`Failed to create directory "${createPath}": ${err.message}`, {
186
- exit: 1
186
+ exit: exitCodes.RUNTIME_ERROR
187
187
  });
188
188
  }
189
189
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/media/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {boxen, input, spinner} from '@sanity/cli-core/ux'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('media:export')\n\nexport class MediaExportCommand extends SanityCommand<typeof MediaExportCommand> {\n static override args = {\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description = 'Export file and image assets from a media library (excludes video)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Export media library interactively',\n },\n {\n command: '<%= config.bin %> <%= command.id %> output.tar.gz',\n description: 'Export media library to output.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --media-library-id my-library-id',\n description: 'Export specific media library',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export media from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaExportCommand)\n const {destination: targetDestination} = args\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n projectId,\n requireUser: true,\n })\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n exportDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: 1})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n if (this.isUnattended()) {\n this.error('Media library ID is required. Pass it with `--media-library-id <id>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n exportDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: 1,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\nmediaLibraryId: ${mediaLibraryId.padEnd(37)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = this.isUnattended()\n ? path.join(process.cwd(), `${mediaLibraryId}-export.tar.gz`)\n : await this.promptForDestination({mediaLibraryId})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n client: projectClient,\n compress: !flags['no-compress'],\n mediaLibraryId,\n onProgress,\n outputPath,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n succeed()\n\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n mediaLibraryId: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n\n const finalPath = looksLikeFile\n ? dstPath\n : path.join(dstPath, `${mediaLibraryId}-export.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Pass \\`--overwrite\\` to replace it.`, {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {\n mediaLibraryId: string\n workDir?: string\n }): Promise<string> {\n const {mediaLibraryId, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${mediaLibraryId}-export.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","exitCodes","getProjectCliClient","SanityCommand","subdebug","boxen","input","spinner","exportDataset","prettyMs","promptForMediaLibrary","promptForProject","getMediaLibraries","absolutify","getProjectIdFlag","noop","exportDebug","MediaExportCommand","args","destination","string","description","examples","command","flags","semantics","integer","default","boolean","overwrite","run","parse","targetDestination","projectId","getProjectId","fallback","projectClient","apiVersion","requireUser","mediaLibraries","error","Error","message","exit","length","mediaLibraryId","isUnattended","USAGE_ERROR","some","library","id","log","padEnd","borderColor","borderStyle","destinationPath","join","process","cwd","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","client","compress","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","stdout","dstPath","isAbsolute","resolve","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","finalPath","finalPathStats","options","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/media/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {boxen, input, spinner} from '@sanity/cli-core/ux'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {promptForMediaLibrary} from '../../prompts/promptForMediaLibrary.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getMediaLibraries} from '../../services/mediaLibraries.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('media:export')\n\nexport class MediaExportCommand extends SanityCommand<typeof MediaExportCommand> {\n static override args = {\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description = 'Export file and image assets from a media library (excludes video)'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Export media library interactively',\n },\n {\n command: '<%= config.bin %> <%= command.id %> output.tar.gz',\n description: 'Export media library to output.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --media-library-id my-library-id',\n description: 'Export specific media library',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export media from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n 'media-library-id': Flags.string({\n description: 'The id of the target media library',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(MediaExportCommand)\n const {destination: targetDestination} = args\n\n const projectId = await this.getProjectId({fallback: () => promptForProject({})})\n\n const projectClient = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n projectId,\n requireUser: true,\n })\n\n let mediaLibraries\n try {\n mediaLibraries = await getMediaLibraries(projectId)\n } catch (error) {\n exportDebug('Error listing media libraries', error)\n this.error(\n `Failed to list media libraries:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n\n if (mediaLibraries.length === 0) {\n this.error('No active media libraries found in this project', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n let mediaLibraryId = flags['media-library-id']\n if (!mediaLibraryId) {\n if (this.isUnattended()) {\n this.error('Media library ID is required. Pass it with `--media-library-id <id>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n try {\n mediaLibraryId = await promptForMediaLibrary({mediaLibraries})\n } catch (error) {\n exportDebug('Error selecting media library', error)\n this.error(\n `Failed to select media library:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n\n if (!mediaLibraries.some((library) => library.id === mediaLibraryId)) {\n this.error(`Media library with id \"${mediaLibraryId}\" not found`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\nmediaLibraryId: ${mediaLibraryId.padEnd(37)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = this.isUnattended()\n ? path.join(process.cwd(), `${mediaLibraryId}-export.tar.gz`)\n : await this.promptForDestination({mediaLibraryId})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, mediaLibraryId, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n client: projectClient,\n compress: !flags['no-compress'],\n mediaLibraryId,\n onProgress,\n outputPath,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n succeed()\n\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n mediaLibraryId: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n const finalPath = looksLikeFile\n ? dstPath\n : path.join(dstPath, `${mediaLibraryId}-export.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Pass \\`--overwrite\\` to replace it.`, {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {\n mediaLibraryId: string\n workDir?: string\n }): Promise<string> {\n const {mediaLibraryId, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${mediaLibraryId}-export.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","exitCodes","getProjectCliClient","SanityCommand","subdebug","boxen","input","spinner","exportDataset","prettyMs","promptForMediaLibrary","promptForProject","getMediaLibraries","absolutify","getProjectIdFlag","noop","exportDebug","MediaExportCommand","args","destination","string","description","examples","command","flags","semantics","integer","default","boolean","overwrite","run","parse","targetDestination","projectId","getProjectId","fallback","projectClient","apiVersion","requireUser","mediaLibraries","error","Error","message","exit","RUNTIME_ERROR","length","mediaLibraryId","isUnattended","USAGE_ERROR","some","library","id","log","padEnd","borderColor","borderStyle","destinationPath","join","process","cwd","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","client","compress","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","stdout","dstPath","isAbsolute","resolve","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","finalPath","finalPathStats","options","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
@@ -58,12 +58,12 @@ export class MediaImportCommand extends SanityCommand {
58
58
  } catch (error) {
59
59
  importMediaDebug('Error listing media libraries', error);
60
60
  this.error(`Failed to list media libraries:\n${error instanceof Error ? error.message : error}`, {
61
- exit: 1
61
+ exit: exitCodes.RUNTIME_ERROR
62
62
  });
63
63
  }
64
64
  if (mediaLibraries.length === 0) {
65
65
  this.error('No active media libraries found in this project', {
66
- exit: 1
66
+ exit: exitCodes.RUNTIME_ERROR
67
67
  });
68
68
  }
69
69
  let mediaLibraryId = flags['media-library-id'];
@@ -80,13 +80,13 @@ export class MediaImportCommand extends SanityCommand {
80
80
  } catch (error) {
81
81
  importMediaDebug('Error selecting media library', error);
82
82
  this.error(`Failed to select media library:\n${error instanceof Error ? error.message : error}`, {
83
- exit: 1
83
+ exit: exitCodes.RUNTIME_ERROR
84
84
  });
85
85
  }
86
86
  }
87
87
  if (!mediaLibraries.some((library)=>library.id === mediaLibraryId)) {
88
88
  this.error(`Media library with id "${mediaLibraryId}" not found`, {
89
- exit: 1
89
+ exit: exitCodes.RUNTIME_ERROR
90
90
  });
91
91
  }
92
92
  const projectClient = await getProjectCliClient({
@@ -138,11 +138,11 @@ export class MediaImportCommand extends SanityCommand {
138
138
  process.once('SIGINT', ()=>{
139
139
  subscription.unsubscribe();
140
140
  spin.fail('Import interrupted.');
141
- process.exit(130);
141
+ process.exit(exitCodes.SIGINT);
142
142
  });
143
143
  }).catch((error)=>{
144
144
  this.error(styleText('red', error.message), {
145
- exit: 1
145
+ exit: exitCodes.RUNTIME_ERROR
146
146
  });
147
147
  });
148
148
  }