@sanity/cli 7.12.0 → 7.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/actions/build/buildApp.js +1 -1
  2. package/dist/actions/build/buildApp.js.map +1 -1
  3. package/dist/actions/build/buildStudio.js +1 -1
  4. package/dist/actions/build/buildStudio.js.map +1 -1
  5. package/dist/commands/backups/disable.js +4 -4
  6. package/dist/commands/backups/disable.js.map +1 -1
  7. package/dist/commands/backups/download.js +7 -7
  8. package/dist/commands/backups/download.js.map +1 -1
  9. package/dist/commands/backups/enable.js +4 -4
  10. package/dist/commands/backups/enable.js.map +1 -1
  11. package/dist/commands/backups/list.js +7 -7
  12. package/dist/commands/backups/list.js.map +1 -1
  13. package/dist/commands/codemod.js +5 -5
  14. package/dist/commands/codemod.js.map +1 -1
  15. package/dist/commands/cors/add.js +1 -1
  16. package/dist/commands/cors/add.js.map +1 -1
  17. package/dist/commands/cors/delete.js +4 -4
  18. package/dist/commands/cors/delete.js.map +1 -1
  19. package/dist/commands/cors/list.js +2 -2
  20. package/dist/commands/cors/list.js.map +1 -1
  21. package/dist/commands/datasets/alias/create.js +5 -5
  22. package/dist/commands/datasets/alias/create.js.map +1 -1
  23. package/dist/commands/datasets/alias/delete.js +2 -2
  24. package/dist/commands/datasets/alias/delete.js.map +1 -1
  25. package/dist/commands/datasets/alias/link.js +5 -5
  26. package/dist/commands/datasets/alias/link.js.map +1 -1
  27. package/dist/commands/datasets/alias/unlink.js +3 -3
  28. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  29. package/dist/commands/datasets/copy.js +7 -7
  30. package/dist/commands/datasets/copy.js.map +1 -1
  31. package/dist/commands/datasets/create.js +3 -3
  32. package/dist/commands/datasets/create.js.map +1 -1
  33. package/dist/commands/datasets/delete.js +2 -2
  34. package/dist/commands/datasets/delete.js.map +1 -1
  35. package/dist/commands/datasets/embeddings/disable.js +3 -3
  36. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  37. package/dist/commands/datasets/embeddings/enable.js +5 -5
  38. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  39. package/dist/commands/datasets/embeddings/status.js +3 -3
  40. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  41. package/dist/commands/datasets/export.js +6 -6
  42. package/dist/commands/datasets/export.js.map +1 -1
  43. package/dist/commands/datasets/import.js +3 -3
  44. package/dist/commands/datasets/import.js.map +1 -1
  45. package/dist/commands/datasets/list.js +2 -2
  46. package/dist/commands/datasets/list.js.map +1 -1
  47. package/dist/commands/datasets/visibility/get.js +2 -2
  48. package/dist/commands/datasets/visibility/get.js.map +1 -1
  49. package/dist/commands/datasets/visibility/set.js +3 -3
  50. package/dist/commands/datasets/visibility/set.js.map +1 -1
  51. package/dist/commands/deploy.js +2 -2
  52. package/dist/commands/deploy.js.map +1 -1
  53. package/dist/commands/dev.js +2 -2
  54. package/dist/commands/dev.js.map +1 -1
  55. package/dist/commands/docs/read.js +1 -1
  56. package/dist/commands/docs/read.js.map +1 -1
  57. package/dist/commands/docs/search.js +3 -3
  58. package/dist/commands/docs/search.js.map +1 -1
  59. package/dist/commands/doctor.js +3 -3
  60. package/dist/commands/doctor.js.map +1 -1
  61. package/dist/commands/documents/create.js +3 -3
  62. package/dist/commands/documents/create.js.map +1 -1
  63. package/dist/commands/documents/delete.js +3 -3
  64. package/dist/commands/documents/delete.js.map +1 -1
  65. package/dist/commands/documents/get.js +2 -2
  66. package/dist/commands/documents/get.js.map +1 -1
  67. package/dist/commands/documents/query.js +2 -2
  68. package/dist/commands/documents/query.js.map +1 -1
  69. package/dist/commands/documents/validate.js +3 -3
  70. package/dist/commands/documents/validate.js.map +1 -1
  71. package/dist/commands/graphql/deploy.js +13 -13
  72. package/dist/commands/graphql/deploy.js.map +1 -1
  73. package/dist/commands/graphql/list.js +2 -2
  74. package/dist/commands/graphql/list.js.map +1 -1
  75. package/dist/commands/graphql/undeploy.js +2 -2
  76. package/dist/commands/graphql/undeploy.js.map +1 -1
  77. package/dist/commands/hooks/attempt.js +2 -2
  78. package/dist/commands/hooks/attempt.js.map +1 -1
  79. package/dist/commands/hooks/create.js +3 -3
  80. package/dist/commands/hooks/create.js.map +1 -1
  81. package/dist/commands/hooks/delete.js +4 -4
  82. package/dist/commands/hooks/delete.js.map +1 -1
  83. package/dist/commands/hooks/list.js +2 -2
  84. package/dist/commands/hooks/list.js.map +1 -1
  85. package/dist/commands/hooks/logs.js +5 -5
  86. package/dist/commands/hooks/logs.js.map +1 -1
  87. package/dist/commands/login.js +2 -2
  88. package/dist/commands/login.js.map +1 -1
  89. package/dist/commands/logout.js +2 -2
  90. package/dist/commands/logout.js.map +1 -1
  91. package/dist/commands/manifest/extract.js +3 -3
  92. package/dist/commands/manifest/extract.js.map +1 -1
  93. package/dist/commands/mcp/configure.js +4 -4
  94. package/dist/commands/mcp/configure.js.map +1 -1
  95. package/dist/commands/media/create-aspect.js +3 -3
  96. package/dist/commands/media/create-aspect.js.map +1 -1
  97. package/dist/commands/media/delete-aspect.js +1 -1
  98. package/dist/commands/media/delete-aspect.js.map +1 -1
  99. package/dist/commands/media/deploy-aspect.js +4 -4
  100. package/dist/commands/media/deploy-aspect.js.map +1 -1
  101. package/dist/commands/media/export.js +7 -7
  102. package/dist/commands/media/export.js.map +1 -1
  103. package/dist/commands/media/import.js +6 -6
  104. package/dist/commands/media/import.js.map +1 -1
  105. package/dist/commands/migrations/create.js +4 -4
  106. package/dist/commands/migrations/create.js.map +1 -1
  107. package/dist/commands/migrations/list.js +2 -2
  108. package/dist/commands/migrations/list.js.map +1 -1
  109. package/dist/commands/migrations/run.js +14 -14
  110. package/dist/commands/migrations/run.js.map +1 -1
  111. package/dist/commands/openapi/get.js +3 -3
  112. package/dist/commands/openapi/get.js.map +1 -1
  113. package/dist/commands/openapi/list.js +2 -2
  114. package/dist/commands/openapi/list.js.map +1 -1
  115. package/dist/commands/organizations/create.js +5 -5
  116. package/dist/commands/organizations/create.js.map +1 -1
  117. package/dist/commands/organizations/delete.js +6 -6
  118. package/dist/commands/organizations/delete.js.map +1 -1
  119. package/dist/commands/organizations/get.js +3 -3
  120. package/dist/commands/organizations/get.js.map +1 -1
  121. package/dist/commands/organizations/list.js +2 -2
  122. package/dist/commands/organizations/list.js.map +1 -1
  123. package/dist/commands/organizations/update.js +6 -6
  124. package/dist/commands/organizations/update.js.map +1 -1
  125. package/dist/commands/preview.js +2 -2
  126. package/dist/commands/preview.js.map +1 -1
  127. package/dist/commands/projects/create.js +2 -2
  128. package/dist/commands/projects/create.js.map +1 -1
  129. package/dist/commands/projects/list.js +2 -2
  130. package/dist/commands/projects/list.js.map +1 -1
  131. package/dist/commands/schemas/delete.js +2 -2
  132. package/dist/commands/schemas/delete.js.map +1 -1
  133. package/dist/commands/schemas/deploy.js +2 -2
  134. package/dist/commands/schemas/deploy.js.map +1 -1
  135. package/dist/commands/schemas/list.js +1 -1
  136. package/dist/commands/schemas/list.js.map +1 -1
  137. package/dist/commands/schemas/validate.js +2 -1
  138. package/dist/commands/schemas/validate.js.map +1 -1
  139. package/dist/commands/skills/install.js +2 -2
  140. package/dist/commands/skills/install.js.map +1 -1
  141. package/dist/commands/telemetry/disable.js +2 -2
  142. package/dist/commands/telemetry/disable.js.map +1 -1
  143. package/dist/commands/telemetry/enable.js +2 -2
  144. package/dist/commands/telemetry/enable.js.map +1 -1
  145. package/dist/commands/tokens/create.js +2 -2
  146. package/dist/commands/tokens/create.js.map +1 -1
  147. package/dist/commands/tokens/delete.js +2 -2
  148. package/dist/commands/tokens/delete.js.map +1 -1
  149. package/dist/commands/tokens/list.js +2 -2
  150. package/dist/commands/tokens/list.js.map +1 -1
  151. package/dist/commands/users/invite.js +3 -3
  152. package/dist/commands/users/invite.js.map +1 -1
  153. package/oclif.manifest.json +512 -512
  154. package/package.json +6 -6
@@ -1,5 +1,5 @@
1
1
  import { Flags } from '@oclif/core';
2
- import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import open from 'open';
4
4
  const listOpenapiDebug = subdebug('openapi:list');
