@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.
- package/dist/actions/dev/startStudioDevServer.js +3 -8
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/dev/types.d.ts +1 -3
- package/dist/actions/dev/types.js.map +1 -1
- package/dist/actions/documents/validate.d.ts +0 -2
- package/dist/actions/documents/validate.js +21 -1
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/exec/execScript.js +1 -1
- package/dist/actions/exec/execScript.js.map +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/manifest/extractManifest.js +1 -4
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
- package/dist/actions/schema/deleteSchemaAction.js +12 -17
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
- package/dist/actions/schema/deploySchemas.d.ts +15 -0
- package/dist/actions/schema/deploySchemas.js +98 -0
- package/dist/actions/schema/deploySchemas.js.map +1 -0
- package/dist/actions/schema/listSchemas.d.ts +12 -0
- package/dist/actions/schema/listSchemas.js +119 -0
- package/dist/actions/schema/listSchemas.js.map +1 -0
- package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
- package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
- package/dist/actions/schema/utils/debug.d.ts +2 -0
- package/dist/actions/schema/utils/debug.js +5 -0
- package/dist/actions/schema/utils/debug.js.map +1 -0
- package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
- package/dist/actions/schema/utils/manifestExtractor.js +12 -17
- package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
- package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
- package/dist/actions/schema/utils/manifestReader.js +6 -12
- package/dist/actions/schema/utils/manifestReader.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
- package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
- package/dist/actions/users/getMembersForProject.d.ts +1 -3
- package/dist/actions/users/getMembersForProject.js +6 -17
- package/dist/actions/users/getMembersForProject.js.map +1 -1
- package/dist/actions/users/types.d.ts +0 -11
- package/dist/actions/users/types.js.map +1 -1
- package/dist/commands/__tests__/debug.test.js +113 -220
- package/dist/commands/__tests__/debug.test.js.map +1 -1
- package/dist/commands/__tests__/deploy.test.js +325 -293
- package/dist/commands/__tests__/deploy.test.js.map +1 -1
- package/dist/commands/__tests__/dev.test.js +62 -19
- package/dist/commands/__tests__/dev.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.authentication.test.js +40 -27
- package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.create-new-project.test.js +84 -85
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.plan.test.js +103 -44
- package/dist/commands/__tests__/init/init.plan.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.setup.test.js +85 -29
- package/dist/commands/__tests__/init/init.setup.test.js.map +1 -1
- package/dist/commands/__tests__/install.test.js +46 -22
- package/dist/commands/__tests__/install.test.js.map +1 -1
- package/dist/commands/__tests__/logout.test.js +8 -5
- package/dist/commands/__tests__/logout.test.js.map +1 -1
- package/dist/commands/__tests__/manage.test.js +29 -24
- package/dist/commands/__tests__/manage.test.js.map +1 -1
- package/dist/commands/__tests__/versions.test.js +22 -14
- package/dist/commands/__tests__/versions.test.js.map +1 -1
- package/dist/commands/backup/__tests__/disable.test.js +72 -75
- package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/download.test.js +166 -77
- package/dist/commands/backup/__tests__/download.test.js.map +1 -1
- package/dist/commands/backup/__tests__/enable.test.js +109 -140
- package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/list.test.js +84 -75
- package/dist/commands/backup/__tests__/list.test.js.map +1 -1
- package/dist/commands/backup/disable.js +5 -11
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/enable.js +5 -11
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +7 -8
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/__tests__/add.test.js +68 -38
- package/dist/commands/cors/__tests__/add.test.js.map +1 -1
- package/dist/commands/cors/__tests__/delete.test.js +52 -37
- package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
- package/dist/commands/cors/__tests__/list.test.js +80 -57
- package/dist/commands/cors/__tests__/list.test.js.map +1 -1
- package/dist/commands/cors/add.js +5 -13
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +7 -15
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -10
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/__tests__/copy.test.js +197 -89
- package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/create.test.js +147 -117
- package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/delete.test.js +75 -68
- package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/export.test.js +123 -83
- package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/list.test.js +107 -65
- package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
- package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
- package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
- package/dist/commands/dataset/export.js +4 -4
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
- package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
- package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
- package/dist/commands/dev.js +0 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/__tests__/search.test.js +8 -7
- package/dist/commands/docs/__tests__/search.test.js.map +1 -1
- package/dist/commands/documents/__tests__/create.test.js +328 -265
- package/dist/commands/documents/__tests__/create.test.js.map +1 -1
- package/dist/commands/documents/__tests__/delete.test.js +119 -87
- package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
- package/dist/commands/documents/__tests__/get.test.js +68 -95
- package/dist/commands/documents/__tests__/get.test.js.map +1 -1
- package/dist/commands/documents/__tests__/query.test.js +84 -189
- package/dist/commands/documents/__tests__/query.test.js.map +1 -1
- package/dist/commands/documents/__tests__/validate.test.js +52 -29
- package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
- package/dist/commands/documents/create.d.ts +1 -0
- package/dist/commands/documents/create.js +10 -9
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +2 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -3
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -3
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +0 -20
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/__tests__/list.test.js +57 -45
- package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
- package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
- package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +4 -9
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/__tests__/attempt.test.js +48 -33
- package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
- package/dist/commands/hook/__tests__/create.test.js +49 -51
- package/dist/commands/hook/__tests__/create.test.js.map +1 -1
- package/dist/commands/hook/__tests__/delete.test.js +43 -30
- package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
- package/dist/commands/hook/__tests__/list.test.js +38 -31
- package/dist/commands/hook/__tests__/list.test.js.map +1 -1
- package/dist/commands/hook/__tests__/logs.test.js +68 -40
- package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
- package/dist/commands/hook/create.js +2 -6
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +5 -17
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +2 -8
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/manifest/__tests__/extract.test.js +22 -13
- package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
- package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
- package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
- package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
- package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/export.test.js +365 -66
- package/dist/commands/media/__tests__/export.test.js.map +1 -1
- package/dist/commands/media/__tests__/import.test.js +171 -105
- package/dist/commands/media/__tests__/import.test.js.map +1 -1
- package/dist/commands/media/export.js +2 -2
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +2 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/projects/__tests__/list.test.js +5 -4
- package/dist/commands/projects/__tests__/list.test.js.map +1 -1
- package/dist/commands/projects/list.js +2 -6
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schema/__tests__/delete.test.js +396 -151
- package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
- package/dist/commands/schema/__tests__/deploy.test.js +348 -0
- package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
- package/dist/commands/schema/__tests__/extract.test.js +19 -11
- package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
- package/dist/commands/schema/__tests__/list.test.js +399 -0
- package/dist/commands/schema/__tests__/list.test.js.map +1 -0
- package/dist/commands/schema/__tests__/validate.test.js +27 -10
- package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
- package/dist/commands/schema/delete.d.ts +1 -1
- package/dist/commands/schema/delete.js +20 -23
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.d.ts +16 -0
- package/dist/commands/schema/deploy.js +98 -0
- package/dist/commands/schema/deploy.js.map +1 -0
- package/dist/commands/schema/list.d.ts +15 -0
- package/dist/commands/schema/list.js +104 -0
- package/dist/commands/schema/list.js.map +1 -0
- package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/status.test.js +7 -5
- package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/add.test.js +55 -40
- package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/delete.test.js +72 -42
- package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/list.test.js +87 -60
- package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
- package/dist/commands/tokens/add.js +3 -5
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/users/__tests__/invite.test.js +100 -79
- package/dist/commands/users/__tests__/invite.test.js.map +1 -1
- package/dist/commands/users/__tests__/list.test.js +186 -180
- package/dist/commands/users/__tests__/list.test.js.map +1 -1
- package/dist/commands/users/invite.js +6 -17
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +4 -7
- package/dist/commands/users/list.js.map +1 -1
- package/dist/config/createCliConfig.d.ts +4 -4
- package/dist/services/backup.d.ts +8 -0
- package/dist/services/backup.js +19 -0
- package/dist/services/backup.js.map +1 -1
- package/dist/services/cors.d.ts +23 -0
- package/dist/services/cors.js +38 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/graphql.d.ts +7 -0
- package/dist/services/graphql.js +11 -0
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/hooks.d.ts +2 -0
- package/dist/services/hooks.js +19 -0
- package/dist/services/hooks.js.map +1 -1
- package/dist/services/organizations.d.ts +1 -1
- package/dist/services/organizations.js +1 -1
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/projects.d.ts +11 -0
- package/dist/services/projects.js +41 -0
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.d.ts +4 -0
- package/dist/services/schemas.js +40 -0
- package/dist/services/schemas.js.map +1 -0
- package/dist/services/user.d.ts +8 -0
- package/dist/services/user.js +15 -2
- package/dist/services/user.js.map +1 -1
- package/dist/util/__tests__/getCliVersion.test.js +2 -2
- package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
- package/dist/util/errorMessages.d.ts +1 -0
- package/dist/util/errorMessages.js +1 -0
- package/dist/util/errorMessages.js.map +1 -1
- package/dist/util/getCliVersion.js +1 -1
- package/dist/util/getCliVersion.js.map +1 -1
- package/dist/util/readPackageJson.d.ts +1 -15
- package/dist/util/readPackageJson.js +1 -1
- package/dist/util/readPackageJson.js.map +1 -1
- package/dist/util/uniqBy.d.ts +1 -0
- package/dist/util/uniqBy.js +14 -0
- package/dist/util/uniqBy.js.map +1 -0
- package/oclif.manifest.json +172 -27
- package/package.json +27 -28
- package/dist/actions/cors/constants.d.ts +0 -1
- package/dist/actions/cors/constants.js +0 -3
- package/dist/actions/cors/constants.js.map +0 -1
- package/dist/actions/cors/types.d.ts +0 -9
- package/dist/actions/cors/types.js +0 -3
- package/dist/actions/cors/types.js.map +0 -1
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
- package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
- package/dist/actions/schema/schemaStoreConstants.js +0 -4
- package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
- package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
- package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
- package/dist/actions/schema/utils/schemaApiClient.js +0 -17
- package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
- package/dist/actions/users/apiVersion.d.ts +0 -6
- package/dist/actions/users/apiVersion.js +0 -7
- package/dist/actions/users/apiVersion.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/media/__tests__/export.test.ts"],"sourcesContent":["import fs from 'node:fs/promises'\n\nimport {runCommand} from '@oclif/test'\nimport {type CliConfig, getCliConfig, getGlobalCliClient} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {exportDataset} from '@sanity/export'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaExportCommand} from '../export.js'\n\nvi.mock('@sanity/export', () => ({\n exportDataset: vi.fn().mockResolvedValue(undefined),\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 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(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getGlobalCliClient: vi.fn(),\n getProjectCliClient: vi.fn(),\n}))\n\nvi.mock('node:fs/promises', () => ({\n default: {\n mkdir: vi.fn().mockResolvedValue(undefined),\n stat: vi.fn(),\n },\n}))\n\nconst mockExportDataset = vi.mocked(exportDataset)\nconst mockInput = vi.mocked(input)\nconst mockSelect = vi.mocked(select)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetGlobalCliClient = vi.mocked(getGlobalCliClient)\nconst mockFs = vi.mocked(fs)\n\nconst TEST_CONFIG = {\n MEDIA_LIBRARY_ID: 'test-media-library',\n PROJECT_ID: 'test-project',\n} as const\n\nconst TEST_OUTPUTS = {\n EXISTING: 'existing.tar.gz',\n STDOUT: '-',\n SUBDIR: 'subdir/output.tar.gz',\n TAR_GZ: 'output.tar.gz',\n} as const\n\nconst ERROR_MESSAGES = {\n ALREADY_EXISTS: 'already exists',\n EXPORT_FAILED: 'Export failed',\n MEDIA_LIBRARY_NOT_FOUND: 'Media library with id',\n NO_MEDIA_LIBRARIES: 'No active media libraries found',\n USE_OVERWRITE: '--overwrite',\n} as const\n\nconst createTestContext = (\n overrides: {\n fileExists?: boolean\n inputValue?: string\n isFile?: boolean\n mediaLibraries?: Array<{id: string; organizationId: string; status: 'active' | 'inactive'}>\n projectId?: string\n selectValue?: string\n } = {},\n) => {\n const defaults = {\n fileExists: false,\n isFile: true,\n mediaLibraries: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'another-library', organizationId: 'org-1', status: 'active' as const},\n ],\n projectId: TEST_CONFIG.PROJECT_ID,\n }\n\n const context = {...defaults, ...overrides}\n\n // Setup CLI config\n const apiConfig: CliConfig['api'] = {projectId: context.projectId}\n\n mockGetCliConfig.mockResolvedValue({api: apiConfig})\n\n // Setup client mock\n const mockClient = {\n config: () => ({projectId: context.projectId}),\n request: vi.fn().mockResolvedValue({\n data: context.mediaLibraries,\n }),\n }\n mockGetGlobalCliClient.mockResolvedValue(mockClient as never)\n\n // Setup fs.stat mock\n if (context.fileExists) {\n mockFs.stat.mockResolvedValue({\n isFile: () => context.isFile,\n } as never)\n } else {\n mockFs.stat.mockRejectedValue(new Error('ENOENT'))\n }\n\n // Setup prompt mocks\n if (context.inputValue) {\n mockInput.mockResolvedValue(context.inputValue)\n }\n if (context.selectValue) {\n mockSelect.mockResolvedValue(context.selectValue)\n }\n\n return context\n}\n\ndescribe('#media:export', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media export --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.\n\n USAGE\n $ sanity media export [DESTINATION] [--asset-concurrency <value>]\n [--media-library-id <value>] [--no-compress] [--overwrite]\n\n ARGUMENTS\n [DESTINATION] Output destination file path\n\n FLAGS\n --asset-concurrency=<value> [default: 8] Concurrent number of asset downloads\n --media-library-id=<value> The id of the target media library\n --no-compress Skips compressing tarball entries (still\n generates a gzip file)\n --overwrite Overwrite any file with the same name\n\n DESCRIPTION\n Export an archive of all file and image assets including their aspect data\n from the target media library. Video assets are excluded from the export.\n\n EXAMPLES\n Export media library interactively\n\n $ sanity media export\n\n Export media library to output.tar.gz\n\n $ sanity media export output.tar.gz\n\n Export specific media library\n\n $ sanity media export --media-library-id my-library-id\n\n \"\n `)\n })\n\n test('should export with provided destination', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Exporting from:')\n expect(stdout).toContain(TEST_CONFIG.PROJECT_ID)\n expect(stdout).toContain(TEST_CONFIG.MEDIA_LIBRARY_ID)\n expect(stdout).toContain('Export finished')\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n assetConcurrency: 8,\n compress: true,\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n outputPath: expect.stringContaining(TEST_OUTPUTS.TAR_GZ),\n }),\n )\n })\n\n test('should export with media library ID flag', async () => {\n createTestContext()\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [\n TEST_OUTPUTS.TAR_GZ,\n '--media-library-id',\n TEST_CONFIG.MEDIA_LIBRARY_ID,\n ])\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n\n expect(mockSelect).not.toHaveBeenCalled()\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n }),\n )\n })\n\n test('should prompt for media library when not provided', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('should prompt for destination when not provided', async () => {\n createTestContext({\n inputValue: TEST_OUTPUTS.TAR_GZ,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, [])\n\n expect(mockInput).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Output path:',\n }),\n )\n })\n\n test('should error when file already exists without overwrite flag', async () => {\n createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.EXISTING])\n\n expect(error?.message).toContain(ERROR_MESSAGES.ALREADY_EXISTS)\n expect(error?.message).toContain(ERROR_MESSAGES.USE_OVERWRITE)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should overwrite file when overwrite flag is provided', async () => {\n createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [\n TEST_OUTPUTS.EXISTING,\n '--overwrite',\n ])\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n })\n\n test('should use directory and append default filename', async () => {\n createTestContext({\n fileExists: true,\n isFile: false,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, ['some-directory'])\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: expect.stringContaining(`${TEST_CONFIG.MEDIA_LIBRARY_ID}-export.tar.gz`),\n }),\n )\n })\n\n test('should export to stdout when destination is -', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.STDOUT])\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: process.stdout,\n }),\n )\n })\n\n test.each([\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: NO_PROJECT_ID,\n scenario: 'no project ID is found',\n setup: {projectId: ''},\n },\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: ERROR_MESSAGES.NO_MEDIA_LIBRARIES,\n scenario: 'no media libraries found',\n setup: {mediaLibraries: []},\n },\n {\n additionalCheck: (error: Error) => expect(error.message).toContain('non-existent-library'),\n args: [TEST_OUTPUTS.TAR_GZ, '--media-library-id', 'non-existent-library'],\n errorMessage: ERROR_MESSAGES.MEDIA_LIBRARY_NOT_FOUND,\n scenario: 'media library ID not found',\n setup: {},\n },\n ])('should error when $scenario', async ({additionalCheck, args, errorMessage, setup}) => {\n createTestContext(setup)\n\n const {error} = await testCommand(MediaExportCommand, args)\n\n expect(error?.message).toContain(errorMessage)\n expect(error?.oclif?.exit).toBe(1)\n if (additionalCheck) {\n additionalCheck(error as Error)\n }\n })\n\n test.each([\n {\n args: ['--asset-concurrency', '16'],\n description: 'custom asset concurrency',\n expected: {assetConcurrency: 16},\n },\n {\n args: ['--no-compress'],\n description: 'disabled compression',\n expected: {compress: false},\n },\n ])('should pass $description flag correctly', async ({args, expected}) => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ, ...args])\n\n expect(mockExportDataset).toHaveBeenCalledWith(expect.objectContaining(expected))\n })\n\n test('should handle export failure', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n mockExportDataset.mockRejectedValueOnce(new Error('Export operation failed'))\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(error?.message).toContain(ERROR_MESSAGES.EXPORT_FAILED)\n expect(error?.message).toContain('Export operation failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should create subdirectories if they do not exist', async () => {\n createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.SUBDIR])\n\n expect(mockFs.mkdir).toHaveBeenCalledWith(\n expect.stringContaining('subdir'),\n expect.objectContaining({recursive: true}),\n )\n })\n\n test('should filter inactive media libraries', async () => {\n createTestContext({\n mediaLibraries: [\n {id: 'active-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'inactive-library', organizationId: 'org-1', status: 'inactive' as const},\n ],\n selectValue: 'active-library',\n })\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n choices: expect.arrayContaining([expect.objectContaining({value: 'active-library'})]),\n }),\n )\n\n const selectCall = mockSelect.mock.calls[0][0]\n const choices = selectCall.choices.filter((choice: unknown) => typeof choice === 'object')\n expect(choices).not.toContainEqual(expect.objectContaining({value: 'inactive-library'}))\n })\n})\n"],"names":["fs","runCommand","getCliConfig","getGlobalCliClient","input","select","testCommand","exportDataset","afterEach","describe","expect","test","vi","NO_PROJECT_ID","MediaExportCommand","mock","fn","mockResolvedValue","undefined","actual","importActual","findProjectRoot","directory","root","type","getCliToken","getProjectCliClient","default","mkdir","stat","mockExportDataset","mocked","mockInput","mockSelect","mockGetCliConfig","mockGetGlobalCliClient","mockFs","TEST_CONFIG","MEDIA_LIBRARY_ID","PROJECT_ID","TEST_OUTPUTS","EXISTING","STDOUT","SUBDIR","TAR_GZ","ERROR_MESSAGES","ALREADY_EXISTS","EXPORT_FAILED","MEDIA_LIBRARY_NOT_FOUND","NO_MEDIA_LIBRARIES","USE_OVERWRITE","createTestContext","overrides","defaults","fileExists","isFile","mediaLibraries","id","organizationId","status","projectId","context","apiConfig","api","mockClient","config","request","data","mockRejectedValue","Error","inputValue","selectValue","clearAllMocks","stdout","toMatchInlineSnapshot","stderr","toBe","toContain","toHaveBeenCalledWith","objectContaining","assetConcurrency","compress","mediaLibraryId","outputPath","stringContaining","not","toHaveBeenCalled","message","error","oclif","exit","process","each","args","errorMessage","scenario","setup","additionalCheck","description","expected","mockRejectedValueOnce","recursive","choices","arrayContaining","value","selectCall","calls","filter","choice","toContainEqual"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/media/__tests__/export.test.ts"],"sourcesContent":["import fs from 'node:fs/promises'\n\nimport {runCommand} from '@oclif/test'\nimport {type CliConfig} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\nimport {createTestToken, mockApi, testCommand} from '@sanity/cli-test'\nimport {exportDataset} from '@sanity/export'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaExportCommand} from '../export.js'\n\nvi.mock('@sanity/export', () => ({\n exportDataset: vi.fn().mockResolvedValue(undefined),\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 select: vi.fn(),\n }\n})\n\nvi.mock('node:fs/promises', () => ({\n default: {\n mkdir: vi.fn().mockResolvedValue(undefined),\n stat: vi.fn(),\n },\n}))\n\nconst mockExportDataset = vi.mocked(exportDataset)\nconst mockInput = vi.mocked(input)\nconst mockSelect = vi.mocked(select)\nconst mockFs = vi.mocked(fs)\n\nconst TEST_CONFIG = {\n MEDIA_LIBRARY_ID: 'test-media-library',\n PROJECT_ID: 'test-project',\n} as const\n\nconst TEST_OUTPUTS = {\n EXISTING: 'existing.tar.gz',\n STDOUT: '-',\n SUBDIR: 'subdir/output.tar.gz',\n TAR_GZ: 'output.tar.gz',\n} as const\n\nconst ERROR_MESSAGES = {\n ALREADY_EXISTS: 'already exists',\n EXPORT_FAILED: 'Export failed',\n MEDIA_LIBRARY_NOT_FOUND: 'Media library with id',\n NO_MEDIA_LIBRARIES: 'No active media libraries found',\n USE_OVERWRITE: '--overwrite',\n} as const\n\nconst defaultMocks = {\n cliConfig: {\n api: {projectId: TEST_CONFIG.PROJECT_ID} as CliConfig['api'],\n },\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n root: '/test/path',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nconst createTestContext = (\n overrides: {\n fileExists?: boolean\n inputValue?: string\n isFile?: boolean\n mediaLibraries?: Array<{id: string; organizationId: string; status: 'active' | 'inactive'}>\n projectId?: string\n selectValue?: string\n } = {},\n) => {\n const defaults = {\n fileExists: false,\n isFile: true,\n mediaLibraries: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'another-library', organizationId: 'org-1', status: 'active' as const},\n ],\n projectId: TEST_CONFIG.PROJECT_ID,\n }\n\n const context = {...defaults, ...overrides}\n\n // Setup fs.stat mock\n if (context.fileExists) {\n mockFs.stat.mockResolvedValue({\n isFile: () => context.isFile,\n } as never)\n } else {\n mockFs.stat.mockRejectedValue(new Error('ENOENT'))\n }\n\n // Setup prompt mocks\n if (context.inputValue) {\n mockInput.mockResolvedValue(context.inputValue)\n }\n if (context.selectValue) {\n mockSelect.mockResolvedValue(context.selectValue)\n }\n\n // Return context with mocks for testCommand\n return {\n ...context,\n mocks: {\n ...defaultMocks,\n cliConfig: {\n api: {projectId: context.projectId} as CliConfig['api'],\n },\n },\n }\n}\n\ndescribe('#media:export', () => {\n afterEach(() => {\n vi.clearAllMocks()\n vi.unstubAllEnvs()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media export --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Export an archive of all file and image assets including their aspect data from the target media library. Video assets are excluded from the export.\n\n USAGE\n $ sanity media export [DESTINATION] [--asset-concurrency <value>]\n [--media-library-id <value>] [--no-compress] [--overwrite]\n\n ARGUMENTS\n [DESTINATION] Output destination file path\n\n FLAGS\n --asset-concurrency=<value> [default: 8] Concurrent number of asset downloads\n --media-library-id=<value> The id of the target media library\n --no-compress Skips compressing tarball entries (still\n generates a gzip file)\n --overwrite Overwrite any file with the same name\n\n DESCRIPTION\n Export an archive of all file and image assets including their aspect data\n from the target media library. Video assets are excluded from the export.\n\n EXAMPLES\n Export media library interactively\n\n $ sanity media export\n\n Export media library to output.tar.gz\n\n $ sanity media export output.tar.gz\n\n Export specific media library\n\n $ sanity media export --media-library-id my-library-id\n\n \"\n `)\n })\n\n test('should export with provided destination', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: TEST_CONFIG.MEDIA_LIBRARY_ID, organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n mockSelect.mockResolvedValue(TEST_CONFIG.MEDIA_LIBRARY_ID)\n const ctx = createTestContext()\n\n const {stderr, stdout} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {\n mocks: ctx.mocks,\n })\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Exporting from:')\n expect(stdout).toContain(TEST_CONFIG.PROJECT_ID)\n expect(stdout).toContain(TEST_CONFIG.MEDIA_LIBRARY_ID)\n expect(stdout).toContain('Export finished')\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n assetConcurrency: 8,\n compress: true,\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n outputPath: expect.stringContaining(TEST_OUTPUTS.TAR_GZ),\n }),\n )\n })\n\n test('should export with media library ID flag', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext()\n\n const {stderr, stdout} = await testCommand(\n MediaExportCommand,\n [TEST_OUTPUTS.TAR_GZ, '--media-library-id', TEST_CONFIG.MEDIA_LIBRARY_ID],\n {mocks: ctx.mocks},\n )\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n\n expect(mockSelect).not.toHaveBeenCalled()\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n mediaLibraryId: TEST_CONFIG.MEDIA_LIBRARY_ID,\n }),\n )\n })\n\n test('should prompt for media library when not provided', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {mocks: ctx.mocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('should prompt for destination when not provided', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n inputValue: TEST_OUTPUTS.TAR_GZ,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, [], {mocks: ctx.mocks})\n\n expect(mockInput).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Output path:',\n }),\n )\n })\n\n test('should error when file already exists without overwrite flag', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.EXISTING], {\n mocks: ctx.mocks,\n })\n\n expect(error?.message).toContain(ERROR_MESSAGES.ALREADY_EXISTS)\n expect(error?.message).toContain(ERROR_MESSAGES.USE_OVERWRITE)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should overwrite file when overwrite flag is provided', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n fileExists: true,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n const {stderr, stdout} = await testCommand(\n MediaExportCommand,\n [TEST_OUTPUTS.EXISTING, '--overwrite'],\n {mocks: ctx.mocks},\n )\n\n expect(stderr).toBe('')\n expect(stdout).toContain('Export finished')\n })\n\n test('should use directory and append default filename', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n fileExists: true,\n isFile: false,\n selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID,\n })\n\n await testCommand(MediaExportCommand, ['some-directory'], {mocks: ctx.mocks})\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: expect.stringContaining(`${TEST_CONFIG.MEDIA_LIBRARY_ID}-export.tar.gz`),\n }),\n )\n })\n\n test('should export to stdout when destination is -', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.STDOUT], {mocks: ctx.mocks})\n\n expect(mockExportDataset).toHaveBeenCalledWith(\n expect.objectContaining({\n outputPath: process.stdout,\n }),\n )\n })\n\n test.each([\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: NO_PROJECT_ID,\n scenario: 'no project ID is found',\n setup: {projectId: ''},\n },\n {\n args: [TEST_OUTPUTS.TAR_GZ],\n errorMessage: ERROR_MESSAGES.NO_MEDIA_LIBRARIES,\n scenario: 'no media libraries found',\n setup: {mediaLibraries: []},\n },\n {\n additionalCheck: (error: Error) => expect(error.message).toContain('non-existent-library'),\n args: [TEST_OUTPUTS.TAR_GZ, '--media-library-id', 'non-existent-library'],\n errorMessage: ERROR_MESSAGES.MEDIA_LIBRARY_NOT_FOUND,\n scenario: 'media library ID not found',\n setup: {},\n },\n ])('should error when $scenario', async ({additionalCheck, args, errorMessage, setup}) => {\n const ctx = createTestContext(setup)\n\n // Set up mock for API calls (skip if no projectId)\n if (ctx.projectId) {\n createTestToken('test-token')\n const data = ctx.mediaLibraries.filter((lib) => lib.status === 'active')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: ctx.projectId},\n uri: '/media-libraries',\n }).reply(200, {data})\n }\n\n const {error} = await testCommand(MediaExportCommand, args, {mocks: ctx.mocks})\n\n expect(error?.message).toContain(errorMessage)\n expect(error?.oclif?.exit).toBe(1)\n if (additionalCheck) {\n additionalCheck(error as Error)\n }\n })\n\n test.each([\n {\n args: ['--asset-concurrency', '16'],\n description: 'custom asset concurrency',\n expected: {assetConcurrency: 16},\n },\n {\n args: ['--no-compress'],\n description: 'disabled compression',\n expected: {compress: false},\n },\n ])('should pass $description flag correctly', async ({args, expected}) => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ, ...args], {mocks: ctx.mocks})\n\n expect(mockExportDataset).toHaveBeenCalledWith(expect.objectContaining(expected))\n })\n\n test('should handle export failure', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n mockExportDataset.mockRejectedValueOnce(new Error('Export operation failed'))\n\n const {error} = await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {\n mocks: ctx.mocks,\n })\n\n expect(error?.message).toContain(ERROR_MESSAGES.EXPORT_FAILED)\n expect(error?.message).toContain('Export operation failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should create subdirectories if they do not exist', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({selectValue: TEST_CONFIG.MEDIA_LIBRARY_ID})\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.SUBDIR], {mocks: ctx.mocks})\n\n expect(mockFs.mkdir).toHaveBeenCalledWith(\n expect.stringContaining('subdir'),\n expect.objectContaining({recursive: true}),\n )\n })\n\n test('should filter inactive media libraries', async () => {\n // Set up custom mock for this test with both active and inactive libraries\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: TEST_CONFIG.PROJECT_ID},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'active-library', organizationId: 'org-1', status: 'active'},\n {id: 'inactive-library', organizationId: 'org-1', status: 'inactive'},\n ],\n })\n\n createTestToken('test-token')\n const ctx = createTestContext({\n mediaLibraries: [\n {id: 'active-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'inactive-library', organizationId: 'org-1', status: 'inactive' as const},\n ],\n selectValue: 'active-library',\n })\n\n await testCommand(MediaExportCommand, [TEST_OUTPUTS.TAR_GZ], {mocks: ctx.mocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n choices: expect.arrayContaining([expect.objectContaining({value: 'active-library'})]),\n }),\n )\n\n const selectCall = mockSelect.mock.calls[0][0]\n const choices = selectCall.choices.filter((choice: unknown) => typeof choice === 'object')\n expect(choices).not.toContainEqual(expect.objectContaining({value: 'inactive-library'}))\n })\n})\n"],"names":["fs","runCommand","input","select","createTestToken","mockApi","testCommand","exportDataset","nock","afterEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","NO_PROJECT_ID","MediaExportCommand","mock","fn","mockResolvedValue","undefined","actual","importActual","default","mkdir","stat","mockExportDataset","mocked","mockInput","mockSelect","mockFs","TEST_CONFIG","MEDIA_LIBRARY_ID","PROJECT_ID","TEST_OUTPUTS","EXISTING","STDOUT","SUBDIR","TAR_GZ","ERROR_MESSAGES","ALREADY_EXISTS","EXPORT_FAILED","MEDIA_LIBRARY_NOT_FOUND","NO_MEDIA_LIBRARIES","USE_OVERWRITE","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","root","type","token","createTestContext","overrides","defaults","fileExists","isFile","mediaLibraries","id","organizationId","status","context","mockRejectedValue","Error","inputValue","selectValue","mocks","clearAllMocks","unstubAllEnvs","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","apiVersion","method","query","uri","reply","data","ctx","stderr","toBe","toContain","toHaveBeenCalledWith","objectContaining","assetConcurrency","compress","mediaLibraryId","outputPath","stringContaining","not","toHaveBeenCalled","message","error","oclif","exit","process","each","args","errorMessage","scenario","setup","additionalCheck","filter","lib","description","expected","mockRejectedValueOnce","recursive","choices","arrayContaining","value","selectCall","calls","choice","toContainEqual"],"mappings":"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"}
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { testCommand } from '@sanity/cli-test';
|
|
2
|
+
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
3
|
+
import nock from 'nock';
|
|
3
4
|
import { of, throwError } from 'rxjs';
|
|
4
5
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
6
|
+
import { MEDIA_LIBRARY_API_VERSION } from '../../../services/mediaLibraries.js';
|
|
5
7
|
import { MediaImportCommand } from '../import.js';
|
|
6
8
|
const mocks = vi.hoisted(()=>({
|
|
7
|
-
getCliConfig: vi.fn(),
|
|
8
|
-
getMediaLibraries: vi.fn(),
|
|
9
|
-
getProjectCliClient: vi.fn(),
|
|
10
9
|
importer: vi.fn(),
|
|
11
10
|
select: vi.fn(),
|
|
12
11
|
spinner: vi.fn()
|
|
13
12
|
}));
|
|
14
|
-
vi.mock('../../../services/mediaLibraries.js', ()=>({
|
|
15
|
-
getMediaLibraries: mocks.getMediaLibraries
|
|
16
|
-
}));
|
|
17
13
|
vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
18
14
|
const actual = await vi.importActual('@sanity/cli-core/ux');
|
|
19
15
|
return {
|
|
@@ -22,38 +18,31 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
|
22
18
|
spinner: mocks.spinner
|
|
23
19
|
};
|
|
24
20
|
});
|
|
25
|
-
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
|
|
26
|
-
findProjectRoot: vi.fn().mockResolvedValue({
|
|
27
|
-
directory: '/test/path',
|
|
28
|
-
root: '/test/path',
|
|
29
|
-
type: 'studio'
|
|
30
|
-
})
|
|
31
|
-
}));
|
|
32
|
-
vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
|
|
33
|
-
getCliConfig: mocks.getCliConfig
|
|
34
|
-
}));
|
|
35
|
-
vi.mock('../../../../../cli-core/src/services/apiClient.js', ()=>({
|
|
36
|
-
getProjectCliClient: mocks.getProjectCliClient
|
|
37
|
-
}));
|
|
38
21
|
vi.mock('../../../actions/media/importMedia.js', ()=>({
|
|
39
22
|
importer: mocks.importer
|
|
40
23
|
}));
|
|
41
|
-
const mockGetMediaLibraries = mocks.getMediaLibraries;
|
|
42
|
-
const mockGetCliConfig = mocks.getCliConfig;
|
|
43
|
-
const mockGetProjectCliClient = mocks.getProjectCliClient;
|
|
44
24
|
const mockSelect = mocks.select;
|
|
45
25
|
const mockSpinner = mocks.spinner;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
26
|
+
const defaultMocks = {
|
|
27
|
+
cliConfig: {
|
|
28
|
+
api: {
|
|
29
|
+
projectId: '1234'
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
projectRoot: {
|
|
33
|
+
directory: '/test/path',
|
|
34
|
+
path: '/test/path/sanity.config.ts',
|
|
35
|
+
root: '/test/path',
|
|
36
|
+
type: 'studio'
|
|
37
|
+
},
|
|
38
|
+
token: 'test-token'
|
|
49
39
|
};
|
|
50
|
-
mockGetCliConfig.mockResolvedValue({
|
|
51
|
-
api: apiConfig
|
|
52
|
-
});
|
|
53
|
-
mockGetProjectCliClient.mockResolvedValue({});
|
|
54
40
|
describe('#media:import', ()=>{
|
|
55
41
|
afterEach(()=>{
|
|
56
42
|
vi.clearAllMocks();
|
|
43
|
+
const pending = nock.pendingMocks();
|
|
44
|
+
nock.cleanAll();
|
|
45
|
+
expect(pending, 'pending mocks').toEqual([]);
|
|
57
46
|
});
|
|
58
47
|
test('should show help text correctly', async ()=>{
|
|
59
48
|
const { stdout } = await runCommand([
|
|
@@ -96,97 +85,161 @@ describe('#media:import', ()=>{
|
|
|
96
85
|
`);
|
|
97
86
|
});
|
|
98
87
|
test('show console error when no projectId is found', async ()=>{
|
|
99
|
-
mockGetCliConfig.mockResolvedValueOnce({
|
|
100
|
-
api: {}
|
|
101
|
-
});
|
|
102
88
|
const { error } = await testCommand(MediaImportCommand, [
|
|
103
89
|
'test-source'
|
|
104
|
-
]
|
|
90
|
+
], {
|
|
91
|
+
mocks: {
|
|
92
|
+
...defaultMocks,
|
|
93
|
+
cliConfig: {
|
|
94
|
+
api: {}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
105
98
|
expect(error?.message).toContain('does not contain a project identifier');
|
|
106
99
|
expect(error?.oclif?.exit).toBe(1);
|
|
107
100
|
});
|
|
108
101
|
test('show console error when getMediaLibraries fails', async ()=>{
|
|
109
|
-
|
|
102
|
+
mockApi({
|
|
103
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
104
|
+
method: 'get',
|
|
105
|
+
query: {
|
|
106
|
+
projectId: '1234'
|
|
107
|
+
},
|
|
108
|
+
uri: '/media-libraries'
|
|
109
|
+
}).reply(500, {
|
|
110
|
+
error: 'API request failed'
|
|
111
|
+
});
|
|
110
112
|
const { error } = await testCommand(MediaImportCommand, [
|
|
111
113
|
'test-source'
|
|
112
|
-
]
|
|
114
|
+
], {
|
|
115
|
+
mocks: defaultMocks
|
|
116
|
+
});
|
|
113
117
|
expect(error?.message).toContain('Failed to list media libraries');
|
|
114
118
|
expect(error?.message).toContain('API request failed');
|
|
115
119
|
expect(error?.oclif?.exit).toBe(1);
|
|
116
120
|
});
|
|
117
121
|
test('show console error when no active media libraries are found', async ()=>{
|
|
118
|
-
|
|
122
|
+
mockApi({
|
|
123
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
124
|
+
method: 'get',
|
|
125
|
+
query: {
|
|
126
|
+
projectId: '1234'
|
|
127
|
+
},
|
|
128
|
+
uri: '/media-libraries'
|
|
129
|
+
}).reply(200, {
|
|
130
|
+
data: []
|
|
131
|
+
});
|
|
119
132
|
const { error } = await testCommand(MediaImportCommand, [
|
|
120
133
|
'test-source'
|
|
121
|
-
]
|
|
134
|
+
], {
|
|
135
|
+
mocks: defaultMocks
|
|
136
|
+
});
|
|
122
137
|
expect(error?.message).toContain('No active media libraries found in this project');
|
|
123
138
|
expect(error?.oclif?.exit).toBe(1);
|
|
124
139
|
});
|
|
125
140
|
test('prompt user when there is no media flag', async ()=>{
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
141
|
+
mockApi({
|
|
142
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
143
|
+
method: 'get',
|
|
144
|
+
query: {
|
|
145
|
+
projectId: '1234'
|
|
131
146
|
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
147
|
+
uri: '/media-libraries'
|
|
148
|
+
}).reply(200, {
|
|
149
|
+
data: [
|
|
150
|
+
{
|
|
151
|
+
id: 'test-media-library',
|
|
152
|
+
organizationId: 'org-1',
|
|
153
|
+
status: 'active'
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 'another-library',
|
|
157
|
+
organizationId: 'org-1',
|
|
158
|
+
status: 'active'
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
});
|
|
139
162
|
mockSelect.mockResolvedValue('test-media-library');
|
|
140
163
|
await testCommand(MediaImportCommand, [
|
|
141
164
|
'test-source'
|
|
142
|
-
]
|
|
165
|
+
], {
|
|
166
|
+
mocks: defaultMocks
|
|
167
|
+
});
|
|
143
168
|
expect(mockSelect).toHaveBeenCalledWith(expect.objectContaining({
|
|
144
169
|
message: 'Select media library:'
|
|
145
170
|
}));
|
|
146
171
|
});
|
|
147
172
|
test('show console error when there is an error selecting a media library', async ()=>{
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
173
|
+
mockApi({
|
|
174
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
175
|
+
method: 'get',
|
|
176
|
+
query: {
|
|
177
|
+
projectId: '1234'
|
|
178
|
+
},
|
|
179
|
+
uri: '/media-libraries'
|
|
180
|
+
}).reply(200, {
|
|
181
|
+
data: [
|
|
182
|
+
{
|
|
183
|
+
id: 'test-media-library',
|
|
184
|
+
organizationId: 'org-1',
|
|
185
|
+
status: 'active'
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
});
|
|
156
189
|
mockSelect.mockRejectedValue(new Error('User cancelled selection'));
|
|
157
190
|
const { error } = await testCommand(MediaImportCommand, [
|
|
158
191
|
'test-source'
|
|
159
|
-
]
|
|
192
|
+
], {
|
|
193
|
+
mocks: defaultMocks
|
|
194
|
+
});
|
|
160
195
|
expect(error?.message).toContain('Failed to select media library');
|
|
161
196
|
expect(error?.message).toContain('User cancelled selection');
|
|
162
197
|
expect(error?.oclif?.exit).toBe(1);
|
|
163
198
|
});
|
|
164
199
|
test('show console error when the media library id flag is not valid', async ()=>{
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
200
|
+
mockApi({
|
|
201
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
202
|
+
method: 'get',
|
|
203
|
+
query: {
|
|
204
|
+
projectId: '1234'
|
|
205
|
+
},
|
|
206
|
+
uri: '/media-libraries'
|
|
207
|
+
}).reply(200, {
|
|
208
|
+
data: [
|
|
209
|
+
{
|
|
210
|
+
id: 'test-media-library',
|
|
211
|
+
organizationId: 'org-1',
|
|
212
|
+
status: 'active'
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
});
|
|
173
216
|
const { error } = await testCommand(MediaImportCommand, [
|
|
174
217
|
'test-source',
|
|
175
218
|
'--media-library-id',
|
|
176
219
|
'non-existent-library'
|
|
177
|
-
]
|
|
220
|
+
], {
|
|
221
|
+
mocks: defaultMocks
|
|
222
|
+
});
|
|
178
223
|
expect(error?.message).toContain('Media library with id "non-existent-library" not found');
|
|
179
224
|
expect(error?.oclif?.exit).toBe(1);
|
|
180
225
|
});
|
|
181
226
|
test('getProjectApiClient is instantiated with the correct values', async ()=>{
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
|
|
227
|
+
mockApi({
|
|
228
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
229
|
+
method: 'get',
|
|
230
|
+
query: {
|
|
231
|
+
projectId: '1234'
|
|
232
|
+
},
|
|
233
|
+
uri: '/media-libraries'
|
|
234
|
+
}).reply(200, {
|
|
235
|
+
data: [
|
|
236
|
+
{
|
|
237
|
+
id: 'test-media-library',
|
|
238
|
+
organizationId: 'org-1',
|
|
239
|
+
status: 'active'
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
});
|
|
190
243
|
const mockSpinnerInstance = {
|
|
191
244
|
start: vi.fn().mockReturnThis(),
|
|
192
245
|
stop: vi.fn().mockReturnThis(),
|
|
@@ -197,28 +250,28 @@ describe('#media:import', ()=>{
|
|
|
197
250
|
'test-source',
|
|
198
251
|
'--media-library-id',
|
|
199
252
|
'test-media-library'
|
|
200
|
-
]
|
|
201
|
-
|
|
202
|
-
apiVersion: 'v2025-02-19',
|
|
203
|
-
dataset: undefined,
|
|
204
|
-
perspective: 'drafts',
|
|
205
|
-
projectId: '1234',
|
|
206
|
-
requestTagPrefix: 'sanity.mediaLibraryCli.import',
|
|
207
|
-
requireUser: true,
|
|
208
|
-
'~experimental_resource': {
|
|
209
|
-
id: 'test-media-library',
|
|
210
|
-
type: 'media-library'
|
|
211
|
-
}
|
|
253
|
+
], {
|
|
254
|
+
mocks: defaultMocks
|
|
212
255
|
});
|
|
256
|
+
expect(mockSpinnerInstance.start).toHaveBeenCalled();
|
|
213
257
|
});
|
|
214
258
|
test('show success message when cli imports asset successfully', async ()=>{
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
|
|
259
|
+
mockApi({
|
|
260
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
261
|
+
method: 'get',
|
|
262
|
+
query: {
|
|
263
|
+
projectId: '1234'
|
|
264
|
+
},
|
|
265
|
+
uri: '/media-libraries'
|
|
266
|
+
}).reply(200, {
|
|
267
|
+
data: [
|
|
268
|
+
{
|
|
269
|
+
id: 'test-media-library',
|
|
270
|
+
organizationId: 'org-1',
|
|
271
|
+
status: 'active'
|
|
272
|
+
}
|
|
273
|
+
]
|
|
274
|
+
});
|
|
222
275
|
const mockSpinnerInstance = {
|
|
223
276
|
start: vi.fn().mockReturnThis(),
|
|
224
277
|
succeed: vi.fn().mockReturnThis(),
|
|
@@ -246,19 +299,30 @@ describe('#media:import', ()=>{
|
|
|
246
299
|
'test-source',
|
|
247
300
|
'--media-library-id',
|
|
248
301
|
'test-media-library'
|
|
249
|
-
]
|
|
302
|
+
], {
|
|
303
|
+
mocks: defaultMocks
|
|
304
|
+
});
|
|
250
305
|
expect(mockSpinner).toHaveBeenCalledWith('Beginning import…');
|
|
251
306
|
expect(mockSpinnerInstance.start).toHaveBeenCalled();
|
|
252
307
|
expect(mockSpinnerInstance.succeed).toHaveBeenCalledWith('Imported 3 assets');
|
|
253
308
|
});
|
|
254
309
|
test('show failure in console if importer fails', async ()=>{
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
|
|
310
|
+
mockApi({
|
|
311
|
+
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
312
|
+
method: 'get',
|
|
313
|
+
query: {
|
|
314
|
+
projectId: '1234'
|
|
315
|
+
},
|
|
316
|
+
uri: '/media-libraries'
|
|
317
|
+
}).reply(200, {
|
|
318
|
+
data: [
|
|
319
|
+
{
|
|
320
|
+
id: 'test-media-library',
|
|
321
|
+
organizationId: 'org-1',
|
|
322
|
+
status: 'active'
|
|
323
|
+
}
|
|
324
|
+
]
|
|
325
|
+
});
|
|
262
326
|
const mockSpinnerInstance = {
|
|
263
327
|
start: vi.fn().mockReturnThis(),
|
|
264
328
|
stop: vi.fn().mockReturnThis()
|
|
@@ -270,7 +334,9 @@ describe('#media:import', ()=>{
|
|
|
270
334
|
'test-source',
|
|
271
335
|
'--media-library-id',
|
|
272
336
|
'test-media-library'
|
|
273
|
-
]
|
|
337
|
+
], {
|
|
338
|
+
mocks: defaultMocks
|
|
339
|
+
});
|
|
274
340
|
expect(mockSpinnerInstance.stop).toHaveBeenCalled();
|
|
275
341
|
expect(error).toBeDefined();
|
|
276
342
|
expect(error?.message).toBe('Failed to upload asset');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/media/__tests__/import.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {type CliConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {SanityClient} from '@sanity/client'\nimport {of, throwError} from 'rxjs'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {MediaImportCommand} from '../import.js'\n\nconst mocks = vi.hoisted(() => ({\n getCliConfig: vi.fn(),\n getMediaLibraries: vi.fn(),\n getProjectCliClient: vi.fn(),\n importer: vi.fn(),\n select: vi.fn(),\n spinner: vi.fn(),\n}))\n\nvi.mock('../../../services/mediaLibraries.js', () => ({\n getMediaLibraries: mocks.getMediaLibraries,\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: mocks.select,\n spinner: mocks.spinner,\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: mocks.getCliConfig,\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: mocks.getProjectCliClient,\n}))\n\nvi.mock('../../../actions/media/importMedia.js', () => ({\n importer: mocks.importer,\n}))\n\nconst mockGetMediaLibraries = mocks.getMediaLibraries\nconst mockGetCliConfig = mocks.getCliConfig\nconst mockGetProjectCliClient = mocks.getProjectCliClient\nconst mockSelect = mocks.select\nconst mockSpinner = mocks.spinner\n\n// Setup CLI config\nconst apiConfig: CliConfig['api'] = {projectId: '1234'}\nmockGetCliConfig.mockResolvedValue({api: apiConfig})\nmockGetProjectCliClient.mockResolvedValue({} as SanityClient)\n\ndescribe('#media:import', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media', 'import', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Import a set of assets to the target media library.\n\n USAGE\n $ sanity media import SOURCE [--media-library-id <value>]\n [--replace-aspects]\n\n ARGUMENTS\n SOURCE Image file or folder to import from\n\n FLAGS\n --media-library-id=<value> The id of the target media library\n --replace-aspects Replace existing aspect data. All versions will be\n replaced (e.g. published and draft aspect data)\n\n DESCRIPTION\n Import a set of assets to the target media library.\n\n EXAMPLES\n Import all assets from the \"products\" directory\n\n $ sanity media import products\n\n Import all assets from \"gallery\" archive\n\n $ sanity media import gallery.tar.gz\n\n Import all assets from the \"products\" directory and replace aspects\n\n $ sanity media import products --replace-aspects\n\n \"\n `)\n })\n\n test('show console error when no projectId is found', async () => {\n mockGetCliConfig.mockResolvedValueOnce({api: {}})\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when getMediaLibraries fails', async () => {\n mockGetMediaLibraries.mockRejectedValue(new Error('API request failed'))\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('Failed to list media libraries')\n expect(error?.message).toContain('API request failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when no active media libraries are found', async () => {\n mockGetMediaLibraries.mockResolvedValue([])\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('No active media libraries found in this project')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('prompt user when there is no media flag', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n {id: 'another-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n mockSelect.mockResolvedValue('test-media-library')\n\n await testCommand(MediaImportCommand, ['test-source'])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('show console error when there is an error selecting a media library', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n mockSelect.mockRejectedValue(new Error('User cancelled selection'))\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'])\n\n expect(error?.message).toContain('Failed to select media library')\n expect(error?.message).toContain('User cancelled selection')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when the media library id flag is not valid', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n\n const {error} = await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'non-existent-library',\n ])\n\n expect(error?.message).toContain('Media library with id \"non-existent-library\" not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('getProjectApiClient is instantiated with the correct values', async () => {\n const mediaLibraries = [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ]\n mockGetMediaLibraries.mockResolvedValue(mediaLibraries)\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'test-media-library',\n ])\n\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: 'v2025-02-19',\n dataset: undefined,\n perspective: 'drafts',\n projectId: '1234',\n requestTagPrefix: 'sanity.mediaLibraryCli.import',\n requireUser: true,\n '~experimental_resource': {\n id: 'test-media-library',\n type: 'media-library',\n },\n })\n })\n\n test('show success message when cli imports asset successfully', async () => {\n mockGetMediaLibraries.mockResolvedValue([\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ])\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n text: '',\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to emit 3 assets\n mocks.importer.mockReturnValue(\n of(\n {asset: {originalFilename: 'img1.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img2.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img3.jpg'}, fileCount: 3},\n ),\n )\n\n await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'test-media-library',\n ])\n\n expect(mockSpinner).toHaveBeenCalledWith('Beginning import…')\n expect(mockSpinnerInstance.start).toHaveBeenCalled()\n expect(mockSpinnerInstance.succeed).toHaveBeenCalledWith('Imported 3 assets')\n })\n\n test('show failure in console if importer fails', async () => {\n mockGetMediaLibraries.mockResolvedValue([\n {id: 'test-media-library', organizationId: 'org-1', status: 'active' as const},\n ])\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to throw an error\n mocks.importer.mockReturnValue(throwError(() => new Error('Failed to upload asset')))\n\n const {error} = await testCommand(MediaImportCommand, [\n 'test-source',\n '--media-library-id',\n 'test-media-library',\n ])\n\n expect(mockSpinnerInstance.stop).toHaveBeenCalled()\n expect(error).toBeDefined()\n expect(error?.message).toBe('Failed to upload asset')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","testCommand","of","throwError","afterEach","describe","expect","test","vi","MediaImportCommand","mocks","hoisted","getCliConfig","fn","getMediaLibraries","getProjectCliClient","importer","select","spinner","mock","actual","importActual","findProjectRoot","mockResolvedValue","directory","root","type","mockGetMediaLibraries","mockGetCliConfig","mockGetProjectCliClient","mockSelect","mockSpinner","apiConfig","projectId","api","clearAllMocks","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","error","message","toContain","oclif","exit","toBe","mockRejectedValue","Error","mediaLibraries","id","organizationId","status","toHaveBeenCalledWith","objectContaining","mockSpinnerInstance","start","mockReturnThis","stop","succeed","mockReturnValue","apiVersion","dataset","undefined","perspective","requestTagPrefix","requireUser","text","asset","originalFilename","fileCount","toHaveBeenCalled","toBeDefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/media/__tests__/import.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {type CliConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {of, throwError} from 'rxjs'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {MediaImportCommand} from '../import.js'\n\nconst mocks = vi.hoisted(() => ({\n importer: vi.fn(),\n select: vi.fn(),\n spinner: vi.fn(),\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: mocks.select,\n spinner: mocks.spinner,\n }\n})\n\nvi.mock('../../../actions/media/importMedia.js', () => ({\n importer: mocks.importer,\n}))\n\nconst mockSelect = mocks.select\nconst mockSpinner = mocks.spinner\n\nconst defaultMocks = {\n cliConfig: {\n api: {projectId: '1234'} as CliConfig['api'],\n },\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n root: '/test/path',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\ndescribe('#media:import', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media', 'import', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Import a set of assets to the target media library.\n\n USAGE\n $ sanity media import SOURCE [--media-library-id <value>]\n [--replace-aspects]\n\n ARGUMENTS\n SOURCE Image file or folder to import from\n\n FLAGS\n --media-library-id=<value> The id of the target media library\n --replace-aspects Replace existing aspect data. All versions will be\n replaced (e.g. published and draft aspect data)\n\n DESCRIPTION\n Import a set of assets to the target media library.\n\n EXAMPLES\n Import all assets from the \"products\" directory\n\n $ sanity media import products\n\n Import all assets from \"gallery\" archive\n\n $ sanity media import gallery.tar.gz\n\n Import all assets from the \"products\" directory and replace aspects\n\n $ sanity media import products --replace-aspects\n\n \"\n `)\n })\n\n test('show console error when no projectId is found', async () => {\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {}},\n },\n })\n\n expect(error?.message).toContain('does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when getMediaLibraries fails', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(500, {error: 'API request failed'})\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Failed to list media libraries')\n expect(error?.message).toContain('API request failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when no active media libraries are found', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {data: []})\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('No active media libraries found in this project')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('prompt user when there is no media flag', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {id: 'test-media-library', organizationId: 'org-1', status: 'active'},\n {id: 'another-library', organizationId: 'org-1', status: 'active'},\n ],\n })\n mockSelect.mockResolvedValue('test-media-library')\n\n await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library:',\n }),\n )\n })\n\n test('show console error when there is an error selecting a media library', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n mockSelect.mockRejectedValue(new Error('User cancelled selection'))\n\n const {error} = await testCommand(MediaImportCommand, ['test-source'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Failed to select media library')\n expect(error?.message).toContain('User cancelled selection')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('show console error when the media library id flag is not valid', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const {error} = await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'non-existent-library'],\n {mocks: defaultMocks},\n )\n\n expect(error?.message).toContain('Media library with id \"non-existent-library\" not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('getProjectApiClient is instantiated with the correct values', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'test-media-library'],\n {mocks: defaultMocks},\n )\n\n expect(mockSpinnerInstance.start).toHaveBeenCalled()\n })\n\n test('show success message when cli imports asset successfully', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n succeed: vi.fn().mockReturnThis(),\n text: '',\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to emit 3 assets\n mocks.importer.mockReturnValue(\n of(\n {asset: {originalFilename: 'img1.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img2.jpg'}, fileCount: 3},\n {asset: {originalFilename: 'img3.jpg'}, fileCount: 3},\n ),\n )\n\n await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'test-media-library'],\n {mocks: defaultMocks},\n )\n\n expect(mockSpinner).toHaveBeenCalledWith('Beginning import…')\n expect(mockSpinnerInstance.start).toHaveBeenCalled()\n expect(mockSpinnerInstance.succeed).toHaveBeenCalledWith('Imported 3 assets')\n })\n\n test('show failure in console if importer fails', async () => {\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: '1234'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-media-library', organizationId: 'org-1', status: 'active'}],\n })\n\n const mockSpinnerInstance = {\n start: vi.fn().mockReturnThis(),\n stop: vi.fn().mockReturnThis(),\n }\n mockSpinner.mockReturnValue(mockSpinnerInstance as never)\n\n // Mock importer to throw an error\n mocks.importer.mockReturnValue(throwError(() => new Error('Failed to upload asset')))\n\n const {error} = await testCommand(\n MediaImportCommand,\n ['test-source', '--media-library-id', 'test-media-library'],\n {mocks: defaultMocks},\n )\n\n expect(mockSpinnerInstance.stop).toHaveBeenCalled()\n expect(error).toBeDefined()\n expect(error?.message).toBe('Failed to upload asset')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","of","throwError","afterEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","MediaImportCommand","mocks","hoisted","importer","fn","select","spinner","mock","actual","importActual","mockSelect","mockSpinner","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","root","type","token","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","error","message","toContain","oclif","exit","toBe","apiVersion","method","query","uri","reply","data","id","organizationId","status","mockResolvedValue","toHaveBeenCalledWith","objectContaining","mockRejectedValue","Error","mockSpinnerInstance","start","mockReturnThis","stop","succeed","mockReturnValue","toHaveBeenCalled","text","asset","originalFilename","fileCount","toBeDefined"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { Args, Flags } from '@oclif/core';
|
|
4
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
4
|
+
import { getProjectCliClient, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
5
5
|
import { input, spinner } from '@sanity/cli-core/ux';
|
|
6
6
|
import { exportDataset } from '@sanity/export';
|
|
7
7
|
import boxen from 'boxen';
|
|
@@ -59,7 +59,7 @@ export class MediaExportCommand extends SanityCommand {
|
|
|
59
59
|
exit: 1
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
const projectClient = await
|
|
62
|
+
const projectClient = await getProjectCliClient({
|
|
63
63
|
apiVersion: 'v2025-02-19',
|
|
64
64
|
projectId,
|
|
65
65
|
requireUser: true
|