@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/hook/__tests__/create.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/hook/__tests__/create.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport open from 'open'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {CreateHookCommand} from '../create.js'\n\nvi.mock('open', () => ({\n default: vi.fn().mockResolvedValue(undefined),\n}))\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nconst mockGetById = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual('@sanity/cli-core')\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n projects: {\n getById: mockGetById,\n },\n }),\n }\n})\n\ndescribe('#hook:create', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['hook create', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Create a new webhook for the current project\n\n USAGE\n $ sanity hook create\n\n DESCRIPTION\n Create a new webhook for the current project\n\n EXAMPLES\n Create a new webhook for the current project\n\n $ sanity hook create\n\n \"\n `)\n })\n\n test('opens webhook creation URL for project with organization', async () => {\n mockGetById.mockResolvedValueOnce({\n id: 'test-project',\n organizationId: 'test-org',\n })\n\n const {stdout} = await testCommand(CreateHookCommand, [], {mocks: defaultMocks})\n\n expect(open).toHaveBeenCalledWith(\n 'https://www.sanity.io/organizations/test-org/project/test-project/api/webhooks/new',\n )\n expect(stdout).toContain(\n 'Opening https://www.sanity.io/organizations/test-org/project/test-project/api/webhooks/new',\n )\n })\n\n test('opens webhook creation URL for project without organization (personal)', async () => {\n mockGetById.mockResolvedValueOnce({\n id: 'test-project',\n })\n\n const {stdout} = await testCommand(CreateHookCommand, [], {mocks: defaultMocks})\n\n expect(open).toHaveBeenCalledWith(\n 'https://www.sanity.io/organizations/personal/project/test-project/api/webhooks/new',\n )\n expect(stdout).toContain(\n 'Opening https://www.sanity.io/organizations/personal/project/test-project/api/webhooks/new',\n )\n })\n\n test('displays an error if the project fetch fails', async () => {\n mockGetById.mockRejectedValueOnce(new Error('Internal Server Error'))\n\n const {error} = await testCommand(CreateHookCommand, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to fetch project information')\n })\n\n test('throws error when no project ID is found', async () => {\n const {error} = await testCommand(CreateHookCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('handles open failure gracefully', async () => {\n vi.mocked(open).mockRejectedValueOnce(new Error('Failed to open browser'))\n\n mockGetById.mockResolvedValueOnce({\n id: 'test-project',\n organizationId: 'test-org',\n })\n\n const {error} = await testCommand(CreateHookCommand, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to open browser')\n })\n})\n"],"names":["runCommand","testCommand","open","afterEach","describe","expect","test","vi","NO_PROJECT_ID","CreateHookCommand","mock","default","fn","mockResolvedValue","undefined","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockGetById","hoisted","actual","importActual","getProjectCliClient","projects","getById","clearAllMocks","stdout","toMatchInlineSnapshot","mockResolvedValueOnce","id","organizationId","mocks","toHaveBeenCalledWith","toContain","mockRejectedValueOnce","Error","error","toBeInstanceOf","message","toEqual","mocked"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,OAAOC,UAAU,OAAM;AACvB,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,aAAa,QAAO,iCAAgC;AAC5D,SAAQC,iBAAiB,QAAO,eAAc;AAE9CF,GAAGG,IAAI,CAAC,QAAQ,IAAO,CAAA;QACrBC,SAASJ,GAAGK,EAAE,GAAGC,iBAAiB,CAACC;IACrC,CAAA;AAEA,MAAMC,gBAAgB;AAEtB,MAAMC,eAAe;IACnBC,WAAW;QAACC,KAAK;YAACC,WAAWJ;QAAa;IAAC;IAC3CK,aAAa;QACXC,WAAW;QACXC,MAAM;QACNC,MAAM;IACR;IACAC,OAAO;AACT;AAEA,MAAMC,cAAclB,GAAGmB,OAAO,CAAC,IAAMnB,GAAGK,EAAE;AAE1CL,GAAGG,IAAI,CAAC,oBAAoB;IAC1B,MAAMiB,SAAS,MAAMpB,GAAGqB,YAAY,CAAC;IACrC,OAAO;QACL,GAAGD,MAAM;QACTE,qBAAqBtB,GAAGK,EAAE,GAAGC,iBAAiB,CAAC;YAC7CiB,UAAU;gBACRC,SAASN;YACX;QACF;IACF;AACF;AAEArB,SAAS,gBAAgB;IACvBD,UAAU;QACRI,GAAGyB,aAAa;IAClB;IAEA1B,KAAK,gBAAgB;QACnB,MAAM,EAAC2B,MAAM,EAAC,GAAG,MAAMjC,WAAW;YAAC;YAAe;SAAS;QAE3DK,OAAO4B,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;IAetC,CAAC;IACH;IAEA5B,KAAK,4DAA4D;QAC/DmB,YAAYU,qBAAqB,CAAC;YAChCC,IAAI;YACJC,gBAAgB;QAClB;QAEA,MAAM,EAACJ,MAAM,EAAC,GAAG,MAAMhC,YAAYQ,mBAAmB,EAAE,EAAE;YAAC6B,OAAOtB;QAAY;QAE9EX,OAAOH,MAAMqC,oBAAoB,CAC/B;QAEFlC,OAAO4B,QAAQO,SAAS,CACtB;IAEJ;IAEAlC,KAAK,0EAA0E;QAC7EmB,YAAYU,qBAAqB,CAAC;YAChCC,IAAI;QACN;QAEA,MAAM,EAACH,MAAM,EAAC,GAAG,MAAMhC,YAAYQ,mBAAmB,EAAE,EAAE;YAAC6B,OAAOtB;QAAY;QAE9EX,OAAOH,MAAMqC,oBAAoB,CAC/B;QAEFlC,OAAO4B,QAAQO,SAAS,CACtB;IAEJ;IAEAlC,KAAK,gDAAgD;QACnDmB,YAAYgB,qBAAqB,CAAC,IAAIC,MAAM;QAE5C,MAAM,EAACC,KAAK,EAAC,GAAG,MAAM1C,YAAYQ,mBAAmB,EAAE,EAAE;YAAC6B,OAAOtB;QAAY;QAE7EX,OAAOsC,OAAOC,cAAc,CAACF;QAC7BrC,OAAOsC,OAAOE,SAASL,SAAS,CAAC;IACnC;IAEAlC,KAAK,4CAA4C;QAC/C,MAAM,EAACqC,KAAK,EAAC,GAAG,MAAM1C,YAAYQ,mBAAmB,EAAE,EAAE;YACvD6B,OAAO;gBACL,GAAGtB,YAAY;gBACfC,WAAW;oBAACC,KAAK;wBAACC,WAAWL;oBAAS;gBAAC;YACzC;QACF;QAEAT,OAAOsC,OAAOC,cAAc,CAACF;QAC7BrC,OAAOsC,OAAOE,SAASC,OAAO,CAACtC;IACjC;IAEAF,KAAK,mCAAmC;QACtCC,GAAGwC,MAAM,CAAC7C,MAAMuC,qBAAqB,CAAC,IAAIC,MAAM;QAEhDjB,YAAYU,qBAAqB,CAAC;YAChCC,IAAI;YACJC,gBAAgB;QAClB;QAEA,MAAM,EAACM,KAAK,EAAC,GAAG,MAAM1C,YAAYQ,mBAAmB,EAAE,EAAE;YAAC6B,OAAOtB;QAAY;QAE7EX,OAAOsC,OAAOC,cAAc,CAACF;QAC7BrC,OAAOsC,OAAOE,SAASL,SAAS,CAAC;IACnC;AACF"}
|
|
@@ -1,29 +1,10 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { getCliConfig } from '@sanity/cli-core';
|
|
3
2
|
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
4
3
|
import nock from 'nock';
|
|
5
4
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
6
5
|
import { HOOK_API_VERSION } from '../../../actions/hook/constants.js';
|
|
7
6
|
import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
8
7
|
import { Delete } from '../delete.js';
|
|
9
|
-
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async ()=>{
|
|
10
|
-
return {
|
|
11
|
-
findProjectRoot: vi.fn().mockResolvedValue({
|
|
12
|
-
directory: '/test/path',
|
|
13
|
-
root: '/test/path',
|
|
14
|
-
type: 'studio'
|
|
15
|
-
})
|
|
16
|
-
};
|
|
17
|
-
});
|
|
18
|
-
vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', async ()=>{
|
|
19
|
-
return {
|
|
20
|
-
getCliConfig: vi.fn().mockResolvedValue({
|
|
21
|
-
api: {
|
|
22
|
-
projectId: 'test-project'
|
|
23
|
-
}
|
|
24
|
-
})
|
|
25
|
-
};
|
|
26
|
-
});
|
|
27
8
|
vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
28
9
|
const actual = await vi.importActual('@sanity/cli-core/ux');
|
|
29
10
|
return {
|
|
@@ -31,6 +12,20 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
|
31
12
|
select: vi.fn()
|
|
32
13
|
};
|
|
33
14
|
});
|
|
15
|
+
const testProjectId = 'test-project';
|
|
16
|
+
const defaultMocks = {
|
|
17
|
+
cliConfig: {
|
|
18
|
+
api: {
|
|
19
|
+
projectId: testProjectId
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
projectRoot: {
|
|
23
|
+
directory: '/test/path',
|
|
24
|
+
path: '/test/path/sanity.config.ts',
|
|
25
|
+
type: 'studio'
|
|
26
|
+
},
|
|
27
|
+
token: 'test-token'
|
|
28
|
+
};
|
|
34
29
|
const mockSelect = vi.mocked(await import('@sanity/cli-core/ux')).select;
|
|
35
30
|
describe('#delete', ()=>{
|
|
36
31
|
afterEach(()=>{
|
|
@@ -69,7 +64,9 @@ describe('#delete', ()=>{
|
|
|
69
64
|
}).reply(200);
|
|
70
65
|
const { stdout } = await testCommand(Delete, [
|
|
71
66
|
'test-hook'
|
|
72
|
-
]
|
|
67
|
+
], {
|
|
68
|
+
mocks: defaultMocks
|
|
69
|
+
});
|
|
73
70
|
expect(stdout).toContain('Hook deleted');
|
|
74
71
|
});
|
|
75
72
|
test('displays error when hook name not found', async ()=>{
|
|
@@ -87,7 +84,9 @@ describe('#delete', ()=>{
|
|
|
87
84
|
]);
|
|
88
85
|
const { error } = await testCommand(Delete, [
|
|
89
86
|
'nonexistent-hook'
|
|
90
|
-
]
|
|
87
|
+
], {
|
|
88
|
+
mocks: defaultMocks
|
|
89
|
+
});
|
|
91
90
|
expect(error).toBeInstanceOf(Error);
|
|
92
91
|
expect(error?.message).toContain('Hook with name "nonexistent-hook" not found');
|
|
93
92
|
});
|
|
@@ -96,7 +95,9 @@ describe('#delete', ()=>{
|
|
|
96
95
|
apiVersion: HOOK_API_VERSION,
|
|
97
96
|
uri: '/hooks/projects/test-project'
|
|
98
97
|
}).reply(200, []);
|
|
99
|
-
const { error } = await testCommand(Delete, []
|
|
98
|
+
const { error } = await testCommand(Delete, [], {
|
|
99
|
+
mocks: defaultMocks
|
|
100
|
+
});
|
|
100
101
|
expect(error).toBeInstanceOf(Error);
|
|
101
102
|
expect(error?.message).toContain('No hooks configured for this project');
|
|
102
103
|
});
|
|
@@ -127,7 +128,9 @@ describe('#delete', ()=>{
|
|
|
127
128
|
uri: '/hooks/projects/test-project/hook2'
|
|
128
129
|
}).reply(200);
|
|
129
130
|
mockSelect.mockResolvedValueOnce('hook2');
|
|
130
|
-
const { stdout } = await testCommand(Delete, []
|
|
131
|
+
const { stdout } = await testCommand(Delete, [], {
|
|
132
|
+
mocks: defaultMocks
|
|
133
|
+
});
|
|
131
134
|
expect(mockSelect).toHaveBeenCalledWith({
|
|
132
135
|
choices: [
|
|
133
136
|
{
|
|
@@ -150,7 +153,9 @@ describe('#delete', ()=>{
|
|
|
150
153
|
}).reply(500, {
|
|
151
154
|
message: 'Internal Server Error'
|
|
152
155
|
});
|
|
153
|
-
const { error } = await testCommand(Delete, []
|
|
156
|
+
const { error } = await testCommand(Delete, [], {
|
|
157
|
+
mocks: defaultMocks
|
|
158
|
+
});
|
|
154
159
|
expect(error).toBeInstanceOf(Error);
|
|
155
160
|
expect(error?.message).toContain('Failed to fetch hooks');
|
|
156
161
|
});
|
|
@@ -177,17 +182,23 @@ describe('#delete', ()=>{
|
|
|
177
182
|
});
|
|
178
183
|
const { error } = await testCommand(Delete, [
|
|
179
184
|
'test-hook'
|
|
180
|
-
]
|
|
185
|
+
], {
|
|
186
|
+
mocks: defaultMocks
|
|
187
|
+
});
|
|
181
188
|
expect(error).toBeInstanceOf(Error);
|
|
182
189
|
expect(error?.message).toContain('Hook deletion failed');
|
|
183
190
|
});
|
|
184
191
|
test('throws error when no project ID is found', async ()=>{
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
192
|
+
const { error } = await testCommand(Delete, [], {
|
|
193
|
+
mocks: {
|
|
194
|
+
...defaultMocks,
|
|
195
|
+
cliConfig: {
|
|
196
|
+
api: {
|
|
197
|
+
projectId: undefined
|
|
198
|
+
}
|
|
199
|
+
}
|
|
188
200
|
}
|
|
189
201
|
});
|
|
190
|
-
const { error } = await testCommand(Delete, []);
|
|
191
202
|
expect(error).toBeInstanceOf(Error);
|
|
192
203
|
expect(error?.message).toEqual(NO_PROJECT_ID);
|
|
193
204
|
});
|
|
@@ -212,7 +223,9 @@ describe('#delete', ()=>{
|
|
|
212
223
|
}).reply(200);
|
|
213
224
|
const { stdout } = await testCommand(Delete, [
|
|
214
225
|
'test-hook-name'
|
|
215
|
-
]
|
|
226
|
+
], {
|
|
227
|
+
mocks: defaultMocks
|
|
228
|
+
});
|
|
216
229
|
expect(stdout).toContain('Hook deleted');
|
|
217
230
|
});
|
|
218
231
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/hook/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {HOOK_API_VERSION} from '../../../actions/hook/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {Delete} from '../delete.js'\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async () => {\n return {\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', async () => {\n return {\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n }\n})\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nconst mockSelect = vi.mocked(await import('@sanity/cli-core/ux')).select\n\ndescribe('#delete', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['hook delete', '--help'])\n\n expect(stdout).toContain('Delete a hook within your project')\n })\n\n test('deletes a hook by name', async () => {\n const mockHook = {\n dataset: 'production',\n id: 'hook1',\n name: 'test-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n }\n\n // Mock the hooks list API call\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [mockHook])\n\n // Mock the delete API call\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook1',\n }).reply(200)\n\n const {stdout} = await testCommand(Delete, ['test-hook'])\n\n expect(stdout).toContain('Hook deleted')\n })\n\n test('displays error when hook name not found', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [\n {\n dataset: 'production',\n id: 'hook1',\n name: 'different-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n },\n ])\n\n const {error} = await testCommand(Delete, ['nonexistent-hook'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Hook with name \"nonexistent-hook\" not found')\n })\n\n test('displays error when no hooks exist', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [])\n\n const {error} = await testCommand(Delete, [])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No hooks configured for this project')\n })\n\n test('prompts for hook selection when no name provided', async () => {\n const mockHooks = [\n {\n dataset: 'production',\n id: 'hook1',\n name: 'first-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook1',\n },\n {\n dataset: 'staging',\n id: 'hook2',\n name: 'second-hook',\n type: 'transaction' as const,\n url: 'https://example.com/webhook2',\n },\n ]\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, mockHooks)\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook2',\n }).reply(200)\n\n mockSelect.mockResolvedValueOnce('hook2')\n\n const {stdout} = await testCommand(Delete, [])\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'first-hook', value: 'hook1'},\n {name: 'second-hook', value: 'hook2'},\n ],\n message: 'Select hook to delete',\n })\n expect(stdout).toContain('Hook deleted')\n })\n\n test('handles API error when fetching hooks', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(Delete, [])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to fetch hooks')\n })\n\n test('handles API error when deleting hook', async () => {\n const mockHook = {\n dataset: 'production',\n id: 'hook1',\n name: 'test-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n }\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [mockHook])\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook1',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(Delete, ['test-hook'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Hook deletion failed')\n })\n\n test('throws error when no project ID is found', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(Delete, [])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('handles case insensitive hook name matching', async () => {\n const mockHook = {\n dataset: 'production',\n id: 'hook1',\n name: 'Test-Hook-Name',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n }\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [mockHook])\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook1',\n }).reply(200)\n\n const {stdout} = await testCommand(Delete, ['test-hook-name'])\n\n expect(stdout).toContain('Hook deleted')\n })\n})\n"],"names":["runCommand","getCliConfig","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","HOOK_API_VERSION","NO_PROJECT_ID","Delete","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","actual","importActual","select","mockSelect","mocked","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","mockHook","dataset","id","name","url","apiVersion","uri","reply","method","error","toBeInstanceOf","Error","message","mockHooks","mockResolvedValueOnce","toHaveBeenCalledWith","choices","value","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/hook/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {HOOK_API_VERSION} from '../../../actions/hook/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {Delete} from '../delete.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nconst mockSelect = vi.mocked(await import('@sanity/cli-core/ux')).select\n\ndescribe('#delete', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['hook delete', '--help'])\n\n expect(stdout).toContain('Delete a hook within your project')\n })\n\n test('deletes a hook by name', async () => {\n const mockHook = {\n dataset: 'production',\n id: 'hook1',\n name: 'test-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n }\n\n // Mock the hooks list API call\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [mockHook])\n\n // Mock the delete API call\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook1',\n }).reply(200)\n\n const {stdout} = await testCommand(Delete, ['test-hook'], {mocks: defaultMocks})\n\n expect(stdout).toContain('Hook deleted')\n })\n\n test('displays error when hook name not found', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [\n {\n dataset: 'production',\n id: 'hook1',\n name: 'different-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n },\n ])\n\n const {error} = await testCommand(Delete, ['nonexistent-hook'], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Hook with name \"nonexistent-hook\" not found')\n })\n\n test('displays error when no hooks exist', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [])\n\n const {error} = await testCommand(Delete, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No hooks configured for this project')\n })\n\n test('prompts for hook selection when no name provided', async () => {\n const mockHooks = [\n {\n dataset: 'production',\n id: 'hook1',\n name: 'first-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook1',\n },\n {\n dataset: 'staging',\n id: 'hook2',\n name: 'second-hook',\n type: 'transaction' as const,\n url: 'https://example.com/webhook2',\n },\n ]\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, mockHooks)\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook2',\n }).reply(200)\n\n mockSelect.mockResolvedValueOnce('hook2')\n\n const {stdout} = await testCommand(Delete, [], {mocks: defaultMocks})\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'first-hook', value: 'hook1'},\n {name: 'second-hook', value: 'hook2'},\n ],\n message: 'Select hook to delete',\n })\n expect(stdout).toContain('Hook deleted')\n })\n\n test('handles API error when fetching hooks', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(Delete, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to fetch hooks')\n })\n\n test('handles API error when deleting hook', async () => {\n const mockHook = {\n dataset: 'production',\n id: 'hook1',\n name: 'test-hook',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n }\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [mockHook])\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook1',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(Delete, ['test-hook'], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Hook deletion failed')\n })\n\n test('throws error when no project ID is found', async () => {\n const {error} = await testCommand(Delete, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('handles case insensitive hook name matching', async () => {\n const mockHook = {\n dataset: 'production',\n id: 'hook1',\n name: 'Test-Hook-Name',\n type: 'document' as const,\n url: 'https://example.com/webhook',\n }\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: '/hooks/projects/test-project',\n }).reply(200, [mockHook])\n\n mockApi({\n apiVersion: HOOK_API_VERSION,\n method: 'delete',\n uri: '/hooks/projects/test-project/hook1',\n }).reply(200)\n\n const {stdout} = await testCommand(Delete, ['test-hook-name'], {mocks: defaultMocks})\n\n expect(stdout).toContain('Hook deleted')\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","HOOK_API_VERSION","NO_PROJECT_ID","Delete","mock","actual","importActual","select","fn","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockSelect","mocked","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","mockHook","dataset","id","name","url","apiVersion","uri","reply","method","mocks","error","toBeInstanceOf","Error","message","mockHooks","mockResolvedValueOnce","toHaveBeenCalledWith","choices","value","undefined"],"mappings":"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"}
|
|
@@ -1,29 +1,24 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { getCliConfig } from '@sanity/cli-core';
|
|
3
2
|
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
4
3
|
import nock from 'nock';
|
|
5
4
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
6
5
|
import { HOOK_API_VERSION } from '../../../actions/hook/constants.js';
|
|
7
6
|
import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
8
7
|
import { List } from '../list.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
})
|
|
25
|
-
};
|
|
26
|
-
});
|
|
8
|
+
const testProjectId = 'test-project';
|
|
9
|
+
const defaultMocks = {
|
|
10
|
+
cliConfig: {
|
|
11
|
+
api: {
|
|
12
|
+
projectId: testProjectId
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
projectRoot: {
|
|
16
|
+
directory: '/test/path',
|
|
17
|
+
path: '/test/path/sanity.config.ts',
|
|
18
|
+
type: 'studio'
|
|
19
|
+
},
|
|
20
|
+
token: 'test-token'
|
|
21
|
+
};
|
|
27
22
|
describe('#list', ()=>{
|
|
28
23
|
afterEach(()=>{
|
|
29
24
|
vi.clearAllMocks();
|
|
@@ -41,7 +36,7 @@ describe('#list', ()=>{
|
|
|
41
36
|
test('displays hooks correctly', async ()=>{
|
|
42
37
|
mockApi({
|
|
43
38
|
apiVersion: HOOK_API_VERSION,
|
|
44
|
-
uri:
|
|
39
|
+
uri: `/hooks/projects/${testProjectId}`
|
|
45
40
|
}).reply(200, [
|
|
46
41
|
{
|
|
47
42
|
apiVersion: '2021-10-04',
|
|
@@ -70,7 +65,9 @@ describe('#list', ()=>{
|
|
|
70
65
|
url: 'https://webhook.site/b627a04b-52f5-4ecd-9d45-55fdc88ff4e7'
|
|
71
66
|
}
|
|
72
67
|
]);
|
|
73
|
-
const { stdout } = await testCommand(List
|
|
68
|
+
const { stdout } = await testCommand(List, [], {
|
|
69
|
+
mocks: defaultMocks
|
|
70
|
+
});
|
|
74
71
|
expect(stdout).toContain('Name: test versions');
|
|
75
72
|
expect(stdout).toContain('Dataset: *');
|
|
76
73
|
expect(stdout).toContain('URL: https://webhook.site/b627a04b-52f5-4ecd-9d45-55fdc88ff4e7');
|
|
@@ -80,7 +77,7 @@ describe('#list', ()=>{
|
|
|
80
77
|
test('handles legacy hooks without description', async ()=>{
|
|
81
78
|
mockApi({
|
|
82
79
|
apiVersion: HOOK_API_VERSION,
|
|
83
|
-
uri:
|
|
80
|
+
uri: `/hooks/projects/${testProjectId}`
|
|
84
81
|
}).reply(200, [
|
|
85
82
|
{
|
|
86
83
|
createdAt: '2023-01-01',
|
|
@@ -97,7 +94,9 @@ describe('#list', ()=>{
|
|
|
97
94
|
url: 'https://example.com/webhook'
|
|
98
95
|
}
|
|
99
96
|
]);
|
|
100
|
-
const { stdout } = await testCommand(List
|
|
97
|
+
const { stdout } = await testCommand(List, [], {
|
|
98
|
+
mocks: defaultMocks
|
|
99
|
+
});
|
|
101
100
|
expect(stdout).toContain('Name: legacy hook');
|
|
102
101
|
expect(stdout).toContain('Dataset: production');
|
|
103
102
|
expect(stdout).toContain('URL: https://example.com/webhook');
|
|
@@ -107,29 +106,37 @@ describe('#list', ()=>{
|
|
|
107
106
|
test('displays an error if the API request fails', async ()=>{
|
|
108
107
|
mockApi({
|
|
109
108
|
apiVersion: HOOK_API_VERSION,
|
|
110
|
-
uri:
|
|
109
|
+
uri: `/hooks/projects/${testProjectId}`
|
|
111
110
|
}).reply(500, {
|
|
112
111
|
message: 'Internal Server Error'
|
|
113
112
|
});
|
|
114
|
-
const { error } = await testCommand(List
|
|
113
|
+
const { error } = await testCommand(List, [], {
|
|
114
|
+
mocks: defaultMocks
|
|
115
|
+
});
|
|
115
116
|
expect(error).toBeInstanceOf(Error);
|
|
116
117
|
expect(error?.message).toContain('Hook list retrieval failed');
|
|
117
118
|
});
|
|
118
119
|
test('handles empty hooks list', async ()=>{
|
|
119
120
|
mockApi({
|
|
120
121
|
apiVersion: HOOK_API_VERSION,
|
|
121
|
-
uri:
|
|
122
|
+
uri: `/hooks/projects/${testProjectId}`
|
|
122
123
|
}).reply(200, []);
|
|
123
|
-
const { stdout } = await testCommand(List
|
|
124
|
+
const { stdout } = await testCommand(List, [], {
|
|
125
|
+
mocks: defaultMocks
|
|
126
|
+
});
|
|
124
127
|
expect(stdout).toBe('');
|
|
125
128
|
});
|
|
126
129
|
test('throws error when no project ID is found', async ()=>{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
const { error } = await testCommand(List, [], {
|
|
131
|
+
mocks: {
|
|
132
|
+
...defaultMocks,
|
|
133
|
+
cliConfig: {
|
|
134
|
+
api: {
|
|
135
|
+
projectId: undefined
|
|
136
|
+
}
|
|
137
|
+
}
|
|
130
138
|
}
|
|
131
139
|
});
|
|
132
|
-
const { error } = await testCommand(List);
|
|
133
140
|
expect(error).toBeInstanceOf(Error);
|
|
134
141
|
expect(error?.message).toEqual(NO_PROJECT_ID);
|
|
135
142
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/hook/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/hook/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {HOOK_API_VERSION} from '../../../actions/hook/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {List} from '../list.js'\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('#list', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['hook list', '--help'])\n\n expect(stdout).toContain('List hooks for a given project')\n })\n\n test('displays hooks correctly', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: `/hooks/projects/${testProjectId}`,\n }).reply(200, [\n {\n apiVersion: '2021-10-04',\n createdAt: '2023-01-01',\n createdByUserId: 'user1',\n dataset: '*',\n deletedAt: null,\n description: 'test description',\n headers: {},\n httpMethod: 'POST',\n id: 'hook1',\n includeDrafts: false,\n isDisabled: false,\n isDisabledByUser: false,\n name: 'test versions',\n projectId: 'project1',\n rule: {\n filter: null,\n on: ['create'],\n projection: null,\n },\n secret: null,\n type: 'document',\n url: 'https://webhook.site/b627a04b-52f5-4ecd-9d45-55fdc88ff4e7',\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Name: test versions')\n expect(stdout).toContain('Dataset: *')\n expect(stdout).toContain('URL: https://webhook.site/b627a04b-52f5-4ecd-9d45-55fdc88ff4e7')\n expect(stdout).toContain('HTTP method: POST')\n expect(stdout).toContain('Description: test description')\n })\n\n test('handles legacy hooks without description', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: `/hooks/projects/${testProjectId}`,\n }).reply(200, [\n {\n createdAt: '2023-01-01',\n createdByUserId: 'user1',\n dataset: 'production',\n deletedAt: null,\n description: null,\n id: 'hook1',\n isDisabled: false,\n isDisabledByUser: false,\n name: 'legacy hook',\n projectId: 'project1',\n type: 'transaction',\n url: 'https://example.com/webhook',\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Name: legacy hook')\n expect(stdout).toContain('Dataset: production')\n expect(stdout).toContain('URL: https://example.com/webhook')\n expect(stdout).not.toContain('HTTP method')\n expect(stdout).not.toContain('Description')\n })\n\n test('displays an error if the API request fails', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: `/hooks/projects/${testProjectId}`,\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Hook list retrieval failed')\n })\n\n test('handles empty hooks list', async () => {\n mockApi({\n apiVersion: HOOK_API_VERSION,\n uri: `/hooks/projects/${testProjectId}`,\n }).reply(200, [])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe('')\n })\n\n test('throws error when no project ID is found', async () => {\n const {error} = await testCommand(List, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","HOOK_API_VERSION","NO_PROJECT_ID","List","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","createdAt","createdByUserId","dataset","deletedAt","description","headers","httpMethod","id","includeDrafts","isDisabled","isDisabledByUser","name","rule","filter","on","projection","secret","url","mocks","not","message","error","toBeInstanceOf","Error","toBe","undefined"],"mappings":"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"}
|