@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 +1 @@
1
- {"version":3,"sources":["../../../../../src/commands/dataset/alias/__tests__/create.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} 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 {DATASET_ALIASES_API_VERSION} from '../../../../services/datasetAliases.js'\nimport {listDatasets} from '../../../../services/datasets.js'\nimport {PROJECT_FEATURES_API_VERSION} from '../../../../services/getProjectFeatures.js'\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {CreateAliasCommand} from '../create.js'\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('../../../../services/datasets.js', () => ({\n listDatasets: vi.fn(),\n}))\n\nconst mockListDatasets = vi.mocked(listDatasets)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\n\ndescribe('#dataset:alias:create', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('help works correctly', async () => {\n const {stdout} = await runCommand(['dataset alias create', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Create a dataset alias within your project\n\n USAGE\n $ sanity dataset alias create [ALIASNAME] [TARGETDATASET]\n\n ARGUMENTS\n [ALIASNAME] Dataset alias name to create\n [TARGETDATASET] Target dataset name to link the alias to\n\n DESCRIPTION\n Create a dataset alias within your project\n\n EXAMPLES\n Create an alias with interactive prompts\n\n $ sanity dataset alias create\n\n Create alias named \"conference\" with interactive dataset selection\n\n $ sanity dataset alias create conference\n\n Create alias \"conference\" linked to \"conf-2025\" dataset\n\n $ sanity dataset alias create conference conf-2025\n\n Create alias with explicit ~ prefix\n\n $ sanity dataset alias create ~conference conf-2025\n\n \"\n `)\n })\n\n test.each([\n ['test-alias', 'without ~ prefix'],\n ['~test-alias', 'with ~ prefix'],\n ])('creates alias with valid arguments: %s (%s)', async (aliasInput) => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'put',\n uri: '/aliases/test-alias',\n }).reply(200, {aliasName: 'test-alias', datasetName: 'production'})\n\n const {stdout} = await testCommand(CreateAliasCommand, [aliasInput, 'production'])\n\n expect(stdout).toContain(\n 'Dataset alias ~test-alias created and linked to production successfully',\n )\n })\n\n test('creates alias without target dataset', async () => {\n mockListDatasets.mockResolvedValue([])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'put',\n uri: '/aliases/test-alias',\n }).reply(200, {aliasName: 'test-alias', datasetName: null})\n\n const {stdout} = await testCommand(CreateAliasCommand, ['test-alias'])\n\n expect(stdout).toContain('Dataset alias ~test-alias created successfully')\n })\n\n test('fails when alias already exists', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'existing-alias'}])\n\n const {error} = await testCommand(CreateAliasCommand, ['existing-alias', 'production'])\n\n expect(error?.message).toContain('Dataset alias \"~existing-alias\" already exists')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when project lacks advanced dataset management feature', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, [])\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'production'])\n\n expect(error?.message).toContain('This project cannot create a dataset alias')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when target dataset does not exist', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [])\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'nonexistent'])\n\n expect(error?.message).toContain('Dataset \"nonexistent\" does not exist')\n expect(error?.message).toContain('Available datasets: production')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no project ID available', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: {},\n })\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'production'])\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors gracefully', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'put',\n uri: '/aliases/test-alias',\n }).reply(500, {message: 'API Error: Network timeout'})\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'production'])\n\n expect(error?.message).toContain('Dataset alias creation failed: API Error: Network timeout')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n ['a', 'production', 'Alias name must be at least two characters long'],\n ['test-alias', 'Invalid Dataset', 'Dataset name must be all lowercase characters'],\n ])('fails with invalid input: alias=%s, dataset=%s', async (alias, dataset, expectedError) => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: PROJECT_FEATURES_API_VERSION,\n uri: '/features',\n }).reply(200, ['advancedDatasetManagement'])\n\n const {error} = await testCommand(CreateAliasCommand, [alias, dataset])\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getCliConfig","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","DATASET_ALIASES_API_VERSION","listDatasets","PROJECT_FEATURES_API_VERSION","NO_PROJECT_ID","CreateAliasCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","mockListDatasets","mocked","mockGetCliConfig","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","aliasInput","name","apiHost","apiVersion","uri","reply","method","aliasName","datasetName","toContain","error","message","oclif","exit","toBe","mockResolvedValueOnce","alias","dataset","expectedError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/commands/dataset/alias/__tests__/create.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {createTestClient, mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {DATASET_API_VERSION} from '../../../../services/datasets.js'\nimport {PROJECT_FEATURES_API_VERSION} from '../../../../services/getProjectFeatures.js'\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {CreateAliasCommand} from '../create.js'\n\nconst mockListDatasets = vi.hoisted(() => vi.fn())\nconst testProjectId = vi.hoisted(() => 'test-project')\nconst testToken = vi.hoisted(() => 'test-token')\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n const testClient = createTestClient({\n apiVersion: 'v2025-09-16',\n projectId: testProjectId,\n token: testToken,\n })\n\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n list: mockListDatasets,\n } as never,\n request: testClient.request,\n }),\n }\n})\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: testToken,\n}\n\ndescribe('#dataset:alias:create', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('help works correctly', async () => {\n const {stdout} = await runCommand(['dataset alias create', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Create a dataset alias within your project\n\n USAGE\n $ sanity dataset alias create [ALIASNAME] [TARGETDATASET]\n\n ARGUMENTS\n [ALIASNAME] Dataset alias name to create\n [TARGETDATASET] Target dataset name to link the alias to\n\n DESCRIPTION\n Create a dataset alias within your project\n\n EXAMPLES\n Create an alias with interactive prompts\n\n $ sanity dataset alias create\n\n Create alias named \"conference\" with interactive dataset selection\n\n $ sanity dataset alias create conference\n\n Create alias \"conference\" linked to \"conf-2025\" dataset\n\n $ sanity dataset alias create conference conf-2025\n\n Create alias with explicit ~ prefix\n\n $ sanity dataset alias create ~conference conf-2025\n\n \"\n `)\n })\n\n test.each([\n ['test-alias', 'without ~ prefix'],\n ['~test-alias', 'with ~ prefix'],\n ])('creates alias with valid arguments: %s (%s)', async (aliasInput) => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'put',\n uri: `/aliases/test-alias`,\n }).reply(200, {aliasName: 'test-alias', datasetName: 'production'})\n\n const {stdout} = await testCommand(CreateAliasCommand, [aliasInput, 'production'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain(\n 'Dataset alias ~test-alias created and linked to production successfully',\n )\n })\n\n test('creates alias without target dataset', async () => {\n mockListDatasets.mockResolvedValue([])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'put',\n uri: `/aliases/test-alias`,\n }).reply(200, {aliasName: 'test-alias', datasetName: null})\n\n const {stdout} = await testCommand(CreateAliasCommand, ['test-alias'], {mocks: defaultMocks})\n\n expect(stdout).toContain('Dataset alias ~test-alias created successfully')\n })\n\n test('fails when alias already exists', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [{datasetName: 'production', name: 'existing-alias'}])\n\n const {error} = await testCommand(CreateAliasCommand, ['existing-alias', 'production'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Dataset alias \"~existing-alias\" already exists')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when project lacks advanced dataset management feature', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, [])\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'production'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('This project cannot create a dataset alias')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when target dataset does not exist', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'nonexistent'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Dataset \"nonexistent\" does not exist')\n expect(error?.message).toContain('Available datasets: production')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no project ID available', async () => {\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'production'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {}},\n },\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors gracefully', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, ['advancedDatasetManagement'])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'put',\n uri: `/aliases/test-alias`,\n }).reply(500, {error: 'API Error: Network timeout', message: 'API Error: Network timeout'})\n\n const {error} = await testCommand(CreateAliasCommand, ['test-alias', 'production'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Dataset alias creation failed: API Error: Network timeout')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n ['a', 'production', 'Alias name must be at least two characters long'],\n ['test-alias', 'Invalid Dataset', 'Dataset name must be all lowercase characters'],\n ])('fails with invalid input: alias=%s, dataset=%s', async (alias, dataset, expectedError) => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: PROJECT_FEATURES_API_VERSION,\n method: 'get',\n uri: `/features`,\n }).reply(200, ['advancedDatasetManagement'])\n\n const {error} = await testCommand(CreateAliasCommand, [alias, dataset], {mocks: defaultMocks})\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","createTestClient","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","DATASET_API_VERSION","PROJECT_FEATURES_API_VERSION","NO_PROJECT_ID","CreateAliasCommand","mockListDatasets","hoisted","fn","testProjectId","testToken","mock","importOriginal","actual","testClient","apiVersion","projectId","token","getProjectCliClient","mockResolvedValue","datasets","list","request","defaultMocks","cliConfig","api","projectRoot","directory","path","type","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","aliasInput","name","apiHost","method","uri","reply","aliasName","datasetName","mocks","toContain","error","message","oclif","exit","toBe","alias","dataset","expectedError"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
2
  import { input } from '@sanity/cli-core/ux';
4
3
  import { mockApi, testCommand } from '@sanity/cli-test';
5
4
  import nock from 'nock';
@@ -7,23 +6,6 @@ import { afterEach, describe, expect, test, vi } from 'vitest';
7
6
  import { DATASET_ALIASES_API_VERSION } from '../../../../services/datasetAliases.js';
8
7
  import { NO_PROJECT_ID } from '../../../../util/errorMessages.js';
9
8
  import { DeleteAliasCommand } from '../delete.js';
10
- vi.mock('../../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
11
- findProjectRoot: vi.fn().mockResolvedValue({
12
- directory: '/test/path',
13
- root: '/test/path',
14
- type: 'studio'
15
- })
16
- }));
17
- vi.mock('../../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
18
- getCliConfig: vi.fn().mockResolvedValue({
19
- api: {
20
- projectId: 'test-project'
21
- }
22
- })
23
- }));
24
- vi.mock('../../../../../../cli-core/src/services/getCliToken.js', ()=>({
25
- getCliToken: vi.fn().mockResolvedValue('test-token')
26
- }));
27
9
  vi.mock('@sanity/cli-core/ux', async ()=>{
28
10
  const actual = await vi.importActual('@sanity/cli-core/ux');
29
11
  return {
@@ -31,7 +13,20 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
31
13
  input: vi.fn()
32
14
  };
33
15
  });
34
- const mockGetCliConfig = vi.mocked(getCliConfig);
16
+ const testProjectId = 'test-project';
17
+ const defaultMocks = {
18
+ cliConfig: {
19
+ api: {
20
+ projectId: testProjectId
21
+ }
22
+ },
23
+ projectRoot: {
24
+ directory: '/test/path',
25
+ path: '/test/path/sanity.config.ts',
26
+ type: 'studio'
27
+ },
28
+ token: 'test-token'
29
+ };
35
30
  const mockInput = vi.mocked(input);
36
31
  describe('#dataset:alias:delete', ()=>{
37
32
  afterEach(()=>{
@@ -107,7 +102,9 @@ describe('#dataset:alias:delete', ()=>{
107
102
  mockInput.mockResolvedValueOnce('~test-alias');
108
103
  const { stdout } = await testCommand(DeleteAliasCommand, [
109
104
  aliasInput
110
- ]);
105
+ ], {
106
+ mocks: defaultMocks
107
+ });
111
108
  expect(stdout).toContain('Dataset alias deleted successfully');
112
109
  expect(mockInput).toHaveBeenCalledWith({
113
110
  message: expect.stringContaining('This dataset alias is linked to production'),
@@ -136,7 +133,9 @@ describe('#dataset:alias:delete', ()=>{
136
133
  const { stderr, stdout } = await testCommand(DeleteAliasCommand, [
137
134
  'test-alias',
138
135
  '--force'
139
- ]);
136
+ ], {
137
+ mocks: defaultMocks
138
+ });
140
139
  expect(stderr).toContain("'--force' used: skipping confirmation");
141
140
  expect(stdout).toContain('Dataset alias deleted successfully');
142
141
  expect(mockInput).not.toHaveBeenCalled();
@@ -163,7 +162,9 @@ describe('#dataset:alias:delete', ()=>{
163
162
  mockInput.mockResolvedValueOnce('~test-alias');
164
163
  const { stdout } = await testCommand(DeleteAliasCommand, [
165
164
  'test-alias'
166
- ]);
165
+ ], {
166
+ mocks: defaultMocks
167
+ });
167
168
  expect(stdout).toContain('Dataset alias deleted successfully');
168
169
  expect(mockInput).toHaveBeenCalledWith({
169
170
  message: expect.stringContaining('Are you ABSOLUTELY sure you want to delete'),
@@ -184,24 +185,32 @@ describe('#dataset:alias:delete', ()=>{
184
185
  ]);
185
186
  const { error } = await testCommand(DeleteAliasCommand, [
186
187
  'nonexistent'
187
- ]);
188
+ ], {
189
+ mocks: defaultMocks
190
+ });
188
191
  expect(error?.message).toContain('Dataset alias "~nonexistent" does not exist');
189
192
  expect(error?.oclif?.exit).toBe(1);
190
193
  });
191
194
  test('fails with invalid alias name', async ()=>{
192
195
  const { error } = await testCommand(DeleteAliasCommand, [
193
196
  'a'
194
- ]);
197
+ ], {
198
+ mocks: defaultMocks
199
+ });
195
200
  expect(error?.message).toContain('Alias name must be at least two characters long');
196
201
  expect(error?.oclif?.exit).toBe(1);
197
202
  });
198
203
  test('fails when no project ID available', async ()=>{
199
- mockGetCliConfig.mockResolvedValueOnce({
200
- api: {}
201
- });
202
204
  const { error } = await testCommand(DeleteAliasCommand, [
203
205
  'test-alias'
204
- ]);
206
+ ], {
207
+ mocks: {
208
+ ...defaultMocks,
209
+ cliConfig: {
210
+ api: {}
211
+ }
212
+ }
213
+ });
205
214
  expect(error?.message).toContain(NO_PROJECT_ID);
206
215
  expect(error?.oclif?.exit).toBe(1);
207
216
  });
@@ -227,7 +236,9 @@ describe('#dataset:alias:delete', ()=>{
227
236
  mockInput.mockResolvedValueOnce('~test-alias');
228
237
  const { error } = await testCommand(DeleteAliasCommand, [
229
238
  'test-alias'
230
- ]);
239
+ ], {
240
+ mocks: defaultMocks
241
+ });
231
242
  expect(error?.message).toContain('Dataset alias deletion failed: API Error: Network timeout');
232
243
  expect(error?.oclif?.exit).toBe(1);
233
244
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/commands/dataset/alias/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {input} 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 {DATASET_ALIASES_API_VERSION} from '../../../../services/datasetAliases.js'\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {DeleteAliasCommand} from '../delete.js'\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('@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 input: vi.fn(),\n }\n})\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockInput = vi.mocked(input)\n\ndescribe('#dataset:alias:delete', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('help works correctly', async () => {\n const {stdout} = await runCommand(['dataset alias delete', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Delete a dataset alias within your project\n\n USAGE\n $ sanity dataset alias delete ALIASNAME [--force]\n\n ARGUMENTS\n ALIASNAME Dataset alias name to delete\n\n FLAGS\n --force Skip confirmation prompt and delete immediately\n\n DESCRIPTION\n Delete a dataset alias within your project\n\n EXAMPLES\n Delete alias named \"conference\" with confirmation prompt\n\n $ sanity dataset alias delete conference\n\n Delete alias with explicit ~ prefix\n\n $ sanity dataset alias delete ~conference\n\n Delete alias named \"conference\" without confirmation prompt\n\n $ sanity dataset alias delete conference --force\n\n \"\n `)\n })\n\n test.each([\n ['test-alias', 'without ~ prefix'],\n ['~test-alias', 'with ~ prefix'],\n ])('deletes alias with confirmation: %s (%s)', async (aliasInput) => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(200, {deleted: true})\n\n mockInput.mockResolvedValueOnce('~test-alias')\n\n const {stdout} = await testCommand(DeleteAliasCommand, [aliasInput])\n\n expect(stdout).toContain('Dataset alias deleted successfully')\n expect(mockInput).toHaveBeenCalledWith({\n message: expect.stringContaining('This dataset alias is linked to production'),\n validate: expect.any(Function),\n })\n })\n\n test('deletes alias with force flag (skips confirmation)', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(200, {deleted: true})\n\n const {stderr, stdout} = await testCommand(DeleteAliasCommand, ['test-alias', '--force'])\n\n expect(stderr).toContain(\"'--force' used: skipping confirmation\")\n expect(stdout).toContain('Dataset alias deleted successfully')\n expect(mockInput).not.toHaveBeenCalled()\n })\n\n test('deletes unlinked alias with confirmation (different prompt message)', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: null, name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(200, {deleted: true})\n\n mockInput.mockResolvedValueOnce('~test-alias')\n\n const {stdout} = await testCommand(DeleteAliasCommand, ['test-alias'])\n\n expect(stdout).toContain('Dataset alias deleted successfully')\n expect(mockInput).toHaveBeenCalledWith({\n message: expect.stringContaining('Are you ABSOLUTELY sure you want to delete'),\n validate: expect.any(Function),\n })\n expect(mockInput.mock.calls[0][0].message).not.toContain('linked to')\n })\n\n test('fails when alias does not exist', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'other-alias'}])\n\n const {error} = await testCommand(DeleteAliasCommand, ['nonexistent'])\n\n expect(error?.message).toContain('Dataset alias \"~nonexistent\" does not exist')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails with invalid alias name', async () => {\n const {error} = await testCommand(DeleteAliasCommand, ['a'])\n\n expect(error?.message).toContain('Alias name must be at least two characters long')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no project ID available', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: {},\n })\n\n const {error} = await testCommand(DeleteAliasCommand, ['test-alias'])\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors gracefully', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(500, {message: 'API Error: Network timeout'})\n\n mockInput.mockResolvedValueOnce('~test-alias')\n\n const {error} = await testCommand(DeleteAliasCommand, ['test-alias'])\n\n expect(error?.message).toContain('Dataset alias deletion failed: API Error: Network timeout')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getCliConfig","input","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","DATASET_ALIASES_API_VERSION","NO_PROJECT_ID","DeleteAliasCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","actual","importActual","mockGetCliConfig","mocked","mockInput","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","aliasInput","apiHost","apiVersion","uri","reply","datasetName","name","method","deleted","mockResolvedValueOnce","toContain","toHaveBeenCalledWith","message","stringContaining","validate","any","Function","stderr","not","toHaveBeenCalled","calls","error","oclif","exit","toBe"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/commands/dataset/alias/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {input} 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 {DATASET_ALIASES_API_VERSION} from '../../../../services/datasetAliases.js'\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {DeleteAliasCommand} from '../delete.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 input: 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 mockInput = vi.mocked(input)\n\ndescribe('#dataset:alias:delete', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('help works correctly', async () => {\n const {stdout} = await runCommand(['dataset alias delete', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Delete a dataset alias within your project\n\n USAGE\n $ sanity dataset alias delete ALIASNAME [--force]\n\n ARGUMENTS\n ALIASNAME Dataset alias name to delete\n\n FLAGS\n --force Skip confirmation prompt and delete immediately\n\n DESCRIPTION\n Delete a dataset alias within your project\n\n EXAMPLES\n Delete alias named \"conference\" with confirmation prompt\n\n $ sanity dataset alias delete conference\n\n Delete alias with explicit ~ prefix\n\n $ sanity dataset alias delete ~conference\n\n Delete alias named \"conference\" without confirmation prompt\n\n $ sanity dataset alias delete conference --force\n\n \"\n `)\n })\n\n test.each([\n ['test-alias', 'without ~ prefix'],\n ['~test-alias', 'with ~ prefix'],\n ])('deletes alias with confirmation: %s (%s)', async (aliasInput) => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(200, {deleted: true})\n\n mockInput.mockResolvedValueOnce('~test-alias')\n\n const {stdout} = await testCommand(DeleteAliasCommand, [aliasInput], {mocks: defaultMocks})\n\n expect(stdout).toContain('Dataset alias deleted successfully')\n expect(mockInput).toHaveBeenCalledWith({\n message: expect.stringContaining('This dataset alias is linked to production'),\n validate: expect.any(Function),\n })\n })\n\n test('deletes alias with force flag (skips confirmation)', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(200, {deleted: true})\n\n const {stderr, stdout} = await testCommand(DeleteAliasCommand, ['test-alias', '--force'], {\n mocks: defaultMocks,\n })\n\n expect(stderr).toContain(\"'--force' used: skipping confirmation\")\n expect(stdout).toContain('Dataset alias deleted successfully')\n expect(mockInput).not.toHaveBeenCalled()\n })\n\n test('deletes unlinked alias with confirmation (different prompt message)', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: null, name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(200, {deleted: true})\n\n mockInput.mockResolvedValueOnce('~test-alias')\n\n const {stdout} = await testCommand(DeleteAliasCommand, ['test-alias'], {mocks: defaultMocks})\n\n expect(stdout).toContain('Dataset alias deleted successfully')\n expect(mockInput).toHaveBeenCalledWith({\n message: expect.stringContaining('Are you ABSOLUTELY sure you want to delete'),\n validate: expect.any(Function),\n })\n expect(mockInput.mock.calls[0][0].message).not.toContain('linked to')\n })\n\n test('fails when alias does not exist', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'other-alias'}])\n\n const {error} = await testCommand(DeleteAliasCommand, ['nonexistent'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Dataset alias \"~nonexistent\" does not exist')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails with invalid alias name', async () => {\n const {error} = await testCommand(DeleteAliasCommand, ['a'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Alias name must be at least two characters long')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no project ID available', async () => {\n const {error} = await testCommand(DeleteAliasCommand, ['test-alias'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {}},\n },\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors gracefully', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n uri: '/aliases',\n }).reply(200, [{datasetName: 'production', name: 'test-alias'}])\n\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: DATASET_ALIASES_API_VERSION,\n method: 'delete',\n uri: '/aliases/test-alias',\n }).reply(500, {message: 'API Error: Network timeout'})\n\n mockInput.mockResolvedValueOnce('~test-alias')\n\n const {error} = await testCommand(DeleteAliasCommand, ['test-alias'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Dataset alias deletion failed: API Error: Network timeout')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","input","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","DATASET_ALIASES_API_VERSION","NO_PROJECT_ID","DeleteAliasCommand","mock","actual","importActual","fn","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockInput","mocked","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","aliasInput","apiHost","apiVersion","uri","reply","datasetName","name","method","deleted","mockResolvedValueOnce","mocks","toContain","toHaveBeenCalledWith","message","stringContaining","validate","any","Function","stderr","not","toHaveBeenCalled","calls","error","oclif","exit","toBe"],"mappings":"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"}
@@ -1,34 +1,43 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
- import { mockApi, testCommand } from '@sanity/cli-test';
2
+ import { createTestClient, mockApi, testCommand } from '@sanity/cli-test';
4
3
  import nock from 'nock';
5
4
  import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { DATASET_ALIASES_API_VERSION } from '../../../../services/datasetAliases.js';
7
- import { listDatasets } from '../../../../services/datasets.js';
5
+ import { DATASET_API_VERSION } from '../../../../services/datasets.js';
8
6
  import { NO_PROJECT_ID } from '../../../../util/errorMessages.js';
9
7
  import { LinkAliasCommand } from '../link.js';
10
- vi.mock('../../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
11
- findProjectRoot: vi.fn().mockResolvedValue({
12
- directory: '/test/path',
13
- root: '/test/path',
14
- type: 'studio'
15
- })
16
- }));
17
- vi.mock('../../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
18
- getCliConfig: vi.fn().mockResolvedValue({
19
- api: {
20
- projectId: 'test-project'
21
- }
8
+ const mockListDatasets = vi.hoisted(()=>vi.fn());
9
+ const testProjectId = vi.hoisted(()=>'test-project');
10
+ const testToken = vi.hoisted(()=>'test-token');
11
+ vi.mock('@sanity/cli-core', async (importOriginal)=>{
12
+ const actual = await importOriginal();
13
+ const testClient = createTestClient({
14
+ apiVersion: 'v2025-09-16',
15
+ projectId: testProjectId,
16
+ token: testToken
17
+ });
18
+ return {
19
+ ...actual,
20
+ getProjectCliClient: vi.fn().mockResolvedValue({
21
+ datasets: {
22
+ list: mockListDatasets
23
+ },
24
+ request: testClient.request
22
25
  })
23
- }));
24
- vi.mock('../../../../../../cli-core/src/services/getCliToken.js', ()=>({
25
- getCliToken: vi.fn().mockResolvedValue('test-token')
26
- }));
27
- vi.mock('../../../../services/datasets.js', ()=>({
28
- listDatasets: vi.fn()
29
- }));
30
- const mockListDatasets = vi.mocked(listDatasets);
31
- const mockGetCliConfig = vi.mocked(getCliConfig);
26
+ };
27
+ });
28
+ const defaultMocks = {
29
+ cliConfig: {
30
+ api: {
31
+ projectId: testProjectId
32
+ }
33
+ },
34
+ projectRoot: {
35
+ directory: '/test/path',
36
+ path: '/test/path/sanity.config.ts',
37
+ type: 'studio'
38
+ },
39
+ token: testToken
40
+ };
32
41
  describe('#dataset:alias:link', ()=>{
33
42
  afterEach(()=>{
34
43
  vi.clearAllMocks();
@@ -91,9 +100,10 @@ describe('#dataset:alias:link', ()=>{
91
100
  }
92
101
  ]);
93
102
  mockApi({
94
- apiHost: 'https://test-project.api.sanity.io',
95
- apiVersion: DATASET_ALIASES_API_VERSION,
96
- uri: '/aliases'
103
+ apiHost: `https://${testProjectId}.api.sanity.io`,
104
+ apiVersion: DATASET_API_VERSION,
105
+ method: 'get',
106
+ uri: `/aliases`
97
107
  }).reply(200, [
98
108
  {
99
109
  datasetName: null,
@@ -101,10 +111,10 @@ describe('#dataset:alias:link', ()=>{
101
111
  }
102
112
  ]);
103
113
  mockApi({
104
- apiHost: 'https://test-project.api.sanity.io',
105
- apiVersion: DATASET_ALIASES_API_VERSION,
114
+ apiHost: `https://${testProjectId}.api.sanity.io`,
115
+ apiVersion: DATASET_API_VERSION,
106
116
  method: 'patch',
107
- uri: '/aliases/staging'
117
+ uri: `/aliases/staging`
108
118
  }).reply(200, {
109
119
  aliasName: 'staging',
110
120
  datasetName: 'production'
@@ -112,7 +122,9 @@ describe('#dataset:alias:link', ()=>{
112
122
  const { stdout } = await testCommand(LinkAliasCommand, [
113
123
  'staging',
114
124
  'production'
115
- ]);
125
+ ], {
126
+ mocks: defaultMocks
127
+ });
116
128
  expect(stdout).toContain('Dataset alias ~staging linked to production successfully');
117
129
  });
118
130
  test('re-links already-linked alias when using force flag', async ()=>{
@@ -125,9 +137,10 @@ describe('#dataset:alias:link', ()=>{
125
137
  }
126
138
  ]);
127
139
  mockApi({
128
- apiHost: 'https://test-project.api.sanity.io',
129
- apiVersion: DATASET_ALIASES_API_VERSION,
130
- uri: '/aliases'
140
+ apiHost: `https://${testProjectId}.api.sanity.io`,
141
+ apiVersion: DATASET_API_VERSION,
142
+ method: 'get',
143
+ uri: `/aliases`
131
144
  }).reply(200, [
132
145
  {
133
146
  datasetName: 'development',
@@ -135,10 +148,10 @@ describe('#dataset:alias:link', ()=>{
135
148
  }
136
149
  ]);
137
150
  mockApi({
138
- apiHost: 'https://test-project.api.sanity.io',
139
- apiVersion: DATASET_ALIASES_API_VERSION,
151
+ apiHost: `https://${testProjectId}.api.sanity.io`,
152
+ apiVersion: DATASET_API_VERSION,
140
153
  method: 'patch',
141
- uri: '/aliases/staging'
154
+ uri: `/aliases/staging`
142
155
  }).reply(200, {
143
156
  aliasName: 'staging',
144
157
  datasetName: 'production'
@@ -147,7 +160,9 @@ describe('#dataset:alias:link', ()=>{
147
160
  'staging',
148
161
  'production',
149
162
  '--force'
150
- ]);
163
+ ], {
164
+ mocks: defaultMocks
165
+ });
151
166
  expect(stderr).toContain("'--force' used: skipping confirmation, linking alias to");
152
167
  expect(stdout).toContain('Dataset alias ~staging linked to production successfully');
153
168
  });
@@ -158,9 +173,10 @@ describe('#dataset:alias:link', ()=>{
158
173
  }
159
174
  ]);
160
175
  mockApi({
161
- apiHost: 'https://test-project.api.sanity.io',
162
- apiVersion: DATASET_ALIASES_API_VERSION,
163
- uri: '/aliases'
176
+ apiHost: `https://${testProjectId}.api.sanity.io`,
177
+ apiVersion: DATASET_API_VERSION,
178
+ method: 'get',
179
+ uri: `/aliases`
164
180
  }).reply(200, [
165
181
  {
166
182
  datasetName: null,
@@ -168,10 +184,10 @@ describe('#dataset:alias:link', ()=>{
168
184
  }
169
185
  ]);
170
186
  mockApi({
171
- apiHost: 'https://test-project.api.sanity.io',
172
- apiVersion: DATASET_ALIASES_API_VERSION,
187
+ apiHost: `https://${testProjectId}.api.sanity.io`,
188
+ apiVersion: DATASET_API_VERSION,
173
189
  method: 'patch',
174
- uri: '/aliases/staging'
190
+ uri: `/aliases/staging`
175
191
  }).reply(200, {
176
192
  aliasName: 'staging',
177
193
  datasetName: 'production'
@@ -179,7 +195,9 @@ describe('#dataset:alias:link', ()=>{
179
195
  const { stdout } = await testCommand(LinkAliasCommand, [
180
196
  'staging',
181
197
  'production'
182
- ]);
198
+ ], {
199
+ mocks: defaultMocks
200
+ });
183
201
  expect(stdout).toContain('Dataset alias ~staging linked to production successfully');
184
202
  expect(stdout).not.toContain('confirmation');
185
203
  });
@@ -198,18 +216,24 @@ describe('#dataset:alias:link', ()=>{
198
216
  const { error } = await testCommand(LinkAliasCommand, [
199
217
  alias,
200
218
  dataset
201
- ]);
219
+ ], {
220
+ mocks: defaultMocks
221
+ });
202
222
  expect(error?.message).toContain(expectedError);
203
223
  expect(error?.oclif?.exit).toBe(1);
204
224
  });
205
225
  test('fails when no project ID', async ()=>{
206
- mockGetCliConfig.mockResolvedValueOnce({
207
- api: {}
208
- });
209
226
  const { error } = await testCommand(LinkAliasCommand, [
210
227
  'staging',
211
228
  'production'
212
- ]);
229
+ ], {
230
+ mocks: {
231
+ ...defaultMocks,
232
+ cliConfig: {
233
+ api: {}
234
+ }
235
+ }
236
+ });
213
237
  expect(error?.message).toContain(NO_PROJECT_ID);
214
238
  expect(error?.oclif?.exit).toBe(1);
215
239
  });
@@ -220,9 +244,10 @@ describe('#dataset:alias:link', ()=>{
220
244
  }
221
245
  ]);
222
246
  mockApi({
223
- apiHost: 'https://test-project.api.sanity.io',
224
- apiVersion: DATASET_ALIASES_API_VERSION,
225
- uri: '/aliases'
247
+ apiHost: `https://${testProjectId}.api.sanity.io`,
248
+ apiVersion: DATASET_API_VERSION,
249
+ method: 'get',
250
+ uri: `/aliases`
226
251
  }).reply(200, [
227
252
  {
228
253
  datasetName: null,
@@ -232,7 +257,9 @@ describe('#dataset:alias:link', ()=>{
232
257
  const { error } = await testCommand(LinkAliasCommand, [
233
258
  'nonexistent',
234
259
  'production'
235
- ]);
260
+ ], {
261
+ mocks: defaultMocks
262
+ });
236
263
  expect(error?.message).toContain('Dataset alias "~nonexistent" does not exist');
237
264
  expect(error?.oclif?.exit).toBe(1);
238
265
  });
@@ -243,9 +270,10 @@ describe('#dataset:alias:link', ()=>{
243
270
  }
244
271
  ]);
245
272
  mockApi({
246
- apiHost: 'https://test-project.api.sanity.io',
247
- apiVersion: DATASET_ALIASES_API_VERSION,
248
- uri: '/aliases'
273
+ apiHost: `https://${testProjectId}.api.sanity.io`,
274
+ apiVersion: DATASET_API_VERSION,
275
+ method: 'get',
276
+ uri: `/aliases`
249
277
  }).reply(200, [
250
278
  {
251
279
  datasetName: null,
@@ -255,7 +283,9 @@ describe('#dataset:alias:link', ()=>{
255
283
  const { error } = await testCommand(LinkAliasCommand, [
256
284
  'staging',
257
285
  'nonexistent'
258
- ]);
286
+ ], {
287
+ mocks: defaultMocks
288
+ });
259
289
  expect(error?.message).toContain('Dataset "nonexistent" does not exist');
260
290
  expect(error?.oclif?.exit).toBe(1);
261
291
  });
@@ -266,9 +296,10 @@ describe('#dataset:alias:link', ()=>{
266
296
  }
267
297
  ]);
268
298
  mockApi({
269
- apiHost: 'https://test-project.api.sanity.io',
270
- apiVersion: DATASET_ALIASES_API_VERSION,
271
- uri: '/aliases'
299
+ apiHost: `https://${testProjectId}.api.sanity.io`,
300
+ apiVersion: DATASET_API_VERSION,
301
+ method: 'get',
302
+ uri: `/aliases`
272
303
  }).reply(200, [
273
304
  {
274
305
  datasetName: 'production',
@@ -278,16 +309,19 @@ describe('#dataset:alias:link', ()=>{
278
309
  const { error } = await testCommand(LinkAliasCommand, [
279
310
  'staging',
280
311
  'production'
281
- ]);
312
+ ], {
313
+ mocks: defaultMocks
314
+ });
282
315
  expect(error?.message).toContain('Dataset alias ~staging already linked to production');
283
316
  expect(error?.oclif?.exit).toBe(1);
284
317
  });
285
318
  test('fails when no datasets available', async ()=>{
286
319
  mockListDatasets.mockResolvedValue([]);
287
320
  mockApi({
288
- apiHost: 'https://test-project.api.sanity.io',
289
- apiVersion: DATASET_ALIASES_API_VERSION,
290
- uri: '/aliases'
321
+ apiHost: `https://${testProjectId}.api.sanity.io`,
322
+ apiVersion: DATASET_API_VERSION,
323
+ method: 'get',
324
+ uri: `/aliases`
291
325
  }).reply(200, [
292
326
  {
293
327
  datasetName: null,
@@ -296,7 +330,9 @@ describe('#dataset:alias:link', ()=>{
296
330
  ]);
297
331
  const { error } = await testCommand(LinkAliasCommand, [
298
332
  'staging'
299
- ]);
333
+ ], {
334
+ mocks: defaultMocks
335
+ });
300
336
  expect(error?.message).toContain('No datasets available to link to');
301
337
  expect(error?.oclif?.exit).toBe(1);
302
338
  });
@@ -307,9 +343,10 @@ describe('#dataset:alias:link', ()=>{
307
343
  }
308
344
  ]);
309
345
  mockApi({
310
- apiHost: 'https://test-project.api.sanity.io',
311
- apiVersion: DATASET_ALIASES_API_VERSION,
312
- uri: '/aliases'
346
+ apiHost: `https://${testProjectId}.api.sanity.io`,
347
+ apiVersion: DATASET_API_VERSION,
348
+ method: 'get',
349
+ uri: `/aliases`
313
350
  }).reply(200, [
314
351
  {
315
352
  datasetName: null,
@@ -317,17 +354,20 @@ describe('#dataset:alias:link', ()=>{
317
354
  }
318
355
  ]);
319
356
  mockApi({
320
- apiHost: 'https://test-project.api.sanity.io',
321
- apiVersion: DATASET_ALIASES_API_VERSION,
357
+ apiHost: `https://${testProjectId}.api.sanity.io`,
358
+ apiVersion: DATASET_API_VERSION,
322
359
  method: 'patch',
323
- uri: '/aliases/staging'
360
+ uri: `/aliases/staging`
324
361
  }).reply(500, {
362
+ error: 'API Error',
325
363
  message: 'API Error'
326
364
  });
327
365
  const { error } = await testCommand(LinkAliasCommand, [
328
366
  'staging',
329
367
  'production'
330
- ]);
368
+ ], {
369
+ mocks: defaultMocks
370
+ });
331
371
  expect(error?.message).toContain('Dataset alias linking failed: API Error');
332
372
  expect(error?.oclif?.exit).toBe(1);
333
373
  });