@sanity/cli 6.0.0-alpha.4 → 6.0.0-alpha.5

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 (291) hide show
  1. package/dist/actions/dev/startStudioDevServer.js +3 -8
  2. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  3. package/dist/actions/dev/types.d.ts +1 -3
  4. package/dist/actions/dev/types.js.map +1 -1
  5. package/dist/actions/documents/validate.d.ts +0 -2
  6. package/dist/actions/documents/validate.js +21 -1
  7. package/dist/actions/documents/validate.js.map +1 -1
  8. package/dist/actions/exec/execScript.js +1 -1
  9. package/dist/actions/exec/execScript.js.map +1 -1
  10. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
  11. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
  12. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  13. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  14. package/dist/actions/manifest/extractManifest.js +1 -4
  15. package/dist/actions/manifest/extractManifest.js.map +1 -1
  16. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  17. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  18. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  19. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  20. package/dist/actions/schema/deploySchemas.js +98 -0
  21. package/dist/actions/schema/deploySchemas.js.map +1 -0
  22. package/dist/actions/schema/listSchemas.d.ts +12 -0
  23. package/dist/actions/schema/listSchemas.js +119 -0
  24. package/dist/actions/schema/listSchemas.js.map +1 -0
  25. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  26. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  27. package/dist/actions/schema/utils/debug.d.ts +2 -0
  28. package/dist/actions/schema/utils/debug.js +5 -0
  29. package/dist/actions/schema/utils/debug.js.map +1 -0
  30. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  31. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  32. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  33. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  34. package/dist/actions/schema/utils/manifestReader.js +6 -12
  35. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  36. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  37. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  38. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  39. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  40. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  41. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  42. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  43. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  44. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  45. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  46. package/dist/actions/users/getMembersForProject.js +6 -17
  47. package/dist/actions/users/getMembersForProject.js.map +1 -1
  48. package/dist/actions/users/types.d.ts +0 -11
  49. package/dist/actions/users/types.js.map +1 -1
  50. package/dist/commands/__tests__/debug.test.js +113 -220
  51. package/dist/commands/__tests__/debug.test.js.map +1 -1
  52. package/dist/commands/__tests__/deploy.test.js +325 -293
  53. package/dist/commands/__tests__/deploy.test.js.map +1 -1
  54. package/dist/commands/__tests__/dev.test.js +62 -19
  55. package/dist/commands/__tests__/dev.test.js.map +1 -1
  56. package/dist/commands/__tests__/init/init.authentication.test.js +40 -27
  57. package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -1
  58. package/dist/commands/__tests__/init/init.create-new-project.test.js +84 -85
  59. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -1
  60. package/dist/commands/__tests__/init/init.plan.test.js +103 -44
  61. package/dist/commands/__tests__/init/init.plan.test.js.map +1 -1
  62. package/dist/commands/__tests__/init/init.setup.test.js +85 -29
  63. package/dist/commands/__tests__/init/init.setup.test.js.map +1 -1
  64. package/dist/commands/__tests__/install.test.js +46 -22
  65. package/dist/commands/__tests__/install.test.js.map +1 -1
  66. package/dist/commands/__tests__/logout.test.js +8 -5
  67. package/dist/commands/__tests__/logout.test.js.map +1 -1
  68. package/dist/commands/__tests__/manage.test.js +29 -24
  69. package/dist/commands/__tests__/manage.test.js.map +1 -1
  70. package/dist/commands/__tests__/versions.test.js +22 -14
  71. package/dist/commands/__tests__/versions.test.js.map +1 -1
  72. package/dist/commands/backup/__tests__/disable.test.js +72 -75
  73. package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
  74. package/dist/commands/backup/__tests__/download.test.js +166 -77
  75. package/dist/commands/backup/__tests__/download.test.js.map +1 -1
  76. package/dist/commands/backup/__tests__/enable.test.js +109 -140
  77. package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
  78. package/dist/commands/backup/__tests__/list.test.js +84 -75
  79. package/dist/commands/backup/__tests__/list.test.js.map +1 -1
  80. package/dist/commands/backup/disable.js +5 -11
  81. package/dist/commands/backup/disable.js.map +1 -1
  82. package/dist/commands/backup/enable.js +5 -11
  83. package/dist/commands/backup/enable.js.map +1 -1
  84. package/dist/commands/backup/list.js +7 -8
  85. package/dist/commands/backup/list.js.map +1 -1
  86. package/dist/commands/cors/__tests__/add.test.js +68 -38
  87. package/dist/commands/cors/__tests__/add.test.js.map +1 -1
  88. package/dist/commands/cors/__tests__/delete.test.js +52 -37
  89. package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
  90. package/dist/commands/cors/__tests__/list.test.js +80 -57
  91. package/dist/commands/cors/__tests__/list.test.js.map +1 -1
  92. package/dist/commands/cors/add.js +5 -13
  93. package/dist/commands/cors/add.js.map +1 -1
  94. package/dist/commands/cors/delete.js +7 -15
  95. package/dist/commands/cors/delete.js.map +1 -1
  96. package/dist/commands/cors/list.js +2 -10
  97. package/dist/commands/cors/list.js.map +1 -1
  98. package/dist/commands/dataset/__tests__/copy.test.js +197 -89
  99. package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
  100. package/dist/commands/dataset/__tests__/create.test.js +147 -117
  101. package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
  102. package/dist/commands/dataset/__tests__/delete.test.js +75 -68
  103. package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
  104. package/dist/commands/dataset/__tests__/export.test.js +123 -83
  105. package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
  106. package/dist/commands/dataset/__tests__/list.test.js +107 -65
  107. package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
  108. package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
  109. package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
  110. package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
  111. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
  112. package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
  113. package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
  114. package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
  115. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
  116. package/dist/commands/dataset/export.js +4 -4
  117. package/dist/commands/dataset/export.js.map +1 -1
  118. package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
  119. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
  120. package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
  121. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
  122. package/dist/commands/dev.js +0 -1
  123. package/dist/commands/dev.js.map +1 -1
  124. package/dist/commands/docs/__tests__/search.test.js +8 -7
  125. package/dist/commands/docs/__tests__/search.test.js.map +1 -1
  126. package/dist/commands/documents/__tests__/create.test.js +328 -265
  127. package/dist/commands/documents/__tests__/create.test.js.map +1 -1
  128. package/dist/commands/documents/__tests__/delete.test.js +119 -87
  129. package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
  130. package/dist/commands/documents/__tests__/get.test.js +68 -95
  131. package/dist/commands/documents/__tests__/get.test.js.map +1 -1
  132. package/dist/commands/documents/__tests__/query.test.js +84 -189
  133. package/dist/commands/documents/__tests__/query.test.js.map +1 -1
  134. package/dist/commands/documents/__tests__/validate.test.js +52 -29
  135. package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
  136. package/dist/commands/documents/create.d.ts +1 -0
  137. package/dist/commands/documents/create.js +10 -9
  138. package/dist/commands/documents/create.js.map +1 -1
  139. package/dist/commands/documents/delete.js +2 -3
  140. package/dist/commands/documents/delete.js.map +1 -1
  141. package/dist/commands/documents/get.js +2 -3
  142. package/dist/commands/documents/get.js.map +1 -1
  143. package/dist/commands/documents/query.js +2 -3
  144. package/dist/commands/documents/query.js.map +1 -1
  145. package/dist/commands/documents/validate.js +0 -20
  146. package/dist/commands/documents/validate.js.map +1 -1
  147. package/dist/commands/graphql/__tests__/list.test.js +57 -45
  148. package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
  149. package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
  150. package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
  151. package/dist/commands/graphql/list.js +2 -2
  152. package/dist/commands/graphql/list.js.map +1 -1
  153. package/dist/commands/graphql/undeploy.js +4 -9
  154. package/dist/commands/graphql/undeploy.js.map +1 -1
  155. package/dist/commands/hook/__tests__/attempt.test.js +48 -33
  156. package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
  157. package/dist/commands/hook/__tests__/create.test.js +49 -51
  158. package/dist/commands/hook/__tests__/create.test.js.map +1 -1
  159. package/dist/commands/hook/__tests__/delete.test.js +43 -30
  160. package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
  161. package/dist/commands/hook/__tests__/list.test.js +38 -31
  162. package/dist/commands/hook/__tests__/list.test.js.map +1 -1
  163. package/dist/commands/hook/__tests__/logs.test.js +68 -40
  164. package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
  165. package/dist/commands/hook/create.js +2 -6
  166. package/dist/commands/hook/create.js.map +1 -1
  167. package/dist/commands/hook/delete.js +5 -17
  168. package/dist/commands/hook/delete.js.map +1 -1
  169. package/dist/commands/hook/list.js +2 -8
  170. package/dist/commands/hook/list.js.map +1 -1
  171. package/dist/commands/manifest/__tests__/extract.test.js +22 -13
  172. package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
  173. package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
  174. package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
  175. package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
  176. package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
  177. package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
  178. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
  179. package/dist/commands/media/__tests__/export.test.js +365 -66
  180. package/dist/commands/media/__tests__/export.test.js.map +1 -1
  181. package/dist/commands/media/__tests__/import.test.js +171 -105
  182. package/dist/commands/media/__tests__/import.test.js.map +1 -1
  183. package/dist/commands/media/export.js +2 -2
  184. package/dist/commands/media/export.js.map +1 -1
  185. package/dist/commands/media/import.js +2 -2
  186. package/dist/commands/media/import.js.map +1 -1
  187. package/dist/commands/projects/__tests__/list.test.js +5 -4
  188. package/dist/commands/projects/__tests__/list.test.js.map +1 -1
  189. package/dist/commands/projects/list.js +2 -6
  190. package/dist/commands/projects/list.js.map +1 -1
  191. package/dist/commands/schema/__tests__/delete.test.js +396 -151
  192. package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
  193. package/dist/commands/schema/__tests__/deploy.test.js +348 -0
  194. package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
  195. package/dist/commands/schema/__tests__/extract.test.js +19 -11
  196. package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
  197. package/dist/commands/schema/__tests__/list.test.js +399 -0
  198. package/dist/commands/schema/__tests__/list.test.js.map +1 -0
  199. package/dist/commands/schema/__tests__/validate.test.js +27 -10
  200. package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
  201. package/dist/commands/schema/delete.d.ts +1 -1
  202. package/dist/commands/schema/delete.js +20 -23
  203. package/dist/commands/schema/delete.js.map +1 -1
  204. package/dist/commands/schema/deploy.d.ts +16 -0
  205. package/dist/commands/schema/deploy.js +98 -0
  206. package/dist/commands/schema/deploy.js.map +1 -0
  207. package/dist/commands/schema/list.d.ts +15 -0
  208. package/dist/commands/schema/list.js +104 -0
  209. package/dist/commands/schema/list.js.map +1 -0
  210. package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
  211. package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
  212. package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
  213. package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
  214. package/dist/commands/telemetry/__tests__/status.test.js +7 -5
  215. package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
  216. package/dist/commands/tokens/__tests__/add.test.js +55 -40
  217. package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
  218. package/dist/commands/tokens/__tests__/delete.test.js +72 -42
  219. package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
  220. package/dist/commands/tokens/__tests__/list.test.js +87 -60
  221. package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
  222. package/dist/commands/tokens/add.js +3 -5
  223. package/dist/commands/tokens/add.js.map +1 -1
  224. package/dist/commands/users/__tests__/invite.test.js +100 -79
  225. package/dist/commands/users/__tests__/invite.test.js.map +1 -1
  226. package/dist/commands/users/__tests__/list.test.js +186 -180
  227. package/dist/commands/users/__tests__/list.test.js.map +1 -1
  228. package/dist/commands/users/invite.js +6 -17
  229. package/dist/commands/users/invite.js.map +1 -1
  230. package/dist/commands/users/list.js +4 -7
  231. package/dist/commands/users/list.js.map +1 -1
  232. package/dist/config/createCliConfig.d.ts +4 -4
  233. package/dist/services/backup.d.ts +8 -0
  234. package/dist/services/backup.js +19 -0
  235. package/dist/services/backup.js.map +1 -1
  236. package/dist/services/cors.d.ts +23 -0
  237. package/dist/services/cors.js +38 -0
  238. package/dist/services/cors.js.map +1 -0
  239. package/dist/services/graphql.d.ts +7 -0
  240. package/dist/services/graphql.js +11 -0
  241. package/dist/services/graphql.js.map +1 -1
  242. package/dist/services/hooks.d.ts +2 -0
  243. package/dist/services/hooks.js +19 -0
  244. package/dist/services/hooks.js.map +1 -1
  245. package/dist/services/organizations.d.ts +1 -1
  246. package/dist/services/organizations.js +1 -1
  247. package/dist/services/organizations.js.map +1 -1
  248. package/dist/services/projects.d.ts +11 -0
  249. package/dist/services/projects.js +41 -0
  250. package/dist/services/projects.js.map +1 -1
  251. package/dist/services/schemas.d.ts +4 -0
  252. package/dist/services/schemas.js +40 -0
  253. package/dist/services/schemas.js.map +1 -0
  254. package/dist/services/user.d.ts +8 -0
  255. package/dist/services/user.js +15 -2
  256. package/dist/services/user.js.map +1 -1
  257. package/dist/util/__tests__/getCliVersion.test.js +2 -2
  258. package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
  259. package/dist/util/errorMessages.d.ts +1 -0
  260. package/dist/util/errorMessages.js +1 -0
  261. package/dist/util/errorMessages.js.map +1 -1
  262. package/dist/util/getCliVersion.js +1 -1
  263. package/dist/util/getCliVersion.js.map +1 -1
  264. package/dist/util/readPackageJson.d.ts +1 -15
  265. package/dist/util/readPackageJson.js +1 -1
  266. package/dist/util/readPackageJson.js.map +1 -1
  267. package/dist/util/uniqBy.d.ts +1 -0
  268. package/dist/util/uniqBy.js +14 -0
  269. package/dist/util/uniqBy.js.map +1 -0
  270. package/oclif.manifest.json +172 -27
  271. package/package.json +27 -28
  272. package/dist/actions/cors/constants.d.ts +0 -1
  273. package/dist/actions/cors/constants.js +0 -3
  274. package/dist/actions/cors/constants.js.map +0 -1
  275. package/dist/actions/cors/types.d.ts +0 -9
  276. package/dist/actions/cors/types.js +0 -3
  277. package/dist/actions/cors/types.js.map +0 -1
  278. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  279. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  280. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  281. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  282. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  283. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  284. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  285. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  286. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  287. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  288. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  289. package/dist/actions/users/apiVersion.d.ts +0 -6
  290. package/dist/actions/users/apiVersion.js +0 -7
  291. package/dist/actions/users/apiVersion.js.map +0 -1
@@ -1,5 +1,4 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig, getProjectCliClient } from '@sanity/cli-core';
3
2
  import { select } from '@sanity/cli-core/ux';
4
3
  import { mockApi, testCommand } from '@sanity/cli-test';
5
4
  import nock from 'nock';
@@ -7,54 +6,40 @@ import { afterEach, describe, expect, test, vi } from 'vitest';
7
6
  import { BACKUP_API_VERSION } from '../../../actions/backup/constants.js';
8
7
  import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
9
8
  import { ListBackupCommand } from '../list.js';
10
- vi.mock('@sanity/cli-core/ux', async ()=>{
11
- const actual = await vi.importActual('@sanity/cli-core/ux');
9
+ const mockListDatasets = vi.hoisted(()=>vi.fn());
10
+ vi.mock('@sanity/cli-core', async (importOriginal)=>{
11
+ const actual = await importOriginal();
12
12
  return {
13
13
  ...actual,
14
- select: vi.fn()
15
- };
16
- });
17
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
18
- findProjectRoot: vi.fn().mockResolvedValue({
19
- directory: '/test/path',
20
- root: '/test/path',
21
- type: 'studio'
22
- })
23
- }));
24
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
25
- getCliConfig: vi.fn().mockResolvedValue({
26
- api: {
27
- projectId: 'test-project'
14
+ getProjectCliClient: vi.fn().mockResolvedValue({
15
+ datasets: {
16
+ list: mockListDatasets
28
17
  }
29
18
  })
30
- }));
31
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
32
- getCliToken: vi.fn().mockResolvedValue('test-token')
33
- }));
34
- vi.mock(import('../../../../../cli-core/src/services/apiClient.js'), async (importOriginal)=>{
35
- const actual = await importOriginal();
19
+ };
20
+ });
21
+ vi.mock('@sanity/cli-core/ux', async ()=>{
22
+ const actual = await vi.importActual('@sanity/cli-core/ux');
36
23
  return {
37
24
  ...actual,
38
- getProjectCliClient: vi.fn()
25
+ select: vi.fn()
39
26
  };
40
27
  });
41
- const mockGetCliConfig = vi.mocked(getCliConfig);
42
- const mockSelect = vi.mocked(select);
43
- const mockGetProjectCliClient = vi.mocked(getProjectCliClient);
44
- const setupMocksWithDatasets = (datasets = [
45
- {
46
- name: 'production'
47
- },
48
- {
49
- name: 'staging'
50
- }
51
- ])=>{
52
- mockGetProjectCliClient.mockResolvedValue({
53
- datasets: {
54
- list: vi.fn().mockResolvedValue(datasets)
28
+ const testProjectId = 'test-project';
29
+ const defaultMocks = {
30
+ cliConfig: {
31
+ api: {
32
+ projectId: testProjectId
55
33
  }
56
- });
34
+ },
35
+ projectRoot: {
36
+ directory: '/test/path',
37
+ path: '/test/path/sanity.config.ts',
38
+ type: 'studio'
39
+ },
40
+ token: 'test-token'
57
41
  };
42
+ const mockSelect = vi.mocked(select);
58
43
  const backupsResponse = {
59
44
  backups: [
60
45
  {
@@ -84,21 +69,27 @@ describe('#backup:list', ()=>{
84
69
  expect(stdout).toContain('EXAMPLES');
85
70
  });
86
71
  test('should fail when no project ID is configured', async ()=>{
87
- mockGetCliConfig.mockResolvedValueOnce({
88
- api: {}
72
+ const { error } = await testCommand(ListBackupCommand, [], {
73
+ mocks: {
74
+ ...defaultMocks,
75
+ cliConfig: {
76
+ api: {}
77
+ }
78
+ }
89
79
  });
90
- const { error } = await testCommand(ListBackupCommand, []);
91
80
  expect(error?.message).toContain(NO_PROJECT_ID);
92
81
  expect(error?.oclif?.exit).toBe(1);
93
82
  });
94
83
  test('should fail when no datasets exist', async ()=>{
95
- setupMocksWithDatasets([]);
96
- const { error } = await testCommand(ListBackupCommand, []);
84
+ mockListDatasets.mockResolvedValue([]);
85
+ const { error } = await testCommand(ListBackupCommand, [], {
86
+ mocks: defaultMocks
87
+ });
97
88
  expect(error?.message).toBe('No datasets found in this project.');
98
89
  expect(error?.oclif?.exit).toBe(1);
99
90
  });
100
91
  test('should list backups for a specified dataset', async ()=>{
101
- setupMocksWithDatasets([
92
+ mockListDatasets.mockResolvedValue([
102
93
  {
103
94
  name: 'production'
104
95
  }
@@ -109,11 +100,13 @@ describe('#backup:list', ()=>{
109
100
  query: {
110
101
  limit: '30'
111
102
  },
112
- uri: '/projects/test-project/datasets/production/backups'
103
+ uri: `/projects/${testProjectId}/datasets/production/backups`
113
104
  }).reply(200, backupsResponse);
114
105
  const { stdout } = await testCommand(ListBackupCommand, [
115
106
  'production'
116
- ]);
107
+ ], {
108
+ mocks: defaultMocks
109
+ });
117
110
  expect(stdout).toContain('RESOURCE');
118
111
  expect(stdout).toContain('CREATED AT');
119
112
  expect(stdout).toContain('BACKUP ID');
@@ -122,7 +115,7 @@ describe('#backup:list', ()=>{
122
115
  expect(stdout).toContain('backup-2');
123
116
  });
124
117
  test('should list backups with custom limit', async ()=>{
125
- setupMocksWithDatasets([
118
+ mockListDatasets.mockResolvedValue([
126
119
  {
127
120
  name: 'production'
128
121
  }
@@ -133,18 +126,20 @@ describe('#backup:list', ()=>{
133
126
  query: {
134
127
  limit: '50'
135
128
  },
136
- uri: '/projects/test-project/datasets/production/backups'
129
+ uri: `/projects/${testProjectId}/datasets/production/backups`
137
130
  }).reply(200, backupsResponse);
138
131
  const { stdout } = await testCommand(ListBackupCommand, [
139
132
  'production',
140
133
  '--limit',
141
134
  '50'
142
- ]);
135
+ ], {
136
+ mocks: defaultMocks
137
+ });
143
138
  expect(stdout).toContain('backup-1');
144
139
  expect(stdout).toContain('backup-2');
145
140
  });
146
141
  test('should list backups with date filters', async ()=>{
147
- setupMocksWithDatasets([
142
+ mockListDatasets.mockResolvedValue([
148
143
  {
149
144
  name: 'production'
150
145
  }
@@ -157,7 +152,7 @@ describe('#backup:list', ()=>{
157
152
  before: '2024-01-31',
158
153
  limit: '30'
159
154
  },
160
- uri: '/projects/test-project/datasets/production/backups'
155
+ uri: `/projects/${testProjectId}/datasets/production/backups`
161
156
  }).reply(200, backupsResponse);
162
157
  const { stdout } = await testCommand(ListBackupCommand, [
163
158
  'production',
@@ -165,12 +160,14 @@ describe('#backup:list', ()=>{
165
160
  '2024-01-01',
166
161
  '--before',
167
162
  '2024-01-31'
168
- ]);
163
+ ], {
164
+ mocks: defaultMocks
165
+ });
169
166
  expect(stdout).toContain('backup-1');
170
167
  expect(stdout).toContain('backup-2');
171
168
  });
172
169
  test('should show message when no backups found', async ()=>{
173
- setupMocksWithDatasets([
170
+ mockListDatasets.mockResolvedValue([
174
171
  {
175
172
  name: 'production'
176
173
  }
@@ -181,17 +178,19 @@ describe('#backup:list', ()=>{
181
178
  query: {
182
179
  limit: '30'
183
180
  },
184
- uri: '/projects/test-project/datasets/production/backups'
181
+ uri: `/projects/${testProjectId}/datasets/production/backups`
185
182
  }).reply(200, {
186
183
  backups: []
187
184
  });
188
185
  const { stdout } = await testCommand(ListBackupCommand, [
189
186
  'production'
190
- ]);
187
+ ], {
188
+ mocks: defaultMocks
189
+ });
191
190
  expect(stdout).toContain('No backups found.');
192
191
  });
193
192
  test('should prompt for dataset selection when no dataset is specified', async ()=>{
194
- setupMocksWithDatasets([
193
+ mockListDatasets.mockResolvedValue([
195
194
  {
196
195
  name: 'production'
197
196
  },
@@ -206,9 +205,11 @@ describe('#backup:list', ()=>{
206
205
  query: {
207
206
  limit: '30'
208
207
  },
209
- uri: '/projects/test-project/datasets/staging/backups'
208
+ uri: `/projects/${testProjectId}/datasets/staging/backups`
210
209
  }).reply(200, backupsResponse);
211
- const { stdout } = await testCommand(ListBackupCommand, []);
210
+ const { stdout } = await testCommand(ListBackupCommand, [], {
211
+ mocks: defaultMocks
212
+ });
212
213
  expect(mockSelect).toHaveBeenCalledWith({
213
214
  choices: [
214
215
  {
@@ -225,7 +226,7 @@ describe('#backup:list', ()=>{
225
226
  expect(stdout).toContain('backup-1');
226
227
  });
227
228
  test('should fail with invalid date format', async ()=>{
228
- setupMocksWithDatasets([
229
+ mockListDatasets.mockResolvedValue([
229
230
  {
230
231
  name: 'production'
231
232
  }
@@ -234,12 +235,14 @@ describe('#backup:list', ()=>{
234
235
  'production',
235
236
  '--after',
236
237
  'invalid-date'
237
- ]);
238
+ ], {
239
+ mocks: defaultMocks
240
+ });
238
241
  expect(error?.message).toContain("Invalid date format for '--after' flag");
239
242
  expect(error?.oclif?.exit).toBe(1);
240
243
  });
241
244
  test('should fail when after date is after before date', async ()=>{
242
- setupMocksWithDatasets([
245
+ mockListDatasets.mockResolvedValue([
243
246
  {
244
247
  name: 'production'
245
248
  }
@@ -250,12 +253,14 @@ describe('#backup:list', ()=>{
250
253
  '2024-01-31',
251
254
  '--before',
252
255
  '2024-01-01'
253
- ]);
256
+ ], {
257
+ mocks: defaultMocks
258
+ });
254
259
  expect(error?.message).toBe('Parsing date flags: --after date must be before --before');
255
260
  expect(error?.oclif?.exit).toBe(1);
256
261
  });
257
262
  test('should fail with invalid limit', async ()=>{
258
- setupMocksWithDatasets([
263
+ mockListDatasets.mockResolvedValue([
259
264
  {
260
265
  name: 'production'
261
266
  }
@@ -264,12 +269,14 @@ describe('#backup:list', ()=>{
264
269
  'production',
265
270
  '--limit',
266
271
  '0'
267
- ]);
272
+ ], {
273
+ mocks: defaultMocks
274
+ });
268
275
  expect(error?.message).toContain('must be an integer between 1 and');
269
276
  expect(error?.oclif?.exit).toBe(1);
270
277
  });
271
278
  test('should fail when dataset does not exist', async ()=>{
272
- setupMocksWithDatasets([
279
+ mockListDatasets.mockResolvedValue([
273
280
  {
274
281
  name: 'production'
275
282
  },
@@ -279,13 +286,15 @@ describe('#backup:list', ()=>{
279
286
  ]);
280
287
  const { error } = await testCommand(ListBackupCommand, [
281
288
  'nonexistent'
282
- ]);
289
+ ], {
290
+ mocks: defaultMocks
291
+ });
283
292
  expect(error?.message).toContain('Dataset');
284
293
  expect(error?.message).toContain('not found');
285
294
  expect(error?.oclif?.exit).toBe(1);
286
295
  });
287
296
  test('should handle API errors', async ()=>{
288
- setupMocksWithDatasets([
297
+ mockListDatasets.mockResolvedValue([
289
298
  {
290
299
  name: 'production'
291
300
  }
@@ -296,23 +305,23 @@ describe('#backup:list', ()=>{
296
305
  query: {
297
306
  limit: '30'
298
307
  },
299
- uri: '/projects/test-project/datasets/production/backups'
308
+ uri: `/projects/${testProjectId}/datasets/production/backups`
300
309
  }).reply(500, {
301
310
  message: 'Internal Server Error'
302
311
  });
303
312
  const { error } = await testCommand(ListBackupCommand, [
304
313
  'production'
305
- ]);
314
+ ], {
315
+ mocks: defaultMocks
316
+ });
306
317
  expect(error?.message).toContain('List dataset backup failed');
307
318
  expect(error?.oclif?.exit).toBe(1);
308
319
  });
309
320
  test('should handle failed dataset listing', async ()=>{
310
- mockGetProjectCliClient.mockResolvedValue({
311
- datasets: {
312
- list: vi.fn().mockRejectedValue(new Error('Server Error'))
313
- }
321
+ mockListDatasets.mockRejectedValue(new Error('Server Error'));
322
+ const { error } = await testCommand(ListBackupCommand, [], {
323
+ mocks: defaultMocks
314
324
  });
315
- const { error } = await testCommand(ListBackupCommand, []);
316
325
  expect(error?.message).toContain('Failed to list datasets');
317
326
  expect(error?.oclif?.exit).toBe(1);
318
327
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/backup/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {BACKUP_API_VERSION} from '../../../actions/backup/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {ListBackupCommand} from '../list.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock(import('../../../../../cli-core/src/services/apiClient.js'), async (importOriginal) => {\n const actual = await importOriginal()\n return {\n ...actual,\n getProjectCliClient: vi.fn(),\n }\n})\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockSelect = vi.mocked(select)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\n\nconst setupMocksWithDatasets = (datasets = [{name: 'production'}, {name: 'staging'}]) => {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockResolvedValue(datasets),\n },\n } as never)\n}\n\nconst backupsResponse = {\n backups: [\n {\n createdAt: '2024-01-15T10:30:00Z',\n id: 'backup-1',\n },\n {\n createdAt: '2024-01-14T09:20:00Z',\n id: 'backup-2',\n },\n ],\n}\n\ndescribe('#backup:list', () => {\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n vi.clearAllMocks()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['backup:list', '--help'])\n expect(stdout).toContain('List available backups for a dataset')\n expect(stdout).toContain('USAGE')\n expect(stdout).toContain('EXAMPLES')\n })\n\n test('should fail when no project ID is configured', async () => {\n mockGetCliConfig.mockResolvedValueOnce({api: {}})\n\n const {error} = await testCommand(ListBackupCommand, [])\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when no datasets exist', async () => {\n setupMocksWithDatasets([])\n\n const {error} = await testCommand(ListBackupCommand, [])\n expect(error?.message).toBe('No datasets found in this project.')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should list backups for a specified dataset', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: '/projects/test-project/datasets/production/backups',\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, ['production'])\n\n expect(stdout).toContain('RESOURCE')\n expect(stdout).toContain('CREATED AT')\n expect(stdout).toContain('BACKUP ID')\n expect(stdout).toContain('Dataset')\n expect(stdout).toContain('backup-1')\n expect(stdout).toContain('backup-2')\n })\n\n test('should list backups with custom limit', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '50'},\n uri: '/projects/test-project/datasets/production/backups',\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, ['production', '--limit', '50'])\n\n expect(stdout).toContain('backup-1')\n expect(stdout).toContain('backup-2')\n })\n\n test('should list backups with date filters', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {after: '2024-01-01', before: '2024-01-31', limit: '30'},\n uri: '/projects/test-project/datasets/production/backups',\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, [\n 'production',\n '--after',\n '2024-01-01',\n '--before',\n '2024-01-31',\n ])\n\n expect(stdout).toContain('backup-1')\n expect(stdout).toContain('backup-2')\n })\n\n test('should show message when no backups found', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: '/projects/test-project/datasets/production/backups',\n }).reply(200, {backups: []})\n\n const {stdout} = await testCommand(ListBackupCommand, ['production'])\n\n expect(stdout).toContain('No backups found.')\n })\n\n test('should prompt for dataset selection when no dataset is specified', async () => {\n setupMocksWithDatasets([{name: 'production'}, {name: 'staging'}])\n mockSelect.mockResolvedValueOnce('staging')\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: '/projects/test-project/datasets/staging/backups',\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, [])\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'production', value: 'production'},\n {name: 'staging', value: 'staging'},\n ],\n message: 'Select the dataset name:',\n })\n expect(stdout).toContain('backup-1')\n })\n\n test('should fail with invalid date format', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n const {error} = await testCommand(ListBackupCommand, ['production', '--after', 'invalid-date'])\n expect(error?.message).toContain(\"Invalid date format for '--after' flag\")\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when after date is after before date', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n const {error} = await testCommand(ListBackupCommand, [\n 'production',\n '--after',\n '2024-01-31',\n '--before',\n '2024-01-01',\n ])\n expect(error?.message).toBe('Parsing date flags: --after date must be before --before')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail with invalid limit', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n const {error} = await testCommand(ListBackupCommand, ['production', '--limit', '0'])\n expect(error?.message).toContain('must be an integer between 1 and')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when dataset does not exist', async () => {\n setupMocksWithDatasets([{name: 'production'}, {name: 'staging'}])\n\n const {error} = await testCommand(ListBackupCommand, ['nonexistent'])\n expect(error?.message).toContain('Dataset')\n expect(error?.message).toContain('not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle API errors', async () => {\n setupMocksWithDatasets([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: '/projects/test-project/datasets/production/backups',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(ListBackupCommand, ['production'])\n expect(error?.message).toContain('List dataset backup failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle failed dataset listing', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockRejectedValue(new Error('Server Error')),\n },\n } as never)\n\n const {error} = await testCommand(ListBackupCommand, [])\n expect(error?.message).toContain('Failed to list datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","BACKUP_API_VERSION","NO_PROJECT_ID","ListBackupCommand","mock","actual","importActual","fn","findProjectRoot","mockResolvedValue","directory","root","type","api","projectId","getCliToken","importOriginal","mockGetCliConfig","mocked","mockSelect","mockGetProjectCliClient","setupMocksWithDatasets","datasets","name","list","backupsResponse","backups","createdAt","id","pending","pendingMocks","cleanAll","clearAllMocks","toEqual","stdout","toContain","mockResolvedValueOnce","error","message","oclif","exit","toBe","apiVersion","method","query","limit","uri","reply","after","before","toHaveBeenCalledWith","choices","value","mockRejectedValue","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/backup/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {BACKUP_API_VERSION} from '../../../actions/backup/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {ListBackupCommand} from '../list.js'\n\nconst mockListDatasets = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n list: mockListDatasets,\n } as never,\n }),\n }\n})\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nconst mockSelect = vi.mocked(select)\n\nconst backupsResponse = {\n backups: [\n {\n createdAt: '2024-01-15T10:30:00Z',\n id: 'backup-1',\n },\n {\n createdAt: '2024-01-14T09:20:00Z',\n id: 'backup-2',\n },\n ],\n}\n\ndescribe('#backup:list', () => {\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n vi.clearAllMocks()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['backup:list', '--help'])\n expect(stdout).toContain('List available backups for a dataset')\n expect(stdout).toContain('USAGE')\n expect(stdout).toContain('EXAMPLES')\n })\n\n test('should fail when no project ID is configured', async () => {\n const {error} = await testCommand(ListBackupCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {}},\n },\n })\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when no datasets exist', async () => {\n mockListDatasets.mockResolvedValue([])\n\n const {error} = await testCommand(ListBackupCommand, [], {\n mocks: defaultMocks,\n })\n expect(error?.message).toBe('No datasets found in this project.')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should list backups for a specified dataset', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: `/projects/${testProjectId}/datasets/production/backups`,\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, ['production'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('RESOURCE')\n expect(stdout).toContain('CREATED AT')\n expect(stdout).toContain('BACKUP ID')\n expect(stdout).toContain('Dataset')\n expect(stdout).toContain('backup-1')\n expect(stdout).toContain('backup-2')\n })\n\n test('should list backups with custom limit', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '50'},\n uri: `/projects/${testProjectId}/datasets/production/backups`,\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, ['production', '--limit', '50'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('backup-1')\n expect(stdout).toContain('backup-2')\n })\n\n test('should list backups with date filters', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {after: '2024-01-01', before: '2024-01-31', limit: '30'},\n uri: `/projects/${testProjectId}/datasets/production/backups`,\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(\n ListBackupCommand,\n ['production', '--after', '2024-01-01', '--before', '2024-01-31'],\n {\n mocks: defaultMocks,\n },\n )\n\n expect(stdout).toContain('backup-1')\n expect(stdout).toContain('backup-2')\n })\n\n test('should show message when no backups found', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: `/projects/${testProjectId}/datasets/production/backups`,\n }).reply(200, {backups: []})\n\n const {stdout} = await testCommand(ListBackupCommand, ['production'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('No backups found.')\n })\n\n test('should prompt for dataset selection when no dataset is specified', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}, {name: 'staging'}])\n mockSelect.mockResolvedValueOnce('staging')\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: `/projects/${testProjectId}/datasets/staging/backups`,\n }).reply(200, backupsResponse)\n\n const {stdout} = await testCommand(ListBackupCommand, [], {\n mocks: defaultMocks,\n })\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'production', value: 'production'},\n {name: 'staging', value: 'staging'},\n ],\n message: 'Select the dataset name:',\n })\n expect(stdout).toContain('backup-1')\n })\n\n test('should fail with invalid date format', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n const {error} = await testCommand(\n ListBackupCommand,\n ['production', '--after', 'invalid-date'],\n {\n mocks: defaultMocks,\n },\n )\n expect(error?.message).toContain(\"Invalid date format for '--after' flag\")\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when after date is after before date', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n const {error} = await testCommand(\n ListBackupCommand,\n ['production', '--after', '2024-01-31', '--before', '2024-01-01'],\n {\n mocks: defaultMocks,\n },\n )\n expect(error?.message).toBe('Parsing date flags: --after date must be before --before')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail with invalid limit', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n const {error} = await testCommand(ListBackupCommand, ['production', '--limit', '0'], {\n mocks: defaultMocks,\n })\n expect(error?.message).toContain('must be an integer between 1 and')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when dataset does not exist', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}, {name: 'staging'}])\n\n const {error} = await testCommand(ListBackupCommand, ['nonexistent'], {\n mocks: defaultMocks,\n })\n expect(error?.message).toContain('Dataset')\n expect(error?.message).toContain('not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle API errors', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '30'},\n uri: `/projects/${testProjectId}/datasets/production/backups`,\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(ListBackupCommand, ['production'], {\n mocks: defaultMocks,\n })\n expect(error?.message).toContain('List dataset backup failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle failed dataset listing', async () => {\n mockListDatasets.mockRejectedValue(new Error('Server Error'))\n\n const {error} = await testCommand(ListBackupCommand, [], {\n mocks: defaultMocks,\n })\n expect(error?.message).toContain('Failed to list datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","BACKUP_API_VERSION","NO_PROJECT_ID","ListBackupCommand","mockListDatasets","hoisted","fn","mock","importOriginal","actual","getProjectCliClient","mockResolvedValue","datasets","list","importActual","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockSelect","mocked","backupsResponse","backups","createdAt","id","pending","pendingMocks","cleanAll","clearAllMocks","toEqual","stdout","toContain","error","mocks","message","oclif","exit","toBe","name","apiVersion","method","query","limit","uri","reply","after","before","mockResolvedValueOnce","toHaveBeenCalledWith","choices","value","mockRejectedValue","Error"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,MAAM,QAAO,sBAAqB;AAC1C,SAAQC,OAAO,EAAEC,WAAW,QAAO,mBAAkB;AACrD,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,kBAAkB,QAAO,uCAAsC;AACvE,SAAQC,aAAa,QAAO,iCAAgC;AAC5D,SAAQC,iBAAiB,QAAO,aAAY;AAE5C,MAAMC,mBAAmBJ,GAAGK,OAAO,CAAC,IAAML,GAAGM,EAAE;AAE/CN,GAAGO,IAAI,CAAC,oBAAoB,OAAOC;IACjC,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACL,GAAGC,MAAM;QACTC,qBAAqBV,GAAGM,EAAE,GAAGK,iBAAiB,CAAC;YAC7CC,UAAU;gBACRC,MAAMT;YACR;QACF;IACF;AACF;AAEAJ,GAAGO,IAAI,CAAC,uBAAuB;IAC7B,MAAME,SAAS,MAAMT,GAAGc,YAAY,CAAuC;IAC3E,OAAO;QACL,GAAGL,MAAM;QACTjB,QAAQQ,GAAGM,EAAE;IACf;AACF;AAEA,MAAMS,gBAAgB;AAEtB,MAAMC,eAAe;IACnBC,WAAW;QAACC,KAAK;YAACC,WAAWJ;QAAa;IAAC;IAC3CK,aAAa;QACXC,WAAW;QACXC,MAAM;QACNC,MAAM;IACR;IACAC,OAAO;AACT;AAEA,MAAMC,aAAazB,GAAG0B,MAAM,CAAClC;AAE7B,MAAMmC,kBAAkB;IACtBC,SAAS;QACP;YACEC,WAAW;YACXC,IAAI;QACN;QACA;YACED,WAAW;YACXC,IAAI;QACN;KACD;AACH;AAEAjC,SAAS,gBAAgB;IACvBD,UAAU;QACR,MAAMmC,UAAUpC,KAAKqC,YAAY;QACjCrC,KAAKsC,QAAQ;QACbjC,GAAGkC,aAAa;QAChBpC,OAAOiC,SAAS,iBAAiBI,OAAO,CAAC,EAAE;IAC7C;IAEApC,KAAK,gBAAgB;QACnB,MAAM,EAACqC,MAAM,EAAC,GAAG,MAAM7C,WAAW;YAAC;YAAe;SAAS;QAC3DO,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;IAC3B;IAEAtC,KAAK,gDAAgD;QACnD,MAAM,EAACuC,KAAK,EAAC,GAAG,MAAM5C,YAAYS,mBAAmB,EAAE,EAAE;YACvDoC,OAAO;gBACL,GAAGvB,YAAY;gBACfC,WAAW;oBAACC,KAAK,CAAC;gBAAC;YACrB;QACF;QACApB,OAAOwC,OAAOE,SAASH,SAAS,CAACnC;QACjCJ,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,sCAAsC;QACzCK,iBAAiBO,iBAAiB,CAAC,EAAE;QAErC,MAAM,EAAC2B,KAAK,EAAC,GAAG,MAAM5C,YAAYS,mBAAmB,EAAE,EAAE;YACvDoC,OAAOvB;QACT;QACAlB,OAAOwC,OAAOE,SAASG,IAAI,CAAC;QAC5B7C,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,+CAA+C;QAClDK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzDnD,QAAQ;YACNoD,YAAY5C;YACZ6C,QAAQ;YACRC,OAAO;gBAACC,OAAO;YAAI;YACnBC,KAAK,CAAC,UAAU,EAAElC,cAAc,4BAA4B,CAAC;QAC/D,GAAGmC,KAAK,CAAC,KAAKvB;QAEd,MAAM,EAACS,MAAM,EAAC,GAAG,MAAM1C,YAAYS,mBAAmB;YAAC;SAAa,EAAE;YACpEoC,OAAOvB;QACT;QAEAlB,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;IAC3B;IAEAtC,KAAK,yCAAyC;QAC5CK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzDnD,QAAQ;YACNoD,YAAY5C;YACZ6C,QAAQ;YACRC,OAAO;gBAACC,OAAO;YAAI;YACnBC,KAAK,CAAC,UAAU,EAAElC,cAAc,4BAA4B,CAAC;QAC/D,GAAGmC,KAAK,CAAC,KAAKvB;QAEd,MAAM,EAACS,MAAM,EAAC,GAAG,MAAM1C,YAAYS,mBAAmB;YAAC;YAAc;YAAW;SAAK,EAAE;YACrFoC,OAAOvB;QACT;QAEAlB,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;IAC3B;IAEAtC,KAAK,yCAAyC;QAC5CK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzDnD,QAAQ;YACNoD,YAAY5C;YACZ6C,QAAQ;YACRC,OAAO;gBAACI,OAAO;gBAAcC,QAAQ;gBAAcJ,OAAO;YAAI;YAC9DC,KAAK,CAAC,UAAU,EAAElC,cAAc,4BAA4B,CAAC;QAC/D,GAAGmC,KAAK,CAAC,KAAKvB;QAEd,MAAM,EAACS,MAAM,EAAC,GAAG,MAAM1C,YACrBS,mBACA;YAAC;YAAc;YAAW;YAAc;YAAY;SAAa,EACjE;YACEoC,OAAOvB;QACT;QAGFlB,OAAOsC,QAAQC,SAAS,CAAC;QACzBvC,OAAOsC,QAAQC,SAAS,CAAC;IAC3B;IAEAtC,KAAK,6CAA6C;QAChDK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzDnD,QAAQ;YACNoD,YAAY5C;YACZ6C,QAAQ;YACRC,OAAO;gBAACC,OAAO;YAAI;YACnBC,KAAK,CAAC,UAAU,EAAElC,cAAc,4BAA4B,CAAC;QAC/D,GAAGmC,KAAK,CAAC,KAAK;YAACtB,SAAS,EAAE;QAAA;QAE1B,MAAM,EAACQ,MAAM,EAAC,GAAG,MAAM1C,YAAYS,mBAAmB;YAAC;SAAa,EAAE;YACpEoC,OAAOvB;QACT;QAEAlB,OAAOsC,QAAQC,SAAS,CAAC;IAC3B;IAEAtC,KAAK,oEAAoE;QACvEK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;YAAG;gBAACA,MAAM;YAAS;SAAE;QAC5EnB,WAAW4B,qBAAqB,CAAC;QAEjC5D,QAAQ;YACNoD,YAAY5C;YACZ6C,QAAQ;YACRC,OAAO;gBAACC,OAAO;YAAI;YACnBC,KAAK,CAAC,UAAU,EAAElC,cAAc,yBAAyB,CAAC;QAC5D,GAAGmC,KAAK,CAAC,KAAKvB;QAEd,MAAM,EAACS,MAAM,EAAC,GAAG,MAAM1C,YAAYS,mBAAmB,EAAE,EAAE;YACxDoC,OAAOvB;QACT;QAEAlB,OAAO2B,YAAY6B,oBAAoB,CAAC;YACtCC,SAAS;gBACP;oBAACX,MAAM;oBAAcY,OAAO;gBAAY;gBACxC;oBAACZ,MAAM;oBAAWY,OAAO;gBAAS;aACnC;YACDhB,SAAS;QACX;QACA1C,OAAOsC,QAAQC,SAAS,CAAC;IAC3B;IAEAtC,KAAK,wCAAwC;QAC3CK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzD,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM5C,YACpBS,mBACA;YAAC;YAAc;YAAW;SAAe,EACzC;YACEoC,OAAOvB;QACT;QAEFlB,OAAOwC,OAAOE,SAASH,SAAS,CAAC;QACjCvC,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,oDAAoD;QACvDK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzD,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM5C,YACpBS,mBACA;YAAC;YAAc;YAAW;YAAc;YAAY;SAAa,EACjE;YACEoC,OAAOvB;QACT;QAEFlB,OAAOwC,OAAOE,SAASG,IAAI,CAAC;QAC5B7C,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,kCAAkC;QACrCK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzD,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM5C,YAAYS,mBAAmB;YAAC;YAAc;YAAW;SAAI,EAAE;YACnFoC,OAAOvB;QACT;QACAlB,OAAOwC,OAAOE,SAASH,SAAS,CAAC;QACjCvC,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,2CAA2C;QAC9CK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;YAAG;gBAACA,MAAM;YAAS;SAAE;QAE5E,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM5C,YAAYS,mBAAmB;YAAC;SAAc,EAAE;YACpEoC,OAAOvB;QACT;QACAlB,OAAOwC,OAAOE,SAASH,SAAS,CAAC;QACjCvC,OAAOwC,OAAOE,SAASH,SAAS,CAAC;QACjCvC,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,4BAA4B;QAC/BK,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACiC,MAAM;YAAY;SAAE;QAEzDnD,QAAQ;YACNoD,YAAY5C;YACZ6C,QAAQ;YACRC,OAAO;gBAACC,OAAO;YAAI;YACnBC,KAAK,CAAC,UAAU,EAAElC,cAAc,4BAA4B,CAAC;QAC/D,GAAGmC,KAAK,CAAC,KAAK;YAACV,SAAS;QAAuB;QAE/C,MAAM,EAACF,KAAK,EAAC,GAAG,MAAM5C,YAAYS,mBAAmB;YAAC;SAAa,EAAE;YACnEoC,OAAOvB;QACT;QACAlB,OAAOwC,OAAOE,SAASH,SAAS,CAAC;QACjCvC,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEA5C,KAAK,wCAAwC;QAC3CK,iBAAiBqD,iBAAiB,CAAC,IAAIC,MAAM;QAE7C,MAAM,EAACpB,KAAK,EAAC,GAAG,MAAM5C,YAAYS,mBAAmB,EAAE,EAAE;YACvDoC,OAAOvB;QACT;QACAlB,OAAOwC,OAAOE,SAASH,SAAS,CAAC;QACjCvC,OAAOwC,OAAOG,OAAOC,MAAMC,IAAI,CAAC;IAClC;AACF"}
@@ -2,7 +2,7 @@ import { Args } from '@oclif/core';
2
2
  import { SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { chalk, select } from '@sanity/cli-core/ux';
4
4
  import { assertDatasetExists } from '../../actions/backup/assertDatasetExist.js';
5
- import { BACKUP_API_VERSION } from '../../actions/backup/constants.js';
5
+ import { setBackup } from '../../services/backup.js';
6
6
  import { listDatasets } from '../../services/datasets.js';
7
7
  import { NO_PROJECT_ID } from '../../util/errorMessages.js';
8
8
  const disableBackupDebug = subdebug('backup:disable');
@@ -33,10 +33,6 @@ export class DisableBackupCommand extends SanityCommand {
33
33
  exit: 1
34
34
  });
35
35
  }
36
- const client = await this.getGlobalApiClient({
37
- apiVersion: BACKUP_API_VERSION,
38
- requireUser: true
39
- });
40
36
  let datasets;
41
37
  try {
42
38
  datasets = await listDatasets(projectId);
@@ -58,12 +54,10 @@ export class DisableBackupCommand extends SanityCommand {
58
54
  dataset = await this.promptForDataset(datasets);
59
55
  }
60
56
  try {
61
- await client.request({
62
- body: {
63
- enabled: false
64
- },
65
- method: 'PUT',
66
- uri: `/projects/${projectId}/datasets/${dataset}/settings/backups`
57
+ await setBackup({
58
+ dataset,
59
+ projectId,
60
+ status: false
67
61
  });
68
62
  this.log(`${chalk.green(`Disabled daily backups for dataset ${dataset}.\n`)}`);
69
63
  this.log(`${chalk.yellow('Note: Existing backups will be retained according to your retention policy.\n')}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/backup/disable.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk, select} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\n\nimport {assertDatasetExists} from '../../actions/backup/assertDatasetExist.js'\nimport {BACKUP_API_VERSION} from '../../actions/backup/constants.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst disableBackupDebug = subdebug('backup:disable')\n\nexport class DisableBackupCommand extends SanityCommand<typeof DisableBackupCommand> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to disable backup for',\n required: false,\n }),\n }\n\n static override description = 'Disable backup for a dataset.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively disable backup for a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Disable backup for the production dataset',\n },\n ]\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DisableBackupCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n const client = await this.getGlobalApiClient({\n apiVersion: BACKUP_API_VERSION,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n disableBackupDebug(`Failed to list datasets: ${message}`, error)\n this.error(`Failed to list datasets: ${message}`, {exit: 1})\n }\n\n if (datasets.length === 0) {\n this.error('No datasets found in this project.', {exit: 1})\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await this.promptForDataset(datasets)\n }\n\n try {\n await client.request({\n body: {\n enabled: false,\n },\n method: 'PUT',\n uri: `/projects/${projectId}/datasets/${dataset}/settings/backups`,\n })\n\n this.log(`${chalk.green(`Disabled daily backups for dataset ${dataset}.\\n`)}`)\n this.log(\n `${chalk.yellow('Note: Existing backups will be retained according to your retention policy.\\n')}`,\n )\n\n disableBackupDebug(`Successfully disabled backup for dataset ${dataset}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n disableBackupDebug(`Failed to disable backup for dataset`, error)\n this.error(`Disabling dataset backup failed: ${message}`, {exit: 1})\n }\n }\n\n private async promptForDataset(datasets: DatasetsResponse): Promise<string> {\n try {\n const choices = datasets.map((dataset) => ({\n name: dataset.name,\n value: dataset.name,\n }))\n\n return select({\n choices,\n message: 'Select the dataset name:',\n })\n } catch (error) {\n const err = error as Error\n disableBackupDebug(`Error fetching datasets`, err)\n this.error(`Failed to fetch datasets:\\n${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","SanityCommand","subdebug","chalk","select","assertDatasetExists","BACKUP_API_VERSION","listDatasets","NO_PROJECT_ID","disableBackupDebug","DisableBackupCommand","args","dataset","string","description","required","examples","command","run","parse","projectId","getProjectId","error","exit","client","getGlobalApiClient","apiVersion","requireUser","datasets","message","Error","String","length","promptForDataset","request","body","enabled","method","uri","log","green","yellow","choices","map","name","value","err"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/backup/disable.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk, select} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\n\nimport {assertDatasetExists} from '../../actions/backup/assertDatasetExist.js'\nimport {setBackup} from '../../services/backup.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst disableBackupDebug = subdebug('backup:disable')\n\nexport class DisableBackupCommand extends SanityCommand<typeof DisableBackupCommand> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to disable backup for',\n required: false,\n }),\n }\n\n static override description = 'Disable backup for a dataset.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively disable backup for a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Disable backup for the production dataset',\n },\n ]\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DisableBackupCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n disableBackupDebug(`Failed to list datasets: ${message}`, error)\n this.error(`Failed to list datasets: ${message}`, {exit: 1})\n }\n\n if (datasets.length === 0) {\n this.error('No datasets found in this project.', {exit: 1})\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await this.promptForDataset(datasets)\n }\n\n try {\n await setBackup({dataset, projectId, status: false})\n\n this.log(`${chalk.green(`Disabled daily backups for dataset ${dataset}.\\n`)}`)\n this.log(\n `${chalk.yellow('Note: Existing backups will be retained according to your retention policy.\\n')}`,\n )\n\n disableBackupDebug(`Successfully disabled backup for dataset ${dataset}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n disableBackupDebug(`Failed to disable backup for dataset`, error)\n this.error(`Disabling dataset backup failed: ${message}`, {exit: 1})\n }\n }\n\n private async promptForDataset(datasets: DatasetsResponse): Promise<string> {\n try {\n const choices = datasets.map((dataset) => ({\n name: dataset.name,\n value: dataset.name,\n }))\n\n return select({\n choices,\n message: 'Select the dataset name:',\n })\n } catch (error) {\n const err = error as Error\n disableBackupDebug(`Error fetching datasets`, err)\n this.error(`Failed to fetch datasets:\\n${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","SanityCommand","subdebug","chalk","select","assertDatasetExists","setBackup","listDatasets","NO_PROJECT_ID","disableBackupDebug","DisableBackupCommand","args","dataset","string","description","required","examples","command","run","parse","projectId","getProjectId","error","exit","datasets","message","Error","String","length","promptForDataset","status","log","green","yellow","choices","map","name","value","err"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,EAAEC,MAAM,QAAO,sBAAqB;AAGjD,SAAQC,mBAAmB,QAAO,6CAA4C;AAC9E,SAAQC,SAAS,QAAO,2BAA0B;AAClD,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,qBAAqBP,SAAS;AAEpC,OAAO,MAAMQ,6BAA6BT;IACxC,OAAgBU,OAAO;QACrBC,SAASZ,KAAKa,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,gCAA+B;IAE7D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,MAAaI,MAAqB;QAChC,MAAM,EAACP,IAAI,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACT;QAChC,IAAI,EAACE,OAAO,EAAC,GAAGD;QAEhB,MAAMS,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACd,eAAe;gBAACe,MAAM;YAAC;QACpC;QAEA,IAAIC;QAEJ,IAAI;YACFA,WAAW,MAAMjB,aAAaa;QAChC,EAAE,OAAOE,OAAO;YACd,MAAMG,UAAUH,iBAAiBI,QAAQJ,MAAMG,OAAO,GAAGE,OAAOL;YAChEb,mBAAmB,CAAC,yBAAyB,EAAEgB,SAAS,EAAEH;YAC1D,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEG,SAAS,EAAE;gBAACF,MAAM;YAAC;QAC5D;QAEA,IAAIC,SAASI,MAAM,KAAK,GAAG;YACzB,IAAI,CAACN,KAAK,CAAC,sCAAsC;gBAACC,MAAM;YAAC;QAC3D;QAEA,IAAIX,SAAS;YACXP,oBAAoBmB,UAAUZ;QAChC,OAAO;YACLA,UAAU,MAAM,IAAI,CAACiB,gBAAgB,CAACL;QACxC;QAEA,IAAI;YACF,MAAMlB,UAAU;gBAACM;gBAASQ;gBAAWU,QAAQ;YAAK;YAElD,IAAI,CAACC,GAAG,CAAC,GAAG5B,MAAM6B,KAAK,CAAC,CAAC,mCAAmC,EAAEpB,QAAQ,GAAG,CAAC,GAAG;YAC7E,IAAI,CAACmB,GAAG,CACN,GAAG5B,MAAM8B,MAAM,CAAC,kFAAkF;YAGpGxB,mBAAmB,CAAC,yCAAyC,EAAEG,SAAS;QAC1E,EAAE,OAAOU,OAAO;YACd,MAAMG,UAAUH,iBAAiBI,QAAQJ,MAAMG,OAAO,GAAGE,OAAOL;YAChEb,mBAAmB,CAAC,oCAAoC,CAAC,EAAEa;YAC3D,IAAI,CAACA,KAAK,CAAC,CAAC,iCAAiC,EAAEG,SAAS,EAAE;gBAACF,MAAM;YAAC;QACpE;IACF;IAEA,MAAcM,iBAAiBL,QAA0B,EAAmB;QAC1E,IAAI;YACF,MAAMU,UAAUV,SAASW,GAAG,CAAC,CAACvB,UAAa,CAAA;oBACzCwB,MAAMxB,QAAQwB,IAAI;oBAClBC,OAAOzB,QAAQwB,IAAI;gBACrB,CAAA;YAEA,OAAOhC,OAAO;gBACZ8B;gBACAT,SAAS;YACX;QACF,EAAE,OAAOH,OAAO;YACd,MAAMgB,MAAMhB;YACZb,mBAAmB,CAAC,uBAAuB,CAAC,EAAE6B;YAC9C,IAAI,CAAChB,KAAK,CAAC,CAAC,2BAA2B,EAAEgB,IAAIb,OAAO,EAAE,EAAE;gBAACF,MAAM;YAAC;QAClE;IACF;AACF"}
@@ -2,9 +2,9 @@ import { Args } from '@oclif/core';
2
2
  import { SanityCommand, subdebug } from '@sanity/cli-core';
3
3
  import { chalk } from '@sanity/cli-core/ux';
4
4
  import { assertDatasetExists } from '../../actions/backup/assertDatasetExist.js';
5
- import { BACKUP_API_VERSION } from '../../actions/backup/constants.js';
6
5
  import { NEW_DATASET_VALUE, promptForDataset } from '../../prompts/promptForDataset.js';
7
6
  import { promptForDatasetName } from '../../prompts/promptForDatasetName.js';
7
+ import { setBackup } from '../../services/backup.js';
8
8
  import { createDataset, listDatasets } from '../../services/datasets.js';
9
9
  import { NO_PROJECT_ID } from '../../util/errorMessages.js';
10
10
  const enableBackupDebug = subdebug('backup:enable');
@@ -35,10 +35,6 @@ export class EnableBackupCommand extends SanityCommand {
35
35
  exit: 1
36
36
  });
37
37
  }
38
- const client = await this.getGlobalApiClient({
39
- apiVersion: BACKUP_API_VERSION,
40
- requireUser: true
41
- });
42
38
  let datasets;
43
39
  try {
44
40
  datasets = await listDatasets(projectId);
@@ -82,12 +78,10 @@ export class EnableBackupCommand extends SanityCommand {
82
78
  }
83
79
  }
84
80
  try {
85
- await client.request({
86
- body: {
87
- enabled: true
88
- },
89
- method: 'PUT',
90
- uri: `/projects/${projectId}/datasets/${dataset}/settings/backups`
81
+ await setBackup({
82
+ dataset,
83
+ projectId,
84
+ status: true
91
85
  });
92
86
  this.log(`${chalk.green(`Enabled backups for dataset ${dataset}.\nPlease note that it may take up to 24 hours before the first backup is created.\n`)}`);
93
87
  this.log(`${chalk.bold(`Retention policies may apply depending on your plan and agreement.\n`)}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/backup/enable.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\n\nimport {assertDatasetExists} from '../../actions/backup/assertDatasetExist.js'\nimport {BACKUP_API_VERSION} from '../../actions/backup/constants.js'\nimport {NEW_DATASET_VALUE, promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {createDataset, listDatasets} from '../../services/datasets.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst enableBackupDebug = subdebug('backup:enable')\n\nexport class EnableBackupCommand extends SanityCommand<typeof EnableBackupCommand> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to enable backup for',\n required: false,\n }),\n }\n\n static override description = 'Enable backup for a dataset.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively enable backup for a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Enable backup for the production dataset',\n },\n ]\n\n public async run(): Promise<void> {\n const {args} = await this.parse(EnableBackupCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n const client = await this.getGlobalApiClient({\n apiVersion: BACKUP_API_VERSION,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n enableBackupDebug(`Failed to list datasets: ${message}`, error)\n this.error(`Failed to list datasets: ${message}`, {exit: 1})\n }\n\n const hasProduction = datasets.some((dataset) => dataset.name === 'production')\n\n if (datasets.length === 0) {\n this.error('No datasets found in this project.', {exit: 1})\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await promptForDataset({allowCreation: true, datasets})\n\n if (dataset === NEW_DATASET_VALUE) {\n const newDatasetName = await promptForDatasetName({\n default: hasProduction ? undefined : 'production',\n })\n\n try {\n await createDataset({\n datasetName: newDatasetName,\n projectId,\n })\n dataset = newDatasetName\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n enableBackupDebug(`Failed to create dataset ${newDatasetName}: ${message}`, error)\n this.error(`Failed to create dataset ${newDatasetName}: ${message}`, {exit: 1})\n }\n }\n }\n\n try {\n await client.request({\n body: {\n enabled: true,\n },\n method: 'PUT',\n uri: `/projects/${projectId}/datasets/${dataset}/settings/backups`,\n })\n\n this.log(\n `${chalk.green(\n `Enabled backups for dataset ${dataset}.\\nPlease note that it may take up to 24 hours before the first backup is created.\\n`,\n )}`,\n )\n\n this.log(\n `${chalk.bold(`Retention policies may apply depending on your plan and agreement.\\n`)}`,\n )\n\n enableBackupDebug(`Successfully enabled backup for dataset ${dataset}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n enableBackupDebug(`Failed to enable backup for dataset`, error)\n this.error(`Enabling dataset backup failed: ${message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","SanityCommand","subdebug","chalk","assertDatasetExists","BACKUP_API_VERSION","NEW_DATASET_VALUE","promptForDataset","promptForDatasetName","createDataset","listDatasets","NO_PROJECT_ID","enableBackupDebug","EnableBackupCommand","args","dataset","string","description","required","examples","command","run","parse","projectId","getProjectId","error","exit","client","getGlobalApiClient","apiVersion","requireUser","datasets","message","Error","String","hasProduction","some","name","length","allowCreation","newDatasetName","default","undefined","datasetName","request","body","enabled","method","uri","log","green","bold"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/backup/enable.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\n\nimport {assertDatasetExists} from '../../actions/backup/assertDatasetExist.js'\nimport {NEW_DATASET_VALUE, promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {setBackup} from '../../services/backup.js'\nimport {createDataset, listDatasets} from '../../services/datasets.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst enableBackupDebug = subdebug('backup:enable')\n\nexport class EnableBackupCommand extends SanityCommand<typeof EnableBackupCommand> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to enable backup for',\n required: false,\n }),\n }\n\n static override description = 'Enable backup for a dataset.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively enable backup for a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Enable backup for the production dataset',\n },\n ]\n\n public async run(): Promise<void> {\n const {args} = await this.parse(EnableBackupCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n enableBackupDebug(`Failed to list datasets: ${message}`, error)\n this.error(`Failed to list datasets: ${message}`, {exit: 1})\n }\n\n const hasProduction = datasets.some((dataset) => dataset.name === 'production')\n\n if (datasets.length === 0) {\n this.error('No datasets found in this project.', {exit: 1})\n }\n\n if (dataset) {\n assertDatasetExists(datasets, dataset)\n } else {\n dataset = await promptForDataset({allowCreation: true, datasets})\n\n if (dataset === NEW_DATASET_VALUE) {\n const newDatasetName = await promptForDatasetName({\n default: hasProduction ? undefined : 'production',\n })\n\n try {\n await createDataset({\n datasetName: newDatasetName,\n projectId,\n })\n dataset = newDatasetName\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n enableBackupDebug(`Failed to create dataset ${newDatasetName}: ${message}`, error)\n this.error(`Failed to create dataset ${newDatasetName}: ${message}`, {exit: 1})\n }\n }\n }\n\n try {\n await setBackup({dataset, projectId, status: true})\n\n this.log(\n `${chalk.green(\n `Enabled backups for dataset ${dataset}.\\nPlease note that it may take up to 24 hours before the first backup is created.\\n`,\n )}`,\n )\n\n this.log(\n `${chalk.bold(`Retention policies may apply depending on your plan and agreement.\\n`)}`,\n )\n\n enableBackupDebug(`Successfully enabled backup for dataset ${dataset}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n enableBackupDebug(`Failed to enable backup for dataset`, error)\n this.error(`Enabling dataset backup failed: ${message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","SanityCommand","subdebug","chalk","assertDatasetExists","NEW_DATASET_VALUE","promptForDataset","promptForDatasetName","setBackup","createDataset","listDatasets","NO_PROJECT_ID","enableBackupDebug","EnableBackupCommand","args","dataset","string","description","required","examples","command","run","parse","projectId","getProjectId","error","exit","datasets","message","Error","String","hasProduction","some","name","length","allowCreation","newDatasetName","default","undefined","datasetName","status","log","green","bold"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,QAAO,sBAAqB;AAGzC,SAAQC,mBAAmB,QAAO,6CAA4C;AAC9E,SAAQC,iBAAiB,EAAEC,gBAAgB,QAAO,oCAAmC;AACrF,SAAQC,oBAAoB,QAAO,wCAAuC;AAC1E,SAAQC,SAAS,QAAO,2BAA0B;AAClD,SAAQC,aAAa,EAAEC,YAAY,QAAO,6BAA4B;AACtE,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,oBAAoBV,SAAS;AAEnC,OAAO,MAAMW,4BAA4BZ;IACvC,OAAgBa,OAAO;QACrBC,SAASf,KAAKgB,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,+BAA8B;IAE5D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,MAAaI,MAAqB;QAChC,MAAM,EAACP,IAAI,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACT;QAChC,IAAI,EAACE,OAAO,EAAC,GAAGD;QAEhB,MAAMS,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACd,eAAe;gBAACe,MAAM;YAAC;QACpC;QAEA,IAAIC;QAEJ,IAAI;YACFA,WAAW,MAAMjB,aAAaa;QAChC,EAAE,OAAOE,OAAO;YACd,MAAMG,UAAUH,iBAAiBI,QAAQJ,MAAMG,OAAO,GAAGE,OAAOL;YAChEb,kBAAkB,CAAC,yBAAyB,EAAEgB,SAAS,EAAEH;YACzD,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEG,SAAS,EAAE;gBAACF,MAAM;YAAC;QAC5D;QAEA,MAAMK,gBAAgBJ,SAASK,IAAI,CAAC,CAACjB,UAAYA,QAAQkB,IAAI,KAAK;QAElE,IAAIN,SAASO,MAAM,KAAK,GAAG;YACzB,IAAI,CAACT,KAAK,CAAC,sCAAsC;gBAACC,MAAM;YAAC;QAC3D;QAEA,IAAIX,SAAS;YACXX,oBAAoBuB,UAAUZ;QAChC,OAAO;YACLA,UAAU,MAAMT,iBAAiB;gBAAC6B,eAAe;gBAAMR;YAAQ;YAE/D,IAAIZ,YAAYV,mBAAmB;gBACjC,MAAM+B,iBAAiB,MAAM7B,qBAAqB;oBAChD8B,SAASN,gBAAgBO,YAAY;gBACvC;gBAEA,IAAI;oBACF,MAAM7B,cAAc;wBAClB8B,aAAaH;wBACbb;oBACF;oBACAR,UAAUqB;gBACZ,EAAE,OAAOX,OAAO;oBACd,MAAMG,UAAUH,iBAAiBI,QAAQJ,MAAMG,OAAO,GAAGE,OAAOL;oBAChEb,kBAAkB,CAAC,yBAAyB,EAAEwB,eAAe,EAAE,EAAER,SAAS,EAAEH;oBAC5E,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEW,eAAe,EAAE,EAAER,SAAS,EAAE;wBAACF,MAAM;oBAAC;gBAC/E;YACF;QACF;QAEA,IAAI;YACF,MAAMlB,UAAU;gBAACO;gBAASQ;gBAAWiB,QAAQ;YAAI;YAEjD,IAAI,CAACC,GAAG,CACN,GAAGtC,MAAMuC,KAAK,CACZ,CAAC,4BAA4B,EAAE3B,QAAQ,oFAAoF,CAAC,GAC3H;YAGL,IAAI,CAAC0B,GAAG,CACN,GAAGtC,MAAMwC,IAAI,CAAC,CAAC,oEAAoE,CAAC,GAAG;YAGzF/B,kBAAkB,CAAC,wCAAwC,EAAEG,SAAS;QACxE,EAAE,OAAOU,OAAO;YACd,MAAMG,UAAUH,iBAAiBI,QAAQJ,MAAMG,OAAO,GAAGE,OAAOL;YAChEb,kBAAkB,CAAC,mCAAmC,CAAC,EAAEa;YACzD,IAAI,CAACA,KAAK,CAAC,CAAC,gCAAgC,EAAEG,SAAS,EAAE;gBAACF,MAAM;YAAC;QACnE;IACF;AACF"}
@@ -4,7 +4,7 @@ import { select } from '@sanity/cli-core/ux';
4
4
  import { Table } from 'console-table-printer';
5
5
  import { isAfter, isValid, lightFormat, parse } from 'date-fns';
6
6
  import { assertDatasetExists } from '../../actions/backup/assertDatasetExist.js';
7
- import { BACKUP_API_VERSION } from '../../actions/backup/constants.js';
7
+ import { listBackups } from '../../services/backup.js';
8
8
  import { listDatasets } from '../../services/datasets.js';
9
9
  import { NO_PROJECT_ID } from '../../util/errorMessages.js';
10
10
  const listBackupDebug = subdebug('backup:list');
@@ -57,10 +57,6 @@ export class ListBackupCommand extends SanityCommand {
57
57
  exit: 1
58
58
  });
59
59
  }
60
- const client = await this.getGlobalApiClient({
61
- apiVersion: BACKUP_API_VERSION,
62
- requireUser: true
63
- });
64
60
  let datasets;
65
61
  try {
66
62
  datasets = await listDatasets(projectId);
@@ -113,9 +109,12 @@ export class ListBackupCommand extends SanityCommand {
113
109
  query.before = flags.before;
114
110
  }
115
111
  try {
116
- const response = await client.request({
117
- query,
118
- uri: `/projects/${projectId}/datasets/${dataset}/backups`
112
+ const response = await listBackups({
113
+ after: flags.after,
114
+ before: flags.before,
115
+ datasetName: dataset,
116
+ limit: flags.limit,
117
+ projectId
119
118
  });
120
119
  if (response.backups.length === 0) {
121
120
  this.log('No backups found.');