@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,15 +1,18 @@
1
1
  import { runCommand } from '@oclif/test';
2
+ import { getCliToken, setConfig } from '@sanity/cli-core';
2
3
  import { mockApi, testCommand } from '@sanity/cli-test';
3
4
  import nock from 'nock';
4
5
  import { afterEach, describe, expect, test, vi } from 'vitest';
5
- import { setConfig } from '../../../../cli-core/src/services/cliUserConfig.js';
6
- import { getCliToken } from '../../../../cli-core/src/services/getCliToken.js';
7
6
  import { AUTH_API_VERSION } from '../../services/auth.js';
8
7
  import { LogoutCommand } from '../logout.js';
9
- vi.mock('../../../../cli-core/src/services/getCliToken.js');
10
- vi.mock('../../../../cli-core/src/services/cliUserConfig.js', ()=>({
8
+ vi.mock('@sanity/cli-core', async ()=>{
9
+ const actual = await vi.importActual('@sanity/cli-core');
10
+ return {
11
+ ...actual,
12
+ getCliToken: vi.fn(),
11
13
  setConfig: vi.fn()
12
- }));
14
+ };
15
+ });
13
16
  const mockedGetCliToken = vi.mocked(getCliToken);
14
17
  const mockedSetConfig = vi.mocked(setConfig);
15
18
  afterEach(()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/logout.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {setConfig} from '../../../../cli-core/src/services/cliUserConfig.js'\nimport {getCliToken} from '../../../../cli-core/src/services/getCliToken.js'\nimport {AUTH_API_VERSION} from '../../services/auth.js'\nimport {LogoutCommand} from '../logout.js'\n\nvi.mock('../../../../cli-core/src/services/getCliToken.js')\nvi.mock('../../../../cli-core/src/services/cliUserConfig.js', () => ({\n setConfig: vi.fn(),\n}))\n\nconst mockedGetCliToken = vi.mocked(getCliToken)\nconst mockedSetConfig = vi.mocked(setConfig)\n\nafterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n})\n\ndescribe('#logout', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['logout', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Logs out the CLI from the current user session\n\n USAGE\n $ sanity logout\n\n DESCRIPTION\n Logs out the CLI from the current user session\n\n \"\n `)\n })\n\n test('logs out successfully if a token exists', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(200)\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('Logged out successfully')\n expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined)\n expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined)\n })\n\n test('logs out successfully when session is expired (401)', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(401, {\n message: 'Unauthorized',\n statusCode: 401,\n })\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('Logged out successfully')\n expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined)\n expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined)\n })\n\n test('shows an error if no token exists', async () => {\n mockedGetCliToken.mockResolvedValueOnce('')\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('No login credentials found')\n expect(mockedSetConfig).not.toHaveBeenCalled()\n })\n\n test('throws error on API failure (non-401)', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(LogoutCommand)\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to logout')\n expect(mockedSetConfig).not.toHaveBeenCalled()\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","setConfig","getCliToken","AUTH_API_VERSION","LogoutCommand","mock","fn","mockedGetCliToken","mocked","mockedSetConfig","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","apiVersion","method","uri","reply","toContain","toHaveBeenCalledWith","undefined","message","statusCode","not","toHaveBeenCalled","error","toBeDefined"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,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,SAAS,QAAO,qDAAoD;AAC5E,SAAQC,WAAW,QAAO,mDAAkD;AAC5E,SAAQC,gBAAgB,QAAO,yBAAwB;AACvD,SAAQC,aAAa,QAAO,eAAc;AAE1CJ,GAAGK,IAAI,CAAC;AACRL,GAAGK,IAAI,CAAC,sDAAsD,IAAO,CAAA;QACnEJ,WAAWD,GAAGM,EAAE;IAClB,CAAA;AAEA,MAAMC,oBAAoBP,GAAGQ,MAAM,CAACN;AACpC,MAAMO,kBAAkBT,GAAGQ,MAAM,CAACP;AAElCL,UAAU;IACRI,GAAGU,aAAa;IAChB,MAAMC,UAAUhB,KAAKiB,YAAY;IACjCjB,KAAKkB,QAAQ;IACbf,OAAOa,SAAS,iBAAiBG,OAAO,CAAC,EAAE;AAC7C;AAEAjB,SAAS,WAAW;IAClBE,KAAK,gBAAgB;QACnB,MAAM,EAACgB,MAAM,EAAC,GAAG,MAAMvB,WAAW;YAAC;YAAU;SAAS;QAEtDM,OAAOiB,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;IAEAjB,KAAK,2CAA2C;QAC9CQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYf;YACZgB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC;QAET,MAAM,EAACN,MAAM,EAAC,GAAG,MAAMrB,YAAYU;QAEnCN,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBc,oBAAoB,CAAC,aAAaC;QAC1D1B,OAAOW,iBAAiBc,oBAAoB,CAAC,oBAAoBC;IACnE;IAEAzB,KAAK,uDAAuD;QAC1DQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYf;YACZgB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YACZI,SAAS;YACTC,YAAY;QACd;QAEA,MAAM,EAACX,MAAM,EAAC,GAAG,MAAMrB,YAAYU;QAEnCN,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBc,oBAAoB,CAAC,aAAaC;QAC1D1B,OAAOW,iBAAiBc,oBAAoB,CAAC,oBAAoBC;IACnE;IAEAzB,KAAK,qCAAqC;QACxCQ,kBAAkBU,qBAAqB,CAAC;QAExC,MAAM,EAACF,MAAM,EAAC,GAAG,MAAMrB,YAAYU;QAEnCN,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBkB,GAAG,CAACC,gBAAgB;IAC9C;IAEA7B,KAAK,yCAAyC;QAC5CQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYf;YACZgB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YAACI,SAAS;QAAuB;QAE/C,MAAM,EAACI,KAAK,EAAC,GAAG,MAAMnC,YAAYU;QAElCN,OAAO+B,OAAOC,WAAW;QACzBhC,OAAO+B,OAAOJ,SAASH,SAAS,CAAC;QACjCxB,OAAOW,iBAAiBkB,GAAG,CAACC,gBAAgB;IAC9C;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/__tests__/logout.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliToken, setConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {AUTH_API_VERSION} from '../../services/auth.js'\nimport {LogoutCommand} from '../logout.js'\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core')>('@sanity/cli-core')\n return {\n ...actual,\n getCliToken: vi.fn(),\n setConfig: vi.fn(),\n }\n})\n\nconst mockedGetCliToken = vi.mocked(getCliToken)\nconst mockedSetConfig = vi.mocked(setConfig)\n\nafterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n})\n\ndescribe('#logout', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['logout', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Logs out the CLI from the current user session\n\n USAGE\n $ sanity logout\n\n DESCRIPTION\n Logs out the CLI from the current user session\n\n \"\n `)\n })\n\n test('logs out successfully if a token exists', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(200)\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('Logged out successfully')\n expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined)\n expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined)\n })\n\n test('logs out successfully when session is expired (401)', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(401, {\n message: 'Unauthorized',\n statusCode: 401,\n })\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('Logged out successfully')\n expect(mockedSetConfig).toHaveBeenCalledWith('authToken', undefined)\n expect(mockedSetConfig).toHaveBeenCalledWith('telemetryConsent', undefined)\n })\n\n test('shows an error if no token exists', async () => {\n mockedGetCliToken.mockResolvedValueOnce('')\n\n const {stdout} = await testCommand(LogoutCommand)\n\n expect(stdout).toContain('No login credentials found')\n expect(mockedSetConfig).not.toHaveBeenCalled()\n })\n\n test('throws error on API failure (non-401)', async () => {\n mockedGetCliToken.mockResolvedValueOnce('test-token')\n\n mockApi({\n apiVersion: AUTH_API_VERSION,\n method: 'post',\n uri: '/auth/logout',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(LogoutCommand)\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('Failed to logout')\n expect(mockedSetConfig).not.toHaveBeenCalled()\n })\n})\n"],"names":["runCommand","getCliToken","setConfig","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","AUTH_API_VERSION","LogoutCommand","mock","actual","importActual","fn","mockedGetCliToken","mocked","mockedSetConfig","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","apiVersion","method","uri","reply","toContain","toHaveBeenCalledWith","undefined","message","statusCode","not","toHaveBeenCalled","error","toBeDefined"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,WAAW,EAAEC,SAAS,QAAO,mBAAkB;AACvD,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,gBAAgB,QAAO,yBAAwB;AACvD,SAAQC,aAAa,QAAO,eAAc;AAE1CF,GAAGG,IAAI,CAAC,oBAAoB;IAC1B,MAAMC,SAAS,MAAMJ,GAAGK,YAAY,CAAoC;IACxE,OAAO;QACL,GAAGD,MAAM;QACTb,aAAaS,GAAGM,EAAE;QAClBd,WAAWQ,GAAGM,EAAE;IAClB;AACF;AAEA,MAAMC,oBAAoBP,GAAGQ,MAAM,CAACjB;AACpC,MAAMkB,kBAAkBT,GAAGQ,MAAM,CAAChB;AAElCI,UAAU;IACRI,GAAGU,aAAa;IAChB,MAAMC,UAAUhB,KAAKiB,YAAY;IACjCjB,KAAKkB,QAAQ;IACbf,OAAOa,SAAS,iBAAiBG,OAAO,CAAC,EAAE;AAC7C;AAEAjB,SAAS,WAAW;IAClBE,KAAK,gBAAgB;QACnB,MAAM,EAACgB,MAAM,EAAC,GAAG,MAAMzB,WAAW;YAAC;YAAU;SAAS;QAEtDQ,OAAOiB,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;IAEAjB,KAAK,2CAA2C;QAC9CQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYjB;YACZkB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC;QAET,MAAM,EAACN,MAAM,EAAC,GAAG,MAAMrB,YAAYQ;QAEnCJ,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBc,oBAAoB,CAAC,aAAaC;QAC1D1B,OAAOW,iBAAiBc,oBAAoB,CAAC,oBAAoBC;IACnE;IAEAzB,KAAK,uDAAuD;QAC1DQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYjB;YACZkB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YACZI,SAAS;YACTC,YAAY;QACd;QAEA,MAAM,EAACX,MAAM,EAAC,GAAG,MAAMrB,YAAYQ;QAEnCJ,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBc,oBAAoB,CAAC,aAAaC;QAC1D1B,OAAOW,iBAAiBc,oBAAoB,CAAC,oBAAoBC;IACnE;IAEAzB,KAAK,qCAAqC;QACxCQ,kBAAkBU,qBAAqB,CAAC;QAExC,MAAM,EAACF,MAAM,EAAC,GAAG,MAAMrB,YAAYQ;QAEnCJ,OAAOiB,QAAQO,SAAS,CAAC;QACzBxB,OAAOW,iBAAiBkB,GAAG,CAACC,gBAAgB;IAC9C;IAEA7B,KAAK,yCAAyC;QAC5CQ,kBAAkBU,qBAAqB,CAAC;QAExCxB,QAAQ;YACNyB,YAAYjB;YACZkB,QAAQ;YACRC,KAAK;QACP,GAAGC,KAAK,CAAC,KAAK;YAACI,SAAS;QAAuB;QAE/C,MAAM,EAACI,KAAK,EAAC,GAAG,MAAMnC,YAAYQ;QAElCJ,OAAO+B,OAAOC,WAAW;QACzBhC,OAAO+B,OAAOJ,SAASH,SAAS,CAAC;QACjCxB,OAAOW,iBAAiBkB,GAAG,CAACC,gBAAgB;IAC9C;AACF"}
@@ -1,28 +1,24 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig, getStudioConfig } from '@sanity/cli-core';
2
+ import { getStudioConfig } from '@sanity/cli-core';
3
3
  import { testCommand } from '@sanity/cli-test';
4
4
  import open from 'open';
5
5
  import { afterEach, describe, expect, test, vi } from 'vitest';
6
6
  import { ManageCommand } from '../manage.js';
7
- vi.mock('../../../../cli-core/src/config/studio/getStudioConfig.js', async ()=>{
7
+ vi.mock('@sanity/cli-core', async ()=>{
8
+ const actual = await vi.importActual('@sanity/cli-core');
8
9
  return {
10
+ ...actual,
9
11
  getStudioConfig: vi.fn()
10
12
  };
11
13
  });
12
- vi.mock('../../../../cli-core/src/config/findProjectRoot.js', async ()=>{
13
- return {
14
- findProjectRoot: vi.fn().mockResolvedValue({
15
- directory: '/test/path',
16
- root: '/test/path',
17
- type: 'studio'
18
- })
19
- };
20
- });
21
- vi.mock('../../../../cli-core/src/config/cli/getCliConfig.js', async ()=>{
22
- return {
23
- getCliConfig: vi.fn().mockResolvedValue({})
24
- };
25
- });
14
+ const defaultMocks = {
15
+ cliConfig: {},
16
+ projectRoot: {
17
+ directory: '/test/path',
18
+ path: '/test/path/sanity.config.ts',
19
+ type: 'studio'
20
+ }
21
+ };
26
22
  afterEach(()=>{
27
23
  vi.clearAllMocks();
28
24
  });
@@ -45,12 +41,16 @@ describe('#manage', ()=>{
45
41
  `);
46
42
  });
47
43
  test('open link to project management interface if cli config has projectId', async ()=>{
48
- vi.mocked(getCliConfig).mockResolvedValueOnce({
49
- api: {
50
- projectId: 'test-project-id'
44
+ const { stdout } = await testCommand(ManageCommand, [], {
45
+ mocks: {
46
+ ...defaultMocks,
47
+ cliConfig: {
48
+ api: {
49
+ projectId: 'test-project-id'
50
+ }
51
+ }
51
52
  }
52
53
  });
53
- const { stdout } = await testCommand(ManageCommand);
54
54
  expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id');
55
55
  // Mocked in test setup
56
56
  expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id');
@@ -66,7 +66,9 @@ describe('#manage', ()=>{
66
66
  },
67
67
  unstable_sources: []
68
68
  });
69
- const { stdout } = await testCommand(ManageCommand);
69
+ const { stdout } = await testCommand(ManageCommand, [], {
70
+ mocks: defaultMocks
71
+ });
70
72
  expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id');
71
73
  // Mocked in test setup
72
74
  expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id');
@@ -87,15 +89,18 @@ describe('#manage', ()=>{
87
89
  unstable_sources: []
88
90
  }
89
91
  ]);
90
- const { stdout } = await testCommand(ManageCommand);
92
+ const { stdout } = await testCommand(ManageCommand, [], {
93
+ mocks: defaultMocks
94
+ });
91
95
  expect(stdout).toContain('Opening https://www.sanity.io/manage/');
92
96
  // Mocked in test setup
93
97
  expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/');
94
98
  });
95
99
  test('opens root manage page if no projectId is found', async ()=>{
96
- vi.mocked(getCliConfig).mockResolvedValueOnce({});
97
100
  vi.mocked(getStudioConfig).mockResolvedValueOnce({});
98
- const { stdout } = await testCommand(ManageCommand);
101
+ const { stdout } = await testCommand(ManageCommand, [], {
102
+ mocks: defaultMocks
103
+ });
99
104
  expect(stdout).toContain('Opening https://www.sanity.io/manage/');
100
105
  // Mocked in test setup
101
106
  expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/manage.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getStudioConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport open from 'open'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ManageCommand} from '../manage.js'\n\nvi.mock('../../../../cli-core/src/config/studio/getStudioConfig.js', async () => {\n return {\n getStudioConfig: vi.fn(),\n }\n})\n\nvi.mock('../../../../cli-core/src/config/findProjectRoot.js', async () => {\n return {\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n }\n})\n\nvi.mock('../../../../cli-core/src/config/cli/getCliConfig.js', async () => {\n return {\n getCliConfig: vi.fn().mockResolvedValue({}),\n }\n})\n\nafterEach(() => {\n vi.clearAllMocks()\n})\n\ndescribe('#manage', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['manage', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Opens project management interface in your web browser\n\n USAGE\n $ sanity manage\n\n DESCRIPTION\n Opens project management interface in your web browser\n\n \"\n `)\n })\n\n test('open link to project management interface if cli config has projectId', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: 'test-project-id',\n },\n })\n\n const {stdout} = await testCommand(ManageCommand)\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id')\n })\n\n test('open link to project management interface if studio config has projectId', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce({\n basePath: 'test-base-path',\n dataset: 'test-dataset',\n name: 'test-name',\n projectId: 'test-project-id',\n schema: {\n types: [],\n },\n unstable_sources: [],\n })\n\n const {stdout} = await testCommand(ManageCommand)\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id')\n })\n\n test('open root link to manage page if studio config is array', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce([\n {\n basePath: 'test-base-path',\n dataset: 'test-dataset',\n name: 'test-name',\n projectId: 'test-project-id',\n schema: {\n _original: {\n types: [],\n },\n },\n title: 'test-title',\n unstable_sources: [],\n },\n ])\n\n const {stdout} = await testCommand(ManageCommand)\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/')\n })\n\n test('opens root manage page if no projectId is found', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({})\n vi.mocked(getStudioConfig).mockResolvedValueOnce({} as never)\n\n const {stdout} = await testCommand(ManageCommand)\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/')\n })\n})\n"],"names":["runCommand","getCliConfig","getStudioConfig","testCommand","open","afterEach","describe","expect","test","vi","ManageCommand","mock","fn","findProjectRoot","mockResolvedValue","directory","root","type","clearAllMocks","stdout","toMatchInlineSnapshot","mocked","mockResolvedValueOnce","api","projectId","toContain","toHaveBeenCalledWith","basePath","dataset","name","schema","types","unstable_sources","_original","title"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,YAAY,EAAEC,eAAe,QAAO,mBAAkB;AAC9D,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,aAAa,QAAO,eAAc;AAE1CD,GAAGE,IAAI,CAAC,6DAA6D;IACnE,OAAO;QACLT,iBAAiBO,GAAGG,EAAE;IACxB;AACF;AAEAH,GAAGE,IAAI,CAAC,sDAAsD;IAC5D,OAAO;QACLE,iBAAiBJ,GAAGG,EAAE,GAAGE,iBAAiB,CAAC;YACzCC,WAAW;YACXC,MAAM;YACNC,MAAM;QACR;IACF;AACF;AAEAR,GAAGE,IAAI,CAAC,uDAAuD;IAC7D,OAAO;QACLV,cAAcQ,GAAGG,EAAE,GAAGE,iBAAiB,CAAC,CAAC;IAC3C;AACF;AAEAT,UAAU;IACRI,GAAGS,aAAa;AAClB;AAEAZ,SAAS,WAAW;IAClBE,KAAK,gBAAgB;QACnB,MAAM,EAACW,MAAM,EAAC,GAAG,MAAMnB,WAAW;YAAC;YAAU;SAAS;QAEtDO,OAAOY,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;IAEAZ,KAAK,yEAAyE;QAC5EC,GAAGY,MAAM,CAACpB,cAAcqB,qBAAqB,CAAC;YAC5CC,KAAK;gBACHC,WAAW;YACb;QACF;QAEA,MAAM,EAACL,MAAM,EAAC,GAAG,MAAMhB,YAAYO;QAEnCH,OAAOY,QAAQM,SAAS,CAAC;QACzB,uBAAuB;QACvBlB,OAAOH,MAAMsB,oBAAoB,CAAC;IACpC;IAEAlB,KAAK,4EAA4E;QAC/EC,GAAGY,MAAM,CAACnB,iBAAiBoB,qBAAqB,CAAC;YAC/CK,UAAU;YACVC,SAAS;YACTC,MAAM;YACNL,WAAW;YACXM,QAAQ;gBACNC,OAAO,EAAE;YACX;YACAC,kBAAkB,EAAE;QACtB;QAEA,MAAM,EAACb,MAAM,EAAC,GAAG,MAAMhB,YAAYO;QAEnCH,OAAOY,QAAQM,SAAS,CAAC;QACzB,uBAAuB;QACvBlB,OAAOH,MAAMsB,oBAAoB,CAAC;IACpC;IAEAlB,KAAK,2DAA2D;QAC9DC,GAAGY,MAAM,CAACnB,iBAAiBoB,qBAAqB,CAAC;YAC/C;gBACEK,UAAU;gBACVC,SAAS;gBACTC,MAAM;gBACNL,WAAW;gBACXM,QAAQ;oBACNG,WAAW;wBACTF,OAAO,EAAE;oBACX;gBACF;gBACAG,OAAO;gBACPF,kBAAkB,EAAE;YACtB;SACD;QAED,MAAM,EAACb,MAAM,EAAC,GAAG,MAAMhB,YAAYO;QAEnCH,OAAOY,QAAQM,SAAS,CAAC;QACzB,uBAAuB;QACvBlB,OAAOH,MAAMsB,oBAAoB,CAAC;IACpC;IAEAlB,KAAK,mDAAmD;QACtDC,GAAGY,MAAM,CAACpB,cAAcqB,qBAAqB,CAAC,CAAC;QAC/Cb,GAAGY,MAAM,CAACnB,iBAAiBoB,qBAAqB,CAAC,CAAC;QAElD,MAAM,EAACH,MAAM,EAAC,GAAG,MAAMhB,YAAYO;QAEnCH,OAAOY,QAAQM,SAAS,CAAC;QACzB,uBAAuB;QACvBlB,OAAOH,MAAMsB,oBAAoB,CAAC;IACpC;AACF"}
1
+ {"version":3,"sources":["../../../src/commands/__tests__/manage.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getStudioConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport open from 'open'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ManageCommand} from '../manage.js'\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core')>('@sanity/cli-core')\n return {\n ...actual,\n getStudioConfig: vi.fn(),\n }\n})\n\nconst defaultMocks = {\n cliConfig: {},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n}\n\nafterEach(() => {\n vi.clearAllMocks()\n})\n\ndescribe('#manage', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['manage', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Opens project management interface in your web browser\n\n USAGE\n $ sanity manage\n\n DESCRIPTION\n Opens project management interface in your web browser\n\n \"\n `)\n })\n\n test('open link to project management interface if cli config has projectId', async () => {\n const {stdout} = await testCommand(ManageCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {\n api: {\n projectId: 'test-project-id',\n },\n },\n },\n })\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id')\n })\n\n test('open link to project management interface if studio config has projectId', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce({\n basePath: 'test-base-path',\n dataset: 'test-dataset',\n name: 'test-name',\n projectId: 'test-project-id',\n schema: {\n types: [],\n },\n unstable_sources: [],\n })\n\n const {stdout} = await testCommand(ManageCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/project/test-project-id')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/project/test-project-id')\n })\n\n test('open root link to manage page if studio config is array', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce([\n {\n basePath: 'test-base-path',\n dataset: 'test-dataset',\n name: 'test-name',\n projectId: 'test-project-id',\n schema: {\n _original: {\n types: [],\n },\n },\n title: 'test-title',\n unstable_sources: [],\n },\n ])\n\n const {stdout} = await testCommand(ManageCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/')\n })\n\n test('opens root manage page if no projectId is found', async () => {\n vi.mocked(getStudioConfig).mockResolvedValueOnce({} as never)\n\n const {stdout} = await testCommand(ManageCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Opening https://www.sanity.io/manage/')\n // Mocked in test setup\n expect(open).toHaveBeenCalledWith('https://www.sanity.io/manage/')\n })\n})\n"],"names":["runCommand","getStudioConfig","testCommand","open","afterEach","describe","expect","test","vi","ManageCommand","mock","actual","importActual","fn","defaultMocks","cliConfig","projectRoot","directory","path","type","clearAllMocks","stdout","toMatchInlineSnapshot","mocks","api","projectId","toContain","toHaveBeenCalledWith","mocked","mockResolvedValueOnce","basePath","dataset","name","schema","types","unstable_sources","_original","title"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,eAAe,QAAO,mBAAkB;AAChD,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,aAAa,QAAO,eAAc;AAE1CD,GAAGE,IAAI,CAAC,oBAAoB;IAC1B,MAAMC,SAAS,MAAMH,GAAGI,YAAY,CAAoC;IACxE,OAAO;QACL,GAAGD,MAAM;QACTV,iBAAiBO,GAAGK,EAAE;IACxB;AACF;AAEA,MAAMC,eAAe;IACnBC,WAAW,CAAC;IACZC,aAAa;QACXC,WAAW;QACXC,MAAM;QACNC,MAAM;IACR;AACF;AAEAf,UAAU;IACRI,GAAGY,aAAa;AAClB;AAEAf,SAAS,WAAW;IAClBE,KAAK,gBAAgB;QACnB,MAAM,EAACc,MAAM,EAAC,GAAG,MAAMrB,WAAW;YAAC;YAAU;SAAS;QAEtDM,OAAOe,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;IAUtC,CAAC;IACH;IAEAf,KAAK,yEAAyE;QAC5E,MAAM,EAACc,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YACpDc,OAAO;gBACL,GAAGT,YAAY;gBACfC,WAAW;oBACTS,KAAK;wBACHC,WAAW;oBACb;gBACF;YACF;QACF;QAEAnB,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;IAEApB,KAAK,4EAA4E;QAC/EC,GAAGoB,MAAM,CAAC3B,iBAAiB4B,qBAAqB,CAAC;YAC/CC,UAAU;YACVC,SAAS;YACTC,MAAM;YACNP,WAAW;YACXQ,QAAQ;gBACNC,OAAO,EAAE;YACX;YACAC,kBAAkB,EAAE;QACtB;QAEA,MAAM,EAACd,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YAACc,OAAOT;QAAY;QAE1ER,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;IAEApB,KAAK,2DAA2D;QAC9DC,GAAGoB,MAAM,CAAC3B,iBAAiB4B,qBAAqB,CAAC;YAC/C;gBACEC,UAAU;gBACVC,SAAS;gBACTC,MAAM;gBACNP,WAAW;gBACXQ,QAAQ;oBACNG,WAAW;wBACTF,OAAO,EAAE;oBACX;gBACF;gBACAG,OAAO;gBACPF,kBAAkB,EAAE;YACtB;SACD;QAED,MAAM,EAACd,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YAACc,OAAOT;QAAY;QAE1ER,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;IAEApB,KAAK,mDAAmD;QACtDC,GAAGoB,MAAM,CAAC3B,iBAAiB4B,qBAAqB,CAAC,CAAC;QAElD,MAAM,EAACR,MAAM,EAAC,GAAG,MAAMnB,YAAYO,eAAe,EAAE,EAAE;YAACc,OAAOT;QAAY;QAE1ER,OAAOe,QAAQK,SAAS,CAAC;QACzB,uBAAuB;QACvBpB,OAAOH,MAAMwB,oBAAoB,CAAC;IACpC;AACF"}
@@ -6,19 +6,17 @@ import { Versions } from '../../commands/versions.js';
6
6
  import { getCliVersion } from '../../util/getCliVersion.js';
7
7
  import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
8
8
  import { readPackageJson } from '../../util/readPackageJson.js';
9
- vi.mock('../../../../cli-core/src/config/findProjectRoot.js', async ()=>{
10
- return {
11
- findProjectRoot: vi.fn().mockResolvedValue({
12
- directory: '/test/path',
13
- root: '/test/path',
14
- type: 'studio'
15
- })
16
- };
17
- });
18
9
  vi.mock(import('../../util/getCliVersion.js'));
19
10
  vi.mock(import('../../util/readPackageJson.js'));
20
11
  vi.mock(import('../../util/getLocalPackageVersion.js'));
21
12
  vi.mock(import('get-latest-version'));
13
+ const defaultMocks = {
14
+ projectRoot: {
15
+ directory: '/test/path',
16
+ path: '/test/path/sanity.config.ts',
17
+ type: 'studio'
18
+ }
19
+ };
22
20
  afterEach(()=>{
23
21
  vi.clearAllMocks();
24
22
  });
@@ -55,7 +53,9 @@ describe('#versions', ()=>{
55
53
  });
56
54
  vi.mocked(getLatestVersion).mockResolvedValue('3.0.0');
57
55
  vi.mocked(getLocalPackageVersion).mockResolvedValue('3.0.0');
58
- const { stdout } = await testCommand(Versions);
56
+ const { stdout } = await testCommand(Versions, [], {
57
+ mocks: defaultMocks
58
+ });
59
59
  expect(stdout).toMatchInlineSnapshot(`
60
60
  "@sanity/cli (global) 3.0.0 (up to date)
61
61
  @sanity/cli 3.0.0 (up to date)
@@ -75,7 +75,9 @@ describe('#versions', ()=>{
75
75
  });
76
76
  vi.mocked(getLatestVersion).mockResolvedValue('3.0.0');
77
77
  vi.mocked(getLocalPackageVersion).mockResolvedValue('2.0.0');
78
- const { stdout } = await testCommand(Versions);
78
+ const { stdout } = await testCommand(Versions, [], {
79
+ mocks: defaultMocks
80
+ });
79
81
  expect(stdout).toMatchInlineSnapshot(`
80
82
  "@sanity/cli (global) 2.0.0 (latest: 3.0.0)
81
83
  @sanity/cli 2.0.0 (latest: 3.0.0)
@@ -94,7 +96,9 @@ describe('#versions', ()=>{
94
96
  });
95
97
  vi.mocked(getLocalPackageVersion).mockReturnValueOnce(Promise.resolve(undefined));
96
98
  vi.mocked(getLatestVersion).mockResolvedValue('3.0.0');
97
- const { stdout } = await testCommand(Versions);
99
+ const { stdout } = await testCommand(Versions, [], {
100
+ mocks: defaultMocks
101
+ });
98
102
  expect(stdout).toMatchInlineSnapshot(`
99
103
  "@sanity/cli (global) 3.0.0 (up to date)
100
104
  sanity <missing> (latest: 3.0.0)
@@ -111,7 +115,9 @@ describe('#versions', ()=>{
111
115
  version: '1.0.0'
112
116
  });
113
117
  vi.mocked(getLatestVersion).mockResolvedValue('3.0.0');
114
- const { stdout } = await testCommand(Versions);
118
+ const { stdout } = await testCommand(Versions, [], {
119
+ mocks: defaultMocks
120
+ });
115
121
  expect(stdout).toMatchInlineSnapshot(`
116
122
  "@sanity/cli (global) 3.0.0 (up to date)
117
123
  "
@@ -125,7 +131,9 @@ describe('#versions', ()=>{
125
131
  version: '1.0.0'
126
132
  });
127
133
  vi.mocked(getLatestVersion).mockRejectedValueOnce(new Error('No sanity packages found'));
128
- const { error } = await testCommand(Versions);
134
+ const { error } = await testCommand(Versions, [], {
135
+ mocks: defaultMocks
136
+ });
129
137
  expect(error).toBeInstanceOf(Error);
130
138
  expect(error?.message).toEqual('Cannot find version for @sanity/cli');
131
139
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/__tests__/versions.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport getLatestVersion from 'get-latest-version'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {Versions} from '../../commands/versions.js'\nimport {getCliVersion} from '../../util/getCliVersion.js'\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {readPackageJson} from '../../util/readPackageJson.js'\n\nvi.mock('../../../../cli-core/src/config/findProjectRoot.js', async () => {\n return {\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n }\n})\n\nvi.mock(import('../../util/getCliVersion.js'))\nvi.mock(import('../../util/readPackageJson.js'))\nvi.mock(import('../../util/getLocalPackageVersion.js'))\nvi.mock(import('get-latest-version'))\n\nafterEach(() => {\n vi.clearAllMocks()\n})\n\ndescribe('#versions', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['versions', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Shows installed versions of Sanity Studio and components\n\n USAGE\n $ sanity versions\n\n DESCRIPTION\n Shows installed versions of Sanity Studio and components\n\n EXAMPLES\n $ sanity versions\n\n \"\n `)\n })\n\n test('displays versions correctly when modules are up to date', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n '@sanity/cli': '3.0.0',\n sanity: '3.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n vi.mocked(getLocalPackageVersion).mockResolvedValue('3.0.0')\n\n const {stdout} = await testCommand(Versions)\n\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 3.0.0 (up to date)\n @sanity/cli 3.0.0 (up to date)\n sanity 3.0.0 (up to date)\n \"\n `)\n })\n\n test('displays versions correctly when modules need update', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('2.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n '@sanity/cli': '2.0.0',\n sanity: '2.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n vi.mocked(getLocalPackageVersion).mockResolvedValue('2.0.0')\n\n const {stdout} = await testCommand(Versions)\n\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 2.0.0 (latest: 3.0.0)\n @sanity/cli 2.0.0 (latest: 3.0.0)\n sanity 2.0.0 (latest: 3.0.0)\n \"\n `)\n })\n\n test('displays versions correctly when a module is missing', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n sanity: '3.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLocalPackageVersion).mockReturnValueOnce(Promise.resolve(undefined))\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n\n const {stdout} = await testCommand(Versions)\n\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 3.0.0 (up to date)\n sanity <missing> (latest: 3.0.0)\n \"\n `)\n })\n\n test(\"doesn't show anything if no sanity packages\", async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n 'something-random': '3.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n\n const {stdout} = await testCommand(Versions)\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 3.0.0 (up to date)\n \"\n `)\n })\n\n test('shows error if no sanity packages are found', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {},\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockRejectedValueOnce(new Error('No sanity packages found'))\n\n const {error} = await testCommand(Versions)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual('Cannot find version for @sanity/cli')\n })\n})\n"],"names":["runCommand","testCommand","getLatestVersion","afterEach","describe","expect","test","vi","Versions","getCliVersion","getLocalPackageVersion","readPackageJson","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","clearAllMocks","stdout","toMatchInlineSnapshot","mocked","mockResolvedValueOnce","dependencies","sanity","name","version","mockReturnValueOnce","Promise","resolve","undefined","mockRejectedValueOnce","Error","error","toBeInstanceOf","message","toEqual"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/__tests__/versions.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport getLatestVersion from 'get-latest-version'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {Versions} from '../../commands/versions.js'\nimport {getCliVersion} from '../../util/getCliVersion.js'\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {readPackageJson} from '../../util/readPackageJson.js'\n\nvi.mock(import('../../util/getCliVersion.js'))\nvi.mock(import('../../util/readPackageJson.js'))\nvi.mock(import('../../util/getLocalPackageVersion.js'))\nvi.mock(import('get-latest-version'))\n\nconst defaultMocks = {\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n}\n\nafterEach(() => {\n vi.clearAllMocks()\n})\n\ndescribe('#versions', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['versions', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Shows installed versions of Sanity Studio and components\n\n USAGE\n $ sanity versions\n\n DESCRIPTION\n Shows installed versions of Sanity Studio and components\n\n EXAMPLES\n $ sanity versions\n\n \"\n `)\n })\n\n test('displays versions correctly when modules are up to date', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n '@sanity/cli': '3.0.0',\n sanity: '3.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n vi.mocked(getLocalPackageVersion).mockResolvedValue('3.0.0')\n\n const {stdout} = await testCommand(Versions, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 3.0.0 (up to date)\n @sanity/cli 3.0.0 (up to date)\n sanity 3.0.0 (up to date)\n \"\n `)\n })\n\n test('displays versions correctly when modules need update', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('2.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n '@sanity/cli': '2.0.0',\n sanity: '2.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n vi.mocked(getLocalPackageVersion).mockResolvedValue('2.0.0')\n\n const {stdout} = await testCommand(Versions, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 2.0.0 (latest: 3.0.0)\n @sanity/cli 2.0.0 (latest: 3.0.0)\n sanity 2.0.0 (latest: 3.0.0)\n \"\n `)\n })\n\n test('displays versions correctly when a module is missing', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n sanity: '3.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLocalPackageVersion).mockReturnValueOnce(Promise.resolve(undefined))\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n\n const {stdout} = await testCommand(Versions, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 3.0.0 (up to date)\n sanity <missing> (latest: 3.0.0)\n \"\n `)\n })\n\n test(\"doesn't show anything if no sanity packages\", async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {\n 'something-random': '3.0.0',\n },\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockResolvedValue('3.0.0' as never)\n\n const {stdout} = await testCommand(Versions, [], {mocks: defaultMocks})\n expect(stdout).toMatchInlineSnapshot(`\n \"@sanity/cli (global) 3.0.0 (up to date)\n \"\n `)\n })\n\n test('shows error if no sanity packages are found', async () => {\n vi.mocked(getCliVersion).mockResolvedValueOnce('3.0.0')\n vi.mocked(readPackageJson).mockResolvedValueOnce({\n dependencies: {},\n name: 'test',\n version: '1.0.0',\n })\n vi.mocked(getLatestVersion).mockRejectedValueOnce(new Error('No sanity packages found'))\n\n const {error} = await testCommand(Versions, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual('Cannot find version for @sanity/cli')\n })\n})\n"],"names":["runCommand","testCommand","getLatestVersion","afterEach","describe","expect","test","vi","Versions","getCliVersion","getLocalPackageVersion","readPackageJson","mock","defaultMocks","projectRoot","directory","path","type","clearAllMocks","stdout","toMatchInlineSnapshot","mocked","mockResolvedValueOnce","dependencies","sanity","name","version","mockResolvedValue","mocks","mockReturnValueOnce","Promise","resolve","undefined","mockRejectedValueOnce","Error","error","toBeInstanceOf","message","toEqual"],"mappings":"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"}
@@ -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 { DisableBackupCommand } from '../disable.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
  describe('#backup:disable', ()=>{
59
44
  afterEach(()=>{
60
45
  const pending = nock.pendingMocks();
@@ -92,32 +77,27 @@ describe('#backup:disable', ()=>{
92
77
  `);
93
78
  });
94
79
  test('should disable backup for specified dataset', async ()=>{
80
+ mockListDatasets.mockResolvedValue([
81
+ {
82
+ name: 'production'
83
+ }
84
+ ]);
95
85
  mockApi({
96
86
  apiVersion: BACKUP_API_VERSION,
97
87
  method: 'put',
98
- uri: '/projects/test-project/datasets/production/settings/backups'
88
+ uri: `/projects/${testProjectId}/datasets/production/settings/backups`
99
89
  }).reply(200, {
100
90
  enabled: false
101
91
  });
102
- setupMocksWithDatasets([
103
- {
104
- name: 'production'
105
- }
106
- ]);
107
92
  const { stdout } = await testCommand(DisableBackupCommand, [
108
93
  'production'
109
- ]);
94
+ ], {
95
+ mocks: defaultMocks
96
+ });
110
97
  expect(stdout).toContain('Disabled daily backups for dataset production');
111
98
  });
112
99
  test('should prompt for dataset when none specified', async ()=>{
113
- mockApi({
114
- apiVersion: BACKUP_API_VERSION,
115
- method: 'put',
116
- uri: '/projects/test-project/datasets/production/settings/backups'
117
- }).reply(200, {
118
- enabled: false
119
- });
120
- setupMocksWithDatasets([
100
+ mockListDatasets.mockResolvedValue([
121
101
  {
122
102
  name: 'production'
123
103
  },
@@ -125,8 +105,17 @@ describe('#backup:disable', ()=>{
125
105
  name: 'staging'
126
106
  }
127
107
  ]);
108
+ mockApi({
109
+ apiVersion: BACKUP_API_VERSION,
110
+ method: 'put',
111
+ uri: `/projects/${testProjectId}/datasets/production/settings/backups`
112
+ }).reply(200, {
113
+ enabled: false
114
+ });
128
115
  mockSelect.mockResolvedValue('production');
129
- const { stdout } = await testCommand(DisableBackupCommand, []);
116
+ const { stdout } = await testCommand(DisableBackupCommand, [], {
117
+ mocks: defaultMocks
118
+ });
130
119
  expect(stdout).toContain('Disabled daily backups for dataset production');
131
120
  expect(mockSelect).toHaveBeenCalledWith({
132
121
  choices: [
@@ -143,51 +132,57 @@ describe('#backup:disable', ()=>{
143
132
  });
144
133
  });
145
134
  test('should fail when no project ID is available', async ()=>{
146
- mockGetCliConfig.mockResolvedValueOnce({
147
- api: undefined
148
- });
149
135
  const { error } = await testCommand(DisableBackupCommand, [
150
136
  'production'
151
- ]);
137
+ ], {
138
+ mocks: {
139
+ ...defaultMocks,
140
+ cliConfig: {
141
+ api: undefined
142
+ }
143
+ }
144
+ });
152
145
  expect(error?.message).toContain(NO_PROJECT_ID);
153
146
  expect(error?.oclif?.exit).toBe(1);
154
147
  });
155
148
  test('should handle API errors gracefully', async ()=>{
156
- mockApi({
157
- apiVersion: BACKUP_API_VERSION,
158
- method: 'put',
159
- uri: '/projects/test-project/datasets/production/settings/backups'
160
- }).reply(500, 'API request failed');
161
- setupMocksWithDatasets([
149
+ mockListDatasets.mockResolvedValue([
162
150
  {
163
151
  name: 'production'
164
152
  }
165
153
  ]);
154
+ mockApi({
155
+ apiVersion: BACKUP_API_VERSION,
156
+ method: 'put',
157
+ uri: `/projects/${testProjectId}/datasets/production/settings/backups`
158
+ }).reply(500, 'API request failed');
166
159
  const { error } = await testCommand(DisableBackupCommand, [
167
160
  'production'
168
- ]);
161
+ ], {
162
+ mocks: defaultMocks
163
+ });
169
164
  expect(error?.message).toContain('Disabling dataset backup failed:');
170
165
  expect(error?.message).toContain('API request failed');
171
166
  expect(error?.oclif?.exit).toBe(1);
172
167
  });
173
168
  test('should fail when no datasets are available', async ()=>{
174
- setupMocksWithDatasets([]);
175
- const { error } = await testCommand(DisableBackupCommand, []);
169
+ mockListDatasets.mockResolvedValue([]);
170
+ const { error } = await testCommand(DisableBackupCommand, [], {
171
+ mocks: defaultMocks
172
+ });
176
173
  expect(error?.message).toContain('No datasets found in this project');
177
174
  expect(error?.oclif?.exit).toBe(1);
178
175
  });
179
176
  test('should handle dataset list fetch errors', async ()=>{
180
- mockGetProjectCliClient.mockResolvedValue({
181
- datasets: {
182
- list: vi.fn().mockRejectedValue(new Error('Failed to fetch datasets'))
183
- }
177
+ mockListDatasets.mockRejectedValue(new Error('Failed to fetch datasets'));
178
+ const { error } = await testCommand(DisableBackupCommand, [], {
179
+ mocks: defaultMocks
184
180
  });
185
- const { error } = await testCommand(DisableBackupCommand, []);
186
181
  expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets');
187
182
  expect(error?.oclif?.exit).toBe(1);
188
183
  });
189
184
  test('should fail when specified dataset does not exist', async ()=>{
190
- setupMocksWithDatasets([
185
+ mockListDatasets.mockResolvedValue([
191
186
  {
192
187
  name: 'production'
193
188
  },
@@ -197,7 +192,9 @@ describe('#backup:disable', ()=>{
197
192
  ]);
198
193
  const { error } = await testCommand(DisableBackupCommand, [
199
194
  'nonexistent'
200
- ]);
195
+ ], {
196
+ mocks: defaultMocks
197
+ });
201
198
  expect(error?.message).toContain("Dataset 'nonexistent' not found");
202
199
  expect(error?.message).toContain('Available datasets: production, staging');
203
200
  expect(error?.oclif?.exit).toBe(1);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/backup/__tests__/disable.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 {DisableBackupCommand} from '../disable.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\ndescribe('#backup:disable', () => {\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 disable', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Disable backup for a dataset.\n\n USAGE\n $ sanity backup disable [DATASET]\n\n ARGUMENTS\n [DATASET] Dataset name to disable backup for\n\n DESCRIPTION\n Disable backup for a dataset.\n\n EXAMPLES\n Interactively disable backup for a dataset\n\n $ sanity backup disable\n\n Disable backup for the production dataset\n\n $ sanity backup disable production\n\n \"\n `)\n })\n\n test('should disable backup for specified dataset', async () => {\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/settings/backups',\n }).reply(200, {enabled: false})\n\n setupMocksWithDatasets([{name: 'production'}])\n\n const {stdout} = await testCommand(DisableBackupCommand, ['production'])\n\n expect(stdout).toContain('Disabled daily backups for dataset production')\n })\n\n test('should prompt for dataset when none specified', async () => {\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/settings/backups',\n }).reply(200, {enabled: false})\n\n setupMocksWithDatasets([{name: 'production'}, {name: 'staging'}])\n mockSelect.mockResolvedValue('production')\n\n const {stdout} = await testCommand(DisableBackupCommand, [])\n\n expect(stdout).toContain('Disabled daily backups for dataset production')\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 })\n\n test('should fail when no project ID is available', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: undefined,\n })\n\n const {error} = await testCommand(DisableBackupCommand, ['production'])\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle API errors gracefully', async () => {\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/settings/backups',\n }).reply(500, 'API request failed')\n\n setupMocksWithDatasets([{name: 'production'}])\n\n const {error} = await testCommand(DisableBackupCommand, ['production'])\n\n expect(error?.message).toContain('Disabling dataset backup failed:')\n expect(error?.message).toContain('API request failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when no datasets are available', async () => {\n setupMocksWithDatasets([])\n\n const {error} = await testCommand(DisableBackupCommand, [])\n\n expect(error?.message).toContain('No datasets found in this project')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle dataset list fetch errors', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockRejectedValue(new Error('Failed to fetch datasets')),\n },\n } as never)\n\n const {error} = await testCommand(DisableBackupCommand, [])\n\n expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when specified dataset does not exist', async () => {\n setupMocksWithDatasets([{name: 'production'}, {name: 'staging'}])\n\n const {error} = await testCommand(DisableBackupCommand, ['nonexistent'])\n\n expect(error?.message).toContain(\"Dataset 'nonexistent' not found\")\n expect(error?.message).toContain('Available datasets: production, staging')\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","DisableBackupCommand","mock","actual","importActual","fn","findProjectRoot","mockResolvedValue","directory","root","type","api","projectId","getCliToken","importOriginal","mockGetCliConfig","mocked","mockSelect","mockGetProjectCliClient","setupMocksWithDatasets","datasets","name","list","pending","pendingMocks","cleanAll","clearAllMocks","toEqual","stdout","toMatchInlineSnapshot","apiVersion","method","uri","reply","enabled","toContain","toHaveBeenCalledWith","choices","value","message","mockResolvedValueOnce","undefined","error","oclif","exit","toBe","mockRejectedValue","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/backup/__tests__/disable.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 {DisableBackupCommand} from '../disable.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\ndescribe('#backup:disable', () => {\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 disable', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Disable backup for a dataset.\n\n USAGE\n $ sanity backup disable [DATASET]\n\n ARGUMENTS\n [DATASET] Dataset name to disable backup for\n\n DESCRIPTION\n Disable backup for a dataset.\n\n EXAMPLES\n Interactively disable backup for a dataset\n\n $ sanity backup disable\n\n Disable backup for the production dataset\n\n $ sanity backup disable production\n\n \"\n `)\n })\n\n test('should disable backup for specified dataset', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'put',\n uri: `/projects/${testProjectId}/datasets/production/settings/backups`,\n }).reply(200, {enabled: false})\n\n const {stdout} = await testCommand(DisableBackupCommand, ['production'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('Disabled daily backups for dataset production')\n })\n\n test('should prompt for dataset when none specified', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}, {name: 'staging'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'put',\n uri: `/projects/${testProjectId}/datasets/production/settings/backups`,\n }).reply(200, {enabled: false})\n\n mockSelect.mockResolvedValue('production')\n\n const {stdout} = await testCommand(DisableBackupCommand, [], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('Disabled daily backups for dataset production')\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 })\n\n test('should fail when no project ID is available', async () => {\n const {error} = await testCommand(DisableBackupCommand, ['production'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: undefined},\n },\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle API errors gracefully', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}])\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'put',\n uri: `/projects/${testProjectId}/datasets/production/settings/backups`,\n }).reply(500, 'API request failed')\n\n const {error} = await testCommand(DisableBackupCommand, ['production'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Disabling dataset backup failed:')\n expect(error?.message).toContain('API request failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when no datasets are available', async () => {\n mockListDatasets.mockResolvedValue([])\n\n const {error} = await testCommand(DisableBackupCommand, [], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('No datasets found in this project')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should handle dataset list fetch errors', async () => {\n mockListDatasets.mockRejectedValue(new Error('Failed to fetch datasets'))\n\n const {error} = await testCommand(DisableBackupCommand, [], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fail when specified dataset does not exist', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'}, {name: 'staging'}])\n\n const {error} = await testCommand(DisableBackupCommand, ['nonexistent'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain(\"Dataset 'nonexistent' not found\")\n expect(error?.message).toContain('Available datasets: production, staging')\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","DisableBackupCommand","mockListDatasets","hoisted","fn","mock","importOriginal","actual","getProjectCliClient","mockResolvedValue","datasets","list","importActual","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockSelect","mocked","pending","pendingMocks","cleanAll","clearAllMocks","toEqual","stdout","toMatchInlineSnapshot","name","apiVersion","method","uri","reply","enabled","mocks","toContain","toHaveBeenCalledWith","choices","value","message","error","undefined","oclif","exit","toBe","mockRejectedValue","Error"],"mappings":"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"}