5
5
  export class ListOpenApiCommand extends SanityCommand {
@@ -42,7 +42,7 @@ export class ListOpenApiCommand extends SanityCommand {
42
42
  } catch (error) {
43
43
  listOpenapiDebug('Error fetching OpenAPI specs', error);
44
44
  this.error('The OpenAPI service is currently unavailable. Please try again later.', {
45
- exit: 1
45
+ exit: exitCodes.RUNTIME_ERROR
46
46
  });
47
47
  }
48
48
  if (json) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/openapi/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\ninterface OpenAPISpec {\n description: string\n slug: string\n title: string\n}\n\nconst listOpenapiDebug = subdebug('openapi:list')\n\nexport class ListOpenApiCommand extends SanityCommand<typeof ListOpenApiCommand> {\n static override description = 'List all available OpenAPI specifications'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all available OpenAPI specs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json',\n description: 'List with JSON output',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --web',\n description: 'Open HTTP Reference in browser',\n },\n ]\n\n static override flags = {\n json: Flags.boolean({\n description: 'Output JSON',\n }),\n web: Flags.boolean({\n char: 'w',\n description: 'Open HTTP Reference in web browser',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ListOpenApiCommand)\n const {json, web} = flags\n\n if (web) {\n const url = 'https://www.sanity.io/docs/http-reference'\n this.log(`Opening ${url}`)\n await open(url)\n return\n }\n\n let specs: OpenAPISpec[]\n try {\n specs = await this.getSpecs()\n } catch (error) {\n listOpenapiDebug('Error fetching OpenAPI specs', error)\n\n this.error('The OpenAPI service is currently unavailable. Please try again later.', {\n exit: 1,\n })\n }\n\n if (json) {\n this.log(JSON.stringify(specs, null, 2))\n return\n }\n\n if (specs.length === 0) {\n this.log('No OpenAPI specifications available.')\n return\n }\n\n // Human-readable table format\n this.log(`\\nFound ${specs.length} OpenAPI specification(s):\\n`)\n\n for (const spec of specs) {\n this.log(`Title: ${spec.title}`)\n this.log(`Slug: ${spec.slug}`)\n if (spec.description) {\n this.log(`Description: ${spec.description}`)\n }\n this.log('')\n }\n\n this.log(`Use 'sanity openapi get <slug>' to retrieve a specific specification.`)\n }\n\n private async getSpecs(): Promise<OpenAPISpec[]> {\n const response = await fetch('https://www.sanity.io/docs/api/openapi', {\n signal: AbortSignal.timeout(10_000),\n })\n\n if (response.ok) {\n const data = await response.json()\n return Array.isArray(data?.specs) ? data.specs : []\n }\n\n throw response\n }\n}\n"],"names":["Flags","SanityCommand","subdebug","open","listOpenapiDebug","ListOpenApiCommand","description","examples","command","flags","json","boolean","web","char","run","parse","url","log","specs","getSpecs","error","exit","JSON","stringify","length","spec","title","slug","response","fetch","signal","AbortSignal","timeout","ok","data","Array","isArray"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,OAAOC,UAAU,OAAM;AAQvB,MAAMC,mBAAmBF,SAAS;AAElC,OAAO,MAAMG,2BAA2BJ;IACtC,OAAgBK,cAAc,4CAA2C;IAEzE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,MAAMV,MAAMW,OAAO,CAAC;YAClBL,aAAa;QACf;QACAM,KAAKZ,MAAMW,OAAO,CAAC;YACjBE,MAAM;YACNP,aAAa;QACf;IACF,EAAC;IAED,MAAaQ,MAAqB;QAChC,MAAM,EAACL,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACV;QACjC,MAAM,EAACK,IAAI,EAAEE,GAAG,EAAC,GAAGH;QAEpB,IAAIG,KAAK;YACP,MAAMI,MAAM;YACZ,IAAI,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAED,KAAK;YACzB,MAAMb,KAAKa;YACX;QACF;QAEA,IAAIE;QACJ,IAAI;YACFA,QAAQ,MAAM,IAAI,CAACC,QAAQ;QAC7B,EAAE,OAAOC,OAAO;YACdhB,iBAAiB,gCAAgCgB;YAEjD,IAAI,CAACA,KAAK,CAAC,yEAAyE;gBAClFC,MAAM;YACR;QACF;QAEA,IAAIX,MAAM;YACR,IAAI,CAACO,GAAG,CAACK,KAAKC,SAAS,CAACL,OAAO,MAAM;YACrC;QACF;QAEA,IAAIA,MAAMM,MAAM,KAAK,GAAG;YACtB,IAAI,CAACP,GAAG,CAAC;YACT;QACF;QAEA,8BAA8B;QAC9B,IAAI,CAACA,GAAG,CAAC,CAAC,QAAQ,EAAEC,MAAMM,MAAM,CAAC,4BAA4B,CAAC;QAE9D,KAAK,MAAMC,QAAQP,MAAO;YACxB,IAAI,CAACD,GAAG,CAAC,CAAC,OAAO,EAAEQ,KAAKC,KAAK,EAAE;YAC/B,IAAI,CAACT,GAAG,CAAC,CAAC,MAAM,EAAEQ,KAAKE,IAAI,EAAE;YAC7B,IAAIF,KAAKnB,WAAW,EAAE;gBACpB,IAAI,CAACW,GAAG,CAAC,CAAC,aAAa,EAAEQ,KAAKnB,WAAW,EAAE;YAC7C;YACA,IAAI,CAACW,GAAG,CAAC;QACX;QAEA,IAAI,CAACA,GAAG,CAAC,CAAC,qEAAqE,CAAC;IAClF;IAEA,MAAcE,WAAmC;QAC/C,MAAMS,WAAW,MAAMC,MAAM,0CAA0C;YACrEC,QAAQC,YAAYC,OAAO,CAAC;QAC9B;QAEA,IAAIJ,SAASK,EAAE,EAAE;YACf,MAAMC,OAAO,MAAMN,SAASlB,IAAI;YAChC,OAAOyB,MAAMC,OAAO,CAACF,MAAMhB,SAASgB,KAAKhB,KAAK,GAAG,EAAE;QACrD;QAEA,MAAMU;IACR;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/openapi/list.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport open from 'open'\n\ninterface OpenAPISpec {\n description: string\n slug: string\n title: string\n}\n\nconst listOpenapiDebug = subdebug('openapi:list')\n\nexport class ListOpenApiCommand extends SanityCommand<typeof ListOpenApiCommand> {\n static override description = 'List all available OpenAPI specifications'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all available OpenAPI specs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --json',\n description: 'List with JSON output',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --web',\n description: 'Open HTTP Reference in browser',\n },\n ]\n\n static override flags = {\n json: Flags.boolean({\n description: 'Output JSON',\n }),\n web: Flags.boolean({\n char: 'w',\n description: 'Open HTTP Reference in web browser',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(ListOpenApiCommand)\n const {json, web} = flags\n\n if (web) {\n const url = 'https://www.sanity.io/docs/http-reference'\n this.log(`Opening ${url}`)\n await open(url)\n return\n }\n\n let specs: OpenAPISpec[]\n try {\n specs = await this.getSpecs()\n } catch (error) {\n listOpenapiDebug('Error fetching OpenAPI specs', error)\n\n this.error('The OpenAPI service is currently unavailable. Please try again later.', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (json) {\n this.log(JSON.stringify(specs, null, 2))\n return\n }\n\n if (specs.length === 0) {\n this.log('No OpenAPI specifications available.')\n return\n }\n\n // Human-readable table format\n this.log(`\\nFound ${specs.length} OpenAPI specification(s):\\n`)\n\n for (const spec of specs) {\n this.log(`Title: ${spec.title}`)\n this.log(`Slug: ${spec.slug}`)\n if (spec.description) {\n this.log(`Description: ${spec.description}`)\n }\n this.log('')\n }\n\n this.log(`Use 'sanity openapi get <slug>' to retrieve a specific specification.`)\n }\n\n private async getSpecs(): Promise<OpenAPISpec[]> {\n const response = await fetch('https://www.sanity.io/docs/api/openapi', {\n signal: AbortSignal.timeout(10_000),\n })\n\n if (response.ok) {\n const data = await response.json()\n return Array.isArray(data?.specs) ? data.specs : []\n }\n\n throw response\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","open","listOpenapiDebug","ListOpenApiCommand","description","examples","command","flags","json","boolean","web","char","run","parse","url","log","specs","getSpecs","error","exit","RUNTIME_ERROR","JSON","stringify","length","spec","title","slug","response","fetch","signal","AbortSignal","timeout","ok","data","Array","isArray"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,OAAOC,UAAU,OAAM;AAQvB,MAAMC,mBAAmBF,SAAS;AAElC,OAAO,MAAMG,2BAA2BJ;IACtC,OAAgBK,cAAc,4CAA2C;IAEzE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,MAAMX,MAAMY,OAAO,CAAC;YAClBL,aAAa;QACf;QACAM,KAAKb,MAAMY,OAAO,CAAC;YACjBE,MAAM;YACNP,aAAa;QACf;IACF,EAAC;IAED,MAAaQ,MAAqB;QAChC,MAAM,EAACL,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACV;QACjC,MAAM,EAACK,IAAI,EAAEE,GAAG,EAAC,GAAGH;QAEpB,IAAIG,KAAK;YACP,MAAMI,MAAM;YACZ,IAAI,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAED,KAAK;YACzB,MAAMb,KAAKa;YACX;QACF;QAEA,IAAIE;QACJ,IAAI;YACFA,QAAQ,MAAM,IAAI,CAACC,QAAQ;QAC7B,EAAE,OAAOC,OAAO;YACdhB,iBAAiB,gCAAgCgB;YAEjD,IAAI,CAACA,KAAK,CAAC,yEAAyE;gBAClFC,MAAMrB,UAAUsB,aAAa;YAC/B;QACF;QAEA,IAAIZ,MAAM;YACR,IAAI,CAACO,GAAG,CAACM,KAAKC,SAAS,CAACN,OAAO,MAAM;YACrC;QACF;QAEA,IAAIA,MAAMO,MAAM,KAAK,GAAG;YACtB,IAAI,CAACR,GAAG,CAAC;YACT;QACF;QAEA,8BAA8B;QAC9B,IAAI,CAACA,GAAG,CAAC,CAAC,QAAQ,EAAEC,MAAMO,MAAM,CAAC,4BAA4B,CAAC;QAE9D,KAAK,MAAMC,QAAQR,MAAO;YACxB,IAAI,CAACD,GAAG,CAAC,CAAC,OAAO,EAAES,KAAKC,KAAK,EAAE;YAC/B,IAAI,CAACV,GAAG,CAAC,CAAC,MAAM,EAAES,KAAKE,IAAI,EAAE;YAC7B,IAAIF,KAAKpB,WAAW,EAAE;gBACpB,IAAI,CAACW,GAAG,CAAC,CAAC,aAAa,EAAES,KAAKpB,WAAW,EAAE;YAC7C;YACA,IAAI,CAACW,GAAG,CAAC;QACX;QAEA,IAAI,CAACA,GAAG,CAAC,CAAC,qEAAqE,CAAC;IAClF;IAEA,MAAcE,WAAmC;QAC/C,MAAMU,WAAW,MAAMC,MAAM,0CAA0C;YACrEC,QAAQC,YAAYC,OAAO,CAAC;QAC9B;QAEA,IAAIJ,SAASK,EAAE,EAAE;YACf,MAAMC,OAAO,MAAMN,SAASnB,IAAI;YAChC,OAAO0B,MAAMC,OAAO,CAACF,MAAMjB,SAASiB,KAAKjB,KAAK,GAAG,EAAE;QACrD;QAEA,MAAMW;IACR;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { Flags } from '@oclif/core';
2
- import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { getErrorMessage } from '@sanity/cli-core/errors';
4
4
  import { spinner } from '@sanity/cli-core/ux';
5
5
  import { validateOrganizationName } from '../../actions/organizations/validateOrganizationName.js';
@@ -39,14 +39,14 @@ export class CreateOrganizationCommand extends SanityCommand {
39
39
  const defaultRole = defaultRoleFlag?.trim();
40
40
  if (defaultRole === '') {
41
41
  this.error('Default role cannot be empty', {
42
- exit: 1
42
+ exit: exitCodes.RUNTIME_ERROR
43
43
  });
44
44
  }
45
45
  let name;
46
46
  if (nameFlag === undefined) {
47
47
  if (this.isUnattended()) {
48
48
  this.error('Organization name is required. Provide it with the --name flag.', {
49
- exit: 1
49
+ exit: exitCodes.RUNTIME_ERROR
50
50
  });
51
51
  }
52
52
  name = await promptForOrganizationName();
@@ -55,7 +55,7 @@ export class CreateOrganizationCommand extends SanityCommand {
55
55
  const validation = validateOrganizationName(trimmedName);
56
56
  if (validation !== true) {
57
57
  this.error(validation, {
58
- exit: 1
58
+ exit: exitCodes.RUNTIME_ERROR
59
59
  });
60
60
  }
61
61
  name = trimmedName;
@@ -70,7 +70,7 @@ export class CreateOrganizationCommand extends SanityCommand {
70
70
  spin.fail();
71
71
  createOrgDebug('Error creating organization', error);
72
72
  this.error(`Failed to create organization: ${getErrorMessage(error)}`, {
73
- exit: 1
73
+ exit: exitCodes.RUNTIME_ERROR
74
74
  });
75
75
  }
76
76
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/organizations/create.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {validateOrganizationName} from '../../actions/organizations/validateOrganizationName.js'\nimport {promptForOrganizationName} from '../../prompts/promptForOrganizationName.js'\nimport {createOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst createOrgDebug = subdebug('organizations:create')\n\nexport class CreateOrganizationCommand extends SanityCommand<typeof CreateOrganizationCommand> {\n static override description = 'Create a new organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --name \"Acme Corp\"',\n description: 'Create an organization named \"Acme Corp\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --name \"Acme Corp\" --default-role member',\n description: 'Create an organization with a default member role',\n },\n ]\n\n static override flags = {\n 'default-role': Flags.string({\n description: 'Default role assigned to new members',\n required: false,\n }),\n name: Flags.string({\n description: 'Organization name',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('create')\n\n public async run(): Promise<void> {\n const {'default-role': defaultRoleFlag, name: nameFlag} = this.flags\n\n const defaultRole = defaultRoleFlag?.trim()\n if (defaultRole === '') {\n this.error('Default role cannot be empty', {exit: 1})\n }\n\n let name: string\n if (nameFlag === undefined) {\n if (this.isUnattended()) {\n this.error('Organization name is required. Provide it with the --name flag.', {exit: 1})\n }\n name = await promptForOrganizationName()\n } else {\n const trimmedName = nameFlag.trim()\n const validation = validateOrganizationName(trimmedName)\n if (validation !== true) {\n this.error(validation, {exit: 1})\n }\n name = trimmedName\n }\n\n const spin = spinner('Creating organization').start()\n try {\n const org = await createOrganization(name, defaultRole)\n spin.succeed('Organization created')\n this.log(`ID: ${org.id}`)\n this.log(`Name: ${org.name}`)\n } catch (error) {\n spin.fail()\n createOrgDebug('Error creating organization', error)\n this.error(`Failed to create organization: ${getErrorMessage(error)}`, {\n exit: 1,\n })\n }\n }\n}\n"],"names":["Flags","SanityCommand","subdebug","getErrorMessage","spinner","validateOrganizationName","promptForOrganizationName","createOrganization","organizationAliases","createOrgDebug","CreateOrganizationCommand","description","examples","command","flags","string","required","name","hiddenAliases","run","defaultRoleFlag","nameFlag","defaultRole","trim","error","exit","undefined","isUnattended","trimmedName","validation","spin","start","org","succeed","log","id","fail"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AAEjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,wBAAwB,QAAO,0DAAyD;AAChG,SAAQC,yBAAyB,QAAO,6CAA4C;AACpF,SAAQC,kBAAkB,QAAO,kCAAiC;AAClE,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,iBAAiBP,SAAS;AAEhC,OAAO,MAAMQ,kCAAkCT;IAC7C,OAAgBU,cAAc,4BAA2B;IAEzD,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,gBAAgBd,MAAMe,MAAM,CAAC;YAC3BJ,aAAa;YACbK,UAAU;QACZ;QACAC,MAAMjB,MAAMe,MAAM,CAAC;YACjBJ,aAAa;YACbK,UAAU;QACZ;IACF,EAAqB;IAErB,OAAgBE,gBAAgBV,oBAAoB,UAAS;IAE7D,MAAaW,MAAqB;QAChC,MAAM,EAAC,gBAAgBC,eAAe,EAAEH,MAAMI,QAAQ,EAAC,GAAG,IAAI,CAACP,KAAK;QAEpE,MAAMQ,cAAcF,iBAAiBG;QACrC,IAAID,gBAAgB,IAAI;YACtB,IAAI,CAACE,KAAK,CAAC,gCAAgC;gBAACC,MAAM;YAAC;QACrD;QAEA,IAAIR;QACJ,IAAII,aAAaK,WAAW;YAC1B,IAAI,IAAI,CAACC,YAAY,IAAI;gBACvB,IAAI,CAACH,KAAK,CAAC,mEAAmE;oBAACC,MAAM;gBAAC;YACxF;YACAR,OAAO,MAAMX;QACf,OAAO;YACL,MAAMsB,cAAcP,SAASE,IAAI;YACjC,MAAMM,aAAaxB,yBAAyBuB;YAC5C,IAAIC,eAAe,MAAM;gBACvB,IAAI,CAACL,KAAK,CAACK,YAAY;oBAACJ,MAAM;gBAAC;YACjC;YACAR,OAAOW;QACT;QAEA,MAAME,OAAO1B,QAAQ,yBAAyB2B,KAAK;QACnD,IAAI;YACF,MAAMC,MAAM,MAAMzB,mBAAmBU,MAAMK;YAC3CQ,KAAKG,OAAO,CAAC;YACb,IAAI,CAACC,GAAG,CAAC,CAAC,MAAM,EAAEF,IAAIG,EAAE,EAAE;YAC1B,IAAI,CAACD,GAAG,CAAC,CAAC,MAAM,EAAEF,IAAIf,IAAI,EAAE;QAC9B,EAAE,OAAOO,OAAO;YACdM,KAAKM,IAAI;YACT3B,eAAe,+BAA+Be;YAC9C,IAAI,CAACA,KAAK,CAAC,CAAC,+BAA+B,EAAErB,gBAAgBqB,QAAQ,EAAE;gBACrEC,MAAM;YACR;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/organizations/create.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {validateOrganizationName} from '../../actions/organizations/validateOrganizationName.js'\nimport {promptForOrganizationName} from '../../prompts/promptForOrganizationName.js'\nimport {createOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst createOrgDebug = subdebug('organizations:create')\n\nexport class CreateOrganizationCommand extends SanityCommand<typeof CreateOrganizationCommand> {\n static override description = 'Create a new organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --name \"Acme Corp\"',\n description: 'Create an organization named \"Acme Corp\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --name \"Acme Corp\" --default-role member',\n description: 'Create an organization with a default member role',\n },\n ]\n\n static override flags = {\n 'default-role': Flags.string({\n description: 'Default role assigned to new members',\n required: false,\n }),\n name: Flags.string({\n description: 'Organization name',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('create')\n\n public async run(): Promise<void> {\n const {'default-role': defaultRoleFlag, name: nameFlag} = this.flags\n\n const defaultRole = defaultRoleFlag?.trim()\n if (defaultRole === '') {\n this.error('Default role cannot be empty', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n let name: string\n if (nameFlag === undefined) {\n if (this.isUnattended()) {\n this.error('Organization name is required. Provide it with the --name flag.', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n name = await promptForOrganizationName()\n } else {\n const trimmedName = nameFlag.trim()\n const validation = validateOrganizationName(trimmedName)\n if (validation !== true) {\n this.error(validation, {exit: exitCodes.RUNTIME_ERROR})\n }\n name = trimmedName\n }\n\n const spin = spinner('Creating organization').start()\n try {\n const org = await createOrganization(name, defaultRole)\n spin.succeed('Organization created')\n this.log(`ID: ${org.id}`)\n this.log(`Name: ${org.name}`)\n } catch (error) {\n spin.fail()\n createOrgDebug('Error creating organization', error)\n this.error(`Failed to create organization: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","spinner","validateOrganizationName","promptForOrganizationName","createOrganization","organizationAliases","createOrgDebug","CreateOrganizationCommand","description","examples","command","flags","string","required","name","hiddenAliases","run","defaultRoleFlag","nameFlag","defaultRole","trim","error","exit","RUNTIME_ERROR","undefined","isUnattended","trimmedName","validation","spin","start","org","succeed","log","id","fail"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AAEjC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,wBAAwB,QAAO,0DAAyD;AAChG,SAAQC,yBAAyB,QAAO,6CAA4C;AACpF,SAAQC,kBAAkB,QAAO,kCAAiC;AAClE,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,iBAAiBP,SAAS;AAEhC,OAAO,MAAMQ,kCAAkCT;IAC7C,OAAgBU,cAAc,4BAA2B;IAEzD,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,gBAAgBf,MAAMgB,MAAM,CAAC;YAC3BJ,aAAa;YACbK,UAAU;QACZ;QACAC,MAAMlB,MAAMgB,MAAM,CAAC;YACjBJ,aAAa;YACbK,UAAU;QACZ;IACF,EAAqB;IAErB,OAAgBE,gBAAgBV,oBAAoB,UAAS;IAE7D,MAAaW,MAAqB;QAChC,MAAM,EAAC,gBAAgBC,eAAe,EAAEH,MAAMI,QAAQ,EAAC,GAAG,IAAI,CAACP,KAAK;QAEpE,MAAMQ,cAAcF,iBAAiBG;QACrC,IAAID,gBAAgB,IAAI;YACtB,IAAI,CAACE,KAAK,CAAC,gCAAgC;gBAACC,MAAMzB,UAAU0B,aAAa;YAAA;QAC3E;QAEA,IAAIT;QACJ,IAAII,aAAaM,WAAW;YAC1B,IAAI,IAAI,CAACC,YAAY,IAAI;gBACvB,IAAI,CAACJ,KAAK,CAAC,mEAAmE;oBAC5EC,MAAMzB,UAAU0B,aAAa;gBAC/B;YACF;YACAT,OAAO,MAAMX;QACf,OAAO;YACL,MAAMuB,cAAcR,SAASE,IAAI;YACjC,MAAMO,aAAazB,yBAAyBwB;YAC5C,IAAIC,eAAe,MAAM;gBACvB,IAAI,CAACN,KAAK,CAACM,YAAY;oBAACL,MAAMzB,UAAU0B,aAAa;gBAAA;YACvD;YACAT,OAAOY;QACT;QAEA,MAAME,OAAO3B,QAAQ,yBAAyB4B,KAAK;QACnD,IAAI;YACF,MAAMC,MAAM,MAAM1B,mBAAmBU,MAAMK;YAC3CS,KAAKG,OAAO,CAAC;YACb,IAAI,CAACC,GAAG,CAAC,CAAC,MAAM,EAAEF,IAAIG,EAAE,EAAE;YAC1B,IAAI,CAACD,GAAG,CAAC,CAAC,MAAM,EAAEF,IAAIhB,IAAI,EAAE;QAC9B,EAAE,OAAOO,OAAO;YACdO,KAAKM,IAAI;YACT5B,eAAe,+BAA+Be;YAC9C,IAAI,CAACA,KAAK,CAAC,CAAC,+BAA+B,EAAErB,gBAAgBqB,QAAQ,EAAE;gBACrEC,MAAMzB,UAAU0B,aAAa;YAC/B;QACF;IACF;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { Args, Flags } from '@oclif/core';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
4
4
  import { getErrorMessage } from '@sanity/cli-core/errors';
5
5
  import { input, logSymbols, spinner } from '@sanity/cli-core/ux';
6
6
  import { isHttpError } from '@sanity/client';
@@ -50,11 +50,11 @@ export class DeleteOrganizationCommand extends SanityCommand {
50
50
  deleteOrgDebug('Error deleting organization', error);
51
51
  if (isHttpError(error) && error.statusCode === 404) {
52
52
  this.error(`Organization "${organizationId}" not found`, {
53
- exit: 1
53
+ exit: exitCodes.RUNTIME_ERROR
54
54
  });
55
55
  }
56
56
  this.error(`Failed to delete organization: ${getErrorMessage(error)}`, {
57
- exit: 1
57
+ exit: exitCodes.RUNTIME_ERROR
58
58
  });
59
59
  }
60
60
  }
@@ -68,11 +68,11 @@ export class DeleteOrganizationCommand extends SanityCommand {
68
68
  deleteOrgDebug(`Error getting organization ${organizationId}`, err);
69
69
  if (isHttpError(error) && error.statusCode === 404) {
70
70
  this.error(`Organization "${organizationId}" not found`, {
71
- exit: 1
71
+ exit: exitCodes.RUNTIME_ERROR
72
72
  });
73
73
  }
74
74
  this.error(`Organization retrieval failed: ${err.message}`, {
75
- exit: 1
75
+ exit: exitCodes.RUNTIME_ERROR
76
76
  });
77
77
  }
78
78
  this.log(styleText('yellow', `${logSymbols.warning} Deleting organization "${styleText([
@@ -91,7 +91,7 @@ export class DeleteOrganizationCommand extends SanityCommand {
91
91
  const err = error instanceof Error ? error : new Error(`${error}`);
92
92
  deleteOrgDebug(`User cancelled`, err);
93
93
  this.error(`User cancelled`, {
94
- exit: 1
94
+ exit: exitCodes.RUNTIME_ERROR
95
95
  });
96
96
  }
97
97
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/organizations/delete.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {input, logSymbols, spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\n\nimport {deleteOrganization, getOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst deleteOrgDebug = subdebug('organizations:delete')\n\nexport class DeleteOrganizationCommand extends SanityCommand<typeof DeleteOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123',\n description: 'Delete an organization (prompts for confirmation)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --force',\n description: 'Delete an organization without confirmation',\n },\n ]\n\n static override flags = {\n force: Flags.boolean({\n description: 'Do not prompt for delete confirmation - forcefully delete',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('delete')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n const {force} = this.flags\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, deleting organization \"${organizationId}\"`)\n } else {\n await this.confirmDeletion(organizationId)\n }\n\n const spin = spinner('Deleting organization').start()\n try {\n await deleteOrganization(organizationId)\n spin.succeed()\n this.log('Organization deleted')\n } catch (error) {\n spin.fail()\n deleteOrgDebug('Error deleting organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: 1})\n }\n this.error(`Failed to delete organization: ${getErrorMessage(error)}`, {exit: 1})\n }\n }\n\n private async confirmDeletion(organizationId: string): Promise<void> {\n let orgName: string\n try {\n const org = await getOrganization(organizationId)\n orgName = org.name\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteOrgDebug(`Error getting organization ${organizationId}`, err)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: 1})\n }\n this.error(`Organization retrieval failed: ${err.message}`, {exit: 1})\n }\n\n this.log(\n styleText(\n 'yellow',\n `${logSymbols.warning} Deleting organization \"${styleText(['bold', 'underline'], orgName)}\"\\n`,\n ),\n )\n\n try {\n await input({\n message:\n 'Are you ABSOLUTELY sure you want to delete this organization?\\n Type the name of the organization to confirm delete:',\n validate: (value) => {\n const trimmed = value.trim().toLowerCase()\n return (\n trimmed === orgName.trim().toLowerCase() ||\n 'Incorrect organization name. Ctrl + C to cancel delete.'\n )\n },\n })\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteOrgDebug(`User cancelled`, err)\n this.error(`User cancelled`, {exit: 1})\n }\n }\n}\n"],"names":["styleText","Args","Flags","SanityCommand","subdebug","getErrorMessage","input","logSymbols","spinner","isHttpError","deleteOrganization","getOrganization","organizationAliases","deleteOrgDebug","DeleteOrganizationCommand","args","organizationId","string","description","required","examples","command","flags","force","boolean","hiddenAliases","run","warn","confirmDeletion","spin","start","succeed","log","error","fail","statusCode","exit","orgName","org","name","err","Error","message","warning","validate","value","trimmed","trim","toLowerCase"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AAEvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,KAAK,EAAEC,UAAU,EAAEC,OAAO,QAAO,sBAAqB;AAC9D,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,kBAAkB,EAAEC,eAAe,QAAO,kCAAiC;AACnF,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,iBAAiBT,SAAS;AAEhC,OAAO,MAAMU,kCAAkCX;IAC7C,OAAgBY,OAAO;QACrBC,gBAAgBf,KAAKgB,MAAM,CAAC;YAC1BC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,yBAAwB;IAEtD,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,OAAOrB,MAAMsB,OAAO,CAAC;YACnBN,aAAa;YACbC,UAAU;QACZ;IACF,EAAqB;IAErB,OAAgBM,gBAAgBb,oBAAoB,UAAS;IAE7D,MAAac,MAAqB;QAChC,MAAM,EAACV,cAAc,EAAC,GAAG,IAAI,CAACD,IAAI;QAClC,MAAM,EAACQ,KAAK,EAAC,GAAG,IAAI,CAACD,KAAK;QAE1B,IAAIC,OAAO;YACT,IAAI,CAACI,IAAI,CAAC,CAAC,8DAA8D,EAAEX,eAAe,CAAC,CAAC;QAC9F,OAAO;YACL,MAAM,IAAI,CAACY,eAAe,CAACZ;QAC7B;QAEA,MAAMa,OAAOrB,QAAQ,yBAAyBsB,KAAK;QACnD,IAAI;YACF,MAAMpB,mBAAmBM;YACzBa,KAAKE,OAAO;YACZ,IAAI,CAACC,GAAG,CAAC;QACX,EAAE,OAAOC,OAAO;YACdJ,KAAKK,IAAI;YACTrB,eAAe,+BAA+BoB;YAC9C,IAAIxB,YAAYwB,UAAUA,MAAME,UAAU,KAAK,KAAK;gBAClD,IAAI,CAACF,KAAK,CAAC,CAAC,cAAc,EAAEjB,eAAe,WAAW,CAAC,EAAE;oBAACoB,MAAM;gBAAC;YACnE;YACA,IAAI,CAACH,KAAK,CAAC,CAAC,+BAA+B,EAAE5B,gBAAgB4B,QAAQ,EAAE;gBAACG,MAAM;YAAC;QACjF;IACF;IAEA,MAAcR,gBAAgBZ,cAAsB,EAAiB;QACnE,IAAIqB;QACJ,IAAI;YACF,MAAMC,MAAM,MAAM3B,gBAAgBK;YAClCqB,UAAUC,IAAIC,IAAI;QACpB,EAAE,OAAON,OAAO;YACd,MAAMO,MAAMP,iBAAiBQ,QAAQR,QAAQ,IAAIQ,MAAM,GAAGR,OAAO;YACjEpB,eAAe,CAAC,2BAA2B,EAAEG,gBAAgB,EAAEwB;YAC/D,IAAI/B,YAAYwB,UAAUA,MAAME,UAAU,KAAK,KAAK;gBAClD,IAAI,CAACF,KAAK,CAAC,CAAC,cAAc,EAAEjB,eAAe,WAAW,CAAC,EAAE;oBAACoB,MAAM;gBAAC;YACnE;YACA,IAAI,CAACH,KAAK,CAAC,CAAC,+BAA+B,EAAEO,IAAIE,OAAO,EAAE,EAAE;gBAACN,MAAM;YAAC;QACtE;QAEA,IAAI,CAACJ,GAAG,CACNhC,UACE,UACA,GAAGO,WAAWoC,OAAO,CAAC,wBAAwB,EAAE3C,UAAU;YAAC;YAAQ;SAAY,EAAEqC,SAAS,GAAG,CAAC;QAIlG,IAAI;YACF,MAAM/B,MAAM;gBACVoC,SACE;gBACFE,UAAU,CAACC;oBACT,MAAMC,UAAUD,MAAME,IAAI,GAAGC,WAAW;oBACxC,OACEF,YAAYT,QAAQU,IAAI,GAAGC,WAAW,MACtC;gBAEJ;YACF;QACF,EAAE,OAAOf,OAAO;YACd,MAAMO,MAAMP,iBAAiBQ,QAAQR,QAAQ,IAAIQ,MAAM,GAAGR,OAAO;YACjEpB,eAAe,CAAC,cAAc,CAAC,EAAE2B;YACjC,IAAI,CAACP,KAAK,CAAC,CAAC,cAAc,CAAC,EAAE;gBAACG,MAAM;YAAC;QACvC;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/organizations/delete.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {input, logSymbols, spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\n\nimport {deleteOrganization, getOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst deleteOrgDebug = subdebug('organizations:delete')\n\nexport class DeleteOrganizationCommand extends SanityCommand<typeof DeleteOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123',\n description: 'Delete an organization (prompts for confirmation)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --force',\n description: 'Delete an organization without confirmation',\n },\n ]\n\n static override flags = {\n force: Flags.boolean({\n description: 'Do not prompt for delete confirmation - forcefully delete',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('delete')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n const {force} = this.flags\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, deleting organization \"${organizationId}\"`)\n } else {\n await this.confirmDeletion(organizationId)\n }\n\n const spin = spinner('Deleting organization').start()\n try {\n await deleteOrganization(organizationId)\n spin.succeed()\n this.log('Organization deleted')\n } catch (error) {\n spin.fail()\n deleteOrgDebug('Error deleting organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.error(`Failed to delete organization: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async confirmDeletion(organizationId: string): Promise<void> {\n let orgName: string\n try {\n const org = await getOrganization(organizationId)\n orgName = org.name\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteOrgDebug(`Error getting organization ${organizationId}`, err)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.error(`Organization retrieval failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n this.log(\n styleText(\n 'yellow',\n `${logSymbols.warning} Deleting organization \"${styleText(['bold', 'underline'], orgName)}\"\\n`,\n ),\n )\n\n try {\n await input({\n message:\n 'Are you ABSOLUTELY sure you want to delete this organization?\\n Type the name of the organization to confirm delete:',\n validate: (value) => {\n const trimmed = value.trim().toLowerCase()\n return (\n trimmed === orgName.trim().toLowerCase() ||\n 'Incorrect organization name. Ctrl + C to cancel delete.'\n )\n },\n })\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteOrgDebug(`User cancelled`, err)\n this.error(`User cancelled`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","input","logSymbols","spinner","isHttpError","deleteOrganization","getOrganization","organizationAliases","deleteOrgDebug","DeleteOrganizationCommand","args","organizationId","string","description","required","examples","command","flags","force","boolean","hiddenAliases","run","warn","confirmDeletion","spin","start","succeed","log","error","fail","statusCode","exit","RUNTIME_ERROR","orgName","org","name","err","Error","message","warning","validate","value","trimmed","trim","toLowerCase"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Args } from '@oclif/core';
2
- import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { getErrorMessage } from '@sanity/cli-core/errors';
4
4
  import { isHttpError } from '@sanity/client';
5
5
  import { getOrganization } from '../../services/organizations.js';
@@ -29,11 +29,11 @@ export class GetOrganizationCommand extends SanityCommand {
29
29
  getOrgDebug('Error getting organization', error);
30
30
  if (isHttpError(error) && error.statusCode === 404) {
31
31
  this.error(`Organization "${organizationId}" not found`, {
32
- exit: 1
32
+ exit: exitCodes.RUNTIME_ERROR
33
33
  });
34
34
  }
35
35
  this.error(`Failed to get organization: ${getErrorMessage(error)}`, {
36
- exit: 1
36
+ exit: exitCodes.RUNTIME_ERROR
37
37
  });
38
38
  }
39
39
  this.log(`ID: ${org.id}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/organizations/get.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {isHttpError} from '@sanity/client'\n\nimport {getOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst getOrgDebug = subdebug('organizations:get')\n\nexport class GetOrganizationCommand extends SanityCommand<typeof GetOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID',\n required: true,\n }),\n }\n\n static override description = 'Get details of an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123',\n description: 'Get details of a specific organization',\n },\n ]\n\n static override hiddenAliases = organizationAliases('get')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n\n let org\n try {\n org = await getOrganization(organizationId)\n } catch (error) {\n getOrgDebug('Error getting organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: 1})\n }\n this.error(`Failed to get organization: ${getErrorMessage(error)}`, {exit: 1})\n }\n\n this.log(`ID: ${org.id}`)\n this.log(`Name: ${org.name}`)\n this.log(`Slug: ${org.slug ?? '-'}`)\n this.log(`Default role: ${org.defaultRoleName ?? '-'}`)\n this.log(`Created: ${org.createdAt}`)\n this.log(`Updated: ${org.updatedAt}`)\n }\n}\n"],"names":["Args","SanityCommand","subdebug","getErrorMessage","isHttpError","getOrganization","organizationAliases","getOrgDebug","GetOrganizationCommand","args","organizationId","string","description","required","examples","command","hiddenAliases","run","org","error","statusCode","exit","log","id","name","slug","defaultRoleName","createdAt","updatedAt"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,eAAe,QAAO,kCAAiC;AAC/D,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,cAAcL,SAAS;AAE7B,OAAO,MAAMM,+BAA+BP;IAC1C,OAAgBQ,OAAO;QACrBC,gBAAgBV,KAAKW,MAAM,CAAC;YAC1BC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,iCAAgC;IAE9D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,gBAAgBV,oBAAoB,OAAM;IAE1D,MAAaW,MAAqB;QAChC,MAAM,EAACP,cAAc,EAAC,GAAG,IAAI,CAACD,IAAI;QAElC,IAAIS;QACJ,IAAI;YACFA,MAAM,MAAMb,gBAAgBK;QAC9B,EAAE,OAAOS,OAAO;YACdZ,YAAY,8BAA8BY;YAC1C,IAAIf,YAAYe,UAAUA,MAAMC,UAAU,KAAK,KAAK;gBAClD,IAAI,CAACD,KAAK,CAAC,CAAC,cAAc,EAAET,eAAe,WAAW,CAAC,EAAE;oBAACW,MAAM;gBAAC;YACnE;YACA,IAAI,CAACF,KAAK,CAAC,CAAC,4BAA4B,EAAEhB,gBAAgBgB,QAAQ,EAAE;gBAACE,MAAM;YAAC;QAC9E;QAEA,IAAI,CAACC,GAAG,CAAC,CAAC,cAAc,EAAEJ,IAAIK,EAAE,EAAE;QAClC,IAAI,CAACD,GAAG,CAAC,CAAC,cAAc,EAAEJ,IAAIM,IAAI,EAAE;QACpC,IAAI,CAACF,GAAG,CAAC,CAAC,cAAc,EAAEJ,IAAIO,IAAI,IAAI,KAAK;QAC3C,IAAI,CAACH,GAAG,CAAC,CAAC,cAAc,EAAEJ,IAAIQ,eAAe,IAAI,KAAK;QACtD,IAAI,CAACJ,GAAG,CAAC,CAAC,cAAc,EAAEJ,IAAIS,SAAS,EAAE;QACzC,IAAI,CAACL,GAAG,CAAC,CAAC,cAAc,EAAEJ,IAAIU,SAAS,EAAE;IAC3C;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/organizations/get.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {isHttpError} from '@sanity/client'\n\nimport {getOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst getOrgDebug = subdebug('organizations:get')\n\nexport class GetOrganizationCommand extends SanityCommand<typeof GetOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID',\n required: true,\n }),\n }\n\n static override description = 'Get details of an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123',\n description: 'Get details of a specific organization',\n },\n ]\n\n static override hiddenAliases = organizationAliases('get')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n\n let org\n try {\n org = await getOrganization(organizationId)\n } catch (error) {\n getOrgDebug('Error getting organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.error(`Failed to get organization: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n this.log(`ID: ${org.id}`)\n this.log(`Name: ${org.name}`)\n this.log(`Slug: ${org.slug ?? '-'}`)\n this.log(`Default role: ${org.defaultRoleName ?? '-'}`)\n this.log(`Created: ${org.createdAt}`)\n this.log(`Updated: ${org.updatedAt}`)\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","getErrorMessage","isHttpError","getOrganization","organizationAliases","getOrgDebug","GetOrganizationCommand","args","organizationId","string","description","required","examples","command","hiddenAliases","run","org","error","statusCode","exit","RUNTIME_ERROR","log","id","name","slug","defaultRoleName","createdAt","updatedAt"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,SAAQC,eAAe,QAAO,kCAAiC;AAC/D,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,cAAcL,SAAS;AAE7B,OAAO,MAAMM,+BAA+BP;IAC1C,OAAgBQ,OAAO;QACrBC,gBAAgBX,KAAKY,MAAM,CAAC;YAC1BC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,iCAAgC;IAE9D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,gBAAgBV,oBAAoB,OAAM;IAE1D,MAAaW,MAAqB;QAChC,MAAM,EAACP,cAAc,EAAC,GAAG,IAAI,CAACD,IAAI;QAElC,IAAIS;QACJ,IAAI;YACFA,MAAM,MAAMb,gBAAgBK;QAC9B,EAAE,OAAOS,OAAO;YACdZ,YAAY,8BAA8BY;YAC1C,IAAIf,YAAYe,UAAUA,MAAMC,UAAU,KAAK,KAAK;gBAClD,IAAI,CAACD,KAAK,CAAC,CAAC,cAAc,EAAET,eAAe,WAAW,CAAC,EAAE;oBAACW,MAAMrB,UAAUsB,aAAa;gBAAA;YACzF;YACA,IAAI,CAACH,KAAK,CAAC,CAAC,4BAA4B,EAAEhB,gBAAgBgB,QAAQ,EAAE;gBAClEE,MAAMrB,UAAUsB,aAAa;YAC/B;QACF;QAEA,IAAI,CAACC,GAAG,CAAC,CAAC,cAAc,EAAEL,IAAIM,EAAE,EAAE;QAClC,IAAI,CAACD,GAAG,CAAC,CAAC,cAAc,EAAEL,IAAIO,IAAI,EAAE;QACpC,IAAI,CAACF,GAAG,CAAC,CAAC,cAAc,EAAEL,IAAIQ,IAAI,IAAI,KAAK;QAC3C,IAAI,CAACH,GAAG,CAAC,CAAC,cAAc,EAAEL,IAAIS,eAAe,IAAI,KAAK;QACtD,IAAI,CAACJ,GAAG,CAAC,CAAC,cAAc,EAAEL,IAAIU,SAAS,EAAE;QACzC,IAAI,CAACL,GAAG,CAAC,CAAC,cAAc,EAAEL,IAAIW,SAAS,EAAE;IAC3C;AACF"}
@@ -1,4 +1,4 @@
1
- import { SanityCommand, subdebug } from '@sanity/cli-core';
1
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
2
2
  import { getErrorMessage } from '@sanity/cli-core/errors';
3
3
  import { Table } from 'console-table-printer';
4
4
  import { listOrganizations } from '../../services/organizations.js';
@@ -20,7 +20,7 @@ export class ListOrganizationsCommand extends SanityCommand {
20
20
  } catch (error) {
21
21
  listOrgsDebug('Error listing organizations', error);
22
22
  this.error(`Failed to list organizations: ${getErrorMessage(error)}`, {
23
- exit: 1
23
+ exit: exitCodes.RUNTIME_ERROR
24
24
  });
25
25
  }
26
26
  if (organizations.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/organizations/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {Table} from 'console-table-printer'\n\nimport {listOrganizations} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst listOrgsDebug = subdebug('organizations:list')\n\nexport class ListOrganizationsCommand extends SanityCommand<typeof ListOrganizationsCommand> {\n static override description = 'List organizations you are a member of'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all your organizations',\n },\n ]\n\n static override hiddenAliases = organizationAliases('list')\n\n public async run(): Promise<void> {\n let organizations\n try {\n organizations = await listOrganizations()\n } catch (error) {\n listOrgsDebug('Error listing organizations', error)\n this.error(`Failed to list organizations: ${getErrorMessage(error)}`, {exit: 1})\n }\n\n if (organizations.length === 0) {\n this.log('No organizations found')\n return\n }\n\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'id', title: 'ID'},\n {alignment: 'left', name: 'name', title: 'Name'},\n {alignment: 'left', name: 'slug', title: 'Slug'},\n ],\n })\n\n for (const {id, name, slug} of organizations) {\n table.addRow({id, name, slug: slug ?? '-'})\n }\n\n table.printTable()\n }\n}\n"],"names":["SanityCommand","subdebug","getErrorMessage","Table","listOrganizations","organizationAliases","listOrgsDebug","ListOrganizationsCommand","description","examples","command","hiddenAliases","run","organizations","error","exit","length","log","table","columns","alignment","name","title","id","slug","addRow","printTable"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,KAAK,QAAO,wBAAuB;AAE3C,SAAQC,iBAAiB,QAAO,kCAAiC;AACjE,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,gBAAgBL,SAAS;AAE/B,OAAO,MAAMM,iCAAiCP;IAC5C,OAAgBQ,cAAc,yCAAwC;IAEtE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,gBAAgBN,oBAAoB,QAAO;IAE3D,MAAaO,MAAqB;QAChC,IAAIC;QACJ,IAAI;YACFA,gBAAgB,MAAMT;QACxB,EAAE,OAAOU,OAAO;YACdR,cAAc,+BAA+BQ;YAC7C,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEZ,gBAAgBY,QAAQ,EAAE;gBAACC,MAAM;YAAC;QAChF;QAEA,IAAIF,cAAcG,MAAM,KAAK,GAAG;YAC9B,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,QAAQ,IAAIf,MAAM;YACtBgB,SAAS;gBACP;oBAACC,WAAW;oBAAQC,MAAM;oBAAMC,OAAO;gBAAI;gBAC3C;oBAACF,WAAW;oBAAQC,MAAM;oBAAQC,OAAO;gBAAM;gBAC/C;oBAACF,WAAW;oBAAQC,MAAM;oBAAQC,OAAO;gBAAM;aAChD;QACH;QAEA,KAAK,MAAM,EAACC,EAAE,EAAEF,IAAI,EAAEG,IAAI,EAAC,IAAIX,cAAe;YAC5CK,MAAMO,MAAM,CAAC;gBAACF;gBAAIF;gBAAMG,MAAMA,QAAQ;YAAG;QAC3C;QAEAN,MAAMQ,UAAU;IAClB;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/organizations/list.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {Table} from 'console-table-printer'\n\nimport {listOrganizations} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst listOrgsDebug = subdebug('organizations:list')\n\nexport class ListOrganizationsCommand extends SanityCommand<typeof ListOrganizationsCommand> {\n static override description = 'List organizations you are a member of'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List all your organizations',\n },\n ]\n\n static override hiddenAliases = organizationAliases('list')\n\n public async run(): Promise<void> {\n let organizations\n try {\n organizations = await listOrganizations()\n } catch (error) {\n listOrgsDebug('Error listing organizations', error)\n this.error(`Failed to list organizations: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (organizations.length === 0) {\n this.log('No organizations found')\n return\n }\n\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'id', title: 'ID'},\n {alignment: 'left', name: 'name', title: 'Name'},\n {alignment: 'left', name: 'slug', title: 'Slug'},\n ],\n })\n\n for (const {id, name, slug} of organizations) {\n table.addRow({id, name, slug: slug ?? '-'})\n }\n\n table.printTable()\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","getErrorMessage","Table","listOrganizations","organizationAliases","listOrgsDebug","ListOrganizationsCommand","description","examples","command","hiddenAliases","run","organizations","error","exit","RUNTIME_ERROR","length","log","table","columns","alignment","name","title","id","slug","addRow","printTable"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,SAAQC,eAAe,QAAO,0BAAyB;AACvD,SAAQC,KAAK,QAAO,wBAAuB;AAE3C,SAAQC,iBAAiB,QAAO,kCAAiC;AACjE,SAAQC,mBAAmB,QAAO,oCAAmC;AAErE,MAAMC,gBAAgBL,SAAS;AAE/B,OAAO,MAAMM,iCAAiCP;IAC5C,OAAgBQ,cAAc,yCAAwC;IAEtE,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,gBAAgBN,oBAAoB,QAAO;IAE3D,MAAaO,MAAqB;QAChC,IAAIC;QACJ,IAAI;YACFA,gBAAgB,MAAMT;QACxB,EAAE,OAAOU,OAAO;YACdR,cAAc,+BAA+BQ;YAC7C,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEZ,gBAAgBY,QAAQ,EAAE;gBACpEC,MAAMhB,UAAUiB,aAAa;YAC/B;QACF;QAEA,IAAIH,cAAcI,MAAM,KAAK,GAAG;YAC9B,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,MAAMC,QAAQ,IAAIhB,MAAM;YACtBiB,SAAS;gBACP;oBAACC,WAAW;oBAAQC,MAAM;oBAAMC,OAAO;gBAAI;gBAC3C;oBAACF,WAAW;oBAAQC,MAAM;oBAAQC,OAAO;gBAAM;gBAC/C;oBAACF,WAAW;oBAAQC,MAAM;oBAAQC,OAAO;gBAAM;aAChD;QACH;QAEA,KAAK,MAAM,EAACC,EAAE,EAAEF,IAAI,EAAEG,IAAI,EAAC,IAAIZ,cAAe;YAC5CM,MAAMO,MAAM,CAAC;gBAACF;gBAAIF;gBAAMG,MAAMA,QAAQ;YAAG;QAC3C;QAEAN,MAAMQ,UAAU;IAClB;AACF"}
@@ -1,5 +1,5 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
- import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { getErrorMessage } from '@sanity/cli-core/errors';
4
4
  import { spinner } from '@sanity/cli-core/ux';
5
5
  import { isHttpError } from '@sanity/client';
@@ -68,7 +68,7 @@ export class UpdateOrganizationCommand extends SanityCommand {
68
68
  const validation = validateOrganizationName(trimmedName);
69
69
  if (validation !== true) {
70
70
  this.error(validation, {
71
- exit: 1
71
+ exit: exitCodes.RUNTIME_ERROR
72
72
  });
73
73
  }
74
74
  params.name = trimmedName;
@@ -78,7 +78,7 @@ export class UpdateOrganizationCommand extends SanityCommand {
78
78
  const slugValidation = validateOrganizationSlug(trimmedSlug);
79
79
  if (slugValidation !== true) {
80
80
  this.error(slugValidation, {
81
- exit: 1
81
+ exit: exitCodes.RUNTIME_ERROR
82
82
  });
83
83
  }
84
84
  params.slug = trimmedSlug;
@@ -87,7 +87,7 @@ export class UpdateOrganizationCommand extends SanityCommand {
87
87
  const trimmedRole = defaultRole.trim();
88
88
  if (trimmedRole === '') {
89
89
  this.error('Default role cannot be empty', {
90
- exit: 1
90
+ exit: exitCodes.RUNTIME_ERROR
91
91
  });
92
92
  }
93
93
  params.defaultRoleName = trimmedRole;
@@ -102,11 +102,11 @@ export class UpdateOrganizationCommand extends SanityCommand {
102
102
  updateOrgDebug('Error updating organization', error);
103
103
  if (isHttpError(error) && error.statusCode === 404) {
104
104
  this.error(`Organization "${organizationId}" not found`, {
105
- exit: 1
105
+ exit: exitCodes.RUNTIME_ERROR
106
106
  });
107
107
  }
108
108
  this.error(`Failed to update organization: ${getErrorMessage(error)}`, {
109
- exit: 1
109
+ exit: exitCodes.RUNTIME_ERROR
110
110
  });
111
111
  }
112
112
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/organizations/update.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\n\nimport {validateOrganizationName} from '../../actions/organizations/validateOrganizationName.js'\nimport {validateOrganizationSlug} from '../../actions/organizations/validateOrganizationSlug.js'\nimport {type OrganizationUpdateParams, updateOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst updateOrgDebug = subdebug('organizations:update')\n\nconst UPDATE_FLAGS = ['name', 'slug', 'default-role'] as const\n\nexport class UpdateOrganizationCommand extends SanityCommand<typeof UpdateOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID',\n required: true,\n }),\n }\n\n static override description = 'Update an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --name \"New Name\"',\n description: 'Rename an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --slug new-slug',\n description: 'Set the organization slug (requires authSAML feature)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --default-role viewer',\n description: 'Change the default member role',\n },\n ]\n\n static override flags = {\n 'default-role': Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New default role for new members',\n required: false,\n }),\n name: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New organization name',\n required: false,\n }),\n slug: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New URL slug (requires authSAML feature on the organization)',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('update')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n const {'default-role': defaultRole, name, slug} = this.flags\n\n const params: OrganizationUpdateParams = {}\n if (name !== undefined) {\n const trimmedName = name.trim()\n const validation = validateOrganizationName(trimmedName)\n if (validation !== true) {\n this.error(validation, {exit: 1})\n }\n params.name = trimmedName\n }\n if (slug !== undefined) {\n const trimmedSlug = slug.trim()\n const slugValidation = validateOrganizationSlug(trimmedSlug)\n if (slugValidation !== true) {\n this.error(slugValidation, {exit: 1})\n }\n params.slug = trimmedSlug\n }\n if (defaultRole !== undefined) {\n const trimmedRole = defaultRole.trim()\n if (trimmedRole === '') {\n this.error('Default role cannot be empty', {exit: 1})\n }\n params.defaultRoleName = trimmedRole\n }\n\n const spin = spinner('Updating organization').start()\n try {\n await updateOrganization(organizationId, params)\n spin.succeed()\n this.log('Organization updated')\n } catch (error) {\n spin.fail()\n updateOrgDebug('Error updating organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: 1})\n }\n this.error(`Failed to update organization: ${getErrorMessage(error)}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","Flags","SanityCommand","subdebug","getErrorMessage","spinner","isHttpError","validateOrganizationName","validateOrganizationSlug","updateOrganization","organizationAliases","updateOrgDebug","UPDATE_FLAGS","UpdateOrganizationCommand","args","organizationId","string","description","required","examples","command","flags","atLeastOne","name","slug","hiddenAliases","run","defaultRole","params","undefined","trimmedName","trim","validation","error","exit","trimmedSlug","slugValidation","trimmedRole","defaultRoleName","spin","start","succeed","log","fail","statusCode"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/organizations/update.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {type FlagInput} from '@oclif/core/interfaces'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {getErrorMessage} from '@sanity/cli-core/errors'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\n\nimport {validateOrganizationName} from '../../actions/organizations/validateOrganizationName.js'\nimport {validateOrganizationSlug} from '../../actions/organizations/validateOrganizationSlug.js'\nimport {type OrganizationUpdateParams, updateOrganization} from '../../services/organizations.js'\nimport {organizationAliases} from '../../util/organizationAliases.js'\n\nconst updateOrgDebug = subdebug('organizations:update')\n\nconst UPDATE_FLAGS = ['name', 'slug', 'default-role'] as const\n\nexport class UpdateOrganizationCommand extends SanityCommand<typeof UpdateOrganizationCommand> {\n static override args = {\n organizationId: Args.string({\n description: 'Organization ID',\n required: true,\n }),\n }\n\n static override description = 'Update an organization'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --name \"New Name\"',\n description: 'Rename an organization',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --slug new-slug',\n description: 'Set the organization slug (requires authSAML feature)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> org-abc123 --default-role viewer',\n description: 'Change the default member role',\n },\n ]\n\n static override flags = {\n 'default-role': Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New default role for new members',\n required: false,\n }),\n name: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New organization name',\n required: false,\n }),\n slug: Flags.string({\n atLeastOne: [...UPDATE_FLAGS],\n description: 'New URL slug (requires authSAML feature on the organization)',\n required: false,\n }),\n } satisfies FlagInput\n\n static override hiddenAliases = organizationAliases('update')\n\n public async run(): Promise<void> {\n const {organizationId} = this.args\n const {'default-role': defaultRole, name, slug} = this.flags\n\n const params: OrganizationUpdateParams = {}\n if (name !== undefined) {\n const trimmedName = name.trim()\n const validation = validateOrganizationName(trimmedName)\n if (validation !== true) {\n this.error(validation, {exit: exitCodes.RUNTIME_ERROR})\n }\n params.name = trimmedName\n }\n if (slug !== undefined) {\n const trimmedSlug = slug.trim()\n const slugValidation = validateOrganizationSlug(trimmedSlug)\n if (slugValidation !== true) {\n this.error(slugValidation, {exit: exitCodes.RUNTIME_ERROR})\n }\n params.slug = trimmedSlug\n }\n if (defaultRole !== undefined) {\n const trimmedRole = defaultRole.trim()\n if (trimmedRole === '') {\n this.error('Default role cannot be empty', {exit: exitCodes.RUNTIME_ERROR})\n }\n params.defaultRoleName = trimmedRole\n }\n\n const spin = spinner('Updating organization').start()\n try {\n await updateOrganization(organizationId, params)\n spin.succeed()\n this.log('Organization updated')\n } catch (error) {\n spin.fail()\n updateOrgDebug('Error updating organization', error)\n if (isHttpError(error) && error.statusCode === 404) {\n this.error(`Organization \"${organizationId}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.error(`Failed to update organization: ${getErrorMessage(error)}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","getErrorMessage","spinner","isHttpError","validateOrganizationName","validateOrganizationSlug","updateOrganization","organizationAliases","updateOrgDebug","UPDATE_FLAGS","UpdateOrganizationCommand","args","organizationId","string","description","required","examples","command","flags","atLeastOne","name","slug","hiddenAliases","run","defaultRole","params","undefined","trimmedName","trim","validation","error","exit","RUNTIME_ERROR","trimmedSlug","slugValidation","trimmedRole","defaultRoleName","spin","start","succeed","log","fail","statusCode"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { Args, Flags } from '@oclif/core';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
4
4
  import { previewAction } from '../actions/preview/previewAction.js';
5
5
  export const previewDebug = subdebug('preview');
6
6
  export class PreviewCommand extends SanityCommand {
@@ -49,7 +49,7 @@ export class PreviewCommand extends SanityCommand {
49
49
  ] : undefined;
50
50
  const message = error instanceof Error ? error.message : String(error);
51
51
  this.output.error(`Failed to start preview server: ${message}`, {
52
- exit: 1,
52
+ exit: exitCodes.RUNTIME_ERROR,
53
53
  suggestions
54
54
  });
55
55
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/preview.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {previewAction} from '../actions/preview/previewAction.js'\nimport {type PreviewServer} from '../server/previewServer.js'\n\nexport const previewDebug = subdebug('preview')\n\nexport class PreviewCommand extends SanityCommand<typeof PreviewCommand> {\n static override args = {\n outputDir: Args.directory({description: 'Output directory'}),\n }\n\n static override deprecateAliases = true\n\n static override description = 'Start a local server to preview a production build'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> some/build-output-dir',\n ]\n\n static override flags = {\n host: Flags.string({\n description: 'Local network interface to listen on (default: localhost)',\n }),\n port: Flags.string({\n description: 'TCP port to start server on (default: 3333)',\n }),\n }\n static override hiddenAliases: string[] = ['start']\n\n public async run(): Promise<PreviewServer | {close: () => Promise<void>} | void> {\n const {args, flags} = await this.parse(PreviewCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n\n const {outputDir} = args\n\n const defaultRootDir = path.resolve(path.join(workDir, 'dist'))\n const outDir = path.resolve(outputDir || defaultRootDir)\n\n try {\n return await previewAction({cliConfig, flags, outDir, output: this.output, workDir})\n } catch (error: unknown) {\n const suggestions =\n error instanceof Error && error.name === 'BUILD_NOT_FOUND'\n ? [\n '`sanity build` to create a production build',\n '`sanity dev` to run a development server',\n ]\n : undefined\n\n const message = error instanceof Error ? error.message : String(error)\n this.output.error(`Failed to start preview server: ${message}`, {\n exit: 1,\n suggestions,\n })\n }\n }\n}\n"],"names":["path","Args","Flags","SanityCommand","subdebug","previewAction","previewDebug","PreviewCommand","args","outputDir","directory","description","deprecateAliases","examples","flags","host","string","port","hiddenAliases","run","parse","workDir","getProjectRoot","cliConfig","getCliConfig","defaultRootDir","resolve","join","outDir","output","error","suggestions","Error","name","undefined","message","String","exit"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,aAAa,QAAO,sCAAqC;AAGjE,OAAO,MAAMC,eAAeF,SAAS,WAAU;AAE/C,OAAO,MAAMG,uBAAuBJ;IAClC,OAAgBK,OAAO;QACrBC,WAAWR,KAAKS,SAAS,CAAC;YAACC,aAAa;QAAkB;IAC5D,EAAC;IAED,OAAgBC,mBAAmB,KAAI;IAEvC,OAAgBD,cAAc,qDAAoD;IAElF,OAAgBE,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtBC,MAAMb,MAAMc,MAAM,CAAC;YACjBL,aAAa;QACf;QACAM,MAAMf,MAAMc,MAAM,CAAC;YACjBL,aAAa;QACf;IACF,EAAC;IACD,OAAgBO,gBAA0B;QAAC;KAAQ,CAAA;IAEnD,MAAaC,MAAoE;QAC/E,MAAM,EAACX,IAAI,EAAEM,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACb;QAEvC,MAAMc,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGZ,SAAS;QACvD,MAAMa,YAAY,MAAM,IAAI,CAACC,YAAY;QAEzC,MAAM,EAACf,SAAS,EAAC,GAAGD;QAEpB,MAAMiB,iBAAiBzB,KAAK0B,OAAO,CAAC1B,KAAK2B,IAAI,CAACN,SAAS;QACvD,MAAMO,SAAS5B,KAAK0B,OAAO,CAACjB,aAAagB;QAEzC,IAAI;YACF,OAAO,MAAMpB,cAAc;gBAACkB;gBAAWT;gBAAOc;gBAAQC,QAAQ,IAAI,CAACA,MAAM;gBAAER;YAAO;QACpF,EAAE,OAAOS,OAAgB;YACvB,MAAMC,cACJD,iBAAiBE,SAASF,MAAMG,IAAI,KAAK,oBACrC;gBACE;gBACA;aACD,GACDC;YAEN,MAAMC,UAAUL,iBAAiBE,QAAQF,MAAMK,OAAO,GAAGC,OAAON;YAChE,IAAI,CAACD,MAAM,CAACC,KAAK,CAAC,CAAC,gCAAgC,EAAEK,SAAS,EAAE;gBAC9DE,MAAM;gBACNN;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/commands/preview.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {previewAction} from '../actions/preview/previewAction.js'\nimport {type PreviewServer} from '../server/previewServer.js'\n\nexport const previewDebug = subdebug('preview')\n\nexport class PreviewCommand extends SanityCommand<typeof PreviewCommand> {\n static override args = {\n outputDir: Args.directory({description: 'Output directory'}),\n }\n\n static override deprecateAliases = true\n\n static override description = 'Start a local server to preview a production build'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> some/build-output-dir',\n ]\n\n static override flags = {\n host: Flags.string({\n description: 'Local network interface to listen on (default: localhost)',\n }),\n port: Flags.string({\n description: 'TCP port to start server on (default: 3333)',\n }),\n }\n static override hiddenAliases: string[] = ['start']\n\n public async run(): Promise<PreviewServer | {close: () => Promise<void>} | void> {\n const {args, flags} = await this.parse(PreviewCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n\n const {outputDir} = args\n\n const defaultRootDir = path.resolve(path.join(workDir, 'dist'))\n const outDir = path.resolve(outputDir || defaultRootDir)\n\n try {\n return await previewAction({cliConfig, flags, outDir, output: this.output, workDir})\n } catch (error: unknown) {\n const suggestions =\n error instanceof Error && error.name === 'BUILD_NOT_FOUND'\n ? [\n '`sanity build` to create a production build',\n '`sanity dev` to run a development server',\n ]\n : undefined\n\n const message = error instanceof Error ? error.message : String(error)\n this.output.error(`Failed to start preview server: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n suggestions,\n })\n }\n }\n}\n"],"names":["path","Args","Flags","exitCodes","SanityCommand","subdebug","previewAction","previewDebug","PreviewCommand","args","outputDir","directory","description","deprecateAliases","examples","flags","host","string","port","hiddenAliases","run","parse","workDir","getProjectRoot","cliConfig","getCliConfig","defaultRootDir","resolve","join","outDir","output","error","suggestions","Error","name","undefined","message","String","exit","RUNTIME_ERROR"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,aAAa,QAAO,sCAAqC;AAGjE,OAAO,MAAMC,eAAeF,SAAS,WAAU;AAE/C,OAAO,MAAMG,uBAAuBJ;IAClC,OAAgBK,OAAO;QACrBC,WAAWT,KAAKU,SAAS,CAAC;YAACC,aAAa;QAAkB;IAC5D,EAAC;IAED,OAAgBC,mBAAmB,KAAI;IAEvC,OAAgBD,cAAc,qDAAoD;IAElF,OAAgBE,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtBC,MAAMd,MAAMe,MAAM,CAAC;YACjBL,aAAa;QACf;QACAM,MAAMhB,MAAMe,MAAM,CAAC;YACjBL,aAAa;QACf;IACF,EAAC;IACD,OAAgBO,gBAA0B;QAAC;KAAQ,CAAA;IAEnD,MAAaC,MAAoE;QAC/E,MAAM,EAACX,IAAI,EAAEM,KAAK,EAAC,GAAG,MAAM,IAAI,CAACM,KAAK,CAACb;QAEvC,MAAMc,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGZ,SAAS;QACvD,MAAMa,YAAY,MAAM,IAAI,CAACC,YAAY;QAEzC,MAAM,EAACf,SAAS,EAAC,GAAGD;QAEpB,MAAMiB,iBAAiB1B,KAAK2B,OAAO,CAAC3B,KAAK4B,IAAI,CAACN,SAAS;QACvD,MAAMO,SAAS7B,KAAK2B,OAAO,CAACjB,aAAagB;QAEzC,IAAI;YACF,OAAO,MAAMpB,cAAc;gBAACkB;gBAAWT;gBAAOc;gBAAQC,QAAQ,IAAI,CAACA,MAAM;gBAAER;YAAO;QACpF,EAAE,OAAOS,OAAgB;YACvB,MAAMC,cACJD,iBAAiBE,SAASF,MAAMG,IAAI,KAAK,oBACrC;gBACE;gBACA;aACD,GACDC;YAEN,MAAMC,UAAUL,iBAAiBE,QAAQF,MAAMK,OAAO,GAAGC,OAAON;YAChE,IAAI,CAACD,MAAM,CAACC,KAAK,CAAC,CAAC,gCAAgC,EAAEK,SAAS,EAAE;gBAC9DE,MAAMnC,UAAUoC,aAAa;gBAC7BP;YACF;QACF;IACF;AACF"}
@@ -107,7 +107,7 @@ export class CreateProjectCommand extends SanityCommand {
107
107
  } catch (error) {
108
108
  const errorText = organization ? `Failed to retrieve organization ${organization}` : 'Failed to retrieve an organization';
109
109
  return this.output.error(`${errorText}: ${error}`, {
110
- exit: 1
110
+ exit: exitCodes.RUNTIME_ERROR
111
111
  });
112
112
  }
113
113
  const spin = spinner('Creating project').start();
@@ -125,7 +125,7 @@ export class CreateProjectCommand extends SanityCommand {
125
125
  spin.fail();
126
126
  debug(`Failed to create project: ${error}`);
127
127
  return this.output.error(`Failed to create project: ${error}`, {
128
- exit: 1
128
+ exit: exitCodes.RUNTIME_ERROR
129
129
  });
130
130
  }
131
131
  let newDataset;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/projects/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes} from '@sanity/cli-core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetResponse} from '@sanity/client'\n\nimport {createDataset} from '../../actions/dataset/create.js'\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {getOrganization} from '../../actions/organizations/getOrganization.js'\nimport {getManageUrl} from '../../actions/projects/getManageUrl.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForDefaultConfig} from '../../prompts/promptForDefaultConfig.js'\nimport {promptForProjectName} from '../../prompts/promptForProjectName.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {getProjectFeatures} from '../../services/getProjectFeatures.js'\nimport {\n type OrganizationCreateResponse,\n type ProjectOrganization,\n} from '../../services/organizations.js'\nimport {createProject, type CreateProjectResult} from '../../services/projects.js'\nimport {getCliUser} from '../../services/user.js'\n\nconst debug = subdebug('projects:create')\n\nexport class CreateProjectCommand extends SanityCommand<typeof CreateProjectCommand> {\n static override args = {\n projectName: Args.string({\n description: 'Name of the project to create',\n required: false,\n }),\n }\n\n static override description = 'Create a new Sanity project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create a project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My New Project\"',\n description: 'Create a project named \"My New Project\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My Project\" --organization=my-org',\n description: 'Create a project in a specific organization',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \"My Project\" --dataset=staging --dataset-visibility=private',\n description: 'Create a project with a private dataset named \"staging\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"CI Project\" --yes --json',\n description: 'Create a project non-interactively with JSON output',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n description: 'Create a dataset. Prompts for visibility unless specified or --yes used',\n parse: async (input) => {\n const datasetNameError = validateDatasetName(input)\n if (datasetNameError) {\n throw new CLIError(datasetNameError, {exit: exitCodes.USAGE_ERROR})\n }\n\n return input\n },\n }),\n 'dataset-visibility': Flags.string({\n description: 'Dataset visibility: public or private',\n options: ['private', 'public'],\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output in JSON format',\n }),\n organization: Flags.string({\n description: 'Organization to create the project in',\n helpValue: '<slug|id>',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Skip prompts and use defaults (project: \"My Sanity Project\", dataset: production, visibility: public)',\n }),\n }\n\n static override hiddenAliases: string[] = ['project:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateProjectCommand)\n const {projectName} = args\n const {dataset, 'dataset-visibility': datasetVisibility, organization, yes} = flags\n const user = await getCliUser()\n\n const finalProjectName =\n projectName ||\n (yes || this.isUnattended() ? 'My Sanity Project' : await promptForProjectName())\n\n debug('Creating project with options: %O', {\n dataset,\n datasetVisibility,\n organizationId: organization,\n projectName,\n unattended: yes,\n })\n\n let chosenOrganization: OrganizationCreateResponse | ProjectOrganization | undefined\n try {\n chosenOrganization = await getOrganization({\n isUnattended: this.isUnattended(),\n output: this.output,\n requestedId: organization,\n user,\n })\n } catch (error) {\n const errorText = organization\n ? `Failed to retrieve organization ${organization}`\n : 'Failed to retrieve an organization'\n return this.output.error(`${errorText}: ${error}`, {exit: 1})\n }\n\n const spin = spinner('Creating project').start()\n let newProject\n try {\n newProject = await createProject({\n displayName: finalProjectName,\n metadata: {\n integration: 'cli',\n },\n organizationId: chosenOrganization?.id,\n })\n spin.succeed('Project created successfully')\n } catch (error) {\n spin.fail()\n debug(`Failed to create project: ${error}`)\n return this.output.error(`Failed to create project: ${error}`, {exit: 1})\n }\n\n let newDataset: DatasetResponse | undefined\n // If dataset name specified, or in attended mode (to prompt for dataset name), create a dataset.\n if (dataset || !this.isUnattended()) {\n newDataset = await this.handleDatasetCreation(\n newProject.projectId,\n dataset,\n datasetVisibility,\n )\n }\n\n this.printProjectCreationSuccess(chosenOrganization, newProject, newDataset)\n }\n\n private async handleDatasetCreation(\n projectId: string,\n datasetFromFlag?: string,\n datasetVisibility?: string,\n ): Promise<DatasetResponse | undefined> {\n try {\n let datasetName: string | undefined = datasetFromFlag\n const existingDatasets = await listDatasets(projectId)\n const existingDatasetNames = existingDatasets.map((ds) => ds.name)\n\n // Prompt for dataset in interactive mode if not provided\n if (!datasetName && !this.isUnattended()) {\n const wantsDataset = await confirm({\n default: true,\n message: 'Would you like to create a dataset?',\n })\n\n if (wantsDataset) {\n const defaultConfig = await promptForDefaultConfig()\n\n datasetName = defaultConfig\n ? 'production'\n : await promptForDatasetName({}, existingDatasetNames)\n }\n }\n\n // Create dataset if we have a name\n if (datasetName) {\n const projectFeatures = await getProjectFeatures(projectId)\n return await createDataset({\n datasetName,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectFeatures,\n projectId,\n silent: this.flags.json,\n visibility: datasetVisibility,\n })\n }\n\n return\n } catch (error) {\n debug(`Error creating dataset: ${error}`)\n this.output.warn(`Project created but dataset creation failed: ${error}`)\n return\n }\n }\n\n private async printProjectCreationSuccess(\n organization: OrganizationCreateResponse | ProjectOrganization | undefined,\n project: CreateProjectResult,\n dataset: DatasetResponse | undefined,\n ) {\n if (this.flags.json) {\n this.output.log(JSON.stringify(project, null, 2))\n return\n }\n\n this.output.log(`Project created successfully!`)\n this.output.log(`ID: ${project.projectId}`)\n this.output.log(`Name: ${project.displayName}`)\n this.output.log(`Organization: ${organization?.name || 'Personal'}`)\n\n if (dataset) {\n this.output.log(`Dataset: ${dataset.datasetName} (${dataset.aclMode})`)\n }\n\n this.output.log(``)\n this.output.log(`Manage your project: ${getManageUrl(project.projectId)}`)\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","subdebug","SanityCommand","confirm","spinner","createDataset","validateDatasetName","getOrganization","getManageUrl","promptForDatasetName","promptForDefaultConfig","promptForProjectName","listDatasets","getProjectFeatures","createProject","getCliUser","debug","CreateProjectCommand","args","projectName","string","description","required","examples","command","flags","dataset","parse","input","datasetNameError","exit","USAGE_ERROR","options","json","boolean","default","organization","helpValue","yes","char","hiddenAliases","run","datasetVisibility","user","finalProjectName","isUnattended","organizationId","unattended","chosenOrganization","output","requestedId","error","errorText","spin","start","newProject","displayName","metadata","integration","id","succeed","fail","newDataset","handleDatasetCreation","projectId","printProjectCreationSuccess","datasetFromFlag","datasetName","existingDatasets","existingDatasetNames","map","ds","name","wantsDataset","message","defaultConfig","projectFeatures","silent","visibility","warn","project","log","JSON","stringify","aclMode"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/projects/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes} from '@sanity/cli-core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {confirm, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetResponse} from '@sanity/client'\n\nimport {createDataset} from '../../actions/dataset/create.js'\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {getOrganization} from '../../actions/organizations/getOrganization.js'\nimport {getManageUrl} from '../../actions/projects/getManageUrl.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForDefaultConfig} from '../../prompts/promptForDefaultConfig.js'\nimport {promptForProjectName} from '../../prompts/promptForProjectName.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {getProjectFeatures} from '../../services/getProjectFeatures.js'\nimport {\n type OrganizationCreateResponse,\n type ProjectOrganization,\n} from '../../services/organizations.js'\nimport {createProject, type CreateProjectResult} from '../../services/projects.js'\nimport {getCliUser} from '../../services/user.js'\n\nconst debug = subdebug('projects:create')\n\nexport class CreateProjectCommand extends SanityCommand<typeof CreateProjectCommand> {\n static override args = {\n projectName: Args.string({\n description: 'Name of the project to create',\n required: false,\n }),\n }\n\n static override description = 'Create a new Sanity project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create a project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My New Project\"',\n description: 'Create a project named \"My New Project\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"My Project\" --organization=my-org',\n description: 'Create a project in a specific organization',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> \"My Project\" --dataset=staging --dataset-visibility=private',\n description: 'Create a project with a private dataset named \"staging\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"CI Project\" --yes --json',\n description: 'Create a project non-interactively with JSON output',\n },\n ]\n\n static override flags = {\n dataset: Flags.string({\n description: 'Create a dataset. Prompts for visibility unless specified or --yes used',\n parse: async (input) => {\n const datasetNameError = validateDatasetName(input)\n if (datasetNameError) {\n throw new CLIError(datasetNameError, {exit: exitCodes.USAGE_ERROR})\n }\n\n return input\n },\n }),\n 'dataset-visibility': Flags.string({\n description: 'Dataset visibility: public or private',\n options: ['private', 'public'],\n }),\n json: Flags.boolean({\n default: false,\n description: 'Output in JSON format',\n }),\n organization: Flags.string({\n description: 'Organization to create the project in',\n helpValue: '<slug|id>',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Skip prompts and use defaults (project: \"My Sanity Project\", dataset: production, visibility: public)',\n }),\n }\n\n static override hiddenAliases: string[] = ['project:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateProjectCommand)\n const {projectName} = args\n const {dataset, 'dataset-visibility': datasetVisibility, organization, yes} = flags\n const user = await getCliUser()\n\n const finalProjectName =\n projectName ||\n (yes || this.isUnattended() ? 'My Sanity Project' : await promptForProjectName())\n\n debug('Creating project with options: %O', {\n dataset,\n datasetVisibility,\n organizationId: organization,\n projectName,\n unattended: yes,\n })\n\n let chosenOrganization: OrganizationCreateResponse | ProjectOrganization | undefined\n try {\n chosenOrganization = await getOrganization({\n isUnattended: this.isUnattended(),\n output: this.output,\n requestedId: organization,\n user,\n })\n } catch (error) {\n const errorText = organization\n ? `Failed to retrieve organization ${organization}`\n : 'Failed to retrieve an organization'\n return this.output.error(`${errorText}: ${error}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const spin = spinner('Creating project').start()\n let newProject\n try {\n newProject = await createProject({\n displayName: finalProjectName,\n metadata: {\n integration: 'cli',\n },\n organizationId: chosenOrganization?.id,\n })\n spin.succeed('Project created successfully')\n } catch (error) {\n spin.fail()\n debug(`Failed to create project: ${error}`)\n return this.output.error(`Failed to create project: ${error}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n let newDataset: DatasetResponse | undefined\n // If dataset name specified, or in attended mode (to prompt for dataset name), create a dataset.\n if (dataset || !this.isUnattended()) {\n newDataset = await this.handleDatasetCreation(\n newProject.projectId,\n dataset,\n datasetVisibility,\n )\n }\n\n this.printProjectCreationSuccess(chosenOrganization, newProject, newDataset)\n }\n\n private async handleDatasetCreation(\n projectId: string,\n datasetFromFlag?: string,\n datasetVisibility?: string,\n ): Promise<DatasetResponse | undefined> {\n try {\n let datasetName: string | undefined = datasetFromFlag\n const existingDatasets = await listDatasets(projectId)\n const existingDatasetNames = existingDatasets.map((ds) => ds.name)\n\n // Prompt for dataset in interactive mode if not provided\n if (!datasetName && !this.isUnattended()) {\n const wantsDataset = await confirm({\n default: true,\n message: 'Would you like to create a dataset?',\n })\n\n if (wantsDataset) {\n const defaultConfig = await promptForDefaultConfig()\n\n datasetName = defaultConfig\n ? 'production'\n : await promptForDatasetName({}, existingDatasetNames)\n }\n }\n\n // Create dataset if we have a name\n if (datasetName) {\n const projectFeatures = await getProjectFeatures(projectId)\n return await createDataset({\n datasetName,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectFeatures,\n projectId,\n silent: this.flags.json,\n visibility: datasetVisibility,\n })\n }\n\n return\n } catch (error) {\n debug(`Error creating dataset: ${error}`)\n this.output.warn(`Project created but dataset creation failed: ${error}`)\n return\n }\n }\n\n private async printProjectCreationSuccess(\n organization: OrganizationCreateResponse | ProjectOrganization | undefined,\n project: CreateProjectResult,\n dataset: DatasetResponse | undefined,\n ) {\n if (this.flags.json) {\n this.output.log(JSON.stringify(project, null, 2))\n return\n }\n\n this.output.log(`Project created successfully!`)\n this.output.log(`ID: ${project.projectId}`)\n this.output.log(`Name: ${project.displayName}`)\n this.output.log(`Organization: ${organization?.name || 'Personal'}`)\n\n if (dataset) {\n this.output.log(`Dataset: ${dataset.datasetName} (${dataset.aclMode})`)\n }\n\n this.output.log(``)\n this.output.log(`Manage your project: ${getManageUrl(project.projectId)}`)\n }\n}\n"],"names":["Args","Flags","CLIError","exitCodes","subdebug","SanityCommand","confirm","spinner","createDataset","validateDatasetName","getOrganization","getManageUrl","promptForDatasetName","promptForDefaultConfig","promptForProjectName","listDatasets","getProjectFeatures","createProject","getCliUser","debug","CreateProjectCommand","args","projectName","string","description","required","examples","command","flags","dataset","parse","input","datasetNameError","exit","USAGE_ERROR","options","json","boolean","default","organization","helpValue","yes","char","hiddenAliases","run","datasetVisibility","user","finalProjectName","isUnattended","organizationId","unattended","chosenOrganization","output","requestedId","error","errorText","RUNTIME_ERROR","spin","start","newProject","displayName","metadata","integration","id","succeed","fail","newDataset","handleDatasetCreation","projectId","printProjectCreationSuccess","datasetFromFlag","datasetName","existingDatasets","existingDatasetNames","map","ds","name","wantsDataset","message","defaultConfig","projectFeatures","silent","visibility","warn","project","log","JSON","stringify","aclMode"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,SAAS,QAAO,mBAAkB;AAC1C,SAAQC,QAAQ,QAAO,yBAAwB;AAC/C,SAAQC,aAAa,QAAO,iCAAgC;AAC5D,SAAQC,OAAO,EAAEC,OAAO,QAAO,sBAAqB;AAGpD,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,mBAAmB,QAAO,+CAA8C;AAChF,SAAQC,eAAe,QAAO,iDAAgD;AAC9E,SAAQC,YAAY,QAAO,yCAAwC;AACnE,SAAQC,oBAAoB,QAAO,wCAAuC;AAC1E,SAAQC,sBAAsB,QAAO,0CAAyC;AAC9E,SAAQC,oBAAoB,QAAO,wCAAuC;AAC1E,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,kBAAkB,QAAO,uCAAsC;AAKvE,SAAQC,aAAa,QAAiC,6BAA4B;AAClF,SAAQC,UAAU,QAAO,yBAAwB;AAEjD,MAAMC,QAAQf,SAAS;AAEvB,OAAO,MAAMgB,6BAA6Bf;IACxC,OAAgBgB,OAAO;QACrBC,aAAatB,KAAKuB,MAAM,CAAC;YACvBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,8BAA6B;IAE3D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SACE;YACFH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,SAAS5B,MAAMsB,MAAM,CAAC;YACpBC,aAAa;YACbM,OAAO,OAAOC;gBACZ,MAAMC,mBAAmBvB,oBAAoBsB;gBAC7C,IAAIC,kBAAkB;oBACpB,MAAM,IAAI9B,SAAS8B,kBAAkB;wBAACC,MAAM9B,UAAU+B,WAAW;oBAAA;gBACnE;gBAEA,OAAOH;YACT;QACF;QACA,sBAAsB9B,MAAMsB,MAAM,CAAC;YACjCC,aAAa;YACbW,SAAS;gBAAC;gBAAW;aAAS;QAChC;QACAC,MAAMnC,MAAMoC,OAAO,CAAC;YAClBC,SAAS;YACTd,aAAa;QACf;QACAe,cAActC,MAAMsB,MAAM,CAAC;YACzBC,aAAa;YACbgB,WAAW;QACb;QACAC,KAAKxC,MAAMoC,OAAO,CAAC;YACjBK,MAAM;YACNJ,SAAS;YACTd,aACE;QACJ;IACF,EAAC;IAED,OAAgBmB,gBAA0B;QAAC;KAAiB,CAAA;IAE5D,MAAaC,MAAqB;QAChC,MAAM,EAACvB,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACE,KAAK,CAACV;QACvC,MAAM,EAACE,WAAW,EAAC,GAAGD;QACtB,MAAM,EAACQ,OAAO,EAAE,sBAAsBgB,iBAAiB,EAAEN,YAAY,EAAEE,GAAG,EAAC,GAAGb;QAC9E,MAAMkB,OAAO,MAAM5B;QAEnB,MAAM6B,mBACJzB,eACCmB,CAAAA,OAAO,IAAI,CAACO,YAAY,KAAK,sBAAsB,MAAMlC,sBAAqB;QAEjFK,MAAM,qCAAqC;YACzCU;YACAgB;YACAI,gBAAgBV;YAChBjB;YACA4B,YAAYT;QACd;QAEA,IAAIU;QACJ,IAAI;YACFA,qBAAqB,MAAMzC,gBAAgB;gBACzCsC,cAAc,IAAI,CAACA,YAAY;gBAC/BI,QAAQ,IAAI,CAACA,MAAM;gBACnBC,aAAad;gBACbO;YACF;QACF,EAAE,OAAOQ,OAAO;YACd,MAAMC,YAAYhB,eACd,CAAC,gCAAgC,EAAEA,cAAc,GACjD;YACJ,OAAO,IAAI,CAACa,MAAM,CAACE,KAAK,CAAC,GAAGC,UAAU,EAAE,EAAED,OAAO,EAAE;gBAACrB,MAAM9B,UAAUqD,aAAa;YAAA;QACnF;QAEA,MAAMC,OAAOlD,QAAQ,oBAAoBmD,KAAK;QAC9C,IAAIC;QACJ,IAAI;YACFA,aAAa,MAAM1C,cAAc;gBAC/B2C,aAAab;gBACbc,UAAU;oBACRC,aAAa;gBACf;gBACAb,gBAAgBE,oBAAoBY;YACtC;YACAN,KAAKO,OAAO,CAAC;QACf,EAAE,OAAOV,OAAO;YACdG,KAAKQ,IAAI;YACT9C,MAAM,CAAC,0BAA0B,EAAEmC,OAAO;YAC1C,OAAO,IAAI,CAACF,MAAM,CAACE,KAAK,CAAC,CAAC,0BAA0B,EAAEA,OAAO,EAAE;gBAC7DrB,MAAM9B,UAAUqD,aAAa;YAC/B;QACF;QAEA,IAAIU;QACJ,iGAAiG;QACjG,IAAIrC,WAAW,CAAC,IAAI,CAACmB,YAAY,IAAI;YACnCkB,aAAa,MAAM,IAAI,CAACC,qBAAqB,CAC3CR,WAAWS,SAAS,EACpBvC,SACAgB;QAEJ;QAEA,IAAI,CAACwB,2BAA2B,CAAClB,oBAAoBQ,YAAYO;IACnE;IAEA,MAAcC,sBACZC,SAAiB,EACjBE,eAAwB,EACxBzB,iBAA0B,EACY;QACtC,IAAI;YACF,IAAI0B,cAAkCD;YACtC,MAAME,mBAAmB,MAAMzD,aAAaqD;YAC5C,MAAMK,uBAAuBD,iBAAiBE,GAAG,CAAC,CAACC,KAAOA,GAAGC,IAAI;YAEjE,yDAAyD;YACzD,IAAI,CAACL,eAAe,CAAC,IAAI,CAACvB,YAAY,IAAI;gBACxC,MAAM6B,eAAe,MAAMvE,QAAQ;oBACjCgC,SAAS;oBACTwC,SAAS;gBACX;gBAEA,IAAID,cAAc;oBAChB,MAAME,gBAAgB,MAAMlE;oBAE5B0D,cAAcQ,gBACV,eACA,MAAMnE,qBAAqB,CAAC,GAAG6D;gBACrC;YACF;YAEA,mCAAmC;YACnC,IAAIF,aAAa;gBACf,MAAMS,kBAAkB,MAAMhE,mBAAmBoD;gBACjD,OAAO,MAAM5D,cAAc;oBACzB+D;oBACAvB,cAAc,IAAI,CAACA,YAAY;oBAC/BI,QAAQ,IAAI,CAACA,MAAM;oBACnB4B;oBACAZ;oBACAa,QAAQ,IAAI,CAACrD,KAAK,CAACQ,IAAI;oBACvB8C,YAAYrC;gBACd;YACF;YAEA;QACF,EAAE,OAAOS,OAAO;YACdnC,MAAM,CAAC,wBAAwB,EAAEmC,OAAO;YACxC,IAAI,CAACF,MAAM,CAAC+B,IAAI,CAAC,CAAC,6CAA6C,EAAE7B,OAAO;YACxE;QACF;IACF;IAEA,MAAce,4BACZ9B,YAA0E,EAC1E6C,OAA4B,EAC5BvD,OAAoC,EACpC;QACA,IAAI,IAAI,CAACD,KAAK,CAACQ,IAAI,EAAE;YACnB,IAAI,CAACgB,MAAM,CAACiC,GAAG,CAACC,KAAKC,SAAS,CAACH,SAAS,MAAM;YAC9C;QACF;QAEA,IAAI,CAAChC,MAAM,CAACiC,GAAG,CAAC,CAAC,6BAA6B,CAAC;QAC/C,IAAI,CAACjC,MAAM,CAACiC,GAAG,CAAC,CAAC,IAAI,EAAED,QAAQhB,SAAS,EAAE;QAC1C,IAAI,CAAChB,MAAM,CAACiC,GAAG,CAAC,CAAC,MAAM,EAAED,QAAQxB,WAAW,EAAE;QAC9C,IAAI,CAACR,MAAM,CAACiC,GAAG,CAAC,CAAC,cAAc,EAAE9C,cAAcqC,QAAQ,YAAY;QAEnE,IAAI/C,SAAS;YACX,IAAI,CAACuB,MAAM,CAACiC,GAAG,CAAC,CAAC,SAAS,EAAExD,QAAQ0C,WAAW,CAAC,EAAE,EAAE1C,QAAQ2D,OAAO,CAAC,CAAC,CAAC;QACxE;QAEA,IAAI,CAACpC,MAAM,CAACiC,GAAG,CAAC,EAAE;QAClB,IAAI,CAACjC,MAAM,CAACiC,GAAG,CAAC,CAAC,qBAAqB,EAAE1E,aAAayE,QAAQhB,SAAS,GAAG;IAC3E;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { Flags } from '@oclif/core';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
4
4
  import size from 'lodash-es/size.js';
5
5
  import sortBy from 'lodash-es/sortBy.js';
6
6
  import { getManageUrl } from '../../actions/projects/getManageUrl.js';
@@ -74,7 +74,7 @@ export class List extends SanityCommand {
74
74
  } catch (error) {
75
75
  projectsDebug('Error listing projects', error);
76
76
  this.error('Failed to list projects', {
77
- exit: 1
77
+ exit: exitCodes.RUNTIME_ERROR
78
78
  });
79
79
  }
80
80
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/projects/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport size from 'lodash-es/size.js'\nimport sortBy from 'lodash-es/sortBy.js'\n\nimport {getManageUrl} from '../../actions/projects/getManageUrl.js'\nimport {listProjects} from '../../services/projects.js'\n\nconst sortFields = ['id', 'members', 'name', 'url', 'created']\n\nconst projectsDebug = subdebug('projects')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List your projects'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List projects',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort=members --order=asc',\n description: 'List projects sorted by member count, ascending',\n },\n ]\n\n static override flags = {\n order: Flags.string({\n default: 'desc',\n description: 'Sort direction',\n options: ['asc', 'desc'],\n }),\n sort: Flags.string({\n default: 'created',\n description: 'Sort field',\n options: sortFields,\n }),\n }\n\n static override hiddenAliases: string[] = ['project:list']\n\n public async run() {\n const {order, sort} = this.flags\n\n try {\n const projects = await listProjects()\n const ordered = sortBy(\n projects.map(({createdAt, displayName, id, members = []}) => {\n const manage = getManageUrl(id)\n return [id, members.length, displayName, manage, createdAt].map(String)\n }),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n // Initialize maxWidths with the width of each header\n const maxWidths = sortFields.map((str) => size(str))\n\n // Calculate maximum width for each column\n for (const row of rows) {\n for (const [i, element] of row.entries()) {\n maxWidths[i] = Math.max(size(element), maxWidths[i])\n }\n }\n\n const printRow = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n this.log(styleText('cyan', printRow(sortFields)))\n for (const row of rows) this.log(printRow(row))\n } catch (error) {\n projectsDebug('Error listing projects', error)\n this.error('Failed to list projects', {exit: 1})\n }\n }\n}\n"],"names":["styleText","Flags","SanityCommand","subdebug","size","sortBy","getManageUrl","listProjects","sortFields","projectsDebug","List","description","examples","command","flags","order","string","default","options","sort","hiddenAliases","run","projects","ordered","map","createdAt","displayName","id","members","manage","length","String","indexOf","rows","toReversed","maxWidths","str","row","i","element","entries","Math","max","printRow","col","padEnd","join","log","error","exit"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,OAAOC,UAAU,oBAAmB;AACpC,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,YAAY,QAAO,yCAAwC;AACnE,SAAQC,YAAY,QAAO,6BAA4B;AAEvD,MAAMC,aAAa;IAAC;IAAM;IAAW;IAAQ;IAAO;CAAU;AAE9D,MAAMC,gBAAgBN,SAAS;AAE/B,OAAO,MAAMO,aAAaR;IACxB,OAAgBS,cAAc,qBAAoB;IAClD,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,OAAOd,MAAMe,MAAM,CAAC;YAClBC,SAAS;YACTN,aAAa;YACbO,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,MAAMlB,MAAMe,MAAM,CAAC;YACjBC,SAAS;YACTN,aAAa;YACbO,SAASV;QACX;IACF,EAAC;IAED,OAAgBY,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACN,KAAK,EAAEI,IAAI,EAAC,GAAG,IAAI,CAACL,KAAK;QAEhC,IAAI;YACF,MAAMQ,WAAW,MAAMf;YACvB,MAAMgB,UAAUlB,OACdiB,SAASE,GAAG,CAAC,CAAC,EAACC,SAAS,EAAEC,WAAW,EAAEC,EAAE,EAAEC,UAAU,EAAE,EAAC;gBACtD,MAAMC,SAASvB,aAAaqB;gBAC5B,OAAO;oBAACA;oBAAIC,QAAQE,MAAM;oBAAEJ;oBAAaG;oBAAQJ;iBAAU,CAACD,GAAG,CAACO;YAClE,IACA;gBAACvB,WAAWwB,OAAO,CAACb;aAAM;YAG5B,MAAMc,OAAOlB,UAAU,QAAQQ,UAAUA,QAAQW,UAAU;YAE3D,qDAAqD;YACrD,MAAMC,YAAY3B,WAAWgB,GAAG,CAAC,CAACY,MAAQhC,KAAKgC;YAE/C,0CAA0C;YAC1C,KAAK,MAAMC,OAAOJ,KAAM;gBACtB,KAAK,MAAM,CAACK,GAAGC,QAAQ,IAAIF,IAAIG,OAAO,GAAI;oBACxCL,SAAS,CAACG,EAAE,GAAGG,KAAKC,GAAG,CAACtC,KAAKmC,UAAUJ,SAAS,CAACG,EAAE;gBACrD;YACF;YAEA,MAAMK,WAAW,CAACN,MAChBA,IAAIb,GAAG,CAAC,CAACoB,KAAKN,IAAM,GAAGM,KAAK,CAACC,MAAM,CAACV,SAAS,CAACG,EAAE,GAAGQ,IAAI,CAAC;YAE1D,IAAI,CAACC,GAAG,CAAC/C,UAAU,QAAQ2C,SAASnC;YACpC,KAAK,MAAM6B,OAAOJ,KAAM,IAAI,CAACc,GAAG,CAACJ,SAASN;QAC5C,EAAE,OAAOW,OAAO;YACdvC,cAAc,0BAA0BuC;YACxC,IAAI,CAACA,KAAK,CAAC,2BAA2B;gBAACC,MAAM;YAAC;QAChD;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/projects/list.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport size from 'lodash-es/size.js'\nimport sortBy from 'lodash-es/sortBy.js'\n\nimport {getManageUrl} from '../../actions/projects/getManageUrl.js'\nimport {listProjects} from '../../services/projects.js'\n\nconst sortFields = ['id', 'members', 'name', 'url', 'created']\n\nconst projectsDebug = subdebug('projects')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List your projects'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List projects',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --sort=members --order=asc',\n description: 'List projects sorted by member count, ascending',\n },\n ]\n\n static override flags = {\n order: Flags.string({\n default: 'desc',\n description: 'Sort direction',\n options: ['asc', 'desc'],\n }),\n sort: Flags.string({\n default: 'created',\n description: 'Sort field',\n options: sortFields,\n }),\n }\n\n static override hiddenAliases: string[] = ['project:list']\n\n public async run() {\n const {order, sort} = this.flags\n\n try {\n const projects = await listProjects()\n const ordered = sortBy(\n projects.map(({createdAt, displayName, id, members = []}) => {\n const manage = getManageUrl(id)\n return [id, members.length, displayName, manage, createdAt].map(String)\n }),\n [sortFields.indexOf(sort)],\n )\n\n const rows = order === 'asc' ? ordered : ordered.toReversed()\n\n // Initialize maxWidths with the width of each header\n const maxWidths = sortFields.map((str) => size(str))\n\n // Calculate maximum width for each column\n for (const row of rows) {\n for (const [i, element] of row.entries()) {\n maxWidths[i] = Math.max(size(element), maxWidths[i])\n }\n }\n\n const printRow = (row: string[]) =>\n row.map((col, i) => `${col}`.padEnd(maxWidths[i])).join(' ')\n\n this.log(styleText('cyan', printRow(sortFields)))\n for (const row of rows) this.log(printRow(row))\n } catch (error) {\n projectsDebug('Error listing projects', error)\n this.error('Failed to list projects', {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["styleText","Flags","exitCodes","SanityCommand","subdebug","size","sortBy","getManageUrl","listProjects","sortFields","projectsDebug","List","description","examples","command","flags","order","string","default","options","sort","hiddenAliases","run","projects","ordered","map","createdAt","displayName","id","members","manage","length","String","indexOf","rows","toReversed","maxWidths","str","row","i","element","entries","Math","max","printRow","col","padEnd","join","log","error","exit","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACnE,OAAOC,UAAU,oBAAmB;AACpC,OAAOC,YAAY,sBAAqB;AAExC,SAAQC,YAAY,QAAO,yCAAwC;AACnE,SAAQC,YAAY,QAAO,6BAA4B;AAEvD,MAAMC,aAAa;IAAC;IAAM;IAAW;IAAQ;IAAO;CAAU;AAE9D,MAAMC,gBAAgBN,SAAS;AAE/B,OAAO,MAAMO,aAAaR;IACxB,OAAgBS,cAAc,qBAAoB;IAClD,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtBC,OAAOf,MAAMgB,MAAM,CAAC;YAClBC,SAAS;YACTN,aAAa;YACbO,SAAS;gBAAC;gBAAO;aAAO;QAC1B;QACAC,MAAMnB,MAAMgB,MAAM,CAAC;YACjBC,SAAS;YACTN,aAAa;YACbO,SAASV;QACX;IACF,EAAC;IAED,OAAgBY,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAM;QACjB,MAAM,EAACN,KAAK,EAAEI,IAAI,EAAC,GAAG,IAAI,CAACL,KAAK;QAEhC,IAAI;YACF,MAAMQ,WAAW,MAAMf;YACvB,MAAMgB,UAAUlB,OACdiB,SAASE,GAAG,CAAC,CAAC,EAACC,SAAS,EAAEC,WAAW,EAAEC,EAAE,EAAEC,UAAU,EAAE,EAAC;gBACtD,MAAMC,SAASvB,aAAaqB;gBAC5B,OAAO;oBAACA;oBAAIC,QAAQE,MAAM;oBAAEJ;oBAAaG;oBAAQJ;iBAAU,CAACD,GAAG,CAACO;YAClE,IACA;gBAACvB,WAAWwB,OAAO,CAACb;aAAM;YAG5B,MAAMc,OAAOlB,UAAU,QAAQQ,UAAUA,QAAQW,UAAU;YAE3D,qDAAqD;YACrD,MAAMC,YAAY3B,WAAWgB,GAAG,CAAC,CAACY,MAAQhC,KAAKgC;YAE/C,0CAA0C;YAC1C,KAAK,MAAMC,OAAOJ,KAAM;gBACtB,KAAK,MAAM,CAACK,GAAGC,QAAQ,IAAIF,IAAIG,OAAO,GAAI;oBACxCL,SAAS,CAACG,EAAE,GAAGG,KAAKC,GAAG,CAACtC,KAAKmC,UAAUJ,SAAS,CAACG,EAAE;gBACrD;YACF;YAEA,MAAMK,WAAW,CAACN,MAChBA,IAAIb,GAAG,CAAC,CAACoB,KAAKN,IAAM,GAAGM,KAAK,CAACC,MAAM,CAACV,SAAS,CAACG,EAAE,GAAGQ,IAAI,CAAC;YAE1D,IAAI,CAACC,GAAG,CAAChD,UAAU,QAAQ4C,SAASnC;YACpC,KAAK,MAAM6B,OAAOJ,KAAM,IAAI,CAACc,GAAG,CAACJ,SAASN;QAC5C,EAAE,OAAOW,OAAO;YACdvC,cAAc,0BAA0BuC;YACxC,IAAI,CAACA,KAAK,CAAC,2BAA2B;gBAACC,MAAMhD,UAAUiD,aAAa;YAAA;QACtE;IACF;AACF"}
@@ -100,12 +100,12 @@ export class DeleteSchemaCommand extends SanityCommand {
100
100
  } catch (error) {
101
101
  if (error instanceof CLIError) {
102
102
  this.error(error.message, {
103
- exit: 1
103
+ exit: exitCodes.RUNTIME_ERROR
104
104
  });
105
105
  }
106
106
  deleteSchemaDebug('Error deleting schemas', error);
107
107
  this.error(`Failed to delete schemas: ${error instanceof Error ? error.message : String(error)}`, {
108
- exit: 1
108
+ exit: exitCodes.RUNTIME_ERROR
109
109
  });
110
110
  }
111
111
  }