@sanity/cli 6.0.0-alpha.4 → 6.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/dev/startStudioDevServer.js +3 -8
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/dev/types.d.ts +1 -3
- package/dist/actions/dev/types.js.map +1 -1
- package/dist/actions/documents/validate.d.ts +0 -2
- package/dist/actions/documents/validate.js +21 -1
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/exec/execScript.js +1 -1
- package/dist/actions/exec/execScript.js.map +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/manifest/extractManifest.js +1 -4
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
- package/dist/actions/schema/deleteSchemaAction.js +12 -17
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
- package/dist/actions/schema/deploySchemas.d.ts +15 -0
- package/dist/actions/schema/deploySchemas.js +98 -0
- package/dist/actions/schema/deploySchemas.js.map +1 -0
- package/dist/actions/schema/listSchemas.d.ts +12 -0
- package/dist/actions/schema/listSchemas.js +119 -0
- package/dist/actions/schema/listSchemas.js.map +1 -0
- package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
- package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
- package/dist/actions/schema/utils/debug.d.ts +2 -0
- package/dist/actions/schema/utils/debug.js +5 -0
- package/dist/actions/schema/utils/debug.js.map +1 -0
- package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
- package/dist/actions/schema/utils/manifestExtractor.js +12 -17
- package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
- package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
- package/dist/actions/schema/utils/manifestReader.js +6 -12
- package/dist/actions/schema/utils/manifestReader.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
- package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
- package/dist/actions/users/getMembersForProject.d.ts +1 -3
- package/dist/actions/users/getMembersForProject.js +6 -17
- package/dist/actions/users/getMembersForProject.js.map +1 -1
- package/dist/actions/users/types.d.ts +0 -11
- package/dist/actions/users/types.js.map +1 -1
- package/dist/commands/__tests__/debug.test.js +113 -220
- package/dist/commands/__tests__/debug.test.js.map +1 -1
- package/dist/commands/__tests__/deploy.test.js +325 -293
- package/dist/commands/__tests__/deploy.test.js.map +1 -1
- package/dist/commands/__tests__/dev.test.js +62 -19
- package/dist/commands/__tests__/dev.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.authentication.test.js +40 -27
- package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.create-new-project.test.js +84 -85
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.plan.test.js +103 -44
- package/dist/commands/__tests__/init/init.plan.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.setup.test.js +85 -29
- package/dist/commands/__tests__/init/init.setup.test.js.map +1 -1
- package/dist/commands/__tests__/install.test.js +46 -22
- package/dist/commands/__tests__/install.test.js.map +1 -1
- package/dist/commands/__tests__/logout.test.js +8 -5
- package/dist/commands/__tests__/logout.test.js.map +1 -1
- package/dist/commands/__tests__/manage.test.js +29 -24
- package/dist/commands/__tests__/manage.test.js.map +1 -1
- package/dist/commands/__tests__/versions.test.js +22 -14
- package/dist/commands/__tests__/versions.test.js.map +1 -1
- package/dist/commands/backup/__tests__/disable.test.js +72 -75
- package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/download.test.js +166 -77
- package/dist/commands/backup/__tests__/download.test.js.map +1 -1
- package/dist/commands/backup/__tests__/enable.test.js +109 -140
- package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/list.test.js +84 -75
- package/dist/commands/backup/__tests__/list.test.js.map +1 -1
- package/dist/commands/backup/disable.js +5 -11
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/enable.js +5 -11
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +7 -8
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/__tests__/add.test.js +68 -38
- package/dist/commands/cors/__tests__/add.test.js.map +1 -1
- package/dist/commands/cors/__tests__/delete.test.js +52 -37
- package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
- package/dist/commands/cors/__tests__/list.test.js +80 -57
- package/dist/commands/cors/__tests__/list.test.js.map +1 -1
- package/dist/commands/cors/add.js +5 -13
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +7 -15
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -10
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/__tests__/copy.test.js +197 -89
- package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/create.test.js +147 -117
- package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/delete.test.js +75 -68
- package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/export.test.js +123 -83
- package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/list.test.js +107 -65
- package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
- package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
- package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
- package/dist/commands/dataset/export.js +4 -4
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
- package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
- package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
- package/dist/commands/dev.js +0 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/__tests__/search.test.js +8 -7
- package/dist/commands/docs/__tests__/search.test.js.map +1 -1
- package/dist/commands/documents/__tests__/create.test.js +328 -265
- package/dist/commands/documents/__tests__/create.test.js.map +1 -1
- package/dist/commands/documents/__tests__/delete.test.js +119 -87
- package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
- package/dist/commands/documents/__tests__/get.test.js +68 -95
- package/dist/commands/documents/__tests__/get.test.js.map +1 -1
- package/dist/commands/documents/__tests__/query.test.js +84 -189
- package/dist/commands/documents/__tests__/query.test.js.map +1 -1
- package/dist/commands/documents/__tests__/validate.test.js +52 -29
- package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
- package/dist/commands/documents/create.d.ts +1 -0
- package/dist/commands/documents/create.js +10 -9
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +2 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -3
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -3
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +0 -20
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/__tests__/list.test.js +57 -45
- package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
- package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
- package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +4 -9
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/__tests__/attempt.test.js +48 -33
- package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
- package/dist/commands/hook/__tests__/create.test.js +49 -51
- package/dist/commands/hook/__tests__/create.test.js.map +1 -1
- package/dist/commands/hook/__tests__/delete.test.js +43 -30
- package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
- package/dist/commands/hook/__tests__/list.test.js +38 -31
- package/dist/commands/hook/__tests__/list.test.js.map +1 -1
- package/dist/commands/hook/__tests__/logs.test.js +68 -40
- package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
- package/dist/commands/hook/create.js +2 -6
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +5 -17
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +2 -8
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/manifest/__tests__/extract.test.js +22 -13
- package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
- package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
- package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
- package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
- package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/export.test.js +365 -66
- package/dist/commands/media/__tests__/export.test.js.map +1 -1
- package/dist/commands/media/__tests__/import.test.js +171 -105
- package/dist/commands/media/__tests__/import.test.js.map +1 -1
- package/dist/commands/media/export.js +2 -2
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +2 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/projects/__tests__/list.test.js +5 -4
- package/dist/commands/projects/__tests__/list.test.js.map +1 -1
- package/dist/commands/projects/list.js +2 -6
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schema/__tests__/delete.test.js +396 -151
- package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
- package/dist/commands/schema/__tests__/deploy.test.js +348 -0
- package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
- package/dist/commands/schema/__tests__/extract.test.js +19 -11
- package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
- package/dist/commands/schema/__tests__/list.test.js +399 -0
- package/dist/commands/schema/__tests__/list.test.js.map +1 -0
- package/dist/commands/schema/__tests__/validate.test.js +27 -10
- package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
- package/dist/commands/schema/delete.d.ts +1 -1
- package/dist/commands/schema/delete.js +20 -23
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.d.ts +16 -0
- package/dist/commands/schema/deploy.js +98 -0
- package/dist/commands/schema/deploy.js.map +1 -0
- package/dist/commands/schema/list.d.ts +15 -0
- package/dist/commands/schema/list.js +104 -0
- package/dist/commands/schema/list.js.map +1 -0
- package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/status.test.js +7 -5
- package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/add.test.js +55 -40
- package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/delete.test.js +72 -42
- package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/list.test.js +87 -60
- package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
- package/dist/commands/tokens/add.js +3 -5
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/users/__tests__/invite.test.js +100 -79
- package/dist/commands/users/__tests__/invite.test.js.map +1 -1
- package/dist/commands/users/__tests__/list.test.js +186 -180
- package/dist/commands/users/__tests__/list.test.js.map +1 -1
- package/dist/commands/users/invite.js +6 -17
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +4 -7
- package/dist/commands/users/list.js.map +1 -1
- package/dist/config/createCliConfig.d.ts +4 -4
- package/dist/services/backup.d.ts +8 -0
- package/dist/services/backup.js +19 -0
- package/dist/services/backup.js.map +1 -1
- package/dist/services/cors.d.ts +23 -0
- package/dist/services/cors.js +38 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/graphql.d.ts +7 -0
- package/dist/services/graphql.js +11 -0
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/hooks.d.ts +2 -0
- package/dist/services/hooks.js +19 -0
- package/dist/services/hooks.js.map +1 -1
- package/dist/services/organizations.d.ts +1 -1
- package/dist/services/organizations.js +1 -1
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/projects.d.ts +11 -0
- package/dist/services/projects.js +41 -0
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.d.ts +4 -0
- package/dist/services/schemas.js +40 -0
- package/dist/services/schemas.js.map +1 -0
- package/dist/services/user.d.ts +8 -0
- package/dist/services/user.js +15 -2
- package/dist/services/user.js.map +1 -1
- package/dist/util/__tests__/getCliVersion.test.js +2 -2
- package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
- package/dist/util/errorMessages.d.ts +1 -0
- package/dist/util/errorMessages.js +1 -0
- package/dist/util/errorMessages.js.map +1 -1
- package/dist/util/getCliVersion.js +1 -1
- package/dist/util/getCliVersion.js.map +1 -1
- package/dist/util/readPackageJson.d.ts +1 -15
- package/dist/util/readPackageJson.js +1 -1
- package/dist/util/readPackageJson.js.map +1 -1
- package/dist/util/uniqBy.d.ts +1 -0
- package/dist/util/uniqBy.js +14 -0
- package/dist/util/uniqBy.js.map +1 -0
- package/oclif.manifest.json +172 -27
- package/package.json +27 -28
- package/dist/actions/cors/constants.d.ts +0 -1
- package/dist/actions/cors/constants.js +0 -3
- package/dist/actions/cors/constants.js.map +0 -1
- package/dist/actions/cors/types.d.ts +0 -9
- package/dist/actions/cors/types.js +0 -3
- package/dist/actions/cors/types.js.map +0 -1
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
- package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
- package/dist/actions/schema/schemaStoreConstants.js +0 -4
- package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
- package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
- package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
- package/dist/actions/schema/utils/schemaApiClient.js +0 -17
- package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
- package/dist/actions/users/apiVersion.d.ts +0 -6
- package/dist/actions/users/apiVersion.js +0 -7
- package/dist/actions/users/apiVersion.js.map +0 -1
|
@@ -2,27 +2,23 @@ import { runCommand } from '@oclif/test';
|
|
|
2
2
|
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
3
3
|
import nock from 'nock';
|
|
4
4
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
5
|
-
import { CORS_API_VERSION } from '../../../
|
|
5
|
+
import { CORS_API_VERSION } from '../../../services/cors.js';
|
|
6
6
|
import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
7
7
|
import { List } from '../list.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}));
|
|
23
|
-
vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
|
|
24
|
-
getCliToken: vi.fn().mockResolvedValue('test-token')
|
|
25
|
-
}));
|
|
8
|
+
const testProjectId = 'test-project';
|
|
9
|
+
const defaultMocks = {
|
|
10
|
+
cliConfig: {
|
|
11
|
+
api: {
|
|
12
|
+
projectId: testProjectId
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
projectRoot: {
|
|
16
|
+
directory: '/test/path',
|
|
17
|
+
path: '/test/path/sanity.config.ts',
|
|
18
|
+
type: 'studio'
|
|
19
|
+
},
|
|
20
|
+
token: 'test-token'
|
|
21
|
+
};
|
|
26
22
|
describe('#list', ()=>{
|
|
27
23
|
afterEach(()=>{
|
|
28
24
|
vi.clearAllMocks();
|
|
@@ -40,7 +36,7 @@ describe('#list', ()=>{
|
|
|
40
36
|
test('displays CORS origins correctly', async ()=>{
|
|
41
37
|
mockApi({
|
|
42
38
|
apiVersion: CORS_API_VERSION,
|
|
43
|
-
uri:
|
|
39
|
+
uri: `/projects/${testProjectId}/cors`
|
|
44
40
|
}).reply(200, [
|
|
45
41
|
{
|
|
46
42
|
allowCredentials: true,
|
|
@@ -48,7 +44,7 @@ describe('#list', ()=>{
|
|
|
48
44
|
deletedAt: null,
|
|
49
45
|
id: 1,
|
|
50
46
|
origin: 'https://example.com',
|
|
51
|
-
projectId:
|
|
47
|
+
projectId: testProjectId,
|
|
52
48
|
updatedAt: '2023-01-02T00:00:00Z'
|
|
53
49
|
},
|
|
54
50
|
{
|
|
@@ -57,7 +53,7 @@ describe('#list', ()=>{
|
|
|
57
53
|
deletedAt: null,
|
|
58
54
|
id: 2,
|
|
59
55
|
origin: 'https://app.example.com',
|
|
60
|
-
projectId:
|
|
56
|
+
projectId: testProjectId,
|
|
61
57
|
updatedAt: null
|
|
62
58
|
},
|
|
63
59
|
{
|
|
@@ -66,17 +62,19 @@ describe('#list', ()=>{
|
|
|
66
62
|
deletedAt: null,
|
|
67
63
|
id: 3,
|
|
68
64
|
origin: 'http://localhost:3000',
|
|
69
|
-
projectId:
|
|
65
|
+
projectId: testProjectId,
|
|
70
66
|
updatedAt: null
|
|
71
67
|
}
|
|
72
68
|
]);
|
|
73
|
-
const { stdout } = await testCommand(List
|
|
69
|
+
const { stdout } = await testCommand(List, [], {
|
|
70
|
+
mocks: defaultMocks
|
|
71
|
+
});
|
|
74
72
|
expect(stdout).toBe('https://example.com\nhttps://app.example.com\nhttp://localhost:3000\n');
|
|
75
73
|
});
|
|
76
74
|
test('displays single CORS origin correctly', async ()=>{
|
|
77
75
|
mockApi({
|
|
78
76
|
apiVersion: CORS_API_VERSION,
|
|
79
|
-
uri:
|
|
77
|
+
uri: `/projects/${testProjectId}/cors`
|
|
80
78
|
}).reply(200, [
|
|
81
79
|
{
|
|
82
80
|
allowCredentials: true,
|
|
@@ -84,92 +82,113 @@ describe('#list', ()=>{
|
|
|
84
82
|
deletedAt: null,
|
|
85
83
|
id: 1,
|
|
86
84
|
origin: 'https://single-origin.com',
|
|
87
|
-
projectId:
|
|
85
|
+
projectId: testProjectId,
|
|
88
86
|
updatedAt: null
|
|
89
87
|
}
|
|
90
88
|
]);
|
|
91
|
-
const { stdout } = await testCommand(List
|
|
89
|
+
const { stdout } = await testCommand(List, [], {
|
|
90
|
+
mocks: defaultMocks
|
|
91
|
+
});
|
|
92
92
|
expect(stdout).toBe('https://single-origin.com\n');
|
|
93
93
|
});
|
|
94
94
|
test('handles empty CORS origins list', async ()=>{
|
|
95
95
|
mockApi({
|
|
96
96
|
apiVersion: CORS_API_VERSION,
|
|
97
|
-
uri:
|
|
97
|
+
uri: `/projects/${testProjectId}/cors`
|
|
98
98
|
}).reply(200, []);
|
|
99
|
-
const { stdout } = await testCommand(List
|
|
99
|
+
const { stdout } = await testCommand(List, [], {
|
|
100
|
+
mocks: defaultMocks
|
|
101
|
+
});
|
|
100
102
|
expect(stdout).toBe('No CORS origins configured for this project.\n');
|
|
101
103
|
});
|
|
102
104
|
test('displays an error if the API request fails', async ()=>{
|
|
103
105
|
mockApi({
|
|
104
106
|
apiVersion: CORS_API_VERSION,
|
|
105
|
-
uri:
|
|
107
|
+
uri: `/projects/${testProjectId}/cors`
|
|
106
108
|
}).reply(500, {
|
|
107
109
|
message: 'Internal Server Error'
|
|
108
110
|
});
|
|
109
|
-
const { error } = await testCommand(List
|
|
111
|
+
const { error } = await testCommand(List, [], {
|
|
112
|
+
mocks: defaultMocks
|
|
113
|
+
});
|
|
110
114
|
expect(error).toBeInstanceOf(Error);
|
|
111
115
|
expect(error?.message).toContain('CORS origins list retrieval failed');
|
|
112
116
|
expect(error?.message).toContain('Internal Server Error');
|
|
113
117
|
});
|
|
114
118
|
test('handles network errors gracefully', async ()=>{
|
|
115
119
|
// Don't set up any mock to simulate network failure
|
|
116
|
-
const { error } = await testCommand(List
|
|
120
|
+
const { error } = await testCommand(List, [], {
|
|
121
|
+
mocks: defaultMocks
|
|
122
|
+
});
|
|
117
123
|
expect(error).toBeInstanceOf(Error);
|
|
118
124
|
expect(error?.message).toContain('CORS origins list retrieval failed');
|
|
119
125
|
// The actual error can vary (authorization, network, etc.) so just check the wrapper
|
|
120
126
|
});
|
|
121
127
|
test('throws error when no project ID is found', async ()=>{
|
|
122
|
-
const {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
const { error } = await testCommand(List, [], {
|
|
129
|
+
mocks: {
|
|
130
|
+
...defaultMocks,
|
|
131
|
+
cliConfig: {
|
|
132
|
+
api: {
|
|
133
|
+
projectId: undefined
|
|
134
|
+
}
|
|
135
|
+
}
|
|
126
136
|
}
|
|
127
137
|
});
|
|
128
|
-
const { error } = await testCommand(List);
|
|
129
138
|
expect(error).toBeInstanceOf(Error);
|
|
130
139
|
expect(error?.message).toEqual(NO_PROJECT_ID);
|
|
131
140
|
});
|
|
132
141
|
test('throws error when project ID is null', async ()=>{
|
|
133
|
-
const {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
142
|
+
const { error } = await testCommand(List, [], {
|
|
143
|
+
mocks: {
|
|
144
|
+
...defaultMocks,
|
|
145
|
+
cliConfig: {
|
|
146
|
+
api: {
|
|
147
|
+
projectId: undefined
|
|
148
|
+
}
|
|
149
|
+
}
|
|
137
150
|
}
|
|
138
151
|
});
|
|
139
|
-
const { error } = await testCommand(List);
|
|
140
152
|
expect(error).toBeInstanceOf(Error);
|
|
141
153
|
expect(error?.message).toEqual(NO_PROJECT_ID);
|
|
142
154
|
});
|
|
143
155
|
test('throws error when project ID is empty string', async ()=>{
|
|
144
|
-
const {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
156
|
+
const { error } = await testCommand(List, [], {
|
|
157
|
+
mocks: {
|
|
158
|
+
...defaultMocks,
|
|
159
|
+
cliConfig: {
|
|
160
|
+
api: {
|
|
161
|
+
projectId: ''
|
|
162
|
+
}
|
|
163
|
+
}
|
|
148
164
|
}
|
|
149
165
|
});
|
|
150
|
-
const { error } = await testCommand(List);
|
|
151
166
|
expect(error).toBeInstanceOf(Error);
|
|
152
167
|
expect(error?.message).toEqual(NO_PROJECT_ID);
|
|
153
168
|
});
|
|
154
169
|
test('handles non-array API response', async ()=>{
|
|
155
170
|
mockApi({
|
|
156
171
|
apiVersion: CORS_API_VERSION,
|
|
157
|
-
uri:
|
|
172
|
+
uri: `/projects/${testProjectId}/cors`
|
|
158
173
|
}).reply(200, {
|
|
159
174
|
message: 'Not an array'
|
|
160
175
|
});
|
|
161
|
-
const { error } = await testCommand(List
|
|
176
|
+
const { error } = await testCommand(List, [], {
|
|
177
|
+
mocks: defaultMocks
|
|
178
|
+
});
|
|
162
179
|
expect(error).toBeInstanceOf(Error);
|
|
163
180
|
expect(error?.message).toContain('origins.map is not a function');
|
|
164
181
|
});
|
|
165
182
|
test('handles 404 error gracefully', async ()=>{
|
|
166
183
|
mockApi({
|
|
167
184
|
apiVersion: CORS_API_VERSION,
|
|
168
|
-
uri:
|
|
185
|
+
uri: `/projects/${testProjectId}/cors`
|
|
169
186
|
}).reply(404, {
|
|
170
187
|
message: 'Project not found'
|
|
171
188
|
});
|
|
172
|
-
const { error } = await testCommand(List
|
|
189
|
+
const { error } = await testCommand(List, [], {
|
|
190
|
+
mocks: defaultMocks
|
|
191
|
+
});
|
|
173
192
|
expect(error).toBeInstanceOf(Error);
|
|
174
193
|
expect(error?.message).toContain('CORS origins list retrieval failed');
|
|
175
194
|
expect(error?.message).toContain('Project not found');
|
|
@@ -177,11 +196,13 @@ describe('#list', ()=>{
|
|
|
177
196
|
test('handles 403 forbidden error', async ()=>{
|
|
178
197
|
mockApi({
|
|
179
198
|
apiVersion: CORS_API_VERSION,
|
|
180
|
-
uri:
|
|
199
|
+
uri: `/projects/${testProjectId}/cors`
|
|
181
200
|
}).reply(403, {
|
|
182
201
|
message: 'Forbidden'
|
|
183
202
|
});
|
|
184
|
-
const { error } = await testCommand(List
|
|
203
|
+
const { error } = await testCommand(List, [], {
|
|
204
|
+
mocks: defaultMocks
|
|
205
|
+
});
|
|
185
206
|
expect(error).toBeInstanceOf(Error);
|
|
186
207
|
expect(error?.message).toContain('CORS origins list retrieval failed');
|
|
187
208
|
expect(error?.message).toContain('Forbidden');
|
|
@@ -189,7 +210,7 @@ describe('#list', ()=>{
|
|
|
189
210
|
test('handles origins with special characters', async ()=>{
|
|
190
211
|
mockApi({
|
|
191
212
|
apiVersion: CORS_API_VERSION,
|
|
192
|
-
uri:
|
|
213
|
+
uri: `/projects/${testProjectId}/cors`
|
|
193
214
|
}).reply(200, [
|
|
194
215
|
{
|
|
195
216
|
allowCredentials: true,
|
|
@@ -197,7 +218,7 @@ describe('#list', ()=>{
|
|
|
197
218
|
deletedAt: null,
|
|
198
219
|
id: 1,
|
|
199
220
|
origin: 'https://café.example.com',
|
|
200
|
-
projectId:
|
|
221
|
+
projectId: testProjectId,
|
|
201
222
|
updatedAt: null
|
|
202
223
|
},
|
|
203
224
|
{
|
|
@@ -206,11 +227,13 @@ describe('#list', ()=>{
|
|
|
206
227
|
deletedAt: null,
|
|
207
228
|
id: 2,
|
|
208
229
|
origin: 'https://example.com:8080',
|
|
209
|
-
projectId:
|
|
230
|
+
projectId: testProjectId,
|
|
210
231
|
updatedAt: null
|
|
211
232
|
}
|
|
212
233
|
]);
|
|
213
|
-
const { stdout } = await testCommand(List
|
|
234
|
+
const { stdout } = await testCommand(List, [], {
|
|
235
|
+
mocks: defaultMocks
|
|
236
|
+
});
|
|
214
237
|
expect(stdout).toBe('https://café.example.com\nhttps://example.com:8080\n');
|
|
215
238
|
});
|
|
216
239
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/cors/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {CORS_API_VERSION} from '../../../actions/cors/constants.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {List} from '../list.js'\n\n// Mock the config functions with relative paths\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().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\ndescribe('#list', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['cors list', '--help'])\n\n expect(stdout).toContain('List all origins allowed to access the API for this project')\n })\n\n test('displays CORS origins correctly', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(200, [\n {\n allowCredentials: true,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 1,\n origin: 'https://example.com',\n projectId: 'test-project',\n updatedAt: '2023-01-02T00:00:00Z',\n },\n {\n allowCredentials: false,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 2,\n origin: 'https://app.example.com',\n projectId: 'test-project',\n updatedAt: null,\n },\n {\n allowCredentials: true,\n createdAt: '2023-01-03T00:00:00Z',\n deletedAt: null,\n id: 3,\n origin: 'http://localhost:3000',\n projectId: 'test-project',\n updatedAt: null,\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toBe('https://example.com\\nhttps://app.example.com\\nhttp://localhost:3000\\n')\n })\n\n test('displays single CORS origin correctly', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(200, [\n {\n allowCredentials: true,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 1,\n origin: 'https://single-origin.com',\n projectId: 'test-project',\n updatedAt: null,\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toBe('https://single-origin.com\\n')\n })\n\n test('handles empty CORS origins list', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(200, [])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toBe('No CORS origins configured for this project.\\n')\n })\n\n test('displays an error if the API request fails', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n expect(error?.message).toContain('Internal Server Error')\n })\n\n test('handles network errors gracefully', async () => {\n // Don't set up any mock to simulate network failure\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n // The actual error can vary (authorization, network, etc.) so just check the wrapper\n })\n\n test('throws error when no project ID is found', async () => {\n const {getCliConfig} = await import('../../../../../cli-core/src/config/cli/getCliConfig.js')\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('throws error when project ID is null', async () => {\n const {getCliConfig} = await import('../../../../../cli-core/src/config/cli/getCliConfig.js')\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('throws error when project ID is empty string', async () => {\n const {getCliConfig} = await import('../../../../../cli-core/src/config/cli/getCliConfig.js')\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: '',\n },\n })\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('handles non-array API response', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(200, {message: 'Not an array'})\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('origins.map is not a function')\n })\n\n test('handles 404 error gracefully', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(404, {message: 'Project not found'})\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n expect(error?.message).toContain('Project not found')\n })\n\n test('handles 403 forbidden error', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(403, {message: 'Forbidden'})\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n expect(error?.message).toContain('Forbidden')\n })\n\n test('handles origins with special characters', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: '/projects/test-project/cors',\n }).reply(200, [\n {\n allowCredentials: true,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 1,\n origin: 'https://café.example.com',\n projectId: 'test-project',\n updatedAt: null,\n },\n {\n allowCredentials: false,\n createdAt: '2023-01-02T00:00:00Z',\n deletedAt: null,\n id: 2,\n origin: 'https://example.com:8080',\n projectId: 'test-project',\n updatedAt: null,\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toBe('https://café.example.com\\nhttps://example.com:8080\\n')\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","CORS_API_VERSION","NO_PROJECT_ID","List","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","getCliConfig","api","projectId","getCliToken","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","allowCredentials","createdAt","deletedAt","id","origin","updatedAt","toBe","message","error","toBeInstanceOf","Error","mocked","mockResolvedValueOnce","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/cors/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {CORS_API_VERSION} from '../../../services/cors.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {List} from '../list.js'\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\ndescribe('#list', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['cors list', '--help'])\n\n expect(stdout).toContain('List all origins allowed to access the API for this project')\n })\n\n test('displays CORS origins correctly', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(200, [\n {\n allowCredentials: true,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 1,\n origin: 'https://example.com',\n projectId: testProjectId,\n updatedAt: '2023-01-02T00:00:00Z',\n },\n {\n allowCredentials: false,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 2,\n origin: 'https://app.example.com',\n projectId: testProjectId,\n updatedAt: null,\n },\n {\n allowCredentials: true,\n createdAt: '2023-01-03T00:00:00Z',\n deletedAt: null,\n id: 3,\n origin: 'http://localhost:3000',\n projectId: testProjectId,\n updatedAt: null,\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe('https://example.com\\nhttps://app.example.com\\nhttp://localhost:3000\\n')\n })\n\n test('displays single CORS origin correctly', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(200, [\n {\n allowCredentials: true,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 1,\n origin: 'https://single-origin.com',\n projectId: testProjectId,\n updatedAt: null,\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe('https://single-origin.com\\n')\n })\n\n test('handles empty CORS origins list', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(200, [])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe('No CORS origins configured for this project.\\n')\n })\n\n test('displays an error if the API request fails', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(500, {message: 'Internal Server Error'})\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n expect(error?.message).toContain('Internal Server Error')\n })\n\n test('handles network errors gracefully', async () => {\n // Don't set up any mock to simulate network failure\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n // The actual error can vary (authorization, network, etc.) so just check the wrapper\n })\n\n test('throws error when no project ID is found', async () => {\n const {error} = await testCommand(List, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('throws error when project ID is null', async () => {\n const {error} = await testCommand(List, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('throws error when project ID is empty string', async () => {\n const {error} = await testCommand(List, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: ''}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n })\n\n test('handles non-array API response', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(200, {message: 'Not an array'})\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('origins.map is not a function')\n })\n\n test('handles 404 error gracefully', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(404, {message: 'Project not found'})\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n expect(error?.message).toContain('Project not found')\n })\n\n test('handles 403 forbidden error', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(403, {message: 'Forbidden'})\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('CORS origins list retrieval failed')\n expect(error?.message).toContain('Forbidden')\n })\n\n test('handles origins with special characters', async () => {\n mockApi({\n apiVersion: CORS_API_VERSION,\n uri: `/projects/${testProjectId}/cors`,\n }).reply(200, [\n {\n allowCredentials: true,\n createdAt: '2023-01-01T00:00:00Z',\n deletedAt: null,\n id: 1,\n origin: 'https://café.example.com',\n projectId: testProjectId,\n updatedAt: null,\n },\n {\n allowCredentials: false,\n createdAt: '2023-01-02T00:00:00Z',\n deletedAt: null,\n id: 2,\n origin: 'https://example.com:8080',\n projectId: testProjectId,\n updatedAt: null,\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe('https://café.example.com\\nhttps://example.com:8080\\n')\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","CORS_API_VERSION","NO_PROJECT_ID","List","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","allowCredentials","createdAt","deletedAt","id","origin","updatedAt","mocks","toBe","message","error","toBeInstanceOf","Error","undefined"],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import { Args, Flags } from '@oclif/core';
|
|
|
4
4
|
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
5
5
|
import { chalk, confirm, logSymbols } from '@sanity/cli-core/ux';
|
|
6
6
|
import { oneline } from 'oneline';
|
|
7
|
-
import { CORS_API_VERSION } from '../../actions/cors/constants.js';
|
|
8
7
|
import { filterAndValidateOrigin } from '../../actions/cors/filterAndValidateOrigin.js';
|
|
8
|
+
import { createCorsOrigin } from '../../services/cors.js';
|
|
9
9
|
import { NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
10
10
|
const addCorsDebug = subdebug('cors:add');
|
|
11
11
|
export class Add extends SanityCommand {
|
|
@@ -41,10 +41,6 @@ export class Add extends SanityCommand {
|
|
|
41
41
|
async run() {
|
|
42
42
|
const { args, flags } = await this.parse(Add);
|
|
43
43
|
const { origin } = args;
|
|
44
|
-
const client = await this.getGlobalApiClient({
|
|
45
|
-
apiVersion: CORS_API_VERSION,
|
|
46
|
-
requireUser: true
|
|
47
|
-
});
|
|
48
44
|
// Ensure we have project context
|
|
49
45
|
const projectId = await this.getProjectId();
|
|
50
46
|
if (!projectId) {
|
|
@@ -76,14 +72,10 @@ export class Add extends SanityCommand {
|
|
|
76
72
|
this.log(`Normalized origin to: ${filteredOrigin}`);
|
|
77
73
|
}
|
|
78
74
|
try {
|
|
79
|
-
const response = await
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
},
|
|
84
|
-
maxRedirects: 0,
|
|
85
|
-
method: 'POST',
|
|
86
|
-
uri: `/projects/${projectId}/cors`
|
|
75
|
+
const response = await createCorsOrigin({
|
|
76
|
+
allowCredentials,
|
|
77
|
+
origin: filteredOrigin,
|
|
78
|
+
projectId
|
|
87
79
|
});
|
|
88
80
|
addCorsDebug(`CORS origin added successfully`, response);
|
|
89
81
|
this.log('CORS origin added successfully');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/cors/add.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk, confirm, logSymbols} from '@sanity/cli-core/ux'\nimport {oneline} from 'oneline'\n\nimport {CORS_API_VERSION} from '../../actions/cors/constants.js'\nimport {filterAndValidateOrigin} from '../../actions/cors/filterAndValidateOrigin.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst addCorsDebug = subdebug('cors:add')\n\nexport class Add extends SanityCommand<typeof Add> {\n static override args = {\n origin: Args.string({\n description: 'Origin to allow (e.g., https://example.com)',\n required: true,\n }),\n }\n\n static override description = 'Allow a new origin to use your project API through CORS'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively add a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> http://localhost:3000 --no-credentials',\n description: 'Add a localhost origin without credentials',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://myapp.com --credentials',\n description: 'Add a production origin with credentials allowed',\n },\n ]\n\n static override flags = {\n credentials: Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Allow credentials (token/cookie) to be sent from this origin',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(Add)\n const {origin} = args\n\n const client = await this.getGlobalApiClient({\n apiVersion: CORS_API_VERSION,\n requireUser: true,\n })\n\n // Ensure we have project context\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n // Check if the origin argument looks like a file path and warn\n try {\n const isFile = fs.existsSync(path.join(process.cwd(), args.origin))\n if (isFile) {\n this.warn(`Origin \"${args.origin}?\" Remember to quote values (sanity cors add \"*\")`)\n }\n } catch {\n // Ignore errors checking if it's a file\n }\n\n const filteredOrigin = await filterAndValidateOrigin(origin, this.output)\n const hasWildcard = origin.includes('*')\n\n if (hasWildcard) {\n const confirmed = await this.promptForWildcardConfirmation(origin)\n if (!confirmed) {\n this.error('Operation cancelled', {exit: 1})\n }\n }\n\n const allowCredentials =\n flags.credentials === undefined\n ? await this.promptForCredentials(hasWildcard)\n : Boolean(flags.credentials)\n\n if (filteredOrigin !== origin) {\n this.log(`Normalized origin to: ${filteredOrigin}`)\n }\n\n try {\n const response = await client.request({\n body: {\n allowCredentials,\n origin: filteredOrigin,\n },\n maxRedirects: 0,\n method: 'POST',\n uri: `/projects/${projectId}/cors`,\n })\n\n addCorsDebug(`CORS origin added successfully`, response)\n\n this.log('CORS origin added successfully')\n } catch (error) {\n const err = error as Error\n\n addCorsDebug(`Error adding CORS origin`, err)\n this.error(`CORS origin addition failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n /**\n * Prompt the user for credentials\n *\n * @param hasWildcard - Whether the origin contains a wildcard\n * @returns - Whether to allow credentials\n */\n private async promptForCredentials(hasWildcard: boolean) {\n this.log('')\n if (hasWildcard) {\n this.log(oneline`\n ${chalk.yellow(`${logSymbols.warning} Warning:`)}\n We ${chalk.red(chalk.underline('HIGHLY'))} recommend NOT allowing credentials\n on origins containing wildcards. If you are logged in to a studio, people will\n be able to send requests ${chalk.underline('on your behalf')} to read and modify\n data, from any matching origin. Please tread carefully!\n `)\n } else {\n this.log(oneline`\n ${chalk.yellow(`${logSymbols.warning} Warning:`)}\n Should this origin be allowed to send requests using authentication tokens or\n session cookies? Be aware that any script on this origin will be able to send\n requests ${chalk.underline('on your behalf')} to read and modify data if you\n are logged in to a Sanity studio. If this origin hosts a studio, you will need\n this, otherwise you should probably answer \"No\" (n).\n `)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Allow credentials to be sent from this origin? Please read the warning above.\n `,\n })\n }\n\n /**\n * Prompt the user for wildcard confirmation\n *\n * @param origin - The origin to check for wildcards\n * @returns - Whether to allow the origin\n */\n private async promptForWildcardConfirmation(origin: string) {\n this.log('')\n this.log(chalk.yellow(`${logSymbols.warning} Warning: Examples of allowed origins:`))\n\n if (origin === '*') {\n this.log('- http://www.some-malicious.site')\n this.log('- https://not.what-you-were-expecting.com')\n this.log('- https://high-traffic-site.com')\n this.log('- http://192.168.1.1:8080')\n } else {\n this.log(`- ${origin.replace(/:\\*/, ':1234').replaceAll('*', 'foo')}`)\n this.log(`- ${origin.replace(/:\\*/, ':3030').replaceAll('*', 'foo.bar')}`)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Using wildcards can be ${chalk.red('risky')}.\n Are you ${chalk.underline('absolutely sure')} you want to allow this origin?`,\n })\n }\n}\n"],"names":["fs","path","Args","Flags","SanityCommand","subdebug","chalk","confirm","logSymbols","oneline","CORS_API_VERSION","filterAndValidateOrigin","NO_PROJECT_ID","addCorsDebug","Add","args","origin","string","description","required","examples","command","flags","credentials","boolean","allowNo","default","undefined","run","parse","client","getGlobalApiClient","apiVersion","requireUser","projectId","getProjectId","error","exit","isFile","existsSync","join","process","cwd","warn","filteredOrigin","output","hasWildcard","includes","confirmed","promptForWildcardConfirmation","allowCredentials","promptForCredentials","Boolean","log","response","request","body","maxRedirects","method","uri","err","message","yellow","warning","red","underline","replace","replaceAll"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/cors/add.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {chalk, confirm, logSymbols} from '@sanity/cli-core/ux'\nimport {oneline} from 'oneline'\n\nimport {filterAndValidateOrigin} from '../../actions/cors/filterAndValidateOrigin.js'\nimport {createCorsOrigin} from '../../services/cors.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst addCorsDebug = subdebug('cors:add')\n\nexport class Add extends SanityCommand<typeof Add> {\n static override args = {\n origin: Args.string({\n description: 'Origin to allow (e.g., https://example.com)',\n required: true,\n }),\n }\n\n static override description = 'Allow a new origin to use your project API through CORS'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively add a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> http://localhost:3000 --no-credentials',\n description: 'Add a localhost origin without credentials',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://myapp.com --credentials',\n description: 'Add a production origin with credentials allowed',\n },\n ]\n\n static override flags = {\n credentials: Flags.boolean({\n allowNo: true,\n default: undefined,\n description: 'Allow credentials (token/cookie) to be sent from this origin',\n required: false,\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(Add)\n const {origin} = args\n\n // Ensure we have project context\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n // Check if the origin argument looks like a file path and warn\n try {\n const isFile = fs.existsSync(path.join(process.cwd(), args.origin))\n if (isFile) {\n this.warn(`Origin \"${args.origin}?\" Remember to quote values (sanity cors add \"*\")`)\n }\n } catch {\n // Ignore errors checking if it's a file\n }\n\n const filteredOrigin = await filterAndValidateOrigin(origin, this.output)\n const hasWildcard = origin.includes('*')\n\n if (hasWildcard) {\n const confirmed = await this.promptForWildcardConfirmation(origin)\n if (!confirmed) {\n this.error('Operation cancelled', {exit: 1})\n }\n }\n\n const allowCredentials =\n flags.credentials === undefined\n ? await this.promptForCredentials(hasWildcard)\n : Boolean(flags.credentials)\n\n if (filteredOrigin !== origin) {\n this.log(`Normalized origin to: ${filteredOrigin}`)\n }\n\n try {\n const response = await createCorsOrigin({\n allowCredentials,\n origin: filteredOrigin,\n projectId,\n })\n\n addCorsDebug(`CORS origin added successfully`, response)\n\n this.log('CORS origin added successfully')\n } catch (error) {\n const err = error as Error\n\n addCorsDebug(`Error adding CORS origin`, err)\n this.error(`CORS origin addition failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n /**\n * Prompt the user for credentials\n *\n * @param hasWildcard - Whether the origin contains a wildcard\n * @returns - Whether to allow credentials\n */\n private async promptForCredentials(hasWildcard: boolean) {\n this.log('')\n if (hasWildcard) {\n this.log(oneline`\n ${chalk.yellow(`${logSymbols.warning} Warning:`)}\n We ${chalk.red(chalk.underline('HIGHLY'))} recommend NOT allowing credentials\n on origins containing wildcards. If you are logged in to a studio, people will\n be able to send requests ${chalk.underline('on your behalf')} to read and modify\n data, from any matching origin. Please tread carefully!\n `)\n } else {\n this.log(oneline`\n ${chalk.yellow(`${logSymbols.warning} Warning:`)}\n Should this origin be allowed to send requests using authentication tokens or\n session cookies? Be aware that any script on this origin will be able to send\n requests ${chalk.underline('on your behalf')} to read and modify data if you\n are logged in to a Sanity studio. If this origin hosts a studio, you will need\n this, otherwise you should probably answer \"No\" (n).\n `)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Allow credentials to be sent from this origin? Please read the warning above.\n `,\n })\n }\n\n /**\n * Prompt the user for wildcard confirmation\n *\n * @param origin - The origin to check for wildcards\n * @returns - Whether to allow the origin\n */\n private async promptForWildcardConfirmation(origin: string) {\n this.log('')\n this.log(chalk.yellow(`${logSymbols.warning} Warning: Examples of allowed origins:`))\n\n if (origin === '*') {\n this.log('- http://www.some-malicious.site')\n this.log('- https://not.what-you-were-expecting.com')\n this.log('- https://high-traffic-site.com')\n this.log('- http://192.168.1.1:8080')\n } else {\n this.log(`- ${origin.replace(/:\\*/, ':1234').replaceAll('*', 'foo')}`)\n this.log(`- ${origin.replace(/:\\*/, ':3030').replaceAll('*', 'foo.bar')}`)\n }\n\n this.log('')\n\n return confirm({\n default: false,\n message: oneline`\n Using wildcards can be ${chalk.red('risky')}.\n Are you ${chalk.underline('absolutely sure')} you want to allow this origin?`,\n })\n }\n}\n"],"names":["fs","path","Args","Flags","SanityCommand","subdebug","chalk","confirm","logSymbols","oneline","filterAndValidateOrigin","createCorsOrigin","NO_PROJECT_ID","addCorsDebug","Add","args","origin","string","description","required","examples","command","flags","credentials","boolean","allowNo","default","undefined","run","parse","projectId","getProjectId","error","exit","isFile","existsSync","join","process","cwd","warn","filteredOrigin","output","hasWildcard","includes","confirmed","promptForWildcardConfirmation","allowCredentials","promptForCredentials","Boolean","log","response","err","message","yellow","warning","red","underline","replace","replaceAll"],"mappings":"AAAA,OAAOA,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAE5B,SAAQC,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,KAAK,EAAEC,OAAO,EAAEC,UAAU,QAAO,sBAAqB;AAC9D,SAAQC,OAAO,QAAO,UAAS;AAE/B,SAAQC,uBAAuB,QAAO,gDAA+C;AACrF,SAAQC,gBAAgB,QAAO,yBAAwB;AACvD,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,eAAeR,SAAS;AAE9B,OAAO,MAAMS,YAAYV;IACvB,OAAgBW,OAAO;QACrBC,QAAQd,KAAKe,MAAM,CAAC;YAClBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,0DAAyD;IAEvF,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,aAAapB,MAAMqB,OAAO,CAAC;YACzBC,SAAS;YACTC,SAASC;YACTT,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,MAAaS,MAAqB;QAChC,MAAM,EAACb,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACf;QACvC,MAAM,EAACE,MAAM,EAAC,GAAGD;QAEjB,iCAAiC;QACjC,MAAMe,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACpB,eAAe;gBAACqB,MAAM;YAAC;QACpC;QAEA,+DAA+D;QAC/D,IAAI;YACF,MAAMC,SAASlC,GAAGmC,UAAU,CAAClC,KAAKmC,IAAI,CAACC,QAAQC,GAAG,IAAIvB,KAAKC,MAAM;YACjE,IAAIkB,QAAQ;gBACV,IAAI,CAACK,IAAI,CAAC,CAAC,QAAQ,EAAExB,KAAKC,MAAM,CAAC,iDAAiD,CAAC;YACrF;QACF,EAAE,OAAM;QACN,wCAAwC;QAC1C;QAEA,MAAMwB,iBAAiB,MAAM9B,wBAAwBM,QAAQ,IAAI,CAACyB,MAAM;QACxE,MAAMC,cAAc1B,OAAO2B,QAAQ,CAAC;QAEpC,IAAID,aAAa;YACf,MAAME,YAAY,MAAM,IAAI,CAACC,6BAA6B,CAAC7B;YAC3D,IAAI,CAAC4B,WAAW;gBACd,IAAI,CAACZ,KAAK,CAAC,uBAAuB;oBAACC,MAAM;gBAAC;YAC5C;QACF;QAEA,MAAMa,mBACJxB,MAAMC,WAAW,KAAKI,YAClB,MAAM,IAAI,CAACoB,oBAAoB,CAACL,eAChCM,QAAQ1B,MAAMC,WAAW;QAE/B,IAAIiB,mBAAmBxB,QAAQ;YAC7B,IAAI,CAACiC,GAAG,CAAC,CAAC,sBAAsB,EAAET,gBAAgB;QACpD;QAEA,IAAI;YACF,MAAMU,WAAW,MAAMvC,iBAAiB;gBACtCmC;gBACA9B,QAAQwB;gBACRV;YACF;YAEAjB,aAAa,CAAC,8BAA8B,CAAC,EAAEqC;YAE/C,IAAI,CAACD,GAAG,CAAC;QACX,EAAE,OAAOjB,OAAO;YACd,MAAMmB,MAAMnB;YAEZnB,aAAa,CAAC,wBAAwB,CAAC,EAAEsC;YACzC,IAAI,CAACnB,KAAK,CAAC,CAAC,8BAA8B,EAAEmB,IAAIC,OAAO,EAAE,EAAE;gBAACnB,MAAM;YAAC;QACrE;IACF;IAEA;;;;;GAKC,GACD,MAAcc,qBAAqBL,WAAoB,EAAE;QACvD,IAAI,CAACO,GAAG,CAAC;QACT,IAAIP,aAAa;YACf,IAAI,CAACO,GAAG,CAACxC,OAAO,CAAC;MACjB,EAAEH,MAAM+C,MAAM,CAAC,GAAG7C,WAAW8C,OAAO,CAAC,SAAS,CAAC,EAAE;SAC9C,EAAEhD,MAAMiD,GAAG,CAACjD,MAAMkD,SAAS,CAAC,WAAW;;+BAEjB,EAAElD,MAAMkD,SAAS,CAAC,kBAAkB;;IAE/D,CAAC;QACD,OAAO;YACL,IAAI,CAACP,GAAG,CAACxC,OAAO,CAAC;MACjB,EAAEH,MAAM+C,MAAM,CAAC,GAAG7C,WAAW8C,OAAO,CAAC,SAAS,CAAC,EAAE;;;eAGxC,EAAEhD,MAAMkD,SAAS,CAAC,kBAAkB;;;IAG/C,CAAC;QACD;QAEA,IAAI,CAACP,GAAG,CAAC;QAET,OAAO1C,QAAQ;YACbmB,SAAS;YACT0B,SAAS3C,OAAO,CAAC;;IAEnB,CAAC;QACD;IACF;IAEA;;;;;GAKC,GACD,MAAcoC,8BAA8B7B,MAAc,EAAE;QAC1D,IAAI,CAACiC,GAAG,CAAC;QACT,IAAI,CAACA,GAAG,CAAC3C,MAAM+C,MAAM,CAAC,GAAG7C,WAAW8C,OAAO,CAAC,sCAAsC,CAAC;QAEnF,IAAItC,WAAW,KAAK;YAClB,IAAI,CAACiC,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAAC;QACX,OAAO;YACL,IAAI,CAACA,GAAG,CAAC,CAAC,EAAE,EAAEjC,OAAOyC,OAAO,CAAC,OAAO,SAASC,UAAU,CAAC,KAAK,QAAQ;YACrE,IAAI,CAACT,GAAG,CAAC,CAAC,EAAE,EAAEjC,OAAOyC,OAAO,CAAC,OAAO,SAASC,UAAU,CAAC,KAAK,YAAY;QAC3E;QAEA,IAAI,CAACT,GAAG,CAAC;QAET,OAAO1C,QAAQ;YACbmB,SAAS;YACT0B,SAAS3C,OAAO,CAAC;6BACM,EAAEH,MAAMiD,GAAG,CAAC,SAAS;cACpC,EAAEjD,MAAMkD,SAAS,CAAC,mBAAmB,+BAA+B,CAAC;QAC/E;IACF;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Args } from '@oclif/core';
|
|
2
2
|
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
3
|
import { select } from '@sanity/cli-core/ux';
|
|
4
|
-
import {
|
|
4
|
+
import { deleteCorsOrigin, listCorsOrigins } from '../../services/cors.js';
|
|
5
5
|
import { NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
6
6
|
const deleteCorsDebug = subdebug('cors:delete');
|
|
7
7
|
export class Delete extends SanityCommand {
|
|
@@ -24,10 +24,6 @@ export class Delete extends SanityCommand {
|
|
|
24
24
|
];
|
|
25
25
|
async run() {
|
|
26
26
|
const { args } = await this.parse(Delete);
|
|
27
|
-
const client = await this.getGlobalApiClient({
|
|
28
|
-
apiVersion: CORS_API_VERSION,
|
|
29
|
-
requireUser: true
|
|
30
|
-
});
|
|
31
27
|
// Ensure we have project context
|
|
32
28
|
const projectId = await this.getProjectId();
|
|
33
29
|
if (!projectId) {
|
|
@@ -36,12 +32,11 @@ export class Delete extends SanityCommand {
|
|
|
36
32
|
});
|
|
37
33
|
}
|
|
38
34
|
// Get the origin ID to delete
|
|
39
|
-
const originId = await this.promptForOrigin(args.origin,
|
|
40
|
-
// Delete the origin
|
|
35
|
+
const originId = await this.promptForOrigin(args.origin, projectId);
|
|
41
36
|
try {
|
|
42
|
-
await
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
await deleteCorsOrigin({
|
|
38
|
+
originId,
|
|
39
|
+
projectId
|
|
45
40
|
});
|
|
46
41
|
this.log('Origin deleted');
|
|
47
42
|
} catch (error) {
|
|
@@ -52,13 +47,10 @@ export class Delete extends SanityCommand {
|
|
|
52
47
|
});
|
|
53
48
|
}
|
|
54
49
|
}
|
|
55
|
-
async promptForOrigin(specifiedOrigin,
|
|
56
|
-
// Fetch all CORS origins
|
|
50
|
+
async promptForOrigin(specifiedOrigin, projectId) {
|
|
57
51
|
let origins;
|
|
58
52
|
try {
|
|
59
|
-
origins = await
|
|
60
|
-
uri: `/projects/${projectId}/cors`
|
|
61
|
-
});
|
|
53
|
+
origins = await listCorsOrigins(projectId);
|
|
62
54
|
} catch (error) {
|
|
63
55
|
const err = error;
|
|
64
56
|
deleteCorsDebug(`Error fetching CORS origins for project ${projectId}`, err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/cors/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/cors/delete.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type CorsOrigin, deleteCorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst deleteCorsDebug = subdebug('cors:delete')\n\nexport class Delete extends SanityCommand<typeof Delete> {\n static override args = {\n origin: Args.string({\n description: 'Origin to delete (will prompt if not provided)',\n required: false,\n }),\n }\n\n static override description = 'Delete an existing CORS origin from your project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively select and delete a CORS origin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://example.com',\n description: 'Delete a specific CORS origin',\n },\n ]\n\n public async run(): Promise<void> {\n const {args} = await this.parse(Delete)\n\n // Ensure we have project context\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n // Get the origin ID to delete\n const originId = await this.promptForOrigin(args.origin, projectId)\n\n try {\n await deleteCorsOrigin({originId, projectId})\n\n this.log('Origin deleted')\n } catch (error) {\n const err = error as Error\n deleteCorsDebug(`Error deleting CORS origin ${originId} for project ${projectId}`, err)\n this.error(`Origin deletion failed:\\n${err.message}`, {exit: 1})\n }\n }\n\n private async promptForOrigin(\n specifiedOrigin: string | undefined,\n projectId: string,\n ): Promise<number> {\n let origins: CorsOrigin[]\n try {\n origins = await listCorsOrigins(projectId)\n } catch (error) {\n const err = error as Error\n deleteCorsDebug(`Error fetching CORS origins for project ${projectId}`, err)\n this.error(`Failed to fetch CORS origins:\\n${err.message}`, {exit: 1})\n }\n\n if (origins.length === 0) {\n this.error('No CORS origins configured for this project.', {exit: 1})\n }\n\n // If origin is specified, find it in the list\n if (specifiedOrigin) {\n const specifiedOriginLower = specifiedOrigin.toLowerCase()\n const selectedOrigin = origins.find(\n (origin) => origin.origin.toLowerCase() === specifiedOriginLower,\n )\n\n if (!selectedOrigin) {\n this.error(`Origin \"${specifiedOrigin}\" not found`, {exit: 1})\n }\n\n return selectedOrigin.id\n }\n\n // If no origin specified, prompt user to select one\n const choices = origins.map((origin) => ({\n name: origin.origin,\n value: origin.id,\n }))\n\n const selectedId = await select({\n choices,\n message: 'Select origin to delete',\n })\n\n return selectedId\n }\n}\n"],"names":["Args","SanityCommand","subdebug","select","deleteCorsOrigin","listCorsOrigins","NO_PROJECT_ID","deleteCorsDebug","Delete","args","origin","string","description","required","examples","command","run","parse","projectId","getProjectId","error","exit","originId","promptForOrigin","log","err","message","specifiedOrigin","origins","length","specifiedOriginLower","toLowerCase","selectedOrigin","find","id","choices","map","name","value","selectedId"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AACxD,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAyBC,gBAAgB,EAAEC,eAAe,QAAO,yBAAwB;AACzF,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,kBAAkBL,SAAS;AAEjC,OAAO,MAAMM,eAAeP;IAC1B,OAAgBQ,OAAO;QACrBC,QAAQV,KAAKW,MAAM,CAAC;YAClBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,mDAAkD;IAEhF,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,MAAaI,MAAqB;QAChC,MAAM,EAACP,IAAI,EAAC,GAAG,MAAM,IAAI,CAACQ,KAAK,CAACT;QAEhC,iCAAiC;QACjC,MAAMU,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACd,eAAe;gBAACe,MAAM;YAAC;QACpC;QAEA,8BAA8B;QAC9B,MAAMC,WAAW,MAAM,IAAI,CAACC,eAAe,CAACd,KAAKC,MAAM,EAAEQ;QAEzD,IAAI;YACF,MAAMd,iBAAiB;gBAACkB;gBAAUJ;YAAS;YAE3C,IAAI,CAACM,GAAG,CAAC;QACX,EAAE,OAAOJ,OAAO;YACd,MAAMK,MAAML;YACZb,gBAAgB,CAAC,2BAA2B,EAAEe,SAAS,aAAa,EAAEJ,WAAW,EAAEO;YACnF,IAAI,CAACL,KAAK,CAAC,CAAC,yBAAyB,EAAEK,IAAIC,OAAO,EAAE,EAAE;gBAACL,MAAM;YAAC;QAChE;IACF;IAEA,MAAcE,gBACZI,eAAmC,EACnCT,SAAiB,EACA;QACjB,IAAIU;QACJ,IAAI;YACFA,UAAU,MAAMvB,gBAAgBa;QAClC,EAAE,OAAOE,OAAO;YACd,MAAMK,MAAML;YACZb,gBAAgB,CAAC,wCAAwC,EAAEW,WAAW,EAAEO;YACxE,IAAI,CAACL,KAAK,CAAC,CAAC,+BAA+B,EAAEK,IAAIC,OAAO,EAAE,EAAE;gBAACL,MAAM;YAAC;QACtE;QAEA,IAAIO,QAAQC,MAAM,KAAK,GAAG;YACxB,IAAI,CAACT,KAAK,CAAC,gDAAgD;gBAACC,MAAM;YAAC;QACrE;QAEA,8CAA8C;QAC9C,IAAIM,iBAAiB;YACnB,MAAMG,uBAAuBH,gBAAgBI,WAAW;YACxD,MAAMC,iBAAiBJ,QAAQK,IAAI,CACjC,CAACvB,SAAWA,OAAOA,MAAM,CAACqB,WAAW,OAAOD;YAG9C,IAAI,CAACE,gBAAgB;gBACnB,IAAI,CAACZ,KAAK,CAAC,CAAC,QAAQ,EAAEO,gBAAgB,WAAW,CAAC,EAAE;oBAACN,MAAM;gBAAC;YAC9D;YAEA,OAAOW,eAAeE,EAAE;QAC1B;QAEA,oDAAoD;QACpD,MAAMC,UAAUP,QAAQQ,GAAG,CAAC,CAAC1B,SAAY,CAAA;gBACvC2B,MAAM3B,OAAOA,MAAM;gBACnB4B,OAAO5B,OAAOwB,EAAE;YAClB,CAAA;QAEA,MAAMK,aAAa,MAAMpC,OAAO;YAC9BgC;YACAT,SAAS;QACX;QAEA,OAAOa;IACT;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
|
-
import {
|
|
2
|
+
import { listCorsOrigins } from '../../services/cors.js';
|
|
3
3
|
import { NO_PROJECT_ID } from '../../util/errorMessages.js';
|
|
4
4
|
const listCorsDebug = subdebug('cors:list');
|
|
5
5
|
export class List extends SanityCommand {
|
|
@@ -11,13 +11,7 @@ export class List extends SanityCommand {
|
|
|
11
11
|
}
|
|
12
12
|
];
|
|
13
13
|
async run() {
|
|
14
|
-
// Parse to ensure no invalid flags are passed
|
|
15
14
|
await this.parse(List);
|
|
16
|
-
const client = await this.getGlobalApiClient({
|
|
17
|
-
apiVersion: CORS_API_VERSION,
|
|
18
|
-
requireUser: true
|
|
19
|
-
});
|
|
20
|
-
// Ensure we have project context
|
|
21
15
|
const projectId = await this.getProjectId();
|
|
22
16
|
if (!projectId) {
|
|
23
17
|
this.error(NO_PROJECT_ID, {
|
|
@@ -26,9 +20,7 @@ export class List extends SanityCommand {
|
|
|
26
20
|
}
|
|
27
21
|
let origins;
|
|
28
22
|
try {
|
|
29
|
-
origins = await
|
|
30
|
-
uri: `/projects/${projectId}/cors`
|
|
31
|
-
});
|
|
23
|
+
origins = await listCorsOrigins(projectId);
|
|
32
24
|
} catch (error) {
|
|
33
25
|
const err = error;
|
|
34
26
|
listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/cors/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/cors/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {type CorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {NO_PROJECT_ID} from '../../util/errorMessages.js'\n\nconst listCorsDebug = subdebug('cors:list')\n\nexport class List extends SanityCommand<typeof List> {\n static override description = 'List all origins allowed to access the API for this project'\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List CORS origins for the current project',\n },\n ]\n\n public async run(): Promise<void> {\n await this.parse(List)\n\n const projectId = await this.getProjectId()\n if (!projectId) {\n this.error(NO_PROJECT_ID, {exit: 1})\n }\n\n let origins: CorsOrigin[]\n try {\n origins = await listCorsOrigins(projectId)\n } catch (error) {\n const err = error as Error\n\n listCorsDebug(`Error fetching CORS origins for project ${projectId}`, err)\n this.error(`CORS origins list retrieval failed:\\n${err.message}`, {exit: 1})\n }\n\n if (origins.length === 0) {\n this.log('No CORS origins configured for this project.')\n return\n }\n\n // Output each origin on a new line, matching the original behavior\n this.log(origins.map((origin) => origin.origin).join('\\n'))\n }\n}\n"],"names":["SanityCommand","subdebug","listCorsOrigins","NO_PROJECT_ID","listCorsDebug","List","description","examples","command","run","parse","projectId","getProjectId","error","exit","origins","err","message","length","log","map","origin","join"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAyBC,eAAe,QAAO,yBAAwB;AACvE,SAAQC,aAAa,QAAO,8BAA6B;AAEzD,MAAMC,gBAAgBH,SAAS;AAE/B,OAAO,MAAMI,aAAaL;IACxB,OAAgBM,cAAc,8DAA6D;IAC3F,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,MAAaG,MAAqB;QAChC,MAAM,IAAI,CAACC,KAAK,CAACL;QAEjB,MAAMM,YAAY,MAAM,IAAI,CAACC,YAAY;QACzC,IAAI,CAACD,WAAW;YACd,IAAI,CAACE,KAAK,CAACV,eAAe;gBAACW,MAAM;YAAC;QACpC;QAEA,IAAIC;QACJ,IAAI;YACFA,UAAU,MAAMb,gBAAgBS;QAClC,EAAE,OAAOE,OAAO;YACd,MAAMG,MAAMH;YAEZT,cAAc,CAAC,wCAAwC,EAAEO,WAAW,EAAEK;YACtE,IAAI,CAACH,KAAK,CAAC,CAAC,qCAAqC,EAAEG,IAAIC,OAAO,EAAE,EAAE;gBAACH,MAAM;YAAC;QAC5E;QAEA,IAAIC,QAAQG,MAAM,KAAK,GAAG;YACxB,IAAI,CAACC,GAAG,CAAC;YACT;QACF;QAEA,mEAAmE;QACnE,IAAI,CAACA,GAAG,CAACJ,QAAQK,GAAG,CAAC,CAACC,SAAWA,OAAOA,MAAM,EAAEC,IAAI,CAAC;IACvD;AACF"}
|