@sanity/cli 7.9.0 → 7.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +163 -22
  2. package/dist/actions/auth/ensureAuthenticated.js +2 -0
  3. package/dist/actions/auth/ensureAuthenticated.js.map +1 -1
  4. package/dist/actions/auth/login/getProvider.js +7 -2
  5. package/dist/actions/auth/login/getProvider.js.map +1 -1
  6. package/dist/actions/auth/login/loginInstructions.js +19 -0
  7. package/dist/actions/auth/login/loginInstructions.js.map +1 -0
  8. package/dist/actions/dataset/create.js +2 -2
  9. package/dist/actions/dataset/create.js.map +1 -1
  10. package/dist/actions/dataset/resolveDataset.js +7 -1
  11. package/dist/actions/dataset/resolveDataset.js.map +1 -1
  12. package/dist/actions/deploy/createUserApplication.js +8 -5
  13. package/dist/actions/deploy/createUserApplication.js.map +1 -1
  14. package/dist/actions/deploy/deployApp.js +47 -24
  15. package/dist/actions/deploy/deployApp.js.map +1 -1
  16. package/dist/actions/deploy/deployStudio.js +2 -0
  17. package/dist/actions/deploy/deployStudio.js.map +1 -1
  18. package/dist/actions/graphql/resolveApiGeneration.js +9 -6
  19. package/dist/actions/graphql/resolveApiGeneration.js.map +1 -1
  20. package/dist/actions/init/initAction.js +23 -15
  21. package/dist/actions/init/initAction.js.map +1 -1
  22. package/dist/actions/manifest/extractCoreAppManifest.js +11 -4
  23. package/dist/actions/manifest/extractCoreAppManifest.js.map +1 -1
  24. package/dist/actions/migration/constants.js +10 -0
  25. package/dist/actions/migration/constants.js.map +1 -0
  26. package/dist/actions/migration/ensureApiVersionFormat.js +16 -0
  27. package/dist/actions/migration/ensureApiVersionFormat.js.map +1 -0
  28. package/dist/actions/migration/fileExists.js +13 -0
  29. package/dist/actions/migration/fileExists.js.map +1 -0
  30. package/dist/actions/migration/prettyMutationFormatter.js +155 -0
  31. package/dist/actions/migration/prettyMutationFormatter.js.map +1 -0
  32. package/dist/actions/migration/resolveMigrationScript.js +75 -0
  33. package/dist/actions/migration/resolveMigrationScript.js.map +1 -0
  34. package/dist/actions/migration/resolveMigrations.js +50 -0
  35. package/dist/actions/migration/resolveMigrations.js.map +1 -0
  36. package/dist/actions/migration/templates/index.js +7 -0
  37. package/dist/actions/migration/templates/index.js.map +1 -0
  38. package/dist/actions/migration/templates/minimalAdvanced.js +21 -0
  39. package/dist/actions/migration/templates/minimalAdvanced.js.map +1 -0
  40. package/dist/actions/migration/templates/minimalSimple.js +61 -0
  41. package/dist/actions/migration/templates/minimalSimple.js.map +1 -0
  42. package/dist/actions/migration/templates/renameField.js +20 -0
  43. package/dist/actions/migration/templates/renameField.js.map +1 -0
  44. package/dist/actions/migration/templates/renameType.js +19 -0
  45. package/dist/actions/migration/templates/renameType.js.map +1 -0
  46. package/dist/actions/migration/templates/stringToPTE.js +32 -0
  47. package/dist/actions/migration/templates/stringToPTE.js.map +1 -0
  48. package/dist/actions/migration/tree.js +111 -0
  49. package/dist/actions/migration/tree.js.map +1 -0
  50. package/dist/actions/organizations/getOrganization.js +7 -3
  51. package/dist/actions/organizations/getOrganization.js.map +1 -1
  52. package/dist/actions/organizations/validateOrganizationSlug.js +20 -0
  53. package/dist/actions/organizations/validateOrganizationSlug.js.map +1 -0
  54. package/dist/actions/preview/previewAction.js +33 -1
  55. package/dist/actions/preview/previewAction.js.map +1 -1
  56. package/dist/actions/schema/listSchemas.js +6 -4
  57. package/dist/actions/schema/listSchemas.js.map +1 -1
  58. package/dist/actions/tokens/validateRole.js +2 -1
  59. package/dist/actions/tokens/validateRole.js.map +1 -1
  60. package/dist/actions/undeploy/runUndeploy.js +13 -4
  61. package/dist/actions/undeploy/runUndeploy.js.map +1 -1
  62. package/dist/commands/backups/disable.js +5 -1
  63. package/dist/commands/backups/disable.js.map +1 -1
  64. package/dist/commands/backups/download.js +30 -6
  65. package/dist/commands/backups/download.js.map +1 -1
  66. package/dist/commands/backups/enable.js +5 -1
  67. package/dist/commands/backups/enable.js.map +1 -1
  68. package/dist/commands/backups/list.js +5 -1
  69. package/dist/commands/backups/list.js.map +1 -1
  70. package/dist/commands/cors/add.js +15 -7
  71. package/dist/commands/cors/add.js.map +1 -1
  72. package/dist/commands/cors/delete.js +6 -1
  73. package/dist/commands/cors/delete.js.map +1 -1
  74. package/dist/commands/datasets/alias/create.js +25 -18
  75. package/dist/commands/datasets/alias/create.js.map +1 -1
  76. package/dist/commands/datasets/alias/delete.js +15 -8
  77. package/dist/commands/datasets/alias/delete.js.map +1 -1
  78. package/dist/commands/datasets/alias/link.js +39 -17
  79. package/dist/commands/datasets/alias/link.js.map +1 -1
  80. package/dist/commands/datasets/alias/unlink.js +23 -2
  81. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  82. package/dist/commands/datasets/copy.js +18 -2
  83. package/dist/commands/datasets/copy.js.map +1 -1
  84. package/dist/commands/datasets/create.js +8 -2
  85. package/dist/commands/datasets/create.js.map +1 -1
  86. package/dist/commands/datasets/delete.js +14 -17
  87. package/dist/commands/datasets/delete.js.map +1 -1
  88. package/dist/commands/datasets/embeddings/disable.js +3 -0
  89. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  90. package/dist/commands/datasets/embeddings/enable.js +5 -2
  91. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  92. package/dist/commands/datasets/embeddings/status.js +3 -0
  93. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  94. package/dist/commands/datasets/export.js +27 -15
  95. package/dist/commands/datasets/export.js.map +1 -1
  96. package/dist/commands/datasets/import.js +3 -3
  97. package/dist/commands/datasets/import.js.map +1 -1
  98. package/dist/commands/datasets/visibility/get.js +2 -2
  99. package/dist/commands/datasets/visibility/get.js.map +1 -1
  100. package/dist/commands/datasets/visibility/set.js +2 -2
  101. package/dist/commands/datasets/visibility/set.js.map +1 -1
  102. package/dist/commands/docs/read.js +3 -3
  103. package/dist/commands/docs/read.js.map +1 -1
  104. package/dist/commands/documents/create.js +18 -13
  105. package/dist/commands/documents/create.js.map +1 -1
  106. package/dist/commands/documents/delete.js +3 -3
  107. package/dist/commands/documents/delete.js.map +1 -1
  108. package/dist/commands/documents/get.js +3 -3
  109. package/dist/commands/documents/get.js.map +1 -1
  110. package/dist/commands/documents/query.js +3 -3
  111. package/dist/commands/documents/query.js.map +1 -1
  112. package/dist/commands/documents/validate.js +29 -26
  113. package/dist/commands/documents/validate.js.map +1 -1
  114. package/dist/commands/graphql/deploy.js +20 -16
  115. package/dist/commands/graphql/deploy.js.map +1 -1
  116. package/dist/commands/graphql/undeploy.js +15 -18
  117. package/dist/commands/graphql/undeploy.js.map +1 -1
  118. package/dist/commands/hooks/create.js +4 -0
  119. package/dist/commands/hooks/create.js.map +1 -1
  120. package/dist/commands/hooks/delete.js +6 -1
  121. package/dist/commands/hooks/delete.js.map +1 -1
  122. package/dist/commands/hooks/logs.js +6 -1
  123. package/dist/commands/hooks/logs.js.map +1 -1
  124. package/dist/commands/install.js +1 -1
  125. package/dist/commands/install.js.map +1 -1
  126. package/dist/commands/login.js +2 -1
  127. package/dist/commands/login.js.map +1 -1
  128. package/dist/commands/media/create-aspect.js +20 -8
  129. package/dist/commands/media/create-aspect.js.map +1 -1
  130. package/dist/commands/media/delete-aspect.js +31 -16
  131. package/dist/commands/media/delete-aspect.js.map +1 -1
  132. package/dist/commands/media/deploy-aspect.js +10 -5
  133. package/dist/commands/media/deploy-aspect.js.map +1 -1
  134. package/dist/commands/media/export.js +9 -4
  135. package/dist/commands/media/export.js.map +1 -1
  136. package/dist/commands/media/import.js +6 -1
  137. package/dist/commands/media/import.js.map +1 -1
  138. package/dist/commands/migrations/create.js +150 -0
  139. package/dist/commands/migrations/create.js.map +1 -0
  140. package/dist/commands/migrations/list.js +64 -0
  141. package/dist/commands/migrations/list.js.map +1 -0
  142. package/dist/commands/migrations/run.js +306 -0
  143. package/dist/commands/migrations/run.js.map +1 -0
  144. package/dist/commands/organizations/create.js +79 -0
  145. package/dist/commands/organizations/create.js.map +1 -0
  146. package/dist/commands/organizations/delete.js +100 -0
  147. package/dist/commands/organizations/delete.js.map +1 -0
  148. package/dist/commands/organizations/get.js +48 -0
  149. package/dist/commands/organizations/get.js.map +1 -0
  150. package/dist/commands/organizations/list.js +60 -0
  151. package/dist/commands/organizations/list.js.map +1 -0
  152. package/dist/commands/organizations/update.js +115 -0
  153. package/dist/commands/organizations/update.js.map +1 -0
  154. package/dist/commands/preview.js +1 -0
  155. package/dist/commands/preview.js.map +1 -1
  156. package/dist/commands/projects/create.js +3 -1
  157. package/dist/commands/projects/create.js.map +1 -1
  158. package/dist/commands/schemas/delete.js +23 -2
  159. package/dist/commands/schemas/delete.js.map +1 -1
  160. package/dist/commands/schemas/deploy.js +6 -4
  161. package/dist/commands/schemas/deploy.js.map +1 -1
  162. package/dist/commands/schemas/extract.js +22 -1
  163. package/dist/commands/schemas/extract.js.map +1 -1
  164. package/dist/commands/schemas/list.js +8 -8
  165. package/dist/commands/schemas/list.js.map +1 -1
  166. package/dist/commands/tokens/{add.js → create.js} +25 -18
  167. package/dist/commands/tokens/create.js.map +1 -0
  168. package/dist/commands/tokens/delete.js +41 -23
  169. package/dist/commands/tokens/delete.js.map +1 -1
  170. package/dist/commands/undeploy.js +2 -7
  171. package/dist/commands/undeploy.js.map +1 -1
  172. package/dist/commands/users/invite.js +25 -3
  173. package/dist/commands/users/invite.js.map +1 -1
  174. package/dist/prompts/promptForOrganizationName.js +2 -1
  175. package/dist/prompts/promptForOrganizationName.js.map +1 -1
  176. package/dist/services/organizations.js +45 -2
  177. package/dist/services/organizations.js.map +1 -1
  178. package/dist/services/userApplications.js.map +1 -1
  179. package/dist/topicAliases.js +10 -0
  180. package/dist/topicAliases.js.map +1 -1
  181. package/dist/util/formatCliErrorMessages.js +5 -0
  182. package/dist/util/formatCliErrorMessages.js.map +1 -0
  183. package/dist/util/organizationAliases.js +12 -0
  184. package/dist/util/organizationAliases.js.map +1 -0
  185. package/oclif.config.js +6 -1
  186. package/oclif.manifest.json +464 -11
  187. package/package.json +28 -28
  188. package/dist/commands/tokens/add.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ import { styleText } from 'node:util';
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { SanityCommand, subdebug } from '@sanity/cli-core';
4
+ import { getErrorMessage } from '@sanity/cli-core/errors';
5
+ import { input, logSymbols, spinner } from '@sanity/cli-core/ux';
6
+ import { isHttpError } from '@sanity/client';
7
+ import { deleteOrganization, getOrganization } from '../../services/organizations.js';
8
+ import { organizationAliases } from '../../util/organizationAliases.js';
9
+ const deleteOrgDebug = subdebug('organizations:delete');
10
+ export class DeleteOrganizationCommand extends SanityCommand {
11
+ static args = {
12
+ organizationId: Args.string({
13
+ description: 'Organization ID to delete',
14
+ required: true
15
+ })
16
+ };
17
+ static description = 'Delete an organization';
18
+ static examples = [
19
+ {
20
+ command: '<%= config.bin %> <%= command.id %> org-abc123',
21
+ description: 'Delete an organization (prompts for confirmation)'
22
+ },
23
+ {
24
+ command: '<%= config.bin %> <%= command.id %> org-abc123 --force',
25
+ description: 'Delete an organization without confirmation'
26
+ }
27
+ ];
28
+ static flags = {
29
+ force: Flags.boolean({
30
+ description: 'Do not prompt for delete confirmation - forcefully delete',
31
+ required: false
32
+ })
33
+ };
34
+ static hiddenAliases = organizationAliases('delete');
35
+ async run() {
36
+ const { organizationId } = this.args;
37
+ const { force } = this.flags;
38
+ if (force) {
39
+ this.warn(`'--force' used: skipping confirmation, deleting organization "${organizationId}"`);
40
+ } else {
41
+ await this.confirmDeletion(organizationId);
42
+ }
43
+ const spin = spinner('Deleting organization').start();
44
+ try {
45
+ await deleteOrganization(organizationId);
46
+ spin.succeed();
47
+ this.log('Organization deleted');
48
+ } catch (error) {
49
+ spin.fail();
50
+ deleteOrgDebug('Error deleting organization', error);
51
+ if (isHttpError(error) && error.statusCode === 404) {
52
+ this.error(`Organization "${organizationId}" not found`, {
53
+ exit: 1
54
+ });
55
+ }
56
+ this.error(`Failed to delete organization: ${getErrorMessage(error)}`, {
57
+ exit: 1
58
+ });
59
+ }
60
+ }
61
+ async confirmDeletion(organizationId) {
62
+ let orgName;
63
+ try {
64
+ const org = await getOrganization(organizationId);
65
+ orgName = org.name;
66
+ } catch (error) {
67
+ const err = error instanceof Error ? error : new Error(`${error}`);
68
+ deleteOrgDebug(`Error getting organization ${organizationId}`, err);
69
+ if (isHttpError(error) && error.statusCode === 404) {
70
+ this.error(`Organization "${organizationId}" not found`, {
71
+ exit: 1
72
+ });
73
+ }
74
+ this.error(`Organization retrieval failed: ${err.message}`, {
75
+ exit: 1
76
+ });
77
+ }
78
+ this.log(styleText('yellow', `${logSymbols.warning} Deleting organization "${styleText([
79
+ 'bold',
80
+ 'underline'
81
+ ], orgName)}"\n`));
82
+ try {
83
+ await input({
84
+ message: 'Are you ABSOLUTELY sure you want to delete this organization?\n Type the name of the organization to confirm delete:',
85
+ validate: (value)=>{
86
+ const trimmed = value.trim().toLowerCase();
87
+ return trimmed === orgName.trim().toLowerCase() || 'Incorrect organization name. Ctrl + C to cancel delete.';
88
+ }
89
+ });
90
+ } catch (error) {
91
+ const err = error instanceof Error ? error : new Error(`${error}`);
92
+ deleteOrgDebug(`User cancelled`, err);
93
+ this.error(`User cancelled`, {
94
+ exit: 1
95
+ });
96
+ }
97
+ }
98
+ }
99
+
100
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +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":"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"}
@@ -0,0 +1,48 @@
1
+ import { Args } from '@oclif/core';
2
+ import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { getErrorMessage } from '@sanity/cli-core/errors';
4
+ import { isHttpError } from '@sanity/client';
5
+ import { getOrganization } from '../../services/organizations.js';
6
+ import { organizationAliases } from '../../util/organizationAliases.js';
7
+ const getOrgDebug = subdebug('organizations:get');
8
+ export class GetOrganizationCommand extends SanityCommand {
9
+ static args = {
10
+ organizationId: Args.string({
11
+ description: 'Organization ID',
12
+ required: true
13
+ })
14
+ };
15
+ static description = 'Get details of an organization';
16
+ static examples = [
17
+ {
18
+ command: '<%= config.bin %> <%= command.id %> org-abc123',
19
+ description: 'Get details of a specific organization'
20
+ }
21
+ ];
22
+ static hiddenAliases = organizationAliases('get');
23
+ async run() {
24
+ const { organizationId } = this.args;
25
+ let org;
26
+ try {
27
+ org = await getOrganization(organizationId);
28
+ } catch (error) {
29
+ getOrgDebug('Error getting organization', error);
30
+ if (isHttpError(error) && error.statusCode === 404) {
31
+ this.error(`Organization "${organizationId}" not found`, {
32
+ exit: 1
33
+ });
34
+ }
35
+ this.error(`Failed to get organization: ${getErrorMessage(error)}`, {
36
+ exit: 1
37
+ });
38
+ }
39
+ this.log(`ID: ${org.id}`);
40
+ this.log(`Name: ${org.name}`);
41
+ this.log(`Slug: ${org.slug ?? '-'}`);
42
+ this.log(`Default role: ${org.defaultRoleName ?? '-'}`);
43
+ this.log(`Created: ${org.createdAt}`);
44
+ this.log(`Updated: ${org.updatedAt}`);
45
+ }
46
+ }
47
+
48
+ //# sourceMappingURL=get.js.map
@@ -0,0 +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"}
@@ -0,0 +1,60 @@
1
+ import { SanityCommand, subdebug } from '@sanity/cli-core';
2
+ import { getErrorMessage } from '@sanity/cli-core/errors';
3
+ import { Table } from 'console-table-printer';
4
+ import { listOrganizations } from '../../services/organizations.js';
5
+ import { organizationAliases } from '../../util/organizationAliases.js';
6
+ const listOrgsDebug = subdebug('organizations:list');
7
+ export class ListOrganizationsCommand extends SanityCommand {
8
+ static description = 'List organizations you are a member of';
9
+ static examples = [
10
+ {
11
+ command: '<%= config.bin %> <%= command.id %>',
12
+ description: 'List all your organizations'
13
+ }
14
+ ];
15
+ static hiddenAliases = organizationAliases('list');
16
+ async run() {
17
+ let organizations;
18
+ try {
19
+ organizations = await listOrganizations();
20
+ } catch (error) {
21
+ listOrgsDebug('Error listing organizations', error);
22
+ this.error(`Failed to list organizations: ${getErrorMessage(error)}`, {
23
+ exit: 1
24
+ });
25
+ }
26
+ if (organizations.length === 0) {
27
+ this.log('No organizations found');
28
+ return;
29
+ }
30
+ const table = new Table({
31
+ columns: [
32
+ {
33
+ alignment: 'left',
34
+ name: 'id',
35
+ title: 'ID'
36
+ },
37
+ {
38
+ alignment: 'left',
39
+ name: 'name',
40
+ title: 'Name'
41
+ },
42
+ {
43
+ alignment: 'left',
44
+ name: 'slug',
45
+ title: 'Slug'
46
+ }
47
+ ]
48
+ });
49
+ for (const { id, name, slug } of organizations){
50
+ table.addRow({
51
+ id,
52
+ name,
53
+ slug: slug ?? '-'
54
+ });
55
+ }
56
+ table.printTable();
57
+ }
58
+ }
59
+
60
+ //# sourceMappingURL=list.js.map
@@ -0,0 +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"}
@@ -0,0 +1,115 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { getErrorMessage } from '@sanity/cli-core/errors';
4
+ import { spinner } from '@sanity/cli-core/ux';
5
+ import { isHttpError } from '@sanity/client';
6
+ import { validateOrganizationName } from '../../actions/organizations/validateOrganizationName.js';
7
+ import { validateOrganizationSlug } from '../../actions/organizations/validateOrganizationSlug.js';
8
+ import { updateOrganization } from '../../services/organizations.js';
9
+ import { organizationAliases } from '../../util/organizationAliases.js';
10
+ const updateOrgDebug = subdebug('organizations:update');
11
+ const UPDATE_FLAGS = [
12
+ 'name',
13
+ 'slug',
14
+ 'default-role'
15
+ ];
16
+ export class UpdateOrganizationCommand extends SanityCommand {
17
+ static args = {
18
+ organizationId: Args.string({
19
+ description: 'Organization ID',
20
+ required: true
21
+ })
22
+ };
23
+ static description = 'Update an organization';
24
+ static examples = [
25
+ {
26
+ command: '<%= config.bin %> <%= command.id %> org-abc123 --name "New Name"',
27
+ description: 'Rename an organization'
28
+ },
29
+ {
30
+ command: '<%= config.bin %> <%= command.id %> org-abc123 --slug new-slug',
31
+ description: 'Set the organization slug (requires authSAML feature)'
32
+ },
33
+ {
34
+ command: '<%= config.bin %> <%= command.id %> org-abc123 --default-role viewer',
35
+ description: 'Change the default member role'
36
+ }
37
+ ];
38
+ static flags = {
39
+ 'default-role': Flags.string({
40
+ atLeastOne: [
41
+ ...UPDATE_FLAGS
42
+ ],
43
+ description: 'New default role for new members',
44
+ required: false
45
+ }),
46
+ name: Flags.string({
47
+ atLeastOne: [
48
+ ...UPDATE_FLAGS
49
+ ],
50
+ description: 'New organization name',
51
+ required: false
52
+ }),
53
+ slug: Flags.string({
54
+ atLeastOne: [
55
+ ...UPDATE_FLAGS
56
+ ],
57
+ description: 'New URL slug (requires authSAML feature on the organization)',
58
+ required: false
59
+ })
60
+ };
61
+ static hiddenAliases = organizationAliases('update');
62
+ async run() {
63
+ const { organizationId } = this.args;
64
+ const { 'default-role': defaultRole, name, slug } = this.flags;
65
+ const params = {};
66
+ if (name !== undefined) {
67
+ const trimmedName = name.trim();
68
+ const validation = validateOrganizationName(trimmedName);
69
+ if (validation !== true) {
70
+ this.error(validation, {
71
+ exit: 1
72
+ });
73
+ }
74
+ params.name = trimmedName;
75
+ }
76
+ if (slug !== undefined) {
77
+ const trimmedSlug = slug.trim();
78
+ const slugValidation = validateOrganizationSlug(trimmedSlug);
79
+ if (slugValidation !== true) {
80
+ this.error(slugValidation, {
81
+ exit: 1
82
+ });
83
+ }
84
+ params.slug = trimmedSlug;
85
+ }
86
+ if (defaultRole !== undefined) {
87
+ const trimmedRole = defaultRole.trim();
88
+ if (trimmedRole === '') {
89
+ this.error('Default role cannot be empty', {
90
+ exit: 1
91
+ });
92
+ }
93
+ params.defaultRoleName = trimmedRole;
94
+ }
95
+ const spin = spinner('Updating organization').start();
96
+ try {
97
+ await updateOrganization(organizationId, params);
98
+ spin.succeed();
99
+ this.log('Organization updated');
100
+ } catch (error) {
101
+ spin.fail();
102
+ updateOrgDebug('Error updating organization', error);
103
+ if (isHttpError(error) && error.statusCode === 404) {
104
+ this.error(`Organization "${organizationId}" not found`, {
105
+ exit: 1
106
+ });
107
+ }
108
+ this.error(`Failed to update organization: ${getErrorMessage(error)}`, {
109
+ exit: 1
110
+ });
111
+ }
112
+ }
113
+ }
114
+
115
+ //# sourceMappingURL=update.js.map
@@ -0,0 +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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"}
@@ -39,6 +39,7 @@ export class PreviewCommand extends SanityCommand {
39
39
  cliConfig,
40
40
  flags,
41
41
  outDir,
42
+ output: this.output,
42
43
  workDir
43
44
  });
44
45
  } catch (error) {
@@ -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 | 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, 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","error","suggestions","Error","name","undefined","message","String","output","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,MAAqC;QAChD,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;gBAAQP;YAAO;QAC/D,EAAE,OAAOQ,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,CAACO,MAAM,CAACP,KAAK,CAAC,CAAC,gCAAgC,EAAEK,SAAS,EAAE;gBAC9DG,MAAM;gBACNP;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 {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,5 +1,6 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
2
  import { CLIError } from '@oclif/core/errors';
3
+ import { exitCodes } from '@sanity/cli-core';
3
4
  import { subdebug } from '@sanity/cli-core/debug';
4
5
  import { SanityCommand } from '@sanity/cli-core/SanityCommand';
5
6
  import { confirm, spinner } from '@sanity/cli-core/ux';
@@ -52,7 +53,7 @@ export class CreateProjectCommand extends SanityCommand {
52
53
  const datasetNameError = validateDatasetName(input);
53
54
  if (datasetNameError) {
54
55
  throw new CLIError(datasetNameError, {
55
- exit: 1
56
+ exit: exitCodes.USAGE_ERROR
56
57
  });
57
58
  }
58
59
  return input;
@@ -159,6 +160,7 @@ export class CreateProjectCommand extends SanityCommand {
159
160
  output: this.output,
160
161
  projectFeatures,
161
162
  projectId,
163
+ silent: this.flags.json,
162
164
  visibility: datasetVisibility
163
165
  });
164
166
  }
@@ -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 {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: 1})\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 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","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","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","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: 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,6 +1,7 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import { CLIError } from '@oclif/core/errors';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
4
+ import { confirm } from '@sanity/cli-core/ux';
4
5
  import { deleteSchemaAction } from '../../actions/schema/deleteSchemaAction.js';
5
6
  import { parseIds } from '../../actions/schema/utils/schemaStoreValidation.js';
6
7
  import { promptForProject } from '../../prompts/promptForProject.js';
@@ -45,6 +46,11 @@ export class DeleteSchemaCommand extends SanityCommand {
45
46
  verbose: Flags.boolean({
46
47
  default: false,
47
48
  description: 'Enable verbose logging'
49
+ }),
50
+ yes: Flags.boolean({
51
+ char: 'y',
52
+ default: false,
53
+ description: 'Delete schemas without prompting for confirmation'
48
54
  })
49
55
  };
50
56
  static hiddenAliases = [
@@ -52,9 +58,24 @@ export class DeleteSchemaCommand extends SanityCommand {
52
58
  ];
53
59
  async run() {
54
60
  const { flags } = await this.parse(DeleteSchemaCommand);
55
- const { dataset } = flags;
61
+ const { dataset, yes } = flags;
56
62
  deleteSchemaDebug('Running schema delete with flags: %O', flags);
57
63
  const ids = parseIds(flags.ids);
64
+ if (!yes && this.isUnattended()) {
65
+ this.error('Schema deletion requires confirmation. Pass `--yes` to delete the schemas.', {
66
+ exit: exitCodes.USAGE_ERROR
67
+ });
68
+ }
69
+ if (!yes) {
70
+ const confirmed = await confirm({
71
+ default: false,
72
+ message: `Delete ${ids.length} schema${ids.length === 1 ? '' : 's'}?`
73
+ });
74
+ if (!confirmed) {
75
+ this.log('Schema deletion cancelled');
76
+ this.exit(exitCodes.USER_ABORT);
77
+ }
78
+ }
58
79
  try {
59
80
  const workDir = await this.getProjectRoot();
60
81
  const projectId = await this.getProjectId({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/schemas/delete.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {deleteSchemaAction} from '../../actions/schema/deleteSchemaAction.js'\nimport {parseIds} from '../../actions/schema/utils/schemaStoreValidation.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteSchemaDebug = subdebug('schema:delete')\n\nexport class DeleteSchemaCommand extends SanityCommand<typeof DeleteSchemaCommand> {\n static override description = 'Delete schema documents by id'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName',\n description: 'Delete a single schema',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName,prefix.sanity.workspace.schema.otherWorkspace',\n description: 'Delete multiple schemas',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete schema from',\n semantics: 'override',\n }),\n ...getDatasetFlag({\n description: 'Delete schemas from a specific dataset',\n semantics: 'specify',\n }),\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Generate manifest file (disable with --no-extract-manifest)',\n hidden: true,\n }),\n ids: Flags.string({\n description: 'Comma-separated list of schema ids to delete',\n required: true,\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n hidden: true,\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:delete']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeleteSchemaCommand)\n const {dataset} = flags\n\n deleteSchemaDebug('Running schema delete with flags: %O', flags)\n\n const ids = parseIds(flags.ids)\n\n try {\n const workDir = await this.getProjectRoot()\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'deployStudio', permission: 'sanity.project'}],\n }),\n })\n\n await deleteSchemaAction({\n configPath: workDir.path,\n dataset,\n ids,\n output: this.output,\n projectId,\n verbose: flags['verbose'],\n workDir: workDir.directory,\n })\n } catch (error) {\n if (error instanceof CLIError) {\n this.error(error.message, {exit: 1})\n }\n\n deleteSchemaDebug('Error deleting schemas', error)\n this.error(\n `Failed to delete schemas: ${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Flags","CLIError","SanityCommand","subdebug","deleteSchemaAction","parseIds","promptForProject","getDatasetFlag","getProjectIdFlag","deleteSchemaDebug","DeleteSchemaCommand","description","examples","command","flags","semantics","boolean","allowNo","default","hidden","ids","string","required","directory","verbose","hiddenAliases","run","parse","dataset","workDir","getProjectRoot","projectId","getProjectId","fallback","requiredPermissions","grant","permission","configPath","path","output","error","message","exit","Error","String"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,kBAAkB,QAAO,6CAA4C;AAC7E,SAAQC,QAAQ,QAAO,sDAAqD;AAC5E,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,cAAc,EAAEC,gBAAgB,QAAO,4BAA2B;AAE1E,MAAMC,oBAAoBN,SAAS;AAEnC,OAAO,MAAMO,4BAA4BR;IACvC,OAAgBS,cAAc,gCAA+B;IAE7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SACE;YACFF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;QACF,GAAGR,eAAe;YAChBI,aAAa;YACbI,WAAW;QACb,EAAE;QACF,oBAAoBf,MAAMgB,OAAO,CAAC;YAChCC,SAAS;YACTC,SAAS;YACTP,aAAa;YACbQ,QAAQ;QACV;QACAC,KAAKpB,MAAMqB,MAAM,CAAC;YAChBV,aAAa;YACbW,UAAU;QACZ;QACA,gBAAgBtB,MAAMuB,SAAS,CAAC;YAC9BL,SAAS;YACTP,aAAa;YACbQ,QAAQ;QACV;QACAK,SAASxB,MAAMgB,OAAO,CAAC;YACrBE,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,OAAgBc,gBAA0B;QAAC;KAAgB,CAAA;IAE3D,MAAaC,MAAqB;QAChC,MAAM,EAACZ,KAAK,EAAC,GAAG,MAAM,IAAI,CAACa,KAAK,CAACjB;QACjC,MAAM,EAACkB,OAAO,EAAC,GAAGd;QAElBL,kBAAkB,wCAAwCK;QAE1D,MAAMM,MAAMf,SAASS,MAAMM,GAAG;QAE9B,IAAI;YACF,MAAMS,UAAU,MAAM,IAAI,CAACC,cAAc;YACzC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;gBACxCC,UAAU,IACR3B,iBAAiB;wBACf4B,qBAAqB;4BAAC;gCAACC,OAAO;gCAAgBC,YAAY;4BAAgB;yBAAE;oBAC9E;YACJ;YAEA,MAAMhC,mBAAmB;gBACvBiC,YAAYR,QAAQS,IAAI;gBACxBV;gBACAR;gBACAmB,QAAQ,IAAI,CAACA,MAAM;gBACnBR;gBACAP,SAASV,KAAK,CAAC,UAAU;gBACzBe,SAASA,QAAQN,SAAS;YAC5B;QACF,EAAE,OAAOiB,OAAO;YACd,IAAIA,iBAAiBvC,UAAU;gBAC7B,IAAI,CAACuC,KAAK,CAACA,MAAMC,OAAO,EAAE;oBAACC,MAAM;gBAAC;YACpC;YAEAjC,kBAAkB,0BAA0B+B;YAC5C,IAAI,CAACA,KAAK,CACR,CAAC,0BAA0B,EAAEA,iBAAiBG,QAAQH,MAAMC,OAAO,GAAGG,OAAOJ,QAAQ,EACrF;gBAACE,MAAM;YAAC;QAEZ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/schemas/delete.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deleteSchemaAction} from '../../actions/schema/deleteSchemaAction.js'\nimport {parseIds} from '../../actions/schema/utils/schemaStoreValidation.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteSchemaDebug = subdebug('schema:delete')\n\nexport class DeleteSchemaCommand extends SanityCommand<typeof DeleteSchemaCommand> {\n static override description = 'Delete schema documents by id'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName',\n description: 'Delete a single schema',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> --ids sanity.workspace.schema.workspaceName,prefix.sanity.workspace.schema.otherWorkspace',\n description: 'Delete multiple schemas',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete schema from',\n semantics: 'override',\n }),\n ...getDatasetFlag({\n description: 'Delete schemas from a specific dataset',\n semantics: 'specify',\n }),\n 'extract-manifest': Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Generate manifest file (disable with --no-extract-manifest)',\n hidden: true,\n }),\n ids: Flags.string({\n description: 'Comma-separated list of schema ids to delete',\n required: true,\n }),\n 'manifest-dir': Flags.directory({\n default: './dist/static',\n description: 'Directory containing manifest file',\n hidden: true,\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description: 'Delete schemas without prompting for confirmation',\n }),\n }\n\n static override hiddenAliases: string[] = ['schema:delete']\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeleteSchemaCommand)\n const {dataset, yes} = flags\n\n deleteSchemaDebug('Running schema delete with flags: %O', flags)\n\n const ids = parseIds(flags.ids)\n\n if (!yes && this.isUnattended()) {\n this.error('Schema deletion requires confirmation. Pass `--yes` to delete the schemas.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n if (!yes) {\n const confirmed = await confirm({\n default: false,\n message: `Delete ${ids.length} schema${ids.length === 1 ? '' : 's'}?`,\n })\n\n if (!confirmed) {\n this.log('Schema deletion cancelled')\n this.exit(exitCodes.USER_ABORT)\n }\n }\n\n try {\n const workDir = await this.getProjectRoot()\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'deployStudio', permission: 'sanity.project'}],\n }),\n })\n\n await deleteSchemaAction({\n configPath: workDir.path,\n dataset,\n ids,\n output: this.output,\n projectId,\n verbose: flags['verbose'],\n workDir: workDir.directory,\n })\n } catch (error) {\n if (error instanceof CLIError) {\n this.error(error.message, {exit: 1})\n }\n\n deleteSchemaDebug('Error deleting schemas', error)\n this.error(\n `Failed to delete schemas: ${error instanceof Error ? error.message : String(error)}`,\n {exit: 1},\n )\n }\n }\n}\n"],"names":["Flags","CLIError","exitCodes","SanityCommand","subdebug","confirm","deleteSchemaAction","parseIds","promptForProject","getDatasetFlag","getProjectIdFlag","deleteSchemaDebug","DeleteSchemaCommand","description","examples","command","flags","semantics","boolean","allowNo","default","hidden","ids","string","required","directory","verbose","yes","char","hiddenAliases","run","parse","dataset","isUnattended","error","exit","USAGE_ERROR","confirmed","message","length","log","USER_ABORT","workDir","getProjectRoot","projectId","getProjectId","fallback","requiredPermissions","grant","permission","configPath","path","output","Error","String"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { styleText } from 'node:util';
2
2
  import { Flags } from '@oclif/core';
3
3
  import { CLIError } from '@oclif/core/errors';
4
4
  import { formatSchemaValidation, SchemaExtractionError } from '@sanity/cli-build/_internal/extract';
5
- import { SanityCommand } from '@sanity/cli-core';
5
+ import { exitCodes, SanityCommand } from '@sanity/cli-core';
6
6
  import { deploySchemas } from '../../actions/schema/deploySchemas.js';
7
7
  import { schemasDeployDebug } from '../../actions/schema/utils/debug.js';
8
8
  import { parseTag } from '../../actions/schema/utils/schemaStoreValidation.js';
@@ -49,9 +49,11 @@ export class DeploySchemaCommand extends SanityCommand {
49
49
  description: 'The name of the workspace to deploy a schema for',
50
50
  helpValue: '<name>',
51
51
  parse: async (input)=>{
52
- if (!input) throw new CLIError('workspace argument cannot be empty if specified', {
53
- exit: 1
54
- });
52
+ if (!input) {
53
+ throw new CLIError('Workspace name cannot be empty. Pass a value with `--workspace <name>`.', {
54
+ exit: exitCodes.USAGE_ERROR
55
+ });
56
+ }
55
57
  return input;
56
58
  }
57
59
  })