@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
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { runCommand } from '@oclif/test';
|
|
2
|
+
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
|
|
4
|
+
import { extractManifestSafe } from '../../../actions/manifest/extractManifest.js';
|
|
5
|
+
import { createManifestReader } from '../../../actions/schema/utils/manifestReader.js';
|
|
6
|
+
import { SCHEMA_API_VERSION } from '../../../services/schemas.js';
|
|
7
|
+
import { NO_DATASET_ID, NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
8
|
+
import { ListSchemaCommand } from '../list.js';
|
|
9
|
+
const mockManifest = {
|
|
10
|
+
createdAt: '2024-01-01T00:00:00.000Z',
|
|
11
|
+
studioVersion: '3.0.0',
|
|
12
|
+
version: 3,
|
|
13
|
+
workspaces: [
|
|
14
|
+
{
|
|
15
|
+
basePath: '/',
|
|
16
|
+
dataset: 'production',
|
|
17
|
+
icon: null,
|
|
18
|
+
name: 'default',
|
|
19
|
+
projectId: 'test-project',
|
|
20
|
+
schema: 'default.create-schema.json',
|
|
21
|
+
tools: 'default.create-tools.json'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
basePath: '/staging',
|
|
25
|
+
dataset: 'staging',
|
|
26
|
+
icon: null,
|
|
27
|
+
name: 'staging',
|
|
28
|
+
projectId: 'test-project',
|
|
29
|
+
schema: 'staging.create-schema.json',
|
|
30
|
+
tools: 'staging.create-tools.json'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
vi.mock('../../../actions/manifest/extractManifest.js');
|
|
35
|
+
vi.mock('../../../actions/schema/utils/manifestReader.js');
|
|
36
|
+
const mockExtractManifestSafe = vi.mocked(extractManifestSafe);
|
|
37
|
+
const mockedCreateManifestReader = vi.mocked(createManifestReader);
|
|
38
|
+
const testProjectId = 'test-project';
|
|
39
|
+
const defaultMocks = {
|
|
40
|
+
cliConfig: {
|
|
41
|
+
api: {
|
|
42
|
+
dataset: 'production',
|
|
43
|
+
projectId: testProjectId
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
projectRoot: {
|
|
47
|
+
directory: '/test/path',
|
|
48
|
+
path: '/test/path/sanity.config.ts',
|
|
49
|
+
type: 'studio'
|
|
50
|
+
},
|
|
51
|
+
token: 'test-token'
|
|
52
|
+
};
|
|
53
|
+
describe('#schema:list', ()=>{
|
|
54
|
+
beforeEach(()=>{
|
|
55
|
+
vi.clearAllMocks();
|
|
56
|
+
mockedCreateManifestReader.mockReturnValue({
|
|
57
|
+
getManifest: vi.fn().mockResolvedValue(mockManifest),
|
|
58
|
+
getWorkspaceSchema: vi.fn()
|
|
59
|
+
});
|
|
60
|
+
mockExtractManifestSafe.mockResolvedValue(undefined);
|
|
61
|
+
});
|
|
62
|
+
afterEach(()=>{
|
|
63
|
+
vi.clearAllMocks();
|
|
64
|
+
});
|
|
65
|
+
test('should show --help text', async ()=>{
|
|
66
|
+
const { stdout } = await runCommand('schema list --help');
|
|
67
|
+
expect(stdout).toMatchInlineSnapshot(`
|
|
68
|
+
"Lists all schemas in the current dataset.
|
|
69
|
+
|
|
70
|
+
USAGE
|
|
71
|
+
$ sanity schema list [--extract-manifest] [--id <schema_id>] [--json]
|
|
72
|
+
[--manifest-dir <directory>]
|
|
73
|
+
|
|
74
|
+
FLAGS
|
|
75
|
+
--[no-]extract-manifest Disables manifest generation - the command will
|
|
76
|
+
fail if no manifest exists
|
|
77
|
+
--id=<schema_id> Fetch a single schema by id
|
|
78
|
+
--json Get schema as json
|
|
79
|
+
--manifest-dir=<directory> [default: ./dist/static] Directory containing
|
|
80
|
+
manifest file
|
|
81
|
+
|
|
82
|
+
DESCRIPTION
|
|
83
|
+
Lists all schemas in the current dataset.
|
|
84
|
+
|
|
85
|
+
**Note**: This command is experimental and subject to change.
|
|
86
|
+
|
|
87
|
+
This operation (re-)generates a manifest file describing the sanity config
|
|
88
|
+
workspace by default.
|
|
89
|
+
To re-use an existing manifest file, use --no-extract-manifest.
|
|
90
|
+
|
|
91
|
+
EXAMPLES
|
|
92
|
+
List all schemas found in any workspace dataset in a table
|
|
93
|
+
|
|
94
|
+
$ sanity schema list
|
|
95
|
+
|
|
96
|
+
Get a schema for a given id
|
|
97
|
+
|
|
98
|
+
$ sanity schema list --id _.schemas.workspaceName
|
|
99
|
+
|
|
100
|
+
Get stored schemas as pretty-printed json-array
|
|
101
|
+
|
|
102
|
+
$ sanity schema list --json
|
|
103
|
+
|
|
104
|
+
Get singular stored schema as pretty-printed json-object
|
|
105
|
+
|
|
106
|
+
$ sanity schema list --json --id _.schemas.workspaceName
|
|
107
|
+
|
|
108
|
+
Runs using a pre-existing manifest file. Config changes in sanity.config
|
|
109
|
+
will not be picked up in this case.
|
|
110
|
+
|
|
111
|
+
$ sanity schema list --no-extract-manifest
|
|
112
|
+
|
|
113
|
+
"
|
|
114
|
+
`);
|
|
115
|
+
});
|
|
116
|
+
test('should list schemas', async ()=>{
|
|
117
|
+
mockApi({
|
|
118
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
119
|
+
uri: `/projects/${testProjectId}/datasets/production/schemas`
|
|
120
|
+
}).reply(200, {
|
|
121
|
+
_createdAt: '2025-01-21T18:49:44Z',
|
|
122
|
+
_id: '_.schemas.default',
|
|
123
|
+
workspace: mockManifest.workspaces[0]
|
|
124
|
+
});
|
|
125
|
+
mockApi({
|
|
126
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
127
|
+
uri: `/projects/${testProjectId}/datasets/staging/schemas`
|
|
128
|
+
}).reply(200, {
|
|
129
|
+
_createdAt: '2025-05-28T18:49:44Z',
|
|
130
|
+
_id: '_.schemas.staging',
|
|
131
|
+
workspace: mockManifest.workspaces[1]
|
|
132
|
+
});
|
|
133
|
+
const { stdout } = await testCommand(ListSchemaCommand, [], {
|
|
134
|
+
mocks: defaultMocks
|
|
135
|
+
});
|
|
136
|
+
expect(stdout).toContain('Id Workspace Dataset ProjectId CreatedAt ');
|
|
137
|
+
expect(stdout).toContain('_.schemas.staging staging staging test-project 2025-05-28T18:49:44Z');
|
|
138
|
+
expect(stdout).toContain('_.schemas.default default production test-project 2025-01-21T18:49:44Z');
|
|
139
|
+
});
|
|
140
|
+
test('should list a specific schema based on id flag', async ()=>{
|
|
141
|
+
mockApi({
|
|
142
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
143
|
+
uri: '/projects/test-project/datasets/production/schemas/_.schemas.staging'
|
|
144
|
+
}).reply(200, []);
|
|
145
|
+
mockApi({
|
|
146
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
147
|
+
uri: '/projects/test-project/datasets/staging/schemas/_.schemas.staging'
|
|
148
|
+
}).reply(200, {
|
|
149
|
+
_createdAt: '2025-05-28T18:49:44Z',
|
|
150
|
+
_id: '_.schemas.staging',
|
|
151
|
+
workspace: mockManifest.workspaces[1]
|
|
152
|
+
});
|
|
153
|
+
const { stdout } = await testCommand(ListSchemaCommand, [
|
|
154
|
+
'--id',
|
|
155
|
+
'_.schemas.staging'
|
|
156
|
+
], {
|
|
157
|
+
mocks: defaultMocks
|
|
158
|
+
});
|
|
159
|
+
expect(stdout).toContain('Id Workspace Dataset ProjectId CreatedAt ');
|
|
160
|
+
expect(stdout).toContain('_.schemas.staging staging staging test-project 2025-05-28T18:49:44Z');
|
|
161
|
+
});
|
|
162
|
+
test('should list schemas in json', async ()=>{
|
|
163
|
+
mockApi({
|
|
164
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
165
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
166
|
+
}).reply(200, {
|
|
167
|
+
_createdAt: '2025-01-21T18:49:44Z',
|
|
168
|
+
_id: '_.schemas.default',
|
|
169
|
+
workspace: mockManifest.workspaces[0]
|
|
170
|
+
});
|
|
171
|
+
mockApi({
|
|
172
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
173
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
174
|
+
}).reply(200, {
|
|
175
|
+
_createdAt: '2025-05-28T18:49:44Z',
|
|
176
|
+
_id: '_.schemas.staging',
|
|
177
|
+
workspace: mockManifest.workspaces[1]
|
|
178
|
+
});
|
|
179
|
+
const { stdout } = await testCommand(ListSchemaCommand, [
|
|
180
|
+
'--json'
|
|
181
|
+
], {
|
|
182
|
+
mocks: defaultMocks
|
|
183
|
+
});
|
|
184
|
+
// eslint-disable-next-line no-useless-escape
|
|
185
|
+
expect(stdout).toContain(`\"_id\": \"_.schemas.default\"`);
|
|
186
|
+
});
|
|
187
|
+
test('should list a specific schema based on id flag in json', async ()=>{
|
|
188
|
+
mockApi({
|
|
189
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
190
|
+
uri: '/projects/test-project/datasets/production/schemas/_.schemas.staging'
|
|
191
|
+
}).reply(200, []);
|
|
192
|
+
mockApi({
|
|
193
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
194
|
+
uri: '/projects/test-project/datasets/staging/schemas/_.schemas.staging'
|
|
195
|
+
}).reply(200, {
|
|
196
|
+
_createdAt: '2025-05-28T18:49:44Z',
|
|
197
|
+
_id: '_.schemas.staging',
|
|
198
|
+
workspace: mockManifest.workspaces[1]
|
|
199
|
+
});
|
|
200
|
+
const { stdout } = await testCommand(ListSchemaCommand, [
|
|
201
|
+
'--id',
|
|
202
|
+
'_.schemas.staging',
|
|
203
|
+
'--json'
|
|
204
|
+
], {
|
|
205
|
+
mocks: defaultMocks
|
|
206
|
+
});
|
|
207
|
+
// eslint-disable-next-line no-useless-escape
|
|
208
|
+
expect(stdout).toContain(`\"_id\": \"_.schemas.staging\"`);
|
|
209
|
+
});
|
|
210
|
+
test.each([
|
|
211
|
+
{
|
|
212
|
+
desc: 'no project ID is found',
|
|
213
|
+
projectId: undefined
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
desc: 'project ID is empty string',
|
|
217
|
+
projectId: ''
|
|
218
|
+
}
|
|
219
|
+
])('throws an error if $desc', async ({ projectId })=>{
|
|
220
|
+
const { error } = await testCommand(ListSchemaCommand, [], {
|
|
221
|
+
mocks: {
|
|
222
|
+
...defaultMocks,
|
|
223
|
+
cliConfig: {
|
|
224
|
+
api: {
|
|
225
|
+
dataset: 'production',
|
|
226
|
+
projectId
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
expect(error?.message).toContain(NO_PROJECT_ID);
|
|
232
|
+
expect(error?.oclif?.exit).toBe(1);
|
|
233
|
+
});
|
|
234
|
+
test.each([
|
|
235
|
+
{
|
|
236
|
+
dataset: undefined,
|
|
237
|
+
desc: 'no dataset is found'
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
dataset: '',
|
|
241
|
+
desc: 'dataset is empty string'
|
|
242
|
+
}
|
|
243
|
+
])('throws an error if $desc', async ({ dataset })=>{
|
|
244
|
+
const { error } = await testCommand(ListSchemaCommand, [], {
|
|
245
|
+
mocks: {
|
|
246
|
+
...defaultMocks,
|
|
247
|
+
cliConfig: {
|
|
248
|
+
api: {
|
|
249
|
+
dataset,
|
|
250
|
+
projectId: 'test-project'
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
expect(error?.message).toContain(NO_DATASET_ID);
|
|
256
|
+
expect(error?.oclif?.exit).toBe(1);
|
|
257
|
+
});
|
|
258
|
+
test.each([
|
|
259
|
+
{
|
|
260
|
+
desc: 'empty string',
|
|
261
|
+
expectedError: 'id argument is empty',
|
|
262
|
+
id: ''
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
desc: 'invalid characters (!)',
|
|
266
|
+
expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',
|
|
267
|
+
id: 'test-id!!'
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
desc: 'invalid characters (@)',
|
|
271
|
+
expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',
|
|
272
|
+
id: '_.schemas.default@tag'
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
desc: 'starts with dash',
|
|
276
|
+
expectedError: 'id cannot start with - (dash)',
|
|
277
|
+
id: '-_.schemas.default'
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
desc: 'consecutive periods',
|
|
281
|
+
expectedError: 'id cannot have consecutive . (period) characters',
|
|
282
|
+
id: '_.schemas..default'
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
desc: 'missing required prefix',
|
|
286
|
+
expectedError: 'id must either match _.schemas.<workspaceName>',
|
|
287
|
+
id: 'schemas.default'
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
desc: 'incorrect prefix',
|
|
291
|
+
expectedError: 'id must either match _.schemas.<workspaceName>',
|
|
292
|
+
id: 'sanity.schemas.default'
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
desc: 'workspace name with invalid characters (space)',
|
|
296
|
+
expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',
|
|
297
|
+
id: '_.schemas.my workspace'
|
|
298
|
+
}
|
|
299
|
+
])('throws error when id is $desc', async ({ expectedError, id })=>{
|
|
300
|
+
const { error } = await testCommand(ListSchemaCommand, [
|
|
301
|
+
'--id',
|
|
302
|
+
id
|
|
303
|
+
], {
|
|
304
|
+
mocks: defaultMocks
|
|
305
|
+
});
|
|
306
|
+
expect(error?.message).toContain(expectedError);
|
|
307
|
+
expect(error?.oclif?.exit).toBe(1);
|
|
308
|
+
});
|
|
309
|
+
test('throws an error if no schemas are found', async ()=>{
|
|
310
|
+
mockApi({
|
|
311
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
312
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
313
|
+
}).reply(200, []);
|
|
314
|
+
mockApi({
|
|
315
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
316
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
317
|
+
}).reply(200, []);
|
|
318
|
+
const { error } = await testCommand(ListSchemaCommand, [], {
|
|
319
|
+
mocks: defaultMocks
|
|
320
|
+
});
|
|
321
|
+
expect(error?.message).toContain('No schemas found in datasets ["production","staging"]');
|
|
322
|
+
expect(error?.oclif?.exit).toBe(1);
|
|
323
|
+
});
|
|
324
|
+
test('throws an error if a specific schema based on id flag is not found', async ()=>{
|
|
325
|
+
mockApi({
|
|
326
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
327
|
+
uri: '/projects/test-project/datasets/production/schemas/_.schemas.staging'
|
|
328
|
+
}).reply(200, []);
|
|
329
|
+
mockApi({
|
|
330
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
331
|
+
uri: '/projects/test-project/datasets/staging/schemas/_.schemas.staging'
|
|
332
|
+
}).reply(200, []);
|
|
333
|
+
const { error } = await testCommand(ListSchemaCommand, [
|
|
334
|
+
'--id',
|
|
335
|
+
'_.schemas.staging'
|
|
336
|
+
], {
|
|
337
|
+
mocks: defaultMocks
|
|
338
|
+
});
|
|
339
|
+
expect(error?.message).toContain('Schema for id "_.schemas.staging" not found in datasets ["production","staging"]');
|
|
340
|
+
expect(error?.oclif?.exit).toBe(1);
|
|
341
|
+
});
|
|
342
|
+
test('throws an error if schema request fails', async ()=>{
|
|
343
|
+
mockApi({
|
|
344
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
345
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
346
|
+
}).reply(400, {
|
|
347
|
+
error: 'Bad request'
|
|
348
|
+
});
|
|
349
|
+
mockApi({
|
|
350
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
351
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
352
|
+
}).reply(200, []);
|
|
353
|
+
const { error } = await testCommand(ListSchemaCommand, [], {
|
|
354
|
+
mocks: defaultMocks
|
|
355
|
+
});
|
|
356
|
+
expect(error?.message).toContain('↳ Failed to fetch schema from "production":\n Bad request');
|
|
357
|
+
expect(error?.oclif?.exit).toBe(1);
|
|
358
|
+
});
|
|
359
|
+
test('throws an error if schema request fails due to permissions', async ()=>{
|
|
360
|
+
mockApi({
|
|
361
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
362
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
363
|
+
}).reply(401);
|
|
364
|
+
mockApi({
|
|
365
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
366
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
367
|
+
}).reply(200, []);
|
|
368
|
+
const { stderr } = await testCommand(ListSchemaCommand, [], {
|
|
369
|
+
mocks: defaultMocks
|
|
370
|
+
});
|
|
371
|
+
expect(stderr).toContain('↳ No permissions to read schema from "production".');
|
|
372
|
+
});
|
|
373
|
+
test('skips manifest extraction with no-extract-manifest flag', async ()=>{
|
|
374
|
+
mockApi({
|
|
375
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
376
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
377
|
+
}).reply(200, {
|
|
378
|
+
_createdAt: '2025-01-21T18:49:44Z',
|
|
379
|
+
_id: '_.schemas.default',
|
|
380
|
+
workspace: mockManifest.workspaces[0]
|
|
381
|
+
});
|
|
382
|
+
mockApi({
|
|
383
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
384
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
385
|
+
}).reply(200, {
|
|
386
|
+
_createdAt: '2025-05-28T18:49:44Z',
|
|
387
|
+
_id: '_.schemas.staging',
|
|
388
|
+
workspace: mockManifest.workspaces[1]
|
|
389
|
+
});
|
|
390
|
+
await testCommand(ListSchemaCommand, [
|
|
391
|
+
'--no-extract-manifest'
|
|
392
|
+
], {
|
|
393
|
+
mocks: defaultMocks
|
|
394
|
+
});
|
|
395
|
+
expect(mockExtractManifestSafe).not.toHaveBeenCalled();
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
//# sourceMappingURL=list.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/schema/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {extractManifestSafe} from '../../../actions/manifest/extractManifest.js'\nimport {createManifestReader} from '../../../actions/schema/utils/manifestReader.js'\nimport {SCHEMA_API_VERSION} from '../../../services/schemas.js'\nimport {NO_DATASET_ID, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {ListSchemaCommand} from '../list.js'\n\nconst mockManifest = {\n createdAt: '2024-01-01T00:00:00.000Z',\n studioVersion: '3.0.0',\n version: 3,\n workspaces: [\n {\n basePath: '/',\n dataset: 'production',\n icon: null,\n name: 'default',\n projectId: 'test-project',\n schema: 'default.create-schema.json',\n tools: 'default.create-tools.json',\n },\n {\n basePath: '/staging',\n dataset: 'staging',\n icon: null,\n name: 'staging',\n projectId: 'test-project',\n schema: 'staging.create-schema.json',\n tools: 'staging.create-tools.json',\n },\n ],\n}\n\nvi.mock('../../../actions/manifest/extractManifest.js')\nvi.mock('../../../actions/schema/utils/manifestReader.js')\n\nconst mockExtractManifestSafe = vi.mocked(extractManifestSafe)\nconst mockedCreateManifestReader = vi.mocked(createManifestReader)\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {dataset: 'production', 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('#schema:list', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n\n mockedCreateManifestReader.mockReturnValue({\n getManifest: vi.fn().mockResolvedValue(mockManifest),\n getWorkspaceSchema: vi.fn(),\n })\n\n mockExtractManifestSafe.mockResolvedValue(undefined)\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show --help text', async () => {\n const {stdout} = await runCommand('schema list --help')\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Lists all schemas in the current dataset.\n\n USAGE\n $ sanity schema list [--extract-manifest] [--id <schema_id>] [--json]\n [--manifest-dir <directory>]\n\n FLAGS\n --[no-]extract-manifest Disables manifest generation - the command will\n fail if no manifest exists\n --id=<schema_id> Fetch a single schema by id\n --json Get schema as json\n --manifest-dir=<directory> [default: ./dist/static] Directory containing\n manifest file\n\n DESCRIPTION\n Lists all schemas in the current dataset.\n\n **Note**: This command is experimental and subject to change.\n\n This operation (re-)generates a manifest file describing the sanity config\n workspace by default.\n To re-use an existing manifest file, use --no-extract-manifest.\n\n EXAMPLES\n List all schemas found in any workspace dataset in a table\n\n $ sanity schema list\n\n Get a schema for a given id\n\n $ sanity schema list --id _.schemas.workspaceName\n\n Get stored schemas as pretty-printed json-array\n\n $ sanity schema list --json\n\n Get singular stored schema as pretty-printed json-object\n\n $ sanity schema list --json --id _.schemas.workspaceName\n\n Runs using a pre-existing manifest file. Config changes in sanity.config\n will not be picked up in this case.\n\n $ sanity schema list --no-extract-manifest\n\n \"\n `)\n })\n\n test('should list schemas', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/${testProjectId}/datasets/production/schemas`,\n }).reply(200, {\n _createdAt: '2025-01-21T18:49:44Z',\n _id: '_.schemas.default',\n workspace: mockManifest.workspaces[0],\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/${testProjectId}/datasets/staging/schemas`,\n }).reply(200, {\n _createdAt: '2025-05-28T18:49:44Z',\n _id: '_.schemas.staging',\n workspace: mockManifest.workspaces[1],\n })\n\n const {stdout} = await testCommand(ListSchemaCommand, [], {mocks: defaultMocks})\n\n expect(stdout).toContain(\n 'Id Workspace Dataset ProjectId CreatedAt ',\n )\n expect(stdout).toContain(\n '_.schemas.staging staging staging test-project 2025-05-28T18:49:44Z',\n )\n expect(stdout).toContain(\n '_.schemas.default default production test-project 2025-01-21T18:49:44Z',\n )\n })\n\n test('should list a specific schema based on id flag', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.staging',\n }).reply(200, [])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.staging',\n }).reply(200, {\n _createdAt: '2025-05-28T18:49:44Z',\n _id: '_.schemas.staging',\n workspace: mockManifest.workspaces[1],\n })\n\n const {stdout} = await testCommand(ListSchemaCommand, ['--id', '_.schemas.staging'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain(\n 'Id Workspace Dataset ProjectId CreatedAt ',\n )\n expect(stdout).toContain(\n '_.schemas.staging staging staging test-project 2025-05-28T18:49:44Z',\n )\n })\n\n test('should list schemas in json', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, {\n _createdAt: '2025-01-21T18:49:44Z',\n _id: '_.schemas.default',\n workspace: mockManifest.workspaces[0],\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, {\n _createdAt: '2025-05-28T18:49:44Z',\n _id: '_.schemas.staging',\n workspace: mockManifest.workspaces[1],\n })\n\n const {stdout} = await testCommand(ListSchemaCommand, ['--json'], {mocks: defaultMocks})\n\n // eslint-disable-next-line no-useless-escape\n expect(stdout).toContain(`\\\"_id\\\": \\\"_.schemas.default\\\"`)\n })\n\n test('should list a specific schema based on id flag in json', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.staging',\n }).reply(200, [])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.staging',\n }).reply(200, {\n _createdAt: '2025-05-28T18:49:44Z',\n _id: '_.schemas.staging',\n workspace: mockManifest.workspaces[1],\n })\n\n const {stdout} = await testCommand(ListSchemaCommand, ['--id', '_.schemas.staging', '--json'], {\n mocks: defaultMocks,\n })\n\n // eslint-disable-next-line no-useless-escape\n expect(stdout).toContain(`\\\"_id\\\": \\\"_.schemas.staging\\\"`)\n })\n\n test.each([\n {desc: 'no project ID is found', projectId: undefined},\n {desc: 'project ID is empty string', projectId: ''},\n ])('throws an error if $desc', async ({projectId}) => {\n const {error} = await testCommand(ListSchemaCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {dataset: 'production', projectId}},\n },\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {dataset: undefined, desc: 'no dataset is found'},\n {dataset: '', desc: 'dataset is empty string'},\n ])('throws an error if $desc', async ({dataset}) => {\n const {error} = await testCommand(ListSchemaCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {dataset, projectId: 'test-project'}},\n },\n })\n\n expect(error?.message).toContain(NO_DATASET_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {\n desc: 'empty string',\n expectedError: 'id argument is empty',\n id: '',\n },\n {\n desc: 'invalid characters (!)',\n expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',\n id: 'test-id!!',\n },\n {\n desc: 'invalid characters (@)',\n expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',\n id: '_.schemas.default@tag',\n },\n {\n desc: 'starts with dash',\n expectedError: 'id cannot start with - (dash)',\n id: '-_.schemas.default',\n },\n {\n desc: 'consecutive periods',\n expectedError: 'id cannot have consecutive . (period) characters',\n id: '_.schemas..default',\n },\n {\n desc: 'missing required prefix',\n expectedError: 'id must either match _.schemas.<workspaceName>',\n id: 'schemas.default',\n },\n {\n desc: 'incorrect prefix',\n expectedError: 'id must either match _.schemas.<workspaceName>',\n id: 'sanity.schemas.default',\n },\n {\n desc: 'workspace name with invalid characters (space)',\n expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',\n id: '_.schemas.my workspace',\n },\n ])('throws error when id is $desc', async ({expectedError, id}) => {\n const {error} = await testCommand(ListSchemaCommand, ['--id', id], {mocks: defaultMocks})\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error if no schemas are found', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, [])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, [])\n\n const {error} = await testCommand(ListSchemaCommand, [], {mocks: defaultMocks})\n\n expect(error?.message).toContain('No schemas found in datasets [\"production\",\"staging\"]')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error if a specific schema based on id flag is not found', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.staging',\n }).reply(200, [])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.staging',\n }).reply(200, [])\n\n const {error} = await testCommand(ListSchemaCommand, ['--id', '_.schemas.staging'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain(\n 'Schema for id \"_.schemas.staging\" not found in datasets [\"production\",\"staging\"]',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error if schema request fails', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(400, {\n error: 'Bad request',\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, [])\n\n const {error} = await testCommand(ListSchemaCommand, [], {mocks: defaultMocks})\n\n expect(error?.message).toContain('↳ Failed to fetch schema from \"production\":\\n Bad request')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error if schema request fails due to permissions', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(401)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, [])\n\n const {stderr} = await testCommand(ListSchemaCommand, [], {mocks: defaultMocks})\n\n expect(stderr).toContain('↳ No permissions to read schema from \"production\".')\n })\n\n test('skips manifest extraction with no-extract-manifest flag', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, {\n _createdAt: '2025-01-21T18:49:44Z',\n _id: '_.schemas.default',\n workspace: mockManifest.workspaces[0],\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, {\n _createdAt: '2025-05-28T18:49:44Z',\n _id: '_.schemas.staging',\n workspace: mockManifest.workspaces[1],\n })\n\n await testCommand(ListSchemaCommand, ['--no-extract-manifest'], {mocks: defaultMocks})\n\n expect(mockExtractManifestSafe).not.toHaveBeenCalled()\n })\n})\n"],"names":["runCommand","mockApi","testCommand","afterEach","beforeEach","describe","expect","test","vi","extractManifestSafe","createManifestReader","SCHEMA_API_VERSION","NO_DATASET_ID","NO_PROJECT_ID","ListSchemaCommand","mockManifest","createdAt","studioVersion","version","workspaces","basePath","dataset","icon","name","projectId","schema","tools","mock","mockExtractManifestSafe","mocked","mockedCreateManifestReader","testProjectId","defaultMocks","cliConfig","api","projectRoot","directory","path","type","token","clearAllMocks","mockReturnValue","getManifest","fn","mockResolvedValue","getWorkspaceSchema","undefined","stdout","toMatchInlineSnapshot","apiVersion","uri","reply","_createdAt","_id","workspace","mocks","toContain","each","desc","error","message","oclif","exit","toBe","expectedError","id","stderr","not","toHaveBeenCalled"],"mappings":"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"}
|
|
@@ -6,13 +6,6 @@ import { SchemaValidate } from '../validate.js';
|
|
|
6
6
|
vi.mock('../../../actions/schema/validateAction.js', ()=>({
|
|
7
7
|
validateAction: vi.fn()
|
|
8
8
|
}));
|
|
9
|
-
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
|
|
10
|
-
findProjectRoot: vi.fn().mockResolvedValue({
|
|
11
|
-
directory: '/test/project',
|
|
12
|
-
path: '/test/project/sanity.config.ts',
|
|
13
|
-
type: 'studio'
|
|
14
|
-
})
|
|
15
|
-
}));
|
|
16
9
|
describe('#schema:validate', ()=>{
|
|
17
10
|
test('--help works', async ()=>{
|
|
18
11
|
const { stdout } = await runCommand([
|
|
@@ -69,14 +62,30 @@ describe('#schema:validate', ()=>{
|
|
|
69
62
|
const { error } = await testCommand(SchemaValidate, [
|
|
70
63
|
'--format',
|
|
71
64
|
'invalid'
|
|
72
|
-
]
|
|
65
|
+
], {
|
|
66
|
+
mocks: {
|
|
67
|
+
projectRoot: {
|
|
68
|
+
directory: '/test/project',
|
|
69
|
+
path: '/test/project/sanity.config.ts',
|
|
70
|
+
type: 'studio'
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
73
74
|
expect(error?.message).toContain('Expected --format=invalid to be one of: pretty, ndjson, json');
|
|
74
75
|
});
|
|
75
76
|
test('shows error when user inputs incorrect level flag', async ()=>{
|
|
76
77
|
const { error } = await testCommand(SchemaValidate, [
|
|
77
78
|
'--level',
|
|
78
79
|
'invalid'
|
|
79
|
-
]
|
|
80
|
+
], {
|
|
81
|
+
mocks: {
|
|
82
|
+
projectRoot: {
|
|
83
|
+
directory: '/test/project',
|
|
84
|
+
path: '/test/project/sanity.config.ts',
|
|
85
|
+
type: 'studio'
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
80
89
|
expect(error?.message).toContain('Expected --level=invalid to be one of: error, warning');
|
|
81
90
|
});
|
|
82
91
|
test('calls validate action with correct parameters', async ()=>{
|
|
@@ -88,7 +97,15 @@ describe('#schema:validate', ()=>{
|
|
|
88
97
|
'error',
|
|
89
98
|
'--workspace',
|
|
90
99
|
'default'
|
|
91
|
-
]
|
|
100
|
+
], {
|
|
101
|
+
mocks: {
|
|
102
|
+
projectRoot: {
|
|
103
|
+
directory: '/test/project',
|
|
104
|
+
path: '/test/project/sanity.config.ts',
|
|
105
|
+
type: 'studio'
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
92
109
|
expect(error).toBeUndefined();
|
|
93
110
|
expect(validateAction).toHaveBeenCalledWith({
|
|
94
111
|
debugMetafilePath: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/schema/__tests__/validate.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {describe, expect, test, vi} from 'vitest'\n\nimport {validateAction} from '../../../actions/schema/validateAction.js'\nimport {SchemaValidate} from '../validate.js'\n\nvi.mock('../../../actions/schema/validateAction.js', () => ({\n validateAction: vi.fn(),\n}))\n\
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/schema/__tests__/validate.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {describe, expect, test, vi} from 'vitest'\n\nimport {validateAction} from '../../../actions/schema/validateAction.js'\nimport {SchemaValidate} from '../validate.js'\n\nvi.mock('../../../actions/schema/validateAction.js', () => ({\n validateAction: vi.fn(),\n}))\n\ndescribe('#schema:validate', () => {\n test('--help works', async () => {\n const {stdout} = await runCommand(['schema:validate', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"Validates all schema types specified in a workspace\n\n USAGE\n $ sanity schema validate [--debug-metafile-path <value>] [--format\n pretty|ndjson|json] [--level error|warning] [--workspace <value>]\n\n FLAGS\n --format=<option> [default: pretty] The output format used to print schema\n errors and warnings\n <options: pretty|ndjson|json>\n --level=<option> [default: warning] The minimum level reported out\n <options: error|warning>\n --workspace=<value> The name of the workspace to use when validating all\n schema types\n\n DEBUG FLAGS\n --debug-metafile-path=<value> Optional path where a metafile will be written\n for build analysis. Only written on successful\n validation. Can be analyzed at\n https://esbuild.github.io/analyze/\n\n DESCRIPTION\n Validates all schema types specified in a workspace\n\n EXAMPLES\n Validates all schema types in a Sanity project with more than one workspace\n\n $ sanity schema validate --workspace default\n\n Save the results of the report into a file\n\n $ sanity schema validate > report.txt\n\n Report out only errors\n\n $ sanity schema validate --level error\n\n Generate a report which can be analyzed with\n https://esbuild.github.io/analyze/\n\n $ sanity schema validate --debug-metafile-path metafile.json\n\n \"\n `)\n })\n\n test('shows error when user inputs incorrect format flag', async () => {\n const {error} = await testCommand(SchemaValidate, ['--format', 'invalid'], {\n mocks: {\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n type: 'studio',\n },\n },\n })\n\n expect(error?.message).toContain('Expected --format=invalid to be one of: pretty, ndjson, json')\n })\n\n test('shows error when user inputs incorrect level flag', async () => {\n const {error} = await testCommand(SchemaValidate, ['--level', 'invalid'], {\n mocks: {\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n type: 'studio',\n },\n },\n })\n\n expect(error?.message).toContain('Expected --level=invalid to be one of: error, warning')\n })\n\n test('calls validate action with correct parameters', async () => {\n vi.mocked(validateAction).mockResolvedValueOnce(undefined)\n\n const {error} = await testCommand(\n SchemaValidate,\n ['--format', 'json', '--level', 'error', '--workspace', 'default'],\n {\n mocks: {\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n type: 'studio',\n },\n },\n },\n )\n\n expect(error).toBeUndefined()\n expect(validateAction).toHaveBeenCalledWith({\n debugMetafilePath: undefined,\n format: 'json',\n level: 'error',\n output: expect.any(Object),\n workDir: '/test/project',\n workspace: 'default',\n })\n })\n})\n"],"names":["runCommand","testCommand","describe","expect","test","vi","validateAction","SchemaValidate","mock","fn","stdout","toMatchInlineSnapshot","error","mocks","projectRoot","directory","path","type","message","toContain","mocked","mockResolvedValueOnce","undefined","toBeUndefined","toHaveBeenCalledWith","debugMetafilePath","format","level","output","any","Object","workDir","workspace"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAEjD,SAAQC,cAAc,QAAO,4CAA2C;AACxE,SAAQC,cAAc,QAAO,iBAAgB;AAE7CF,GAAGG,IAAI,CAAC,6CAA6C,IAAO,CAAA;QAC1DF,gBAAgBD,GAAGI,EAAE;IACvB,CAAA;AAEAP,SAAS,oBAAoB;IAC3BE,KAAK,gBAAgB;QACnB,MAAM,EAACM,MAAM,EAAC,GAAG,MAAMV,WAAW;YAAC;YAAmB;SAAS;QAC/DG,OAAOO,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CtC,CAAC;IACH;IAEAP,KAAK,sDAAsD;QACzD,MAAM,EAACQ,KAAK,EAAC,GAAG,MAAMX,YAAYM,gBAAgB;YAAC;YAAY;SAAU,EAAE;YACzEM,OAAO;gBACLC,aAAa;oBACXC,WAAW;oBACXC,MAAM;oBACNC,MAAM;gBACR;YACF;QACF;QAEAd,OAAOS,OAAOM,SAASC,SAAS,CAAC;IACnC;IAEAf,KAAK,qDAAqD;QACxD,MAAM,EAACQ,KAAK,EAAC,GAAG,MAAMX,YAAYM,gBAAgB;YAAC;YAAW;SAAU,EAAE;YACxEM,OAAO;gBACLC,aAAa;oBACXC,WAAW;oBACXC,MAAM;oBACNC,MAAM;gBACR;YACF;QACF;QAEAd,OAAOS,OAAOM,SAASC,SAAS,CAAC;IACnC;IAEAf,KAAK,iDAAiD;QACpDC,GAAGe,MAAM,CAACd,gBAAgBe,qBAAqB,CAACC;QAEhD,MAAM,EAACV,KAAK,EAAC,GAAG,MAAMX,YACpBM,gBACA;YAAC;YAAY;YAAQ;YAAW;YAAS;YAAe;SAAU,EAClE;YACEM,OAAO;gBACLC,aAAa;oBACXC,WAAW;oBACXC,MAAM;oBACNC,MAAM;gBACR;YACF;QACF;QAGFd,OAAOS,OAAOW,aAAa;QAC3BpB,OAAOG,gBAAgBkB,oBAAoB,CAAC;YAC1CC,mBAAmBH;YACnBI,QAAQ;YACRC,OAAO;YACPC,QAAQzB,OAAO0B,GAAG,CAACC;YACnBC,SAAS;YACTC,WAAW;QACb;IACF;AACF"}
|
|
@@ -9,7 +9,7 @@ export declare class DeleteSchemaCommand extends SanityCommand<typeof DeleteSche
|
|
|
9
9
|
dataset: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
10
|
'extract-manifest': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
11
|
ids: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
'manifest-dir': import("@oclif/core/interfaces").OptionFlag<string
|
|
12
|
+
'manifest-dir': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
13
|
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
14
|
};
|
|
15
15
|
run(): Promise<void>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Flags } from '@oclif/core';
|
|
2
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { parseStringFlag, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { deleteSchemaAction } from '../../actions/schema/deleteSchemaAction.js';
|
|
4
|
-
import {
|
|
4
|
+
import { parseIds } from '../../actions/schema/utils/schemaStoreValidation.js';
|
|
5
|
+
import { NO_DATASET_ID, NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
5
6
|
const deleteSchemaDebug = subdebug('schema:delete');
|
|
6
7
|
export class DeleteSchemaCommand extends SanityCommand {
|
|
7
8
|
static description = 'Delete schema documents by id';
|
|
@@ -21,7 +22,8 @@ export class DeleteSchemaCommand extends SanityCommand {
|
|
|
21
22
|
];
|
|
22
23
|
static flags = {
|
|
23
24
|
dataset: Flags.string({
|
|
24
|
-
description: 'Delete schemas from a specific dataset'
|
|
25
|
+
description: 'Delete schemas from a specific dataset',
|
|
26
|
+
parse: async (input)=>parseStringFlag('dataset', input)
|
|
25
27
|
}),
|
|
26
28
|
'extract-manifest': Flags.boolean({
|
|
27
29
|
allowNo: true,
|
|
@@ -32,7 +34,8 @@ export class DeleteSchemaCommand extends SanityCommand {
|
|
|
32
34
|
description: 'Comma-separated list of schema ids to delete',
|
|
33
35
|
required: true
|
|
34
36
|
}),
|
|
35
|
-
'manifest-dir': Flags.
|
|
37
|
+
'manifest-dir': Flags.directory({
|
|
38
|
+
default: './dist/static',
|
|
36
39
|
description: 'Directory containing manifest file'
|
|
37
40
|
}),
|
|
38
41
|
verbose: Flags.boolean({
|
|
@@ -42,38 +45,32 @@ export class DeleteSchemaCommand extends SanityCommand {
|
|
|
42
45
|
};
|
|
43
46
|
async run() {
|
|
44
47
|
const { flags } = await this.parse(DeleteSchemaCommand);
|
|
48
|
+
const { dataset } = flags;
|
|
45
49
|
deleteSchemaDebug('Running schema delete with flags: %O', flags);
|
|
50
|
+
const ids = parseIds(flags.ids);
|
|
46
51
|
try {
|
|
47
52
|
const workDir = (await this.getProjectRoot()).directory;
|
|
48
53
|
const cliConfig = await this.getCliConfig();
|
|
49
54
|
const projectId = await this.getProjectId();
|
|
50
|
-
const
|
|
55
|
+
const cliDataset = cliConfig.api?.dataset;
|
|
51
56
|
if (!projectId) {
|
|
52
|
-
this.error(
|
|
57
|
+
this.error(NO_PROJECT_ID, {
|
|
53
58
|
exit: 1
|
|
54
59
|
});
|
|
55
60
|
}
|
|
56
|
-
if (!
|
|
57
|
-
this.error(
|
|
61
|
+
if (!cliDataset) {
|
|
62
|
+
this.error(NO_DATASET_ID, {
|
|
58
63
|
exit: 1
|
|
59
64
|
});
|
|
60
65
|
}
|
|
61
|
-
const result = await deleteSchemaAction(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
});
|
|
67
|
-
return client.withConfig({
|
|
68
|
-
dataset,
|
|
69
|
-
projectId
|
|
70
|
-
});
|
|
71
|
-
},
|
|
72
|
-
manifestExtractor: createManifestExtractor({
|
|
73
|
-
output: this.output,
|
|
74
|
-
workDir
|
|
75
|
-
}),
|
|
66
|
+
const result = await deleteSchemaAction({
|
|
67
|
+
dataset,
|
|
68
|
+
extractManifest: flags['extract-manifest'],
|
|
69
|
+
ids,
|
|
70
|
+
manifestDir: flags['manifest-dir'],
|
|
76
71
|
output: this.output,
|
|
72
|
+
projectId,
|
|
73
|
+
verbose: flags['verbose'],
|
|
77
74
|
workDir
|
|
78
75
|
});
|
|
79
76
|
if (result === 'failure') {
|