@sanity/cli 6.0.0-alpha.3 → 6.0.0-alpha.4
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/auth/login/{index.js → login.js} +1 -1
- package/dist/actions/auth/login/{index.js.map → login.js.map} +1 -1
- package/dist/actions/organizations/getOrganizationChoices.d.ts +6 -0
- package/dist/actions/organizations/getOrganizationChoices.js +23 -0
- package/dist/actions/organizations/getOrganizationChoices.js.map +1 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.d.ts +2 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js +9 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js.map +1 -0
- package/dist/actions/organizations/hasProjectAttachGrant.d.ts +1 -0
- package/dist/actions/organizations/hasProjectAttachGrant.js +24 -0
- package/dist/actions/organizations/hasProjectAttachGrant.js.map +1 -0
- package/dist/actions/schema/utils/schemaStoreValidation.js +2 -2
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/commands/__tests__/init/init.authentication.test.js +60 -0
- package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -0
- package/dist/commands/__tests__/init/init.create-new-project.test.js +196 -0
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -0
- package/dist/commands/__tests__/init/init.plan.test.js +220 -0
- package/dist/commands/__tests__/init/init.plan.test.js.map +1 -0
- package/dist/commands/__tests__/init/init.setup.test.js +279 -0
- package/dist/commands/__tests__/init/init.setup.test.js.map +1 -0
- package/dist/commands/__tests__/migration.test.js +119 -0
- package/dist/commands/__tests__/migration.test.js.map +1 -0
- package/dist/commands/backup/__tests__/download.test.js +3 -3
- package/dist/commands/backup/__tests__/download.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/import.test.js +2 -2
- package/dist/commands/dataset/__tests__/import.test.js.map +1 -1
- package/dist/commands/documents/__tests__/query.test.js +3 -3
- package/dist/commands/documents/__tests__/query.test.js.map +1 -1
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +151 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/services/organizations.d.ts +40 -0
- package/dist/services/organizations.js +41 -0
- package/dist/services/organizations.js.map +1 -0
- package/dist/services/projects.d.ts +20 -0
- package/dist/services/projects.js +30 -1
- package/dist/services/projects.js.map +1 -1
- package/dist/services/user.d.ts +2 -0
- package/dist/services/user.js +11 -0
- package/dist/services/user.js.map +1 -0
- package/oclif.config.js +6 -1
- package/oclif.manifest.json +33 -184
- package/package.json +7 -7
- package/dist/actions/migration/getMigrationRootDirectory.d.ts +0 -2
- package/dist/actions/migration/getMigrationRootDirectory.js +0 -14
- package/dist/actions/migration/getMigrationRootDirectory.js.map +0 -1
- package/dist/actions/migration/resolveMigrations.d.ts +0 -19
- package/dist/actions/migration/resolveMigrations.js +0 -43
- package/dist/actions/migration/resolveMigrations.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/minimalAdvanced.test.js +0 -65
- package/dist/actions/migration/templates/__tests__/minimalAdvanced.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/minimalSimple.test.js +0 -145
- package/dist/actions/migration/templates/__tests__/minimalSimple.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/renameField.test.js +0 -63
- package/dist/actions/migration/templates/__tests__/renameField.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/renameType.test.js +0 -61
- package/dist/actions/migration/templates/__tests__/renameType.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/stringToPTE.test.js +0 -87
- package/dist/actions/migration/templates/__tests__/stringToPTE.test.js.map +0 -1
- package/dist/actions/migration/templates/index.d.ts +0 -5
- package/dist/actions/migration/templates/index.js +0 -7
- package/dist/actions/migration/templates/index.js.map +0 -1
- package/dist/actions/migration/templates/minimalAdvanced.d.ts +0 -4
- package/dist/actions/migration/templates/minimalAdvanced.js +0 -21
- package/dist/actions/migration/templates/minimalAdvanced.js.map +0 -1
- package/dist/actions/migration/templates/minimalSimple.d.ts +0 -4
- package/dist/actions/migration/templates/minimalSimple.js +0 -61
- package/dist/actions/migration/templates/minimalSimple.js.map +0 -1
- package/dist/actions/migration/templates/renameField.d.ts +0 -4
- package/dist/actions/migration/templates/renameField.js +0 -20
- package/dist/actions/migration/templates/renameField.js.map +0 -1
- package/dist/actions/migration/templates/renameType.d.ts +0 -4
- package/dist/actions/migration/templates/renameType.js +0 -19
- package/dist/actions/migration/templates/renameType.js.map +0 -1
- package/dist/actions/migration/templates/stringToPTE.d.ts +0 -4
- package/dist/actions/migration/templates/stringToPTE.js +0 -32
- package/dist/actions/migration/templates/stringToPTE.js.map +0 -1
- package/dist/commands/__tests__/init.test.js +0 -411
- package/dist/commands/__tests__/init.test.js.map +0 -1
- package/dist/commands/migration/__tests__/create.test.js +0 -296
- package/dist/commands/migration/__tests__/create.test.js.map +0 -1
- package/dist/commands/migration/__tests__/list.test.js +0 -166
- package/dist/commands/migration/__tests__/list.test.js.map +0 -1
- package/dist/commands/migration/__tests__/run.test.js +0 -481
- package/dist/commands/migration/__tests__/run.test.js.map +0 -1
- package/dist/commands/migration/create.d.ts +0 -17
- package/dist/commands/migration/create.js +0 -143
- package/dist/commands/migration/create.js.map +0 -1
- package/dist/commands/migration/list.d.ts +0 -9
- package/dist/commands/migration/list.js +0 -61
- package/dist/commands/migration/list.js.map +0 -1
- package/dist/commands/migration/run.d.ts +0 -26
- package/dist/commands/migration/run.js +0 -271
- package/dist/commands/migration/run.js.map +0 -1
- package/dist/util/migration/constants.d.ts +0 -3
- package/dist/util/migration/constants.js +0 -10
- package/dist/util/migration/constants.js.map +0 -1
- package/dist/util/migration/ensureApiVersionFormat.d.ts +0 -9
- package/dist/util/migration/ensureApiVersionFormat.js +0 -16
- package/dist/util/migration/ensureApiVersionFormat.js.map +0 -1
- package/dist/util/migration/prettyMutationFormatter.d.ts +0 -8
- package/dist/util/migration/prettyMutationFormatter.js +0 -141
- package/dist/util/migration/prettyMutationFormatter.js.map +0 -1
- package/dist/utils/migration/resolveMigrationScript.d.ts +0 -44
- package/dist/utils/migration/resolveMigrationScript.js +0 -74
- package/dist/utils/migration/resolveMigrationScript.js.map +0 -1
- /package/dist/actions/auth/login/{index.d.ts → login.d.ts} +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { runCommand } from '@oclif/test';
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
describe('#migration', ()=>{
|
|
4
|
+
test('should print migrations help', async ()=>{
|
|
5
|
+
const { stdout } = await runCommand('migration --help');
|
|
6
|
+
expect(stdout).toMatchInlineSnapshot(`
|
|
7
|
+
"Create a new migration within your project
|
|
8
|
+
|
|
9
|
+
USAGE
|
|
10
|
+
$ sanity migration COMMAND
|
|
11
|
+
|
|
12
|
+
COMMANDS
|
|
13
|
+
migration create Create a new migration within your project
|
|
14
|
+
migration list List available migrations
|
|
15
|
+
migration run Run a migration against a dataset
|
|
16
|
+
|
|
17
|
+
"
|
|
18
|
+
`);
|
|
19
|
+
});
|
|
20
|
+
test('should print migration create help', async ()=>{
|
|
21
|
+
const { stdout } = await runCommand('migration create --help');
|
|
22
|
+
expect(stdout).toMatchInlineSnapshot(`
|
|
23
|
+
"Create a new migration within your project
|
|
24
|
+
|
|
25
|
+
USAGE
|
|
26
|
+
$ sanity migration create [TITLE]
|
|
27
|
+
|
|
28
|
+
ARGUMENTS
|
|
29
|
+
[TITLE] Title of migration
|
|
30
|
+
|
|
31
|
+
DESCRIPTION
|
|
32
|
+
Create a new migration within your project
|
|
33
|
+
|
|
34
|
+
EXAMPLES
|
|
35
|
+
Create a new migration, prompting for title and options
|
|
36
|
+
|
|
37
|
+
$ sanity migration create
|
|
38
|
+
|
|
39
|
+
Create a new migration with the provided title, prompting for options
|
|
40
|
+
|
|
41
|
+
$ sanity migration create "Rename field from location to address"
|
|
42
|
+
|
|
43
|
+
"
|
|
44
|
+
`);
|
|
45
|
+
});
|
|
46
|
+
test('should print migration list help', async ()=>{
|
|
47
|
+
const { stdout } = await runCommand('migration list --help');
|
|
48
|
+
expect(stdout).toMatchInlineSnapshot(`
|
|
49
|
+
"List available migrations
|
|
50
|
+
|
|
51
|
+
USAGE
|
|
52
|
+
$ sanity migration list
|
|
53
|
+
|
|
54
|
+
DESCRIPTION
|
|
55
|
+
List available migrations
|
|
56
|
+
|
|
57
|
+
EXAMPLES
|
|
58
|
+
List all available migrations in the project
|
|
59
|
+
|
|
60
|
+
$ sanity migration list
|
|
61
|
+
|
|
62
|
+
"
|
|
63
|
+
`);
|
|
64
|
+
});
|
|
65
|
+
test('should print migration run help', async ()=>{
|
|
66
|
+
const { stdout } = await runCommand('migration run --help');
|
|
67
|
+
expect(stdout).toMatchInlineSnapshot(String.raw`
|
|
68
|
+
"Run a migration against a dataset
|
|
69
|
+
|
|
70
|
+
USAGE
|
|
71
|
+
$ sanity migration run [ID] [--api-version <value>] [--concurrency
|
|
72
|
+
<value>] [--confirm] [--dataset <value>] [--dry-run] [--from-export <value>]
|
|
73
|
+
[--progress] [--project <value>]
|
|
74
|
+
|
|
75
|
+
ARGUMENTS
|
|
76
|
+
[ID] ID
|
|
77
|
+
|
|
78
|
+
FLAGS
|
|
79
|
+
--api-version=<value> API version to use when migrating. Defaults to
|
|
80
|
+
v2024-01-29.
|
|
81
|
+
--concurrency=<value> [default: 6] How many mutation requests to run in
|
|
82
|
+
parallel. Must be between 1 and 10. Default: 6.
|
|
83
|
+
--[no-]confirm Prompt for confirmation before running the migration
|
|
84
|
+
(default: true). Use --no-confirm to skip.
|
|
85
|
+
--dataset=<value> Dataset to migrate. Defaults to the dataset configured
|
|
86
|
+
in your Sanity CLI config.
|
|
87
|
+
--[no-]dry-run By default the migration runs in dry mode. Use
|
|
88
|
+
--no-dry-run to migrate dataset.
|
|
89
|
+
--from-export=<value> Use a local dataset export as source for migration
|
|
90
|
+
instead of calling the Sanity API. Note: this is only
|
|
91
|
+
supported for dry runs.
|
|
92
|
+
--[no-]progress Display progress during migration (default: true). Use
|
|
93
|
+
--no-progress to hide output.
|
|
94
|
+
--project=<value> Project ID of the dataset to migrate. Defaults to the
|
|
95
|
+
projectId configured in your Sanity CLI config.
|
|
96
|
+
|
|
97
|
+
DESCRIPTION
|
|
98
|
+
Run a migration against a dataset
|
|
99
|
+
|
|
100
|
+
EXAMPLES
|
|
101
|
+
dry run the migration
|
|
102
|
+
|
|
103
|
+
$ sanity migration run <id>
|
|
104
|
+
|
|
105
|
+
execute the migration against a dataset
|
|
106
|
+
|
|
107
|
+
$ sanity migration run <id> --no-dry-run --project xyz --dataset staging
|
|
108
|
+
|
|
109
|
+
execute the migration using a dataset export as the source
|
|
110
|
+
|
|
111
|
+
$ sanity migration run <id> --from-export=production.tar.gz --no-dry-run \
|
|
112
|
+
--project xyz --dataset staging
|
|
113
|
+
|
|
114
|
+
"
|
|
115
|
+
`);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/__tests__/migration.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {describe, expect, test} from 'vitest'\n\ndescribe('#migration', () => {\n test('should print migrations help', async () => {\n const {stdout} = await runCommand('migration --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Create a new migration within your project\n\n USAGE\n $ sanity migration COMMAND\n\n COMMANDS\n migration create Create a new migration within your project\n migration list List available migrations\n migration run Run a migration against a dataset\n\n \"\n `)\n })\n\n test('should print migration create help', async () => {\n const {stdout} = await runCommand('migration create --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"Create a new migration within your project\n\n USAGE\n $ sanity migration create [TITLE]\n\n ARGUMENTS\n [TITLE] Title of migration\n\n DESCRIPTION\n Create a new migration within your project\n\n EXAMPLES\n Create a new migration, prompting for title and options\n\n $ sanity migration create\n\n Create a new migration with the provided title, prompting for options\n\n $ sanity migration create \"Rename field from location to address\"\n\n \"\n `)\n })\n\n test('should print migration list help', async () => {\n const {stdout} = await runCommand('migration list --help')\n expect(stdout).toMatchInlineSnapshot(`\n \"List available migrations\n\n USAGE\n $ sanity migration list\n\n DESCRIPTION\n List available migrations\n\n EXAMPLES\n List all available migrations in the project\n\n $ sanity migration list\n\n \"\n `)\n })\n\n test('should print migration run help', async () => {\n const {stdout} = await runCommand('migration run --help')\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Run a migration against a dataset\n\n USAGE\n $ sanity migration run [ID] [--api-version <value>] [--concurrency\n <value>] [--confirm] [--dataset <value>] [--dry-run] [--from-export <value>]\n [--progress] [--project <value>]\n\n ARGUMENTS\n [ID] ID\n\n FLAGS\n --api-version=<value> API version to use when migrating. Defaults to\n v2024-01-29.\n --concurrency=<value> [default: 6] How many mutation requests to run in\n parallel. Must be between 1 and 10. Default: 6.\n --[no-]confirm Prompt for confirmation before running the migration\n (default: true). Use --no-confirm to skip.\n --dataset=<value> Dataset to migrate. Defaults to the dataset configured\n in your Sanity CLI config.\n --[no-]dry-run By default the migration runs in dry mode. Use\n --no-dry-run to migrate dataset.\n --from-export=<value> Use a local dataset export as source for migration\n instead of calling the Sanity API. Note: this is only\n supported for dry runs.\n --[no-]progress Display progress during migration (default: true). Use\n --no-progress to hide output.\n --project=<value> Project ID of the dataset to migrate. Defaults to the\n projectId configured in your Sanity CLI config.\n\n DESCRIPTION\n Run a migration against a dataset\n\n EXAMPLES\n dry run the migration\n\n $ sanity migration run <id>\n\n execute the migration against a dataset\n\n $ sanity migration run <id> --no-dry-run --project xyz --dataset staging\n\n execute the migration using a dataset export as the source\n\n $ sanity migration run <id> --from-export=production.tar.gz --no-dry-run \\\n --project xyz --dataset staging\n\n \"\n `)\n })\n})\n"],"names":["runCommand","describe","expect","test","stdout","toMatchInlineSnapshot","String","raw"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAO,SAAQ;AAE7CF,SAAS,cAAc;IACrBE,KAAK,gCAAgC;QACnC,MAAM,EAACC,MAAM,EAAC,GAAG,MAAMJ,WAAW;QAClCE,OAAOE,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;IAYtC,CAAC;IACH;IAEAF,KAAK,sCAAsC;QACzC,MAAM,EAACC,MAAM,EAAC,GAAG,MAAMJ,WAAW;QAClCE,OAAOE,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;IAsBtC,CAAC;IACH;IAEAF,KAAK,oCAAoC;QACvC,MAAM,EAACC,MAAM,EAAC,GAAG,MAAMJ,WAAW;QAClCE,OAAOE,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;IAetC,CAAC;IACH;IAEAF,KAAK,mCAAmC;QACtC,MAAM,EAACC,MAAM,EAAC,GAAG,MAAMJ,WAAW;QAClCE,OAAOE,QAAQC,qBAAqB,CAACC,OAAOC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDhD,CAAC;IACH;AACF"}
|
|
@@ -118,7 +118,7 @@ describe('#backup:download', ()=>{
|
|
|
118
118
|
'backup download',
|
|
119
119
|
'--help'
|
|
120
120
|
]);
|
|
121
|
-
expect(stdout).toMatchInlineSnapshot(`
|
|
121
|
+
expect(stdout).toMatchInlineSnapshot(String.raw`
|
|
122
122
|
"Download a dataset backup to a local file.
|
|
123
123
|
|
|
124
124
|
USAGE
|
|
@@ -150,12 +150,12 @@ describe('#backup:download', ()=>{
|
|
|
150
150
|
|
|
151
151
|
Download backup to a specific file
|
|
152
152
|
|
|
153
|
-
$ sanity backup download production --backup-id 2024-01-01-backup-2
|
|
153
|
+
$ sanity backup download production --backup-id 2024-01-01-backup-2 \
|
|
154
154
|
--out /path/to/file
|
|
155
155
|
|
|
156
156
|
Download backup and overwrite existing file
|
|
157
157
|
|
|
158
|
-
$ sanity backup download production --backup-id 2024-01-01-backup-3
|
|
158
|
+
$ sanity backup download production --backup-id 2024-01-01-backup-3 \
|
|
159
159
|
--out /path/to/file --overwrite
|
|
160
160
|
|
|
161
161
|
"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/backup/__tests__/download.test.ts"],"sourcesContent":["import {existsSync, mkdirSync} from 'node:fs'\nimport {mkdir, mkdtemp, writeFile} from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {confirm, input, select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {BACKUP_API_VERSION} from '../../../actions/backup/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {DownloadBackupCommand} from '../download.js'\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n}))\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\nvi.mock(import('../../../../../cli-core/src/services/apiClient.js'), async (importOriginal) => {\n const actual = await importOriginal()\n return {\n ...actual,\n getProjectCliClient: vi.fn(),\n }\n})\nvi.mock(import('node:fs/promises'), async (importOriginal) => {\n const actual = await importOriginal()\n return {\n ...actual,\n mkdtemp: vi.fn(),\n }\n})\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\nconst mockMkdtemp = vi.mocked(mkdtemp)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockSelect = vi.mocked(select)\nconst mockInput = vi.mocked(input)\nconst mockConfirm = vi.mocked(confirm)\n\nfunction setupTestEnvironment(datasets = ['production', 'staging']) {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockResolvedValue(\n datasets.map((name) => ({\n aclMode: 'public',\n addonFor: null,\n createdAt: '2024-01-01T00:00:00Z',\n createdByUserId: 'user-123',\n datasetProfile: 'standard',\n features: [],\n name,\n tags: [],\n })),\n ),\n },\n } as unknown as Awaited<ReturnType<typeof getProjectCliClient>>)\n\n mockMkdtemp.mockResolvedValue(\n (() => {\n const tmpOutDir = path.join(process.cwd(), `tmp/sanity-backup-test-${Date.now()}`)\n mkdirSync(tmpOutDir, {recursive: true})\n return tmpOutDir\n })(),\n )\n}\n\nfunction mockBackupAPI({\n files,\n id = 'backup-123',\n nextCursor,\n}: {\n files: {name: string; type: string; url: string}[]\n id?: string\n nextCursor?: string\n}) {\n return mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/${id}`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files,\n totalFiles: files.length,\n ...(nextCursor && {nextCursor}),\n })\n}\n\nfunction mockFileDownloads(files: {name: string; type: string; url: string}[]) {\n for (const file of files) {\n const urlPath = new URL(file.url).pathname\n if (file.type === 'document') {\n nock('https://api.sanity.io').get(urlPath).reply(200, '{\"_id\":\"doc1\"}')\n } else {\n nock('https://api.sanity.io')\n .get(urlPath)\n .reply(200, Buffer.from(`fake-${file.type}-data`))\n }\n }\n}\n\ndescribe('#backup:download', () => {\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n vi.clearAllMocks()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['backup download', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Download a dataset backup to a local file.\n\n USAGE\n $ sanity backup download [DATASET] [--backup-id <value>] [--concurrency\n <value>] [--out <value>] [--overwrite]\n\n ARGUMENTS\n [DATASET] Dataset name to download backup from\n\n FLAGS\n --backup-id=<value> The backup ID to download\n --concurrency=<value> [default: 10] Concurrent number of backup item\n downloads (max: 24)\n --out=<value> The file or directory path the backup should download\n to\n --overwrite Allows overwriting of existing backup file\n\n DESCRIPTION\n Download a dataset backup to a local file.\n\n EXAMPLES\n Interactively download a backup\n\n $ sanity backup download\n\n Download a specific backup for the production dataset\n\n $ sanity backup download production --backup-id 2024-01-01-backup-1\n\n Download backup to a specific file\n\n $ sanity backup download production --backup-id 2024-01-01-backup-2 \\\\\n --out /path/to/file\n\n Download backup and overwrite existing file\n\n $ sanity backup download production --backup-id 2024-01-01-backup-3 \\\\\n --out /path/to/file --overwrite\n\n \"\n `)\n })\n\n describe('validation', () => {\n test.each([\n [\n 'concurrency value below minimum',\n ['--backup-id', 'test', '--concurrency', '0'],\n 'concurrency should be in 1 to 24 range',\n ],\n [\n 'concurrency value above maximum',\n ['--backup-id', 'test', '--concurrency', '25'],\n 'concurrency should be in 1 to 24 range',\n ],\n ])('should reject %s', async (_, flags, expectedError) => {\n setupTestEnvironment()\n\n const {error} = await testCommand(DownloadBackupCommand, ['production', ...flags])\n\n expect(error?.message).toContain(expectedError)\n })\n })\n\n describe('error handling', () => {\n test.each([\n ['no datasets exist in project', () => setupTestEnvironment([]), 'No datasets found'],\n ['dataset is not found', () => setupTestEnvironment(['staging']), 'not found'],\n ])('should error when %s', async (_, setupMock, expectedError) => {\n setupMock()\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n ])\n\n expect(error?.message).toContain(expectedError)\n })\n\n test('should error when no project ID is configured', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: {},\n } as never)\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n ])\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when no backups are available to select', async () => {\n setupTestEnvironment()\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '100'},\n uri: `/projects/test-project/datasets/production/backups`,\n }).reply(200, {\n backups: [],\n })\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--out',\n 'backup.tar.gz',\n ])\n\n expect(error?.message).toContain(\n 'Failed to fetch backups for dataset production: No backups found',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when cannot list datasets', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockRejectedValue(new Error('Failed to fetch datasets')),\n },\n } as unknown as Awaited<ReturnType<typeof getProjectCliClient>>)\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n ])\n\n expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should cancel operation when user rejects file overwrite', async () => {\n setupTestEnvironment()\n\n const out = `tmp/${Date.now()}-backup-docs/backup.tar.gz`\n\n await mkdir(path.dirname(out), {recursive: true})\n await writeFile(out, 'fake-data')\n\n mockConfirm.mockResolvedValue(false)\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n ])\n\n const fullPath = path.join(process.cwd(), out)\n\n expect(mockConfirm).toHaveBeenCalledWith({\n default: false,\n message: `File \"${fullPath}\" already exists, would you like to overwrite it?`,\n })\n\n expect(error?.message).toContain('Operation cancelled.')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n [\n 'document download fails',\n () => {\n const name = 'doc1.json'\n const type = 'document'\n mockBackupAPI({\n files: [{name, type, url: `https://api.sanity.io/${BACKUP_API_VERSION}/${name}`}],\n })\n nock('https://api.sanity.io').get(`/${BACKUP_API_VERSION}/${name}`).reply(500, {\n message: 'Internal Server Error',\n })\n },\n ],\n [\n 'asset download fails',\n () => {\n const name = 'image1.jpg'\n const type = 'asset'\n mockBackupAPI({\n files: [{name, type, url: `https://api.sanity.io/${BACKUP_API_VERSION}/${name}`}],\n })\n nock('https://api.sanity.io').get(`/${BACKUP_API_VERSION}/${name}`).reply(500, {\n message: 'Internal Server Error',\n })\n },\n ],\n [\n 'initial backup API call fails',\n () => {\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(500, {\n message: 'Backup API error',\n })\n },\n ],\n [\n 'backup API fails on subsequent pages',\n () => {\n // First page succeeds\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ],\n nextCursor: 'page2',\n totalFiles: 2,\n })\n\n // Second page fails\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {nextCursor: 'page2'},\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(500, {\n message: 'Second page error',\n })\n },\n ],\n ])('should error when %s', async (description, setupMock) => {\n setupTestEnvironment()\n setupMock()\n\n const out = `tmp/${Date.now()}-backup-error/backup.tar.gz`\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n ])\n\n expect(error?.message).toContain('Downloading dataset backup failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('successful downloads', () => {\n test('should download backup with all flags specified', async () => {\n setupTestEnvironment()\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n {\n name: 'image1.jpg',\n type: 'image',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/image1`,\n },\n {\n name: 'file1.pdf',\n type: 'file',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/file1`,\n },\n ],\n totalFiles: 3,\n })\n\n nock('https://api.sanity.io')\n .get(`/${BACKUP_API_VERSION}/doc1`)\n .reply(200, '{\"_id\":\"doc1\",\"title\":\"Document 1\"}')\n .get(`/${BACKUP_API_VERSION}/image1`)\n .reply(200, Buffer.from('fake-image-data'), {'content-type': 'image/jpeg'})\n .get(`/${BACKUP_API_VERSION}/file1`)\n .reply(200, Buffer.from('fake-file-data'))\n\n const out = `tmp/${Date.now()}-backup/backup.tar.gz`\n const {error, stderr, stdout} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n '--overwrite',\n '--concurrency',\n '5',\n ])\n\n expect(error).toBeUndefined()\n\n expect(stdout).toContain('Downloading backup for:')\n expect(stdout).toContain('projectId')\n expect(stdout).toContain('dataset')\n expect(stdout).toContain('backupId')\n\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test.each([\n [\n 'documents only',\n [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ],\n ],\n [\n 'mixed file types',\n [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n {\n name: 'image1.jpg',\n type: 'image',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/image1`,\n },\n {\n name: 'file1.pdf',\n type: 'file',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/file1`,\n },\n ],\n ],\n ])('should download backup with %s', async (description, files) => {\n setupTestEnvironment()\n\n mockBackupAPI({files})\n mockFileDownloads(files)\n\n const out = `tmp/${Date.now()}-backup-${description.replaceAll(/\\\\s+/g, '-')}/backup.tar.gz`\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n '--overwrite',\n ])\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test('should overwrite existing file when user confirms', async () => {\n setupTestEnvironment()\n\n const files = [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ]\n\n mockBackupAPI({files})\n mockFileDownloads(files)\n\n const out = `tmp/${Date.now()}-backup-confirm/backup.tar.gz`\n\n await mkdir(path.dirname(out), {recursive: true})\n await writeFile(out, 'fake-data')\n\n mockConfirm.mockResolvedValue(true)\n\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n ])\n\n const fullPath = path.join(process.cwd(), out)\n\n expect(mockConfirm).toHaveBeenCalledWith({\n default: false,\n message: `File \"${fullPath}\" already exists, would you like to overwrite it?`,\n })\n expect(error).toBeUndefined()\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test('should download backup with paginated API response', async () => {\n setupTestEnvironment()\n\n // First page\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n {\n name: 'image1.jpg',\n type: 'image',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/image1`,\n },\n ],\n nextCursor: 'page2',\n totalFiles: 3,\n })\n\n // Second page\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {nextCursor: 'page2'},\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'file1.pdf',\n type: 'file',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/file1`,\n },\n ],\n totalFiles: 3,\n })\n\n // Mock file downloads\n nock('https://api.sanity.io')\n .get(`/${BACKUP_API_VERSION}/doc1`)\n .reply(200, '{\"_id\":\"doc1\",\"title\":\"Document 1\"}')\n .get(`/${BACKUP_API_VERSION}/image1`)\n .reply(200, Buffer.from('fake-image-data'))\n .get(`/${BACKUP_API_VERSION}/file1`)\n .reply(200, Buffer.from('fake-file-data'))\n\n const out = `tmp/${Date.now()}-backup-paginated/backup.tar.gz`\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n '--overwrite',\n ])\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n })\n\n describe('interactive prompts', () => {\n test('should prompt for backup selection when backup-id is not provided', async () => {\n setupTestEnvironment()\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '100'},\n uri: `/projects/test-project/datasets/production/backups`,\n }).reply(200, {\n backups: [\n {createdAt: '2024-01-01T00:00:00Z', id: 'backup-1'},\n {createdAt: '2024-01-02T00:00:00Z', id: 'backup-2'},\n ],\n })\n\n mockSelect.mockResolvedValue('backup-1')\n\n const files = [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ]\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-1`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files,\n totalFiles: files.length,\n })\n mockFileDownloads(files)\n\n const out = `tmp/${Date.now()}-backup-prompt/backup.tar.gz`\n\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--out',\n out,\n '--overwrite',\n ])\n\n expect(error).toBeUndefined()\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n choices: expect.arrayContaining([\n {name: 'backup-1', value: 'backup-1'},\n {name: 'backup-2', value: 'backup-2'},\n ]),\n message: expect.stringContaining('Select backup ID'),\n }),\n )\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test('should prompt for dataset selection when no dataset is specified', async () => {\n setupTestEnvironment()\n\n mockBackupAPI({files: []})\n mockSelect.mockResolvedValue('production')\n const out = `tmp/${Date.now()}-backup-dataset-prompt/backup.tar.gz`\n mockInput.mockResolvedValue(out)\n\n const {stdout} = await testCommand(DownloadBackupCommand, ['--backup-id', 'backup-123'])\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'production', value: 'production'},\n {name: 'staging', value: 'staging'},\n ],\n message: 'Select the dataset name:',\n })\n expect(stdout).toContain('Downloading backup for:')\n expect(stdout).toContain('projectId')\n expect(stdout).toContain('dataset')\n expect(stdout).toContain('backupId')\n expect(stdout).toContain('Downloading backup to')\n expect(existsSync(out)).toBe(true)\n })\n })\n})\n"],"names":["existsSync","mkdirSync","mkdir","mkdtemp","writeFile","path","runCommand","getCliConfig","getProjectCliClient","confirm","input","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","BACKUP_API_VERSION","NO_PROJECT_ID","DownloadBackupCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","importOriginal","actual","importActual","mockGetProjectCliClient","mocked","mockMkdtemp","mockGetCliConfig","mockSelect","mockInput","mockConfirm","setupTestEnvironment","datasets","list","map","name","aclMode","addonFor","createdAt","createdByUserId","datasetProfile","features","tags","tmpOutDir","join","process","cwd","Date","now","recursive","mockBackupAPI","files","id","nextCursor","apiVersion","method","uri","reply","totalFiles","length","mockFileDownloads","file","urlPath","URL","url","pathname","get","Buffer","from","pending","pendingMocks","cleanAll","clearAllMocks","toEqual","stdout","toMatchInlineSnapshot","each","_","flags","expectedError","error","message","toContain","setupMock","mockResolvedValueOnce","oclif","exit","toBe","query","limit","backups","mockRejectedValue","Error","out","dirname","fullPath","toHaveBeenCalledWith","default","description","stderr","toBeUndefined","replaceAll","objectContaining","choices","arrayContaining","value","stringContaining"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/backup/__tests__/download.test.ts"],"sourcesContent":["import {existsSync, mkdirSync} from 'node:fs'\nimport {mkdir, mkdtemp, writeFile} from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {confirm, input, select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {BACKUP_API_VERSION} from '../../../actions/backup/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {DownloadBackupCommand} from '../download.js'\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n}))\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\nvi.mock(import('../../../../../cli-core/src/services/apiClient.js'), async (importOriginal) => {\n const actual = await importOriginal()\n return {\n ...actual,\n getProjectCliClient: vi.fn(),\n }\n})\nvi.mock(import('node:fs/promises'), async (importOriginal) => {\n const actual = await importOriginal()\n return {\n ...actual,\n mkdtemp: vi.fn(),\n }\n})\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n confirm: vi.fn(),\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\nconst mockMkdtemp = vi.mocked(mkdtemp)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockSelect = vi.mocked(select)\nconst mockInput = vi.mocked(input)\nconst mockConfirm = vi.mocked(confirm)\n\nfunction setupTestEnvironment(datasets = ['production', 'staging']) {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockResolvedValue(\n datasets.map((name) => ({\n aclMode: 'public',\n addonFor: null,\n createdAt: '2024-01-01T00:00:00Z',\n createdByUserId: 'user-123',\n datasetProfile: 'standard',\n features: [],\n name,\n tags: [],\n })),\n ),\n },\n } as unknown as Awaited<ReturnType<typeof getProjectCliClient>>)\n\n mockMkdtemp.mockResolvedValue(\n (() => {\n const tmpOutDir = path.join(process.cwd(), `tmp/sanity-backup-test-${Date.now()}`)\n mkdirSync(tmpOutDir, {recursive: true})\n return tmpOutDir\n })(),\n )\n}\n\nfunction mockBackupAPI({\n files,\n id = 'backup-123',\n nextCursor,\n}: {\n files: {name: string; type: string; url: string}[]\n id?: string\n nextCursor?: string\n}) {\n return mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/${id}`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files,\n totalFiles: files.length,\n ...(nextCursor && {nextCursor}),\n })\n}\n\nfunction mockFileDownloads(files: {name: string; type: string; url: string}[]) {\n for (const file of files) {\n const urlPath = new URL(file.url).pathname\n if (file.type === 'document') {\n nock('https://api.sanity.io').get(urlPath).reply(200, '{\"_id\":\"doc1\"}')\n } else {\n nock('https://api.sanity.io')\n .get(urlPath)\n .reply(200, Buffer.from(`fake-${file.type}-data`))\n }\n }\n}\n\ndescribe('#backup:download', () => {\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n vi.clearAllMocks()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['backup download', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Download a dataset backup to a local file.\n\n USAGE\n $ sanity backup download [DATASET] [--backup-id <value>] [--concurrency\n <value>] [--out <value>] [--overwrite]\n\n ARGUMENTS\n [DATASET] Dataset name to download backup from\n\n FLAGS\n --backup-id=<value> The backup ID to download\n --concurrency=<value> [default: 10] Concurrent number of backup item\n downloads (max: 24)\n --out=<value> The file or directory path the backup should download\n to\n --overwrite Allows overwriting of existing backup file\n\n DESCRIPTION\n Download a dataset backup to a local file.\n\n EXAMPLES\n Interactively download a backup\n\n $ sanity backup download\n\n Download a specific backup for the production dataset\n\n $ sanity backup download production --backup-id 2024-01-01-backup-1\n\n Download backup to a specific file\n\n $ sanity backup download production --backup-id 2024-01-01-backup-2 \\\n --out /path/to/file\n\n Download backup and overwrite existing file\n\n $ sanity backup download production --backup-id 2024-01-01-backup-3 \\\n --out /path/to/file --overwrite\n\n \"\n `)\n })\n\n describe('validation', () => {\n test.each([\n [\n 'concurrency value below minimum',\n ['--backup-id', 'test', '--concurrency', '0'],\n 'concurrency should be in 1 to 24 range',\n ],\n [\n 'concurrency value above maximum',\n ['--backup-id', 'test', '--concurrency', '25'],\n 'concurrency should be in 1 to 24 range',\n ],\n ])('should reject %s', async (_, flags, expectedError) => {\n setupTestEnvironment()\n\n const {error} = await testCommand(DownloadBackupCommand, ['production', ...flags])\n\n expect(error?.message).toContain(expectedError)\n })\n })\n\n describe('error handling', () => {\n test.each([\n ['no datasets exist in project', () => setupTestEnvironment([]), 'No datasets found'],\n ['dataset is not found', () => setupTestEnvironment(['staging']), 'not found'],\n ])('should error when %s', async (_, setupMock, expectedError) => {\n setupMock()\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n ])\n\n expect(error?.message).toContain(expectedError)\n })\n\n test('should error when no project ID is configured', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: {},\n } as never)\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n ])\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when no backups are available to select', async () => {\n setupTestEnvironment()\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '100'},\n uri: `/projects/test-project/datasets/production/backups`,\n }).reply(200, {\n backups: [],\n })\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--out',\n 'backup.tar.gz',\n ])\n\n expect(error?.message).toContain(\n 'Failed to fetch backups for dataset production: No backups found',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should error when cannot list datasets', async () => {\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockRejectedValue(new Error('Failed to fetch datasets')),\n },\n } as unknown as Awaited<ReturnType<typeof getProjectCliClient>>)\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n ])\n\n expect(error?.message).toContain('Failed to list datasets: Failed to fetch datasets')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should cancel operation when user rejects file overwrite', async () => {\n setupTestEnvironment()\n\n const out = `tmp/${Date.now()}-backup-docs/backup.tar.gz`\n\n await mkdir(path.dirname(out), {recursive: true})\n await writeFile(out, 'fake-data')\n\n mockConfirm.mockResolvedValue(false)\n\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n ])\n\n const fullPath = path.join(process.cwd(), out)\n\n expect(mockConfirm).toHaveBeenCalledWith({\n default: false,\n message: `File \"${fullPath}\" already exists, would you like to overwrite it?`,\n })\n\n expect(error?.message).toContain('Operation cancelled.')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n [\n 'document download fails',\n () => {\n const name = 'doc1.json'\n const type = 'document'\n mockBackupAPI({\n files: [{name, type, url: `https://api.sanity.io/${BACKUP_API_VERSION}/${name}`}],\n })\n nock('https://api.sanity.io').get(`/${BACKUP_API_VERSION}/${name}`).reply(500, {\n message: 'Internal Server Error',\n })\n },\n ],\n [\n 'asset download fails',\n () => {\n const name = 'image1.jpg'\n const type = 'asset'\n mockBackupAPI({\n files: [{name, type, url: `https://api.sanity.io/${BACKUP_API_VERSION}/${name}`}],\n })\n nock('https://api.sanity.io').get(`/${BACKUP_API_VERSION}/${name}`).reply(500, {\n message: 'Internal Server Error',\n })\n },\n ],\n [\n 'initial backup API call fails',\n () => {\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(500, {\n message: 'Backup API error',\n })\n },\n ],\n [\n 'backup API fails on subsequent pages',\n () => {\n // First page succeeds\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ],\n nextCursor: 'page2',\n totalFiles: 2,\n })\n\n // Second page fails\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {nextCursor: 'page2'},\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(500, {\n message: 'Second page error',\n })\n },\n ],\n ])('should error when %s', async (description, setupMock) => {\n setupTestEnvironment()\n setupMock()\n\n const out = `tmp/${Date.now()}-backup-error/backup.tar.gz`\n const {error} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n ])\n\n expect(error?.message).toContain('Downloading dataset backup failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n })\n\n describe('successful downloads', () => {\n test('should download backup with all flags specified', async () => {\n setupTestEnvironment()\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n {\n name: 'image1.jpg',\n type: 'image',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/image1`,\n },\n {\n name: 'file1.pdf',\n type: 'file',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/file1`,\n },\n ],\n totalFiles: 3,\n })\n\n nock('https://api.sanity.io')\n .get(`/${BACKUP_API_VERSION}/doc1`)\n .reply(200, '{\"_id\":\"doc1\",\"title\":\"Document 1\"}')\n .get(`/${BACKUP_API_VERSION}/image1`)\n .reply(200, Buffer.from('fake-image-data'), {'content-type': 'image/jpeg'})\n .get(`/${BACKUP_API_VERSION}/file1`)\n .reply(200, Buffer.from('fake-file-data'))\n\n const out = `tmp/${Date.now()}-backup/backup.tar.gz`\n const {error, stderr, stdout} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n '--overwrite',\n '--concurrency',\n '5',\n ])\n\n expect(error).toBeUndefined()\n\n expect(stdout).toContain('Downloading backup for:')\n expect(stdout).toContain('projectId')\n expect(stdout).toContain('dataset')\n expect(stdout).toContain('backupId')\n\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test.each([\n [\n 'documents only',\n [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ],\n ],\n [\n 'mixed file types',\n [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n {\n name: 'image1.jpg',\n type: 'image',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/image1`,\n },\n {\n name: 'file1.pdf',\n type: 'file',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/file1`,\n },\n ],\n ],\n ])('should download backup with %s', async (description, files) => {\n setupTestEnvironment()\n\n mockBackupAPI({files})\n mockFileDownloads(files)\n\n const out = `tmp/${Date.now()}-backup-${description.replaceAll(/\\\\s+/g, '-')}/backup.tar.gz`\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n '--overwrite',\n ])\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test('should overwrite existing file when user confirms', async () => {\n setupTestEnvironment()\n\n const files = [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ]\n\n mockBackupAPI({files})\n mockFileDownloads(files)\n\n const out = `tmp/${Date.now()}-backup-confirm/backup.tar.gz`\n\n await mkdir(path.dirname(out), {recursive: true})\n await writeFile(out, 'fake-data')\n\n mockConfirm.mockResolvedValue(true)\n\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n ])\n\n const fullPath = path.join(process.cwd(), out)\n\n expect(mockConfirm).toHaveBeenCalledWith({\n default: false,\n message: `File \"${fullPath}\" already exists, would you like to overwrite it?`,\n })\n expect(error).toBeUndefined()\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test('should download backup with paginated API response', async () => {\n setupTestEnvironment()\n\n // First page\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n {\n name: 'image1.jpg',\n type: 'image',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/image1`,\n },\n ],\n nextCursor: 'page2',\n totalFiles: 3,\n })\n\n // Second page\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {nextCursor: 'page2'},\n uri: `/projects/test-project/datasets/production/backups/backup-123`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files: [\n {\n name: 'file1.pdf',\n type: 'file',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/file1`,\n },\n ],\n totalFiles: 3,\n })\n\n // Mock file downloads\n nock('https://api.sanity.io')\n .get(`/${BACKUP_API_VERSION}/doc1`)\n .reply(200, '{\"_id\":\"doc1\",\"title\":\"Document 1\"}')\n .get(`/${BACKUP_API_VERSION}/image1`)\n .reply(200, Buffer.from('fake-image-data'))\n .get(`/${BACKUP_API_VERSION}/file1`)\n .reply(200, Buffer.from('fake-file-data'))\n\n const out = `tmp/${Date.now()}-backup-paginated/backup.tar.gz`\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--backup-id',\n 'backup-123',\n '--out',\n out,\n '--overwrite',\n ])\n\n expect(error).toBeUndefined()\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n })\n\n describe('interactive prompts', () => {\n test('should prompt for backup selection when backup-id is not provided', async () => {\n setupTestEnvironment()\n\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n query: {limit: '100'},\n uri: `/projects/test-project/datasets/production/backups`,\n }).reply(200, {\n backups: [\n {createdAt: '2024-01-01T00:00:00Z', id: 'backup-1'},\n {createdAt: '2024-01-02T00:00:00Z', id: 'backup-2'},\n ],\n })\n\n mockSelect.mockResolvedValue('backup-1')\n\n const files = [\n {\n name: 'doc1.json',\n type: 'document',\n url: `https://api.sanity.io/${BACKUP_API_VERSION}/doc1`,\n },\n ]\n mockApi({\n apiVersion: BACKUP_API_VERSION,\n method: 'get',\n uri: `/projects/test-project/datasets/production/backups/backup-1`,\n }).reply(200, {\n createdAt: '2024-01-15T10:30:00Z',\n files,\n totalFiles: files.length,\n })\n mockFileDownloads(files)\n\n const out = `tmp/${Date.now()}-backup-prompt/backup.tar.gz`\n\n const {error, stderr} = await testCommand(DownloadBackupCommand, [\n 'production',\n '--out',\n out,\n '--overwrite',\n ])\n\n expect(error).toBeUndefined()\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n choices: expect.arrayContaining([\n {name: 'backup-1', value: 'backup-1'},\n {name: 'backup-2', value: 'backup-2'},\n ]),\n message: expect.stringContaining('Select backup ID'),\n }),\n )\n expect(stderr).toContain('Backup download complete')\n expect(existsSync(out)).toBe(true)\n })\n\n test('should prompt for dataset selection when no dataset is specified', async () => {\n setupTestEnvironment()\n\n mockBackupAPI({files: []})\n mockSelect.mockResolvedValue('production')\n const out = `tmp/${Date.now()}-backup-dataset-prompt/backup.tar.gz`\n mockInput.mockResolvedValue(out)\n\n const {stdout} = await testCommand(DownloadBackupCommand, ['--backup-id', 'backup-123'])\n\n expect(mockSelect).toHaveBeenCalledWith({\n choices: [\n {name: 'production', value: 'production'},\n {name: 'staging', value: 'staging'},\n ],\n message: 'Select the dataset name:',\n })\n expect(stdout).toContain('Downloading backup for:')\n expect(stdout).toContain('projectId')\n expect(stdout).toContain('dataset')\n expect(stdout).toContain('backupId')\n expect(stdout).toContain('Downloading backup to')\n expect(existsSync(out)).toBe(true)\n })\n })\n})\n"],"names":["existsSync","mkdirSync","mkdir","mkdtemp","writeFile","path","runCommand","getCliConfig","getProjectCliClient","confirm","input","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","BACKUP_API_VERSION","NO_PROJECT_ID","DownloadBackupCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","importOriginal","actual","importActual","mockGetProjectCliClient","mocked","mockMkdtemp","mockGetCliConfig","mockSelect","mockInput","mockConfirm","setupTestEnvironment","datasets","list","map","name","aclMode","addonFor","createdAt","createdByUserId","datasetProfile","features","tags","tmpOutDir","join","process","cwd","Date","now","recursive","mockBackupAPI","files","id","nextCursor","apiVersion","method","uri","reply","totalFiles","length","mockFileDownloads","file","urlPath","URL","url","pathname","get","Buffer","from","pending","pendingMocks","cleanAll","clearAllMocks","toEqual","stdout","toMatchInlineSnapshot","String","raw","each","_","flags","expectedError","error","message","toContain","setupMock","mockResolvedValueOnce","oclif","exit","toBe","query","limit","backups","mockRejectedValue","Error","out","dirname","fullPath","toHaveBeenCalledWith","default","description","stderr","toBeUndefined","replaceAll","objectContaining","choices","arrayContaining","value","stringContaining"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { describe, expect, test } from 'vitest';
|
|
|
3
3
|
describe('#dataset:import', ()=>{
|
|
4
4
|
test('should print datasets:import help', async ()=>{
|
|
5
5
|
const { stdout } = await runCommand('dataset import --help');
|
|
6
|
-
expect(stdout).toMatchInlineSnapshot(`
|
|
6
|
+
expect(stdout).toMatchInlineSnapshot(String.raw`
|
|
7
7
|
"Import documents to a Sanity dataset
|
|
8
8
|
|
|
9
9
|
USAGE
|
|
@@ -38,7 +38,7 @@ describe('#dataset:import', ()=>{
|
|
|
38
38
|
EXAMPLES
|
|
39
39
|
Import "./my-dataset.ndjson" into dataset "staging"
|
|
40
40
|
|
|
41
|
-
$ sanity dataset import -p myPrOj -d staging -t someSecretToken
|
|
41
|
+
$ sanity dataset import -p myPrOj -d staging -t someSecretToken \
|
|
42
42
|
my-dataset.ndjson
|
|
43
43
|
|
|
44
44
|
Import into dataset "test" from stdin, read token from env var
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/dataset/__tests__/import.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {describe, expect, test} from 'vitest'\n\ndescribe('#dataset:import', () => {\n test('should print datasets:import help', async () => {\n const {stdout} = await runCommand('dataset import --help')\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Import documents to a Sanity dataset\n\n USAGE\n $ sanity dataset import SOURCE -p <value> -d <value> [-t <value>]\n [--replace | --missing] [--allow-failing-assets]\n [--allow-assets-in-different-dataset] [--replace-assets]\n [--skip-cross-dataset-references] [--allow-system-documents]\n [--asset-concurrency <value>]\n\n ARGUMENTS\n SOURCE Source file (use \"-\" for stdin)\n\n FLAGS\n -d, --dataset=<value> (required) Dataset to import to\n -p, --project=<value> (required) Project ID to import to\n -t, --token=<value> [env: SANITY_IMPORT_TOKEN] Token to\n authenticate with\n --allow-assets-in-different-dataset Allow asset documents to reference\n different project/dataset\n --allow-failing-assets Skip assets that cannot be\n fetched/uploaded\n --allow-system-documents Imports system documents\n --asset-concurrency=<value> Number of parallel asset imports\n --missing Skip documents that already exist\n --replace Replace documents with the same IDs\n --replace-assets Skip reuse of existing assets\n --skip-cross-dataset-references Skips references to other datasets\n\n DESCRIPTION\n Import documents to a Sanity dataset\n\n EXAMPLES\n Import \"./my-dataset.ndjson\" into dataset \"staging\"\n\n $ sanity dataset import -p myPrOj -d staging -t someSecretToken
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/dataset/__tests__/import.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {describe, expect, test} from 'vitest'\n\ndescribe('#dataset:import', () => {\n test('should print datasets:import help', async () => {\n const {stdout} = await runCommand('dataset import --help')\n\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Import documents to a Sanity dataset\n\n USAGE\n $ sanity dataset import SOURCE -p <value> -d <value> [-t <value>]\n [--replace | --missing] [--allow-failing-assets]\n [--allow-assets-in-different-dataset] [--replace-assets]\n [--skip-cross-dataset-references] [--allow-system-documents]\n [--asset-concurrency <value>]\n\n ARGUMENTS\n SOURCE Source file (use \"-\" for stdin)\n\n FLAGS\n -d, --dataset=<value> (required) Dataset to import to\n -p, --project=<value> (required) Project ID to import to\n -t, --token=<value> [env: SANITY_IMPORT_TOKEN] Token to\n authenticate with\n --allow-assets-in-different-dataset Allow asset documents to reference\n different project/dataset\n --allow-failing-assets Skip assets that cannot be\n fetched/uploaded\n --allow-system-documents Imports system documents\n --asset-concurrency=<value> Number of parallel asset imports\n --missing Skip documents that already exist\n --replace Replace documents with the same IDs\n --replace-assets Skip reuse of existing assets\n --skip-cross-dataset-references Skips references to other datasets\n\n DESCRIPTION\n Import documents to a Sanity dataset\n\n EXAMPLES\n Import \"./my-dataset.ndjson\" into dataset \"staging\"\n\n $ sanity dataset import -p myPrOj -d staging -t someSecretToken \\\n my-dataset.ndjson\n\n Import into dataset \"test\" from stdin, read token from env var\n\n cat my-dataset.ndjson | sanity dataset import -p myPrOj -d test -\n\n \"\n `)\n })\n})\n"],"names":["runCommand","describe","expect","test","stdout","toMatchInlineSnapshot","String","raw"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAO,SAAQ;AAE7CF,SAAS,mBAAmB;IAC1BE,KAAK,qCAAqC;QACxC,MAAM,EAACC,MAAM,EAAC,GAAG,MAAMJ,WAAW;QAElCE,OAAOE,QAAQC,qBAAqB,CAACC,OAAOC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2ChD,CAAC;IACH;AACF"}
|
|
@@ -34,7 +34,7 @@ describe('#documents:query', ()=>{
|
|
|
34
34
|
'documents query',
|
|
35
35
|
'--help'
|
|
36
36
|
]);
|
|
37
|
-
expect(stdout).toMatchInlineSnapshot(`
|
|
37
|
+
expect(stdout).toMatchInlineSnapshot(String.raw`
|
|
38
38
|
"Query for documents
|
|
39
39
|
|
|
40
40
|
USAGE
|
|
@@ -62,12 +62,12 @@ describe('#documents:query', ()=>{
|
|
|
62
62
|
|
|
63
63
|
Fetch title of the oldest movie in the dataset named "staging"
|
|
64
64
|
|
|
65
|
-
$ sanity documents query '*[_type == "movie"]|order(releaseDate
|
|
65
|
+
$ sanity documents query '*[_type == "movie"]|order(releaseDate \
|
|
66
66
|
asc)[0]{title}' --dataset staging
|
|
67
67
|
|
|
68
68
|
Use API version v2021-06-07 and do a query
|
|
69
69
|
|
|
70
|
-
$ sanity documents query '*[_id == "header"] { "headerText":
|
|
70
|
+
$ sanity documents query '*[_id == "header"] { "headerText": \
|
|
71
71
|
pt::text(body) }' --api-version v2021-06-07
|
|
72
72
|
|
|
73
73
|
"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/documents/__tests__/query.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {QueryDocumentCommand} from '../query.js'\n\n// Mock the config functions\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: vi.fn(),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\nconst testProjectId = 'test-project'\nconst testDataset = 'production'\n\ndescribe('#documents:query', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['documents query', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Query for documents\n\n USAGE\n $ sanity documents query QUERY [--anonymous] [--api-version <value>] [-d\n <value>] [--pretty] [-p <value>]\n\n ARGUMENTS\n QUERY GROQ query to run against the dataset\n\n FLAGS\n -d, --dataset=<value> Dataset to query (overrides config)\n -p, --project=<value> Project ID to query (overrides config)\n --anonymous Send the query without any authorization token\n --api-version=<value> [env: SANITY_CLI_QUERY_API_VERSION] API version to\n use (defaults to 2025-08-15)\n --pretty Colorize JSON output\n\n DESCRIPTION\n Query for documents\n\n EXAMPLES\n Fetch 5 documents of type \"movie\"\n\n $ sanity documents query '*[_type == \"movie\"][0..4]'\n\n Fetch title of the oldest movie in the dataset named \"staging\"\n\n $ sanity documents query '*[_type == \"movie\"]|order(releaseDate \\\\\n asc)[0]{title}' --dataset staging\n\n Use API version v2021-06-07 and do a query\n\n $ sanity documents query '*[_id == \"header\"] { \"headerText\": \\\\\n pt::text(body) }' --api-version v2021-06-07\n\n \"\n `)\n })\n\n test('executes query successfully with basic options', async () => {\n const mockResults = [\n {\n _id: 'movie1',\n _type: 'movie',\n title: 'The Matrix',\n },\n {\n _id: 'movie2',\n _type: 'movie',\n title: 'Inception',\n },\n ]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n // Mock the getProjectApiClient to return a mock client with fetch\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stdout).toContain('\"_id\": \"movie1\"')\n expect(stdout).toContain('\"title\": \"The Matrix\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n // Verify that getProjectCliClient was called with requireUser: true by default\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('executes query with pretty flag for colorized output', async () => {\n const mockResults = [{_id: 'test', title: 'Test Movie'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const originalChalkLevel = chalk.level\n // Force colorization\n chalk.level = 3\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--pretty'], {\n capture: {\n stripAnsi: false,\n },\n })\n\n // Reset chalk level\n chalk.level = originalChalkLevel\n\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(stdout).toContain('\"_id\"')\n expect(stdout).toContain('test')\n // eslint-disable-next-line no-control-regex\n expect(stdout).toMatch(/\\u001B\\[\\d+m/)\n })\n\n test('uses dataset flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideDataset = 'staging'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--dataset',\n overrideDataset,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: overrideDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('uses project flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideProject = 'other-project'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--project',\n overrideProject,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: overrideProject,\n requireUser: true,\n })\n })\n\n test('uses anonymous flag to skip authentication', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--anonymous'])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n // Verify that getProjectCliClient was called with requireUser: false\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: false,\n })\n })\n\n test('uses custom API version', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const customApiVersion = 'v2021-06-07'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--api-version',\n customApiVersion,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: customApiVersion,\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('shows warning and uses default API version when not specified', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stderr, stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stderr).toContain('--api-version not specified, using `2025-08-15`')\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: '2025-08-15',\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('fails when no project ID is configured or provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n },\n })\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no dataset is configured or provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: testProjectId,\n },\n })\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset specified')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when query returns null/undefined', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(null)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"nonexistent\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Query returned no results')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles query execution errors', async () => {\n const queryError = new Error('Invalid query syntax')\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockRejectedValue(queryError)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {error} = await testCommand(QueryDocumentCommand, ['invalid query'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Invalid GROQ query syntax: Invalid query syntax')\n expect(error?.message).toContain('Query: invalid query')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('uses environment variable for API version when set', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const envApiVersion = 'v2023-01-01'\n\n // Mock environment variable\n vi.stubEnv('SANITY_CLI_QUERY_API_VERSION', envApiVersion)\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: envApiVersion,\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n\n vi.unstubAllEnvs()\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","chalk","testCommand","afterEach","describe","expect","test","vi","QueryDocumentCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","getCliToken","mockGetCliConfig","mocked","mockGetProjectCliClient","testProjectId","testDataset","clearAllMocks","stdout","toMatchInlineSnapshot","mockResults","_id","_type","title","api","dataset","projectId","mockFetch","fetch","toContain","toHaveBeenCalledWith","apiVersion","any","String","requireUser","originalChalkLevel","level","capture","stripAnsi","toMatch","overrideDataset","overrideProject","customApiVersion","stderr","error","toBeInstanceOf","Error","message","oclif","exit","toBe","queryError","mockRejectedValue","envApiVersion","stubEnv","unstubAllEnvs"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,YAAY,EAAEC,mBAAmB,QAAO,mBAAkB;AAClE,SAAQC,KAAK,QAAO,sBAAqB;AACzC,SAAQC,WAAW,QAAO,mBAAkB;AAC5C,SAAQC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,EAAE,QAAO,SAAQ;AAE5D,SAAQC,oBAAoB,QAAO,cAAa;AAEhD,4BAA4B;AAC5BD,GAAGE,IAAI,CAAC,yDAAyD,IAAO,CAAA;QACtEC,iBAAiBH,GAAGI,EAAE,GAAGC,iBAAiB,CAAC;YACzCC,WAAW;YACXC,MAAM;YACNC,MAAM;QACR;IACF,CAAA;AAEAR,GAAGE,IAAI,CAAC,0DAA0D,IAAO,CAAA;QACvEV,cAAcQ,GAAGI,EAAE;IACrB,CAAA;AAEAJ,GAAGE,IAAI,CAAC,uDAAuD,IAAO,CAAA;QACpEO,aAAaT,GAAGI,EAAE,GAAGC,iBAAiB,CAAC;IACzC,CAAA;AAEAL,GAAGE,IAAI,CAAC,qDAAqD,IAAO,CAAA;QAClET,qBAAqBO,GAAGI,EAAE;IAC5B,CAAA;AAEA,MAAMM,mBAAmBV,GAAGW,MAAM,CAACnB;AACnC,MAAMoB,0BAA0BZ,GAAGW,MAAM,CAAClB;AAC1C,MAAMoB,gBAAgB;AACtB,MAAMC,cAAc;AAEpBjB,SAAS,oBAAoB;IAC3BD,UAAU;QACRI,GAAGe,aAAa;IAClB;IAEAhB,KAAK,gBAAgB;QACnB,MAAM,EAACiB,MAAM,EAAC,GAAG,MAAMzB,WAAW;YAAC;YAAmB;SAAS;QAE/DO,OAAOkB,QAAQC,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqCtC,CAAC;IACH;IAEAlB,KAAK,kDAAkD;QACrD,MAAMmB,cAAc;YAClB;gBACEC,KAAK;gBACLC,OAAO;gBACPC,OAAO;YACT;YACA;gBACEF,KAAK;gBACLC,OAAO;gBACPC,OAAO;YACT;SACD;QAEDX,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,kEAAkE;QAClE,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACT,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YAAC;SAAsB;QAEhFH,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAO2B,WAAWG,oBAAoB,CAAC;QAEvC,+EAA+E;QAC/E9B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAY/B,OAAOgC,GAAG,CAACC;YACvBR,SAAST;YACTU,WAAWX;YACXmB,aAAa;QACf;IACF;IAEAjC,KAAK,wDAAwD;QAC3D,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAY;SAAE;QAExDX,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAMQ,qBAAqBvC,MAAMwC,KAAK;QACtC,qBAAqB;QACrBxC,MAAMwC,KAAK,GAAG;QAEd,MAAM,EAAClB,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YAAC;YAAuB;SAAW,EAAE;YAC5FkC,SAAS;gBACPC,WAAW;YACb;QACF;QAEA,oBAAoB;QACpB1C,MAAMwC,KAAK,GAAGD;QAEdnC,OAAO2B,WAAWG,oBAAoB,CAAC;QACvC9B,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAOkB,QAAQW,SAAS,CAAC;QACzB,4CAA4C;QAC5C7B,OAAOkB,QAAQqB,OAAO,CAAC;IACzB;IAEAtC,KAAK,wCAAwC;QAC3C,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAM;SAAE;QAClD,MAAMiB,kBAAkB;QAExB5B,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACT,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YACvD;YACA;YACAqC;SACD;QAEDxC,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAO2B,WAAWG,oBAAoB,CAAC;QACvC9B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAY/B,OAAOgC,GAAG,CAACC;YACvBR,SAASe;YACTd,WAAWX;YACXmB,aAAa;QACf;IACF;IAEAjC,KAAK,wCAAwC;QAC3C,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAM;SAAE;QAClD,MAAMkB,kBAAkB;QAExB7B,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACT,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YACvD;YACA;YACAsC;SACD;QAEDzC,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAO2B,WAAWG,oBAAoB,CAAC;QACvC9B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAY/B,OAAOgC,GAAG,CAACC;YACvBR,SAAST;YACTU,WAAWe;YACXP,aAAa;QACf;IACF;IAEAjC,KAAK,8CAA8C;QACjD,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAM;SAAE;QAElDX,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACT,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YAAC;YAAuB;SAAc;QAE/FH,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAO2B,WAAWG,oBAAoB,CAAC;QAEvC,qEAAqE;QACrE9B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAY/B,OAAOgC,GAAG,CAACC;YACvBR,SAAST;YACTU,WAAWX;YACXmB,aAAa;QACf;IACF;IAEAjC,KAAK,2BAA2B;QAC9B,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAM;SAAE;QAClD,MAAMmB,mBAAmB;QAEzB9B,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACT,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YACvD;YACA;YACAuC;SACD;QAED1C,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAO2B,WAAWG,oBAAoB,CAAC;QACvC9B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAYW;YACZjB,SAAST;YACTU,WAAWX;YACXmB,aAAa;QACf;IACF;IAEAjC,KAAK,iEAAiE;QACpE,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAM;SAAE;QAElDX,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACgB,MAAM,EAAEzB,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YAAC;SAAsB;QAExFH,OAAO2C,QAAQd,SAAS,CAAC;QACzB7B,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAY;YACZN,SAAST;YACTU,WAAWX;YACXmB,aAAa;QACf;IACF;IAEAjC,KAAK,sDAAsD;QACzDW,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;YACX;QACF;QAEA,MAAM,EAAC4B,KAAK,EAAC,GAAG,MAAM/C,YAAYM,sBAAsB;YAAC;SAAsB;QAE/EH,OAAO4C,OAAOC,cAAc,CAACC;QAC7B9C,OAAO4C,OAAOG,SAASlB,SAAS,CAAC;QACjC7B,OAAO4C,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAjD,KAAK,mDAAmD;QACtDW,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHE,WAAWX;YACb;QACF;QAEA,MAAM,EAAC6B,KAAK,EAAC,GAAG,MAAM/C,YAAYM,sBAAsB;YAAC;SAAsB;QAE/EH,OAAO4C,OAAOC,cAAc,CAACC;QAC7B9C,OAAO4C,OAAOG,SAASlB,SAAS,CAAC;QACjC7B,OAAO4C,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAjD,KAAK,2CAA2C;QAC9CW,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAAC;QAC5CO,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACiB,KAAK,EAAC,GAAG,MAAM/C,YAAYM,sBAAsB;YAAC;SAA4B;QAErFH,OAAO4C,OAAOC,cAAc,CAACC;QAC7B9C,OAAO4C,OAAOG,SAASlB,SAAS,CAAC;QACjC7B,OAAO4C,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAjD,KAAK,kCAAkC;QACrC,MAAMkD,aAAa,IAAIL,MAAM;QAE7BlC,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAG8C,iBAAiB,CAACD;QAC5CrC,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACiB,KAAK,EAAC,GAAG,MAAM/C,YAAYM,sBAAsB;YAAC;SAAgB;QAEzEH,OAAO4C,OAAOC,cAAc,CAACC;QAC7B9C,OAAO4C,OAAOG,SAASlB,SAAS,CAAC;QACjC7B,OAAO4C,OAAOG,SAASlB,SAAS,CAAC;QACjC7B,OAAO4C,OAAOI,OAAOC,MAAMC,IAAI,CAAC;IAClC;IAEAjD,KAAK,sDAAsD;QACzD,MAAMmB,cAAc;YAAC;gBAACC,KAAK;gBAAQE,OAAO;YAAM;SAAE;QAClD,MAAM8B,gBAAgB;QAEtB,4BAA4B;QAC5BnD,GAAGoD,OAAO,CAAC,gCAAgCD;QAE3CzC,iBAAiBL,iBAAiB,CAAC;YACjCiB,KAAK;gBACHC,SAAST;gBACTU,WAAWX;YACb;QACF;QAEA,MAAMY,YAAYzB,GAAGI,EAAE,GAAGC,iBAAiB,CAACa;QAC5CN,wBAAwBP,iBAAiB,CAAC;YACxCqB,OAAOD;QACT;QAEA,MAAM,EAACT,MAAM,EAAC,GAAG,MAAMrB,YAAYM,sBAAsB;YAAC;SAAsB;QAEhFH,OAAOkB,QAAQW,SAAS,CAAC;QACzB7B,OAAO2B,WAAWG,oBAAoB,CAAC;QACvC9B,OAAOc,yBAAyBgB,oBAAoB,CAAC;YACnDC,YAAYsB;YACZ5B,SAAST;YACTU,WAAWX;YACXmB,aAAa;QACf;QAEAhC,GAAGqD,aAAa;IAClB;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/documents/__tests__/query.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {QueryDocumentCommand} from '../query.js'\n\n// Mock the config functions\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: vi.fn(),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\nconst testProjectId = 'test-project'\nconst testDataset = 'production'\n\ndescribe('#documents:query', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['documents query', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Query for documents\n\n USAGE\n $ sanity documents query QUERY [--anonymous] [--api-version <value>] [-d\n <value>] [--pretty] [-p <value>]\n\n ARGUMENTS\n QUERY GROQ query to run against the dataset\n\n FLAGS\n -d, --dataset=<value> Dataset to query (overrides config)\n -p, --project=<value> Project ID to query (overrides config)\n --anonymous Send the query without any authorization token\n --api-version=<value> [env: SANITY_CLI_QUERY_API_VERSION] API version to\n use (defaults to 2025-08-15)\n --pretty Colorize JSON output\n\n DESCRIPTION\n Query for documents\n\n EXAMPLES\n Fetch 5 documents of type \"movie\"\n\n $ sanity documents query '*[_type == \"movie\"][0..4]'\n\n Fetch title of the oldest movie in the dataset named \"staging\"\n\n $ sanity documents query '*[_type == \"movie\"]|order(releaseDate \\\n asc)[0]{title}' --dataset staging\n\n Use API version v2021-06-07 and do a query\n\n $ sanity documents query '*[_id == \"header\"] { \"headerText\": \\\n pt::text(body) }' --api-version v2021-06-07\n\n \"\n `)\n })\n\n test('executes query successfully with basic options', async () => {\n const mockResults = [\n {\n _id: 'movie1',\n _type: 'movie',\n title: 'The Matrix',\n },\n {\n _id: 'movie2',\n _type: 'movie',\n title: 'Inception',\n },\n ]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n // Mock the getProjectApiClient to return a mock client with fetch\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stdout).toContain('\"_id\": \"movie1\"')\n expect(stdout).toContain('\"title\": \"The Matrix\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n // Verify that getProjectCliClient was called with requireUser: true by default\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('executes query with pretty flag for colorized output', async () => {\n const mockResults = [{_id: 'test', title: 'Test Movie'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const originalChalkLevel = chalk.level\n // Force colorization\n chalk.level = 3\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--pretty'], {\n capture: {\n stripAnsi: false,\n },\n })\n\n // Reset chalk level\n chalk.level = originalChalkLevel\n\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(stdout).toContain('\"_id\"')\n expect(stdout).toContain('test')\n // eslint-disable-next-line no-control-regex\n expect(stdout).toMatch(/\\u001B\\[\\d+m/)\n })\n\n test('uses dataset flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideDataset = 'staging'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--dataset',\n overrideDataset,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: overrideDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('uses project flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideProject = 'other-project'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--project',\n overrideProject,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: overrideProject,\n requireUser: true,\n })\n })\n\n test('uses anonymous flag to skip authentication', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--anonymous'])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n // Verify that getProjectCliClient was called with requireUser: false\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: false,\n })\n })\n\n test('uses custom API version', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const customApiVersion = 'v2021-06-07'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--api-version',\n customApiVersion,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: customApiVersion,\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('shows warning and uses default API version when not specified', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stderr, stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stderr).toContain('--api-version not specified, using `2025-08-15`')\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: '2025-08-15',\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('fails when no project ID is configured or provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n },\n })\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no dataset is configured or provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: testProjectId,\n },\n })\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset specified')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when query returns null/undefined', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(null)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"nonexistent\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Query returned no results')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles query execution errors', async () => {\n const queryError = new Error('Invalid query syntax')\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockRejectedValue(queryError)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {error} = await testCommand(QueryDocumentCommand, ['invalid query'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Invalid GROQ query syntax: Invalid query syntax')\n expect(error?.message).toContain('Query: invalid query')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('uses environment variable for API version when set', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const envApiVersion = 'v2023-01-01'\n\n // Mock environment variable\n vi.stubEnv('SANITY_CLI_QUERY_API_VERSION', envApiVersion)\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: envApiVersion,\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n\n vi.unstubAllEnvs()\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","chalk","testCommand","afterEach","describe","expect","test","vi","QueryDocumentCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","getCliToken","mockGetCliConfig","mocked","mockGetProjectCliClient","testProjectId","testDataset","clearAllMocks","stdout","toMatchInlineSnapshot","String","raw","mockResults","_id","_type","title","api","dataset","projectId","mockFetch","fetch","toContain","toHaveBeenCalledWith","apiVersion","any","requireUser","originalChalkLevel","level","capture","stripAnsi","toMatch","overrideDataset","overrideProject","customApiVersion","stderr","error","toBeInstanceOf","Error","message","oclif","exit","toBe","queryError","mockRejectedValue","envApiVersion","stubEnv","unstubAllEnvs"],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -39,8 +39,12 @@ export declare class InitCommand extends SanityCommand<typeof InitCommand> {
|
|
|
39
39
|
yes: import("@oclif/core/interfaces").BooleanFlag<any>;
|
|
40
40
|
};
|
|
41
41
|
run(): Promise<void>;
|
|
42
|
+
private checkFlagsInUnattendedMode;
|
|
43
|
+
private createProject;
|
|
42
44
|
private ensureAuthenticated;
|
|
43
45
|
private getPlan;
|
|
46
|
+
private promptUserForNewOrganization;
|
|
47
|
+
private promptUserForOrganization;
|
|
44
48
|
private verifyCoupon;
|
|
45
49
|
private verifyPlan;
|
|
46
50
|
}
|