@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/dataset/visibility/__tests__/get.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/commands/dataset/visibility/__tests__/get.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {DatasetVisibilityGetCommand} from '../get.js'\n\nconst mockListDatasets = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n list: mockListDatasets,\n } as never,\n }),\n }\n})\n\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\ndescribe('#dataset:visibility:get', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['dataset visibility get', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Get the visibility of a dataset\n\n USAGE\n $ sanity dataset visibility get DATASET\n\n ARGUMENTS\n DATASET The name of the dataset to get visibility for\n\n DESCRIPTION\n Get the visibility of a dataset\n\n EXAMPLES\n Check the visibility of a dataset\n\n $ sanity dataset visibility get my-dataset\n\n \"\n `)\n })\n\n test('gets dataset visibility successfully', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'private', name: 'my-dataset'}] as never)\n\n const {stdout} = await testCommand(DatasetVisibilityGetCommand, ['my-dataset'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('private')\n })\n\n test('shows error when dataset is not found', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'public', name: 'other-dataset'}] as never)\n\n const {error} = await testCommand(DatasetVisibilityGetCommand, ['not-found'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Dataset not found: not-found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('shows error for invalid dataset name', async () => {\n const invalidDatasetName = 'invalid-dataset-name!'\n\n const {error} = await testCommand(DatasetVisibilityGetCommand, [invalidDatasetName], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Dataset name must only contain')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('shows error when no project ID is available', async () => {\n const {error} = await testCommand(DatasetVisibilityGetCommand, ['my-dataset'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles error when listing datasets', async () => {\n mockListDatasets.mockRejectedValue(new Error('Network error'))\n\n const {error} = await testCommand(DatasetVisibilityGetCommand, ['my-dataset'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to list datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","testCommand","afterEach","describe","expect","test","vi","NO_PROJECT_ID","DatasetVisibilityGetCommand","mockListDatasets","hoisted","fn","mock","importOriginal","actual","getProjectCliClient","mockResolvedValue","datasets","list","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","clearAllMocks","stdout","toMatchInlineSnapshot","aclMode","name","mocks","toContain","error","message","oclif","exit","toBe","invalidDatasetName","undefined","mockRejectedValue","Error"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,aAAa,QAAO,oCAAmC;AAC/D,SAAQC,2BAA2B,QAAO,YAAW;AAErD,MAAMC,mBAAmBH,GAAGI,OAAO,CAAC,IAAMJ,GAAGK,EAAE;AAE/CL,GAAGM,IAAI,CAAC,oBAAoB,OAAOC;IACjC,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACL,GAAGC,MAAM;QACTC,qBAAqBT,GAAGK,EAAE,GAAGK,iBAAiB,CAAC;YAC7CC,UAAU;gBACRC,MAAMT;YACR;QACF;IACF;AACF;AAEA,MAAMU,gBAAgB;AAEtB,MAAMC,eAAe;IACnBC,WAAW;QAACC,KAAK;YAACC,WAAWJ;QAAa;IAAC;IAC3CK,aAAa;QACXC,WAAW;QACXC,MAAM;QACNC,MAAM;IACR;IACAC,OAAO;AACT;AAEAzB,SAAS,2BAA2B;IAClCD,UAAU;QACRI,GAAGuB,aAAa;IAClB;IAEAxB,KAAK,gBAAgB;QACnB,MAAM,EAACyB,MAAM,EAAC,GAAG,MAAM9B,WAAW;YAAC;YAA0B;SAAS;QAEtEI,OAAO0B,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;;;;IAkBtC,CAAC;IACH;IAEA1B,KAAK,wCAAwC;QAC3CI,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACgB,SAAS;gBAAWC,MAAM;YAAY;SAAE;QAE7E,MAAM,EAACH,MAAM,EAAC,GAAG,MAAM7B,YAAYO,6BAA6B;YAAC;SAAa,EAAE;YAC9E0B,OAAOd;QACT;QAEAhB,OAAO0B,QAAQK,SAAS,CAAC;IAC3B;IAEA9B,KAAK,yCAAyC;QAC5CI,iBAAiBO,iBAAiB,CAAC;YAAC;gBAACgB,SAAS;gBAAUC,MAAM;YAAe;SAAE;QAE/E,MAAM,EAACG,KAAK,EAAC,GAAG,MAAMnC,YAAYO,6BAA6B;YAAC;SAAY,EAAE;YAC5E0B,OAAOd;QACT;QAEAhB,OAAOgC,OAAOC,SAASF,SAAS,CAAC;QACjC/B,OAAOgC,OAAOE,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAnC,KAAK,wCAAwC;QAC3C,MAAMoC,qBAAqB;QAE3B,MAAM,EAACL,KAAK,EAAC,GAAG,MAAMnC,YAAYO,6BAA6B;YAACiC;SAAmB,EAAE;YACnFP,OAAOd;QACT;QAEAhB,OAAOgC,OAAOC,SAASF,SAAS,CAAC;QACjC/B,OAAOgC,OAAOE,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAnC,KAAK,+CAA+C;QAClD,MAAM,EAAC+B,KAAK,EAAC,GAAG,MAAMnC,YAAYO,6BAA6B;YAAC;SAAa,EAAE;YAC7E0B,OAAO;gBACL,GAAGd,YAAY;gBACfC,WAAW;oBAACC,KAAK;wBAACC,WAAWmB;oBAAS;gBAAC;YACzC;QACF;QAEAtC,OAAOgC,OAAOC,SAASF,SAAS,CAAC5B;QACjCH,OAAOgC,OAAOE,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAnC,KAAK,uCAAuC;QAC1CI,iBAAiBkC,iBAAiB,CAAC,IAAIC,MAAM;QAE7C,MAAM,EAACR,KAAK,EAAC,GAAG,MAAMnC,YAAYO,6BAA6B;YAAC;SAAa,EAAE;YAC7E0B,OAAOd;QACT;QAEAhB,OAAOgC,OAAOC,SAASF,SAAS,CAAC;QACjC/B,OAAOgC,OAAOE,OAAOC,MAAMC,IAAI,CAAC;IAClC;AACF"}
|
|
@@ -1,29 +1,37 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { getCliConfig, getProjectCliClient } from '@sanity/cli-core';
|
|
3
2
|
import { testCommand } from '@sanity/cli-test';
|
|
4
3
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
5
4
|
import { NO_PROJECT_ID } from '../../../../util/errorMessages.js';
|
|
6
5
|
import { DatasetVisibilitySetCommand } from '../set.js';
|
|
7
|
-
vi.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const mockListDatasets = vi.hoisted(()=>vi.fn());
|
|
7
|
+
const mockEditDatasetAcl = vi.hoisted(()=>vi.fn());
|
|
8
|
+
vi.mock('@sanity/cli-core', async (importOriginal)=>{
|
|
9
|
+
const actual = await importOriginal();
|
|
10
|
+
return {
|
|
11
|
+
...actual,
|
|
12
|
+
getProjectCliClient: vi.fn().mockResolvedValue({
|
|
13
|
+
datasets: {
|
|
14
|
+
edit: mockEditDatasetAcl,
|
|
15
|
+
list: mockListDatasets
|
|
16
|
+
}
|
|
12
17
|
})
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
const testProjectId = 'test-project';
|
|
21
|
+
const defaultMocks = {
|
|
22
|
+
cliConfig: {
|
|
23
|
+
api: {
|
|
24
|
+
projectId: testProjectId
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
projectRoot: {
|
|
28
|
+
directory: '/test/path',
|
|
29
|
+
path: '/test/path/sanity.config.ts',
|
|
30
|
+
type: 'studio'
|
|
31
|
+
},
|
|
32
|
+
token: 'test-token'
|
|
33
|
+
};
|
|
25
34
|
describe('#dataset:visibility:set', ()=>{
|
|
26
|
-
const mockEdit = vi.fn();
|
|
27
35
|
afterEach(()=>{
|
|
28
36
|
vi.clearAllMocks();
|
|
29
37
|
});
|
|
@@ -58,185 +66,130 @@ describe('#dataset:visibility:set', ()=>{
|
|
|
58
66
|
`);
|
|
59
67
|
});
|
|
60
68
|
test('sets dataset visibility to public successfully', async ()=>{
|
|
61
|
-
|
|
69
|
+
mockListDatasets.mockResolvedValue([
|
|
62
70
|
{
|
|
63
71
|
aclMode: 'private',
|
|
64
72
|
name: 'my-dataset'
|
|
65
73
|
}
|
|
66
|
-
];
|
|
67
|
-
|
|
68
|
-
api: {
|
|
69
|
-
projectId: 'test-project'
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
73
|
-
datasets: {
|
|
74
|
-
edit: mockEdit.mockResolvedValue({}),
|
|
75
|
-
list: vi.fn().mockResolvedValue(mockDatasets)
|
|
76
|
-
}
|
|
77
|
-
});
|
|
74
|
+
]);
|
|
75
|
+
mockEditDatasetAcl.mockResolvedValue(undefined);
|
|
78
76
|
const { stdout } = await testCommand(DatasetVisibilitySetCommand, [
|
|
79
77
|
'my-dataset',
|
|
80
78
|
'public'
|
|
81
|
-
]
|
|
79
|
+
], {
|
|
80
|
+
mocks: defaultMocks
|
|
81
|
+
});
|
|
82
82
|
expect(stdout).toContain('Dataset visibility changed');
|
|
83
|
-
expect(
|
|
83
|
+
expect(mockEditDatasetAcl).toHaveBeenCalledWith('my-dataset', {
|
|
84
84
|
aclMode: 'public'
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
87
|
test('sets dataset visibility to private successfully with warning', async ()=>{
|
|
88
|
-
|
|
88
|
+
mockListDatasets.mockResolvedValue([
|
|
89
89
|
{
|
|
90
90
|
aclMode: 'public',
|
|
91
91
|
name: 'my-dataset'
|
|
92
92
|
}
|
|
93
|
-
];
|
|
94
|
-
|
|
95
|
-
api: {
|
|
96
|
-
projectId: 'test-project'
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
// Mock the client used by listDatasets action
|
|
100
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
101
|
-
datasets: {
|
|
102
|
-
edit: mockEdit.mockResolvedValue({}),
|
|
103
|
-
list: vi.fn().mockResolvedValue(mockDatasets)
|
|
104
|
-
}
|
|
105
|
-
});
|
|
93
|
+
]);
|
|
94
|
+
mockEditDatasetAcl.mockResolvedValue(undefined);
|
|
106
95
|
const { stdout } = await testCommand(DatasetVisibilitySetCommand, [
|
|
107
96
|
'my-dataset',
|
|
108
97
|
'private'
|
|
109
|
-
]
|
|
98
|
+
], {
|
|
99
|
+
mocks: defaultMocks
|
|
100
|
+
});
|
|
110
101
|
expect(stdout).toContain('Please note that while documents are private, assets (files and images) are still public');
|
|
111
102
|
expect(stdout).toContain('Dataset visibility changed');
|
|
112
|
-
expect(
|
|
103
|
+
expect(mockEditDatasetAcl).toHaveBeenCalledWith('my-dataset', {
|
|
113
104
|
aclMode: 'private'
|
|
114
105
|
});
|
|
115
106
|
});
|
|
116
107
|
test('shows message when dataset is already in the specified mode', async ()=>{
|
|
117
|
-
|
|
108
|
+
mockListDatasets.mockResolvedValue([
|
|
118
109
|
{
|
|
119
110
|
aclMode: 'private',
|
|
120
111
|
name: 'my-dataset'
|
|
121
112
|
}
|
|
122
|
-
];
|
|
123
|
-
mockGetCliConfig.mockResolvedValue({
|
|
124
|
-
api: {
|
|
125
|
-
projectId: 'test-project'
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
// Mock the client used by listDatasets action
|
|
129
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
130
|
-
datasets: {
|
|
131
|
-
edit: mockEdit,
|
|
132
|
-
list: vi.fn().mockResolvedValue(mockDatasets)
|
|
133
|
-
}
|
|
134
|
-
});
|
|
113
|
+
]);
|
|
135
114
|
const { stdout } = await testCommand(DatasetVisibilitySetCommand, [
|
|
136
115
|
'my-dataset',
|
|
137
116
|
'private'
|
|
138
|
-
]
|
|
117
|
+
], {
|
|
118
|
+
mocks: defaultMocks
|
|
119
|
+
});
|
|
139
120
|
expect(stdout).toContain('Dataset already in "private" mode');
|
|
140
|
-
expect(
|
|
121
|
+
expect(mockEditDatasetAcl).not.toHaveBeenCalled();
|
|
141
122
|
});
|
|
142
123
|
test('shows error when dataset is not found', async ()=>{
|
|
143
|
-
|
|
124
|
+
mockListDatasets.mockResolvedValue([
|
|
144
125
|
{
|
|
145
126
|
aclMode: 'public',
|
|
146
127
|
name: 'other-dataset'
|
|
147
128
|
}
|
|
148
|
-
];
|
|
149
|
-
mockGetCliConfig.mockResolvedValue({
|
|
150
|
-
api: {
|
|
151
|
-
projectId: 'test-project'
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
// Mock the client used by listDatasets action
|
|
155
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
156
|
-
datasets: {
|
|
157
|
-
edit: mockEdit,
|
|
158
|
-
list: vi.fn().mockResolvedValue(mockDatasets)
|
|
159
|
-
}
|
|
160
|
-
});
|
|
129
|
+
]);
|
|
161
130
|
const { error } = await testCommand(DatasetVisibilitySetCommand, [
|
|
162
131
|
'not-found',
|
|
163
132
|
'private'
|
|
164
|
-
]
|
|
133
|
+
], {
|
|
134
|
+
mocks: defaultMocks
|
|
135
|
+
});
|
|
165
136
|
expect(error?.message).toContain('Dataset "not-found" not found');
|
|
166
|
-
expect(
|
|
137
|
+
expect(mockEditDatasetAcl).not.toHaveBeenCalled();
|
|
167
138
|
expect(error?.oclif?.exit).toBe(1);
|
|
168
139
|
});
|
|
169
140
|
test('shows error for invalid dataset name', async ()=>{
|
|
170
141
|
const invalidDatasetName = 'invalid-dataset-name!';
|
|
171
|
-
mockGetCliConfig.mockResolvedValue({
|
|
172
|
-
api: {
|
|
173
|
-
projectId: 'test-project'
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
142
|
const { error } = await testCommand(DatasetVisibilitySetCommand, [
|
|
177
143
|
invalidDatasetName,
|
|
178
144
|
'private'
|
|
179
|
-
]
|
|
145
|
+
], {
|
|
146
|
+
mocks: defaultMocks
|
|
147
|
+
});
|
|
180
148
|
expect(error?.message).toContain('Dataset name must only contain');
|
|
181
149
|
expect(error?.oclif?.exit).toBe(1);
|
|
182
150
|
});
|
|
183
151
|
test('handles error when listing datasets fails', async ()=>{
|
|
184
|
-
|
|
185
|
-
mockGetCliConfig.mockResolvedValue({
|
|
186
|
-
api: {
|
|
187
|
-
projectId: 'test-project'
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
// Mock the client used by listDatasets action to throw an error
|
|
191
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
192
|
-
datasets: {
|
|
193
|
-
edit: mockEdit,
|
|
194
|
-
list: vi.fn().mockRejectedValue(listError)
|
|
195
|
-
}
|
|
196
|
-
});
|
|
152
|
+
mockListDatasets.mockRejectedValue(new Error('Failed to fetch datasets'));
|
|
197
153
|
const { error } = await testCommand(DatasetVisibilitySetCommand, [
|
|
198
154
|
'my-dataset',
|
|
199
155
|
'private'
|
|
200
|
-
]
|
|
156
|
+
], {
|
|
157
|
+
mocks: defaultMocks
|
|
158
|
+
});
|
|
201
159
|
expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets');
|
|
202
160
|
expect(error?.oclif?.exit).toBe(1);
|
|
203
161
|
});
|
|
204
162
|
test('handles error when editing dataset fails', async ()=>{
|
|
205
|
-
|
|
163
|
+
mockListDatasets.mockResolvedValue([
|
|
206
164
|
{
|
|
207
165
|
aclMode: 'public',
|
|
208
166
|
name: 'my-dataset'
|
|
209
167
|
}
|
|
210
|
-
];
|
|
211
|
-
|
|
212
|
-
mockGetCliConfig.mockResolvedValue({
|
|
213
|
-
api: {
|
|
214
|
-
projectId: 'test-project'
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
218
|
-
datasets: {
|
|
219
|
-
edit: mockEdit.mockRejectedValue(editError),
|
|
220
|
-
list: vi.fn().mockResolvedValue(mockDatasets)
|
|
221
|
-
}
|
|
222
|
-
});
|
|
168
|
+
]);
|
|
169
|
+
mockEditDatasetAcl.mockRejectedValue(new Error('Failed to update dataset'));
|
|
223
170
|
const { error } = await testCommand(DatasetVisibilitySetCommand, [
|
|
224
171
|
'my-dataset',
|
|
225
172
|
'private'
|
|
226
|
-
]
|
|
173
|
+
], {
|
|
174
|
+
mocks: defaultMocks
|
|
175
|
+
});
|
|
227
176
|
expect(error?.message).toContain('Failed to edit dataset: Failed to update dataset');
|
|
228
177
|
expect(error?.oclif?.exit).toBe(1);
|
|
229
178
|
});
|
|
230
179
|
test('shows error when no project ID is available', async ()=>{
|
|
231
|
-
mockGetCliConfig.mockResolvedValue({
|
|
232
|
-
api: {
|
|
233
|
-
projectId: undefined
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
180
|
const { error } = await testCommand(DatasetVisibilitySetCommand, [
|
|
237
181
|
'my-dataset',
|
|
238
182
|
'private'
|
|
239
|
-
]
|
|
183
|
+
], {
|
|
184
|
+
mocks: {
|
|
185
|
+
...defaultMocks,
|
|
186
|
+
cliConfig: {
|
|
187
|
+
api: {
|
|
188
|
+
projectId: undefined
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
240
193
|
expect(error?.message).toContain(NO_PROJECT_ID);
|
|
241
194
|
expect(error?.oclif?.exit).toBe(1);
|
|
242
195
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/commands/dataset/visibility/__tests__/set.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {DatasetVisibilitySetCommand} from '../set.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(),\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 getProjectCliClient: vi.fn(),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\n\ndescribe('#dataset:visibility:set', () => {\n const mockEdit = vi.fn()\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['dataset visibility set', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Set the visibility of a dataset\n\n USAGE\n $ sanity dataset visibility set DATASET MODE\n\n ARGUMENTS\n DATASET The name of the dataset to set visibility for\n MODE (public|private) The visibility mode to set\n\n DESCRIPTION\n Set the visibility of a dataset\n\n EXAMPLES\n Make a dataset private\n\n $ sanity dataset visibility set my-dataset private\n\n Make a dataset public\n\n $ sanity dataset visibility set my-dataset public\n\n \"\n `)\n })\n\n test('sets dataset visibility to public successfully', async () => {\n const mockDatasets = [{aclMode: 'private', name: 'my-dataset'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n edit: mockEdit.mockResolvedValue({}),\n list: vi.fn().mockResolvedValue(mockDatasets),\n },\n } as never)\n\n const {stdout} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'public'])\n\n expect(stdout).toContain('Dataset visibility changed')\n expect(mockEdit).toHaveBeenCalledWith('my-dataset', {aclMode: 'public'})\n })\n\n test('sets dataset visibility to private successfully with warning', async () => {\n const mockDatasets = [{aclMode: 'public', name: 'my-dataset'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n // Mock the client used by listDatasets action\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n edit: mockEdit.mockResolvedValue({}),\n list: vi.fn().mockResolvedValue(mockDatasets),\n },\n } as never)\n\n const {stdout} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'])\n\n expect(stdout).toContain(\n 'Please note that while documents are private, assets (files and images) are still public',\n )\n expect(stdout).toContain('Dataset visibility changed')\n expect(mockEdit).toHaveBeenCalledWith('my-dataset', {aclMode: 'private'})\n })\n\n test('shows message when dataset is already in the specified mode', async () => {\n const mockDatasets = [{aclMode: 'private', name: 'my-dataset'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n // Mock the client used by listDatasets action\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n edit: mockEdit,\n list: vi.fn().mockResolvedValue(mockDatasets),\n },\n } as never)\n\n const {stdout} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'])\n\n expect(stdout).toContain('Dataset already in \"private\" mode')\n expect(mockEdit).not.toHaveBeenCalled()\n })\n\n test('shows error when dataset is not found', async () => {\n const mockDatasets = [{aclMode: 'public', name: 'other-dataset'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n // Mock the client used by listDatasets action\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n edit: mockEdit,\n list: vi.fn().mockResolvedValue(mockDatasets),\n },\n } as never)\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['not-found', 'private'])\n\n expect(error?.message).toContain('Dataset \"not-found\" not found')\n expect(mockEdit).not.toHaveBeenCalled()\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('shows error for invalid dataset name', async () => {\n const invalidDatasetName = 'invalid-dataset-name!'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, [invalidDatasetName, 'private'])\n\n expect(error?.message).toContain('Dataset name must only contain')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles error when listing datasets fails', async () => {\n const listError = new Error('Failed to fetch datasets')\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n // Mock the client used by listDatasets action to throw an error\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n edit: mockEdit,\n list: vi.fn().mockRejectedValue(listError),\n },\n } as never)\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'])\n\n expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles error when editing dataset fails', async () => {\n const mockDatasets = [{aclMode: 'public', name: 'my-dataset'}]\n const editError = new Error('Failed to update dataset')\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n })\n\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n edit: mockEdit.mockRejectedValue(editError),\n list: vi.fn().mockResolvedValue(mockDatasets),\n },\n } as never)\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'])\n\n expect(error?.message).toContain('Failed to edit dataset: Failed to update dataset')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('shows error when no project ID is available', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'])\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","testCommand","afterEach","describe","expect","test","vi","NO_PROJECT_ID","DatasetVisibilitySetCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","getCliToken","mockGetCliConfig","mocked","mockGetProjectCliClient","mockEdit","clearAllMocks","stdout","toMatchInlineSnapshot","mockDatasets","aclMode","name","api","projectId","datasets","edit","list","toContain","toHaveBeenCalledWith","not","toHaveBeenCalled","error","message","oclif","exit","toBe","invalidDatasetName","listError","Error","mockRejectedValue","editError","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/commands/dataset/visibility/__tests__/set.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../../util/errorMessages.js'\nimport {DatasetVisibilitySetCommand} from '../set.js'\n\nconst mockListDatasets = vi.hoisted(() => vi.fn())\nconst mockEditDatasetAcl = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async (importOriginal) => {\n const actual = await importOriginal<typeof import('@sanity/cli-core')>()\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n edit: mockEditDatasetAcl,\n list: mockListDatasets,\n } as never,\n }),\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\ndescribe('#dataset:visibility:set', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['dataset visibility set', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Set the visibility of a dataset\n\n USAGE\n $ sanity dataset visibility set DATASET MODE\n\n ARGUMENTS\n DATASET The name of the dataset to set visibility for\n MODE (public|private) The visibility mode to set\n\n DESCRIPTION\n Set the visibility of a dataset\n\n EXAMPLES\n Make a dataset private\n\n $ sanity dataset visibility set my-dataset private\n\n Make a dataset public\n\n $ sanity dataset visibility set my-dataset public\n\n \"\n `)\n })\n\n test('sets dataset visibility to public successfully', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'private', name: 'my-dataset'}] as never)\n mockEditDatasetAcl.mockResolvedValue(undefined as never)\n\n const {stdout} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'public'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('Dataset visibility changed')\n expect(mockEditDatasetAcl).toHaveBeenCalledWith('my-dataset', {\n aclMode: 'public',\n })\n })\n\n test('sets dataset visibility to private successfully with warning', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'public', name: 'my-dataset'}] as never)\n mockEditDatasetAcl.mockResolvedValue(undefined as never)\n\n const {stdout} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain(\n 'Please note that while documents are private, assets (files and images) are still public',\n )\n expect(stdout).toContain('Dataset visibility changed')\n expect(mockEditDatasetAcl).toHaveBeenCalledWith('my-dataset', {\n aclMode: 'private',\n })\n })\n\n test('shows message when dataset is already in the specified mode', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'private', name: 'my-dataset'}] as never)\n\n const {stdout} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('Dataset already in \"private\" mode')\n expect(mockEditDatasetAcl).not.toHaveBeenCalled()\n })\n\n test('shows error when dataset is not found', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'public', name: 'other-dataset'}] as never)\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['not-found', 'private'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Dataset \"not-found\" not found')\n expect(mockEditDatasetAcl).not.toHaveBeenCalled()\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('shows error for invalid dataset name', async () => {\n const invalidDatasetName = 'invalid-dataset-name!'\n\n const {error} = await testCommand(\n DatasetVisibilitySetCommand,\n [invalidDatasetName, 'private'],\n {\n mocks: defaultMocks,\n },\n )\n\n expect(error?.message).toContain('Dataset name must only contain')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles error when listing datasets fails', async () => {\n mockListDatasets.mockRejectedValue(new Error('Failed to fetch datasets'))\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles error when editing dataset fails', async () => {\n mockListDatasets.mockResolvedValue([{aclMode: 'public', name: 'my-dataset'}] as never)\n mockEditDatasetAcl.mockRejectedValue(new Error('Failed to update dataset'))\n\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to edit dataset: Failed to update dataset')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('shows error when no project ID is available', async () => {\n const {error} = await testCommand(DatasetVisibilitySetCommand, ['my-dataset', 'private'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","testCommand","afterEach","describe","expect","test","vi","NO_PROJECT_ID","DatasetVisibilitySetCommand","mockListDatasets","hoisted","fn","mockEditDatasetAcl","mock","importOriginal","actual","getProjectCliClient","mockResolvedValue","datasets","edit","list","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","clearAllMocks","stdout","toMatchInlineSnapshot","aclMode","name","undefined","mocks","toContain","toHaveBeenCalledWith","not","toHaveBeenCalled","error","message","oclif","exit","toBe","invalidDatasetName","mockRejectedValue","Error"],"mappings":"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"}
|
package/dist/commands/dev.js
CHANGED
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description =\n 'Starts a local development server for Sanity Studio with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies.',\n }),\n host: Flags.string({\n default: 'localhost',\n description: 'The local network interface at which to listen.',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard.',\n }),\n port: Flags.string({\n default: '3333',\n description: 'TCP port to start server on.',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n
|
|
1
|
+
{"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description =\n 'Starts a local development server for Sanity Studio with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies.',\n }),\n host: Flags.string({\n default: 'localhost',\n description: 'The local network interface at which to listen.',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard.',\n }),\n port: Flags.string({\n default: '3333',\n description: 'TCP port to start server on.',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n cliConfig,\n flags,\n isApp,\n output: this.output,\n workDir,\n })\n return result\n } catch (error) {\n devDebug(`Failed to start dev server`, error)\n this.output.error(chalk.red.bgBlack(`Failed to start dev server: ${error.message}`), {\n exit: 1,\n })\n }\n }\n}\n"],"names":["Flags","SanityCommand","chalk","devAction","devDebug","determineIsApp","DevCommand","description","examples","flags","boolean","allowNo","host","string","default","port","run","parse","workDir","getProjectRoot","directory","cliConfig","getCliConfig","isApp","undefined","result","output","error","red","bgBlack","message","exit"],"mappings":"AAAA,SAAQA,KAAK,QAAO,cAAa;AACjC,SAAQC,aAAa,QAAO,mBAAkB;AAC9C,SAAQC,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,SAAS,QAAO,8BAA6B;AACrD,SAAQC,QAAQ,QAAO,6BAA4B;AACnD,SAAQC,cAAc,QAAO,4BAA2B;AAExD,OAAO,MAAMC,mBAAmBL;IAC9B,OAAgBM,cACd,0EAAyE;IAE3E,OAAgBC,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtB,gBAAgBT,MAAMU,OAAO,CAAC;YAC5BC,SAAS;YACTJ,aAAa;QACf;QACAK,MAAMZ,MAAMa,MAAM,CAAC;YACjBC,SAAS;YACTP,aAAa;QACf;QACA,qBAAqBP,MAAMU,OAAO,CAAC;YACjCC,SAAS;YACTJ,aAAa;QACf;QACAQ,MAAMf,MAAMa,MAAM,CAAC;YACjBC,SAAS;YACTP,aAAa;QACf;IACF,EAAC;IAED,MAAaS,MAA8C;QACzD,MAAM,EAACP,KAAK,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACX;QAEjC,MAAMY,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QACvD,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,MAAMC,QAAQlB,eAAegB;QAE7B,mDAAmD;QACnD,IAAIE,SAASd,KAAK,CAAC,oBAAoB,KAAKe,WAAW;YACrDf,KAAK,CAAC,oBAAoB,GAAG;QAC/B,OAAO,IAAIA,KAAK,CAAC,oBAAoB,KAAKe,WAAW;YACnD,yDAAyD;YACzDf,KAAK,CAAC,oBAAoB,GAAG;QAC/B;QAEA,IAAI;YACF,MAAMgB,SAAS,MAAMtB,UAAU;gBAC7BkB;gBACAZ;gBACAc;gBACAG,QAAQ,IAAI,CAACA,MAAM;gBACnBR;YACF;YACA,OAAOO;QACT,EAAE,OAAOE,OAAO;YACdvB,SAAS,CAAC,0BAA0B,CAAC,EAAEuB;YACvC,IAAI,CAACD,MAAM,CAACC,KAAK,CAACzB,MAAM0B,GAAG,CAACC,OAAO,CAAC,CAAC,4BAA4B,EAAEF,MAAMG,OAAO,EAAE,GAAG;gBACnFC,MAAM;YACR;QACF;IACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { isInteractive } from '@sanity/cli-core';
|
|
3
2
|
import { select } from '@sanity/cli-core/ux';
|
|
4
3
|
import { testCommand } from '@sanity/cli-test';
|
|
5
4
|
import nock from 'nock';
|
|
@@ -12,13 +11,15 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
|
12
11
|
select: vi.fn()
|
|
13
12
|
};
|
|
14
13
|
});
|
|
15
|
-
vi.
|
|
14
|
+
const mockedIsInteractive = vi.hoisted(()=>vi.fn());
|
|
15
|
+
vi.mock('@sanity/cli-core', async ()=>{
|
|
16
|
+
const actual = await vi.importActual('@sanity/cli-core');
|
|
16
17
|
return {
|
|
17
|
-
|
|
18
|
+
...actual,
|
|
19
|
+
isInteractive: mockedIsInteractive
|
|
18
20
|
};
|
|
19
21
|
});
|
|
20
22
|
const mockedSelect = vi.mocked(select);
|
|
21
|
-
const mockedIsInteractive = vi.mocked(isInteractive);
|
|
22
23
|
afterEach(()=>{
|
|
23
24
|
const pending = nock.pendingMocks();
|
|
24
25
|
nock.cleanAll();
|
|
@@ -179,7 +180,6 @@ describe('#docs:search', ()=>{
|
|
|
179
180
|
expect(stdout).not.toContain('Understanding Sanity schemas');
|
|
180
181
|
});
|
|
181
182
|
test('shows usage hints in non-interactive mode', async ()=>{
|
|
182
|
-
mockedIsInteractive.mockReturnValue(false);
|
|
183
183
|
const searchResponse = [
|
|
184
184
|
{
|
|
185
185
|
description: 'Learn how to install Sanity Studio',
|
|
@@ -190,6 +190,7 @@ describe('#docs:search', ()=>{
|
|
|
190
190
|
nock('https://www.sanity.io').get('/docs/api/search/semantic').query({
|
|
191
191
|
query: 'studio'
|
|
192
192
|
}).reply(200, searchResponse);
|
|
193
|
+
mockedIsInteractive.mockReturnValue(false);
|
|
193
194
|
const { stdout } = await testCommand(DocsSearchCommand, [
|
|
194
195
|
'studio'
|
|
195
196
|
]);
|
|
@@ -208,7 +209,6 @@ describe('#docs:search', ()=>{
|
|
|
208
209
|
expect(error.oclif?.exit).toBe(1);
|
|
209
210
|
});
|
|
210
211
|
test('handles interactive mode article selection', async ()=>{
|
|
211
|
-
mockedIsInteractive.mockReturnValue(true);
|
|
212
212
|
mockedSelect.mockResolvedValue(0);
|
|
213
213
|
const searchResponse = [
|
|
214
214
|
{
|
|
@@ -221,6 +221,7 @@ describe('#docs:search', ()=>{
|
|
|
221
221
|
query: 'studio'
|
|
222
222
|
}).reply(200, searchResponse);
|
|
223
223
|
nock('https://www.sanity.io').get('/docs/studio/installation.md').reply(200, '# Studio Installation\n\nThis is how you install the studio.');
|
|
224
|
+
mockedIsInteractive.mockReturnValue(true);
|
|
224
225
|
const { stdout } = await testCommand(DocsSearchCommand, [
|
|
225
226
|
'studio'
|
|
226
227
|
]);
|
|
@@ -230,7 +231,6 @@ describe('#docs:search', ()=>{
|
|
|
230
231
|
expect(stdout).toContain('This is how you install the studio.');
|
|
231
232
|
});
|
|
232
233
|
test('handles interactive mode exit selection', async ()=>{
|
|
233
|
-
mockedIsInteractive.mockReturnValue(true);
|
|
234
234
|
mockedSelect.mockResolvedValue(-1); // User selects exit option
|
|
235
235
|
const searchResponse = [
|
|
236
236
|
{
|
|
@@ -242,6 +242,7 @@ describe('#docs:search', ()=>{
|
|
|
242
242
|
nock('https://www.sanity.io').get('/docs/api/search/semantic').query({
|
|
243
243
|
query: 'studio'
|
|
244
244
|
}).reply(200, searchResponse);
|
|
245
|
+
mockedIsInteractive.mockReturnValue(true);
|
|
245
246
|
const { stdout } = await testCommand(DocsSearchCommand, [
|
|
246
247
|
'studio'
|
|
247
248
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/docs/__tests__/search.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {isInteractive} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {DocsSearchCommand} from '../search.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/util/isInteractive.js', async () => {\n return {\n isInteractive: vi.fn(),\n }\n})\n\nconst mockedSelect = vi.mocked(select)\nconst mockedIsInteractive = vi.mocked(isInteractive)\n\nafterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n vi.resetAllMocks()\n})\n\ndescribe('#docs:search', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand('docs search --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Search Sanity docs\n\n USAGE\n $ sanity docs search QUERY [--limit <value>]\n\n ARGUMENTS\n QUERY Search query for documentation\n\n FLAGS\n --limit=<value> [default: 10] Maximum number of results to return\n\n DESCRIPTION\n Search Sanity docs\n\n EXAMPLES\n Search for documentation about schemas\n\n $ sanity docs search schema\n\n Search with phrase\n\n $ sanity docs search \"groq functions\"\n\n Limit search results\n\n $ sanity docs search \"deployment\" --limit=5\n\n \"\n `)\n })\n\n test('searches and displays results', async () => {\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Understanding Sanity schemas',\n path: '/docs/schemas/overview',\n title: 'Schema Overview',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Searching documentation for: \"studio\"')\n expect(stdout).toContain('Found 2 result(s):')\n expect(stdout).toContain('1. Studio Installation Guide')\n expect(stdout).toContain('URL: https://www.sanity.io/docs/studio/installation')\n expect(stdout).toContain('Learn how to install Sanity Studio')\n expect(stdout).toContain('2. Schema Overview')\n })\n\n test('handles no results', async () => {\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'nonexistent'})\n .reply(200, [])\n\n const {stdout} = await testCommand(DocsSearchCommand, ['nonexistent'])\n\n expect(stdout).toContain('Searching documentation for: \"nonexistent\"')\n expect(stdout).toContain('No results found. Try a different search term.')\n })\n\n test('handles API errors', async () => {\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'test'})\n .reply(500, 'Internal Server Error')\n\n const {error} = await testCommand(DocsSearchCommand, ['test']).catch((err) => err)\n expect(error.message).toBe(\n 'The documentation search API is currently unavailable. Please try again later.',\n )\n expect(error.oclif?.exit).toBe(1)\n })\n\n test('respects limit flag', async () => {\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio 1',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 2',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 3',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n\n {\n description: 'Learn how to install Sanity Studio 4',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 5',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 6',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio', '--limit=3'])\n\n expect(stdout).toContain('Found 3 result(s):')\n expect(stdout).toContain('1. Studio Installation Guide')\n expect(stdout).toContain('2. Studio Installation Guide')\n expect(stdout).toContain('3. Studio Installation Guide')\n })\n\n test('handles results with empty descriptions', async () => {\n const searchResponse = [\n {\n description: '', // Empty description\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: '', // Empty description\n path: '/docs/schemas/overview',\n title: 'Schema Overview',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Searching documentation for: \"studio\"')\n expect(stdout).toContain('Found 2 result(s):')\n expect(stdout).toContain('1. Studio Installation Guide')\n expect(stdout).toContain('URL: https://www.sanity.io/docs/studio/installation')\n expect(stdout).toContain('2. Schema Overview')\n // Should not show empty description lines\n expect(stdout).not.toContain('Learn how to install')\n expect(stdout).not.toContain('Understanding Sanity schemas')\n })\n\n test('shows usage hints in non-interactive mode', async () => {\n mockedIsInteractive.mockReturnValue(false)\n\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Found 1 result(s):')\n expect(stdout).toContain('Use `sanity docs read <url>` to read an article in terminal.')\n expect(stdout).toContain('Use `sanity docs read <path>` to follow links found within articles.')\n })\n\n test('handles network errors with default message', async () => {\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'test'})\n .reply(500, 'Internal Server Error')\n\n const {error} = await testCommand(DocsSearchCommand, ['test']).catch((err) => err)\n expect(error.message).toBe(\n 'The documentation search API is currently unavailable. Please try again later.',\n )\n expect(error.oclif?.exit).toBe(1)\n })\n\n test('handles interactive mode article selection', async () => {\n mockedIsInteractive.mockReturnValue(true)\n mockedSelect.mockResolvedValue(0)\n\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n nock('https://www.sanity.io')\n .get('/docs/studio/installation.md')\n .reply(200, '# Studio Installation\\n\\nThis is how you install the studio.')\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Found 1 result(s):')\n expect(stdout).toContain('---')\n expect(stdout).toContain('# Studio Installation')\n expect(stdout).toContain('This is how you install the studio.')\n })\n\n test('handles interactive mode exit selection', async () => {\n mockedIsInteractive.mockReturnValue(true)\n mockedSelect.mockResolvedValue(-1) // User selects exit option\n\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Found 1 result(s):')\n expect(stdout).not.toContain('---') // Should not show article content\n expect(stdout).not.toContain('# Studio Installation')\n })\n})\n"],"names":["runCommand","isInteractive","select","testCommand","nock","afterEach","describe","expect","test","vi","DocsSearchCommand","mock","actual","importActual","fn","mockedSelect","mocked","mockedIsInteractive","pending","pendingMocks","cleanAll","toEqual","resetAllMocks","stdout","toMatchInlineSnapshot","searchResponse","description","path","title","get","query","reply","toContain","error","catch","err","message","toBe","oclif","exit","not","mockReturnValue","mockResolvedValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/docs/__tests__/search.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {select} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {DocsSearchCommand} from '../search.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nconst mockedIsInteractive = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core')>('@sanity/cli-core')\n return {\n ...actual,\n isInteractive: mockedIsInteractive,\n }\n})\n\nconst mockedSelect = vi.mocked(select)\n\nafterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n vi.resetAllMocks()\n})\n\ndescribe('#docs:search', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand('docs search --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Search Sanity docs\n\n USAGE\n $ sanity docs search QUERY [--limit <value>]\n\n ARGUMENTS\n QUERY Search query for documentation\n\n FLAGS\n --limit=<value> [default: 10] Maximum number of results to return\n\n DESCRIPTION\n Search Sanity docs\n\n EXAMPLES\n Search for documentation about schemas\n\n $ sanity docs search schema\n\n Search with phrase\n\n $ sanity docs search \"groq functions\"\n\n Limit search results\n\n $ sanity docs search \"deployment\" --limit=5\n\n \"\n `)\n })\n\n test('searches and displays results', async () => {\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Understanding Sanity schemas',\n path: '/docs/schemas/overview',\n title: 'Schema Overview',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Searching documentation for: \"studio\"')\n expect(stdout).toContain('Found 2 result(s):')\n expect(stdout).toContain('1. Studio Installation Guide')\n expect(stdout).toContain('URL: https://www.sanity.io/docs/studio/installation')\n expect(stdout).toContain('Learn how to install Sanity Studio')\n expect(stdout).toContain('2. Schema Overview')\n })\n\n test('handles no results', async () => {\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'nonexistent'})\n .reply(200, [])\n\n const {stdout} = await testCommand(DocsSearchCommand, ['nonexistent'])\n\n expect(stdout).toContain('Searching documentation for: \"nonexistent\"')\n expect(stdout).toContain('No results found. Try a different search term.')\n })\n\n test('handles API errors', async () => {\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'test'})\n .reply(500, 'Internal Server Error')\n\n const {error} = await testCommand(DocsSearchCommand, ['test']).catch((err) => err)\n expect(error.message).toBe(\n 'The documentation search API is currently unavailable. Please try again later.',\n )\n expect(error.oclif?.exit).toBe(1)\n })\n\n test('respects limit flag', async () => {\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio 1',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 2',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 3',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n\n {\n description: 'Learn how to install Sanity Studio 4',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 5',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: 'Learn how to install Sanity Studio 6',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio', '--limit=3'])\n\n expect(stdout).toContain('Found 3 result(s):')\n expect(stdout).toContain('1. Studio Installation Guide')\n expect(stdout).toContain('2. Studio Installation Guide')\n expect(stdout).toContain('3. Studio Installation Guide')\n })\n\n test('handles results with empty descriptions', async () => {\n const searchResponse = [\n {\n description: '', // Empty description\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n {\n description: '', // Empty description\n path: '/docs/schemas/overview',\n title: 'Schema Overview',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Searching documentation for: \"studio\"')\n expect(stdout).toContain('Found 2 result(s):')\n expect(stdout).toContain('1. Studio Installation Guide')\n expect(stdout).toContain('URL: https://www.sanity.io/docs/studio/installation')\n expect(stdout).toContain('2. Schema Overview')\n // Should not show empty description lines\n expect(stdout).not.toContain('Learn how to install')\n expect(stdout).not.toContain('Understanding Sanity schemas')\n })\n\n test('shows usage hints in non-interactive mode', async () => {\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n mockedIsInteractive.mockReturnValue(false)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Found 1 result(s):')\n expect(stdout).toContain('Use `sanity docs read <url>` to read an article in terminal.')\n expect(stdout).toContain('Use `sanity docs read <path>` to follow links found within articles.')\n })\n\n test('handles network errors with default message', async () => {\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'test'})\n .reply(500, 'Internal Server Error')\n\n const {error} = await testCommand(DocsSearchCommand, ['test']).catch((err) => err)\n expect(error.message).toBe(\n 'The documentation search API is currently unavailable. Please try again later.',\n )\n expect(error.oclif?.exit).toBe(1)\n })\n\n test('handles interactive mode article selection', async () => {\n mockedSelect.mockResolvedValue(0)\n\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n nock('https://www.sanity.io')\n .get('/docs/studio/installation.md')\n .reply(200, '# Studio Installation\\n\\nThis is how you install the studio.')\n\n mockedIsInteractive.mockReturnValue(true)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Found 1 result(s):')\n expect(stdout).toContain('---')\n expect(stdout).toContain('# Studio Installation')\n expect(stdout).toContain('This is how you install the studio.')\n })\n\n test('handles interactive mode exit selection', async () => {\n mockedSelect.mockResolvedValue(-1) // User selects exit option\n\n const searchResponse = [\n {\n description: 'Learn how to install Sanity Studio',\n path: '/docs/studio/installation',\n title: 'Studio Installation Guide',\n },\n ]\n\n nock('https://www.sanity.io')\n .get('/docs/api/search/semantic')\n .query({query: 'studio'})\n .reply(200, searchResponse)\n\n mockedIsInteractive.mockReturnValue(true)\n\n const {stdout} = await testCommand(DocsSearchCommand, ['studio'])\n\n expect(stdout).toContain('Found 1 result(s):')\n expect(stdout).not.toContain('---') // Should not show article content\n expect(stdout).not.toContain('# Studio Installation')\n })\n})\n"],"names":["runCommand","select","testCommand","nock","afterEach","describe","expect","test","vi","DocsSearchCommand","mock","actual","importActual","fn","mockedIsInteractive","hoisted","isInteractive","mockedSelect","mocked","pending","pendingMocks","cleanAll","toEqual","resetAllMocks","stdout","toMatchInlineSnapshot","searchResponse","description","path","title","get","query","reply","toContain","error","catch","err","message","toBe","oclif","exit","not","mockReturnValue","mockResolvedValue"],"mappings":"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"}
|