@sanity/cli 8.0.1 → 8.0.2
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/backup/downloadAsset.js +3 -24
- package/dist/actions/backup/downloadAsset.js.map +1 -1
- package/dist/actions/backup/downloadDocument.js +11 -22
- package/dist/actions/backup/downloadDocument.js.map +1 -1
- package/dist/actions/backup/downloadStream.js +83 -0
- package/dist/actions/backup/downloadStream.js.map +1 -0
- package/dist/actions/documents/validate.js +0 -3
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/documents/validateDocuments.worker.js +4 -1
- package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
- package/dist/actions/schema/uploadSchemaToLexicon.js +3 -0
- package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -1
- package/dist/actions/telemetry/telemetryDebug.js +2 -2
- package/dist/actions/telemetry/telemetryDebug.js.map +1 -1
- package/dist/commands/datasets/import.js +7 -10
- package/dist/commands/datasets/import.js.map +1 -1
- package/dist/exports/_internal.d.ts +50 -82
- package/dist/exports/index.d.ts +48 -78
- package/dist/exports/invokeSanityCli/index.d.ts +108 -18
- package/dist/exports/invokeSanityCli/index.js +2 -1
- package/dist/exports/invokeSanityCli/index.js.map +1 -1
- package/dist/exports/runtime.d.ts +3 -65
- package/dist/services/api.js +23 -15
- package/dist/services/api.js.map +1 -1
- package/dist/services/auth.js +4 -4
- package/dist/services/auth.js.map +1 -1
- package/dist/services/backup.js +3 -3
- package/dist/services/backup.js.map +1 -1
- package/dist/services/cors.js +3 -3
- package/dist/services/cors.js.map +1 -1
- package/dist/services/datasetAliases.js +5 -5
- package/dist/services/datasetAliases.js.map +1 -1
- package/dist/services/datasets.js +3 -3
- package/dist/services/datasets.js.map +1 -1
- package/dist/services/documents.js +1 -1
- package/dist/services/documents.js.map +1 -1
- package/dist/services/getProjectFeatures.js +1 -1
- package/dist/services/getProjectFeatures.js.map +1 -1
- package/dist/services/getUrlHeaders.js +3 -9
- package/dist/services/getUrlHeaders.js.map +1 -1
- package/dist/services/grants.js +1 -1
- package/dist/services/grants.js.map +1 -1
- package/dist/services/graphql.js +4 -3
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/hooks.js +6 -6
- package/dist/services/hooks.js.map +1 -1
- package/dist/services/mcp.js +4 -4
- package/dist/services/mcp.js.map +1 -1
- package/dist/services/mediaLibraries.js +3 -3
- package/dist/services/mediaLibraries.js.map +1 -1
- package/dist/services/mintProject.js +6 -11
- package/dist/services/mintProject.js.map +1 -1
- package/dist/services/organizations.js +6 -6
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/plans.js +2 -2
- package/dist/services/plans.js.map +1 -1
- package/dist/services/projects.js +7 -7
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.js +2 -2
- package/dist/services/schemas.js.map +1 -1
- package/dist/services/telemetry.js +2 -2
- package/dist/services/telemetry.js.map +1 -1
- package/dist/services/tokens.js +5 -5
- package/dist/services/tokens.js.map +1 -1
- package/dist/services/user.js +1 -1
- package/dist/services/user.js.map +1 -1
- package/dist/services/userApplications.js +18 -18
- package/dist/services/userApplications.js.map +1 -1
- package/oclif.manifest.json +513 -513
- package/package.json +12 -12
package/dist/services/hooks.js
CHANGED
|
@@ -6,7 +6,7 @@ export async function getHooksForProject(projectId) {
|
|
|
6
6
|
requireUser: true
|
|
7
7
|
});
|
|
8
8
|
return client.request({
|
|
9
|
-
|
|
9
|
+
url: `/hooks/projects/${projectId}`
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
export async function getHookMessagesForProject({ hookId, projectId }) {
|
|
@@ -15,7 +15,7 @@ export async function getHookMessagesForProject({ hookId, projectId }) {
|
|
|
15
15
|
requireUser: true
|
|
16
16
|
});
|
|
17
17
|
return client.request({
|
|
18
|
-
|
|
18
|
+
url: `/hooks/projects/${projectId}/${hookId}/messages`
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
export async function getHookAttemptsForProject({ hookId, projectId }) {
|
|
@@ -24,7 +24,7 @@ export async function getHookAttemptsForProject({ hookId, projectId }) {
|
|
|
24
24
|
requireUser: true
|
|
25
25
|
});
|
|
26
26
|
return client.request({
|
|
27
|
-
|
|
27
|
+
url: `/hooks/projects/${projectId}/${hookId}/attempts`
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
export async function getHookAttempt({ attemptId, projectId }) {
|
|
@@ -33,7 +33,7 @@ export async function getHookAttempt({ attemptId, projectId }) {
|
|
|
33
33
|
requireUser: true
|
|
34
34
|
});
|
|
35
35
|
return client.request({
|
|
36
|
-
|
|
36
|
+
url: `/hooks/projects/${projectId}/attempts/${attemptId}`
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
export async function listHooksForProject(projectId) {
|
|
@@ -42,7 +42,7 @@ export async function listHooksForProject(projectId) {
|
|
|
42
42
|
requireUser: true
|
|
43
43
|
});
|
|
44
44
|
return client.request({
|
|
45
|
-
|
|
45
|
+
url: `/hooks/projects/${projectId}`
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
export async function deleteHookForProject(projectId, hookId) {
|
|
@@ -52,7 +52,7 @@ export async function deleteHookForProject(projectId, hookId) {
|
|
|
52
52
|
});
|
|
53
53
|
return client.request({
|
|
54
54
|
method: 'DELETE',
|
|
55
|
-
|
|
55
|
+
url: `/hooks/projects/${projectId}/${hookId}`
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/hooks.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {HOOK_API_VERSION} from '../actions/hook/constants.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../actions/hook/types.js'\n\nexport async function getHooksForProject(projectId: string): Promise<Hook[]> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Hook[]>({
|
|
1
|
+
{"version":3,"sources":["../../src/services/hooks.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {HOOK_API_VERSION} from '../actions/hook/constants.js'\nimport {type DeliveryAttempt, type Hook, type HookMessage} from '../actions/hook/types.js'\n\nexport async function getHooksForProject(projectId: string): Promise<Hook[]> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Hook[]>({url: `/hooks/projects/${projectId}`})\n}\n\nexport async function getHookMessagesForProject({\n hookId,\n projectId,\n}: {\n hookId: string\n projectId: string\n}): Promise<HookMessage[]> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request<HookMessage[]>({\n url: `/hooks/projects/${projectId}/${hookId}/messages`,\n })\n}\n\nexport async function getHookAttemptsForProject({\n hookId,\n projectId,\n}: {\n hookId: string\n projectId: string\n}): Promise<DeliveryAttempt[]> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request<DeliveryAttempt[]>({\n url: `/hooks/projects/${projectId}/${hookId}/attempts`,\n })\n}\n\nexport async function getHookAttempt({\n attemptId,\n projectId,\n}: {\n attemptId: string\n projectId: string\n}): Promise<DeliveryAttempt> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request<DeliveryAttempt>({\n url: `/hooks/projects/${projectId}/attempts/${attemptId}`,\n })\n}\n\nexport async function listHooksForProject(projectId: string): Promise<Hook[]> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Hook[]>({url: `/hooks/projects/${projectId}`})\n}\n\nexport async function deleteHookForProject(projectId: string, hookId: string): Promise<void> {\n const client = await getGlobalCliClient({\n apiVersion: HOOK_API_VERSION,\n requireUser: true,\n })\n\n return client.request({method: 'DELETE', url: `/hooks/projects/${projectId}/${hookId}`})\n}\n"],"names":["getGlobalCliClient","HOOK_API_VERSION","getHooksForProject","projectId","client","apiVersion","requireUser","request","url","getHookMessagesForProject","hookId","getHookAttemptsForProject","getHookAttempt","attemptId","listHooksForProject","deleteHookForProject","method"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAEnD,SAAQC,gBAAgB,QAAO,+BAA8B;AAG7D,OAAO,eAAeC,mBAAmBC,SAAiB;IACxD,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAS;QAACC,KAAK,CAAC,gBAAgB,EAAEL,WAAW;IAAA;AACpE;AAEA,OAAO,eAAeM,0BAA0B,EAC9CC,MAAM,EACNP,SAAS,EAIV;IACC,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAgB;QACnCC,KAAK,CAAC,gBAAgB,EAAEL,UAAU,CAAC,EAAEO,OAAO,SAAS,CAAC;IACxD;AACF;AAEA,OAAO,eAAeC,0BAA0B,EAC9CD,MAAM,EACNP,SAAS,EAIV;IACC,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAoB;QACvCC,KAAK,CAAC,gBAAgB,EAAEL,UAAU,CAAC,EAAEO,OAAO,SAAS,CAAC;IACxD;AACF;AAEA,OAAO,eAAeE,eAAe,EACnCC,SAAS,EACTV,SAAS,EAIV;IACC,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAkB;QACrCC,KAAK,CAAC,gBAAgB,EAAEL,UAAU,UAAU,EAAEU,WAAW;IAC3D;AACF;AAEA,OAAO,eAAeC,oBAAoBX,SAAiB;IACzD,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAS;QAACC,KAAK,CAAC,gBAAgB,EAAEL,WAAW;IAAA;AACpE;AAEA,OAAO,eAAeY,qBAAqBZ,SAAiB,EAAEO,MAAc;IAC1E,MAAMN,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAC;QAACS,QAAQ;QAAUR,KAAK,CAAC,gBAAgB,EAAEL,UAAU,CAAC,EAAEO,QAAQ;IAAA;AACxF"}
|
package/dist/services/mcp.js
CHANGED
|
@@ -22,14 +22,14 @@ const debug = subdebug('mcp:service');
|
|
|
22
22
|
withStamp: false
|
|
23
23
|
},
|
|
24
24
|
method: 'POST',
|
|
25
|
-
|
|
25
|
+
url: '/auth/session/create'
|
|
26
26
|
});
|
|
27
27
|
const tokenResponse = await client.request({
|
|
28
28
|
method: 'GET',
|
|
29
29
|
query: {
|
|
30
30
|
sid: sessionResponse.sid
|
|
31
31
|
},
|
|
32
|
-
|
|
32
|
+
url: '/auth/fetch'
|
|
33
33
|
});
|
|
34
34
|
return tokenResponse.token;
|
|
35
35
|
}
|
|
@@ -59,7 +59,7 @@ const debug = subdebug('mcp:service');
|
|
|
59
59
|
try {
|
|
60
60
|
await client.request({
|
|
61
61
|
timeout: 2500,
|
|
62
|
-
|
|
62
|
+
url: '/users/me'
|
|
63
63
|
});
|
|
64
64
|
return true;
|
|
65
65
|
} catch (err) {
|
|
@@ -85,7 +85,7 @@ const debug = subdebug('mcp:service');
|
|
|
85
85
|
return await client.request({
|
|
86
86
|
method: 'GET',
|
|
87
87
|
timeout: 1000,
|
|
88
|
-
|
|
88
|
+
url: '/journey/mcp/post-init-prompt'
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
|
package/dist/services/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/mcp.ts"],"sourcesContent":["import {getGlobalCliClient, subdebug} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nconst MCP_API_VERSION = '2025-12-09'\nexport const MCP_SERVER_URL = 'https://mcp.sanity.io'\nexport const MCP_JOURNEY_API_VERSION = 'v2024-02-23'\n\nconst debug = subdebug('mcp:service')\n\ninterface PostInitPromptResponse {\n message?: string\n}\n\n/**\n * Create a child token for MCP usage\n * This token is tied to the parent CLI token and will be invalidated\n * when the parent token is invalidated (e.g., on logout)\n *\n * @returns The MCP token string\n * @internal\n */\nexport async function createMCPToken(): Promise<string> {\n const client = await getGlobalCliClient({\n apiVersion: MCP_API_VERSION,\n requireUser: true,\n })\n\n const sessionResponse = await client.request<{id: string; sid: string}>({\n body: {\n sourceId: 'sanity-mcp',\n withStamp: false,\n },\n method: 'POST',\n
|
|
1
|
+
{"version":3,"sources":["../../src/services/mcp.ts"],"sourcesContent":["import {getGlobalCliClient, subdebug} from '@sanity/cli-core'\nimport {isHttpError} from '@sanity/client'\n\nconst MCP_API_VERSION = '2025-12-09'\nexport const MCP_SERVER_URL = 'https://mcp.sanity.io'\nexport const MCP_JOURNEY_API_VERSION = 'v2024-02-23'\n\nconst debug = subdebug('mcp:service')\n\ninterface PostInitPromptResponse {\n message?: string\n}\n\n/**\n * Create a child token for MCP usage\n * This token is tied to the parent CLI token and will be invalidated\n * when the parent token is invalidated (e.g., on logout)\n *\n * @returns The MCP token string\n * @internal\n */\nexport async function createMCPToken(): Promise<string> {\n const client = await getGlobalCliClient({\n apiVersion: MCP_API_VERSION,\n requireUser: true,\n })\n\n const sessionResponse = await client.request<{id: string; sid: string}>({\n body: {\n sourceId: 'sanity-mcp',\n withStamp: false,\n },\n method: 'POST',\n url: '/auth/session/create',\n })\n\n const tokenResponse = await client.request<{label: string; token: string}>({\n method: 'GET',\n query: {sid: sessionResponse.sid},\n url: '/auth/fetch',\n })\n\n return tokenResponse.token\n}\n\n/**\n * Validate an MCP token by checking it against the Sanity API.\n *\n * MCP tokens are standard Sanity session tokens (`sk…`), so we validate\n * by calling `/users/me` on `api.sanity.io`. A 200 means the token is\n * alive; a 401/403 means it is dead and the caller should prompt for\n * re-configuration.\n *\n * Transient errors (5xx, network failures, timeouts) are rethrown so the\n * caller can decide how to handle them — typically by assuming the token\n * is still valid rather than falsely marking it as expired.\n *\n * We intentionally do NOT probe `mcp.sanity.io` because the MCP server\n * lets invalid bearer tokens through for protocol-compatibility reasons,\n * which causes the CLI to falsely treat dead tokens as valid.\n *\n * @internal\n */\nexport async function validateMCPToken(token: string): Promise<boolean> {\n const client = await getGlobalCliClient({\n apiVersion: MCP_API_VERSION,\n requireUser: false,\n token,\n })\n\n try {\n await client.request({timeout: 2500, url: '/users/me'})\n return true\n } catch (err) {\n // 401/403 definitively mean \"dead token\"\n if (isHttpError(err) && (err.statusCode === 401 || err.statusCode === 403)) {\n debug('MCP token validation failed with %d', err.statusCode)\n return false\n }\n\n // Everything else (5xx, network errors, timeouts) is rethrown so the\n // caller can decide — typically assumes valid rather than forcing re-auth.\n throw err\n }\n}\n\n/**\n * Fetches the post-init MCP prompt from the Journey API and interpolates editor names.\n * Falls back to a hardcoded default if the API call fails, times out, or returns empty.\n * Text wrapped in **markers** will be formatted with cyan color.\n */\nexport async function getPostInitPrompt() {\n const client = await getGlobalCliClient({apiVersion: MCP_JOURNEY_API_VERSION, requireUser: false})\n return await client.request<PostInitPromptResponse | null>({\n method: 'GET',\n timeout: 1000,\n url: '/journey/mcp/post-init-prompt',\n })\n}\n"],"names":["getGlobalCliClient","subdebug","isHttpError","MCP_API_VERSION","MCP_SERVER_URL","MCP_JOURNEY_API_VERSION","debug","createMCPToken","client","apiVersion","requireUser","sessionResponse","request","body","sourceId","withStamp","method","url","tokenResponse","query","sid","token","validateMCPToken","timeout","err","statusCode","getPostInitPrompt"],"mappings":"AAAA,SAAQA,kBAAkB,EAAEC,QAAQ,QAAO,mBAAkB;AAC7D,SAAQC,WAAW,QAAO,iBAAgB;AAE1C,MAAMC,kBAAkB;AACxB,OAAO,MAAMC,iBAAiB,wBAAuB;AACrD,OAAO,MAAMC,0BAA0B,cAAa;AAEpD,MAAMC,QAAQL,SAAS;AAMvB;;;;;;;CAOC,GACD,OAAO,eAAeM;IACpB,MAAMC,SAAS,MAAMR,mBAAmB;QACtCS,YAAYN;QACZO,aAAa;IACf;IAEA,MAAMC,kBAAkB,MAAMH,OAAOI,OAAO,CAA4B;QACtEC,MAAM;YACJC,UAAU;YACVC,WAAW;QACb;QACAC,QAAQ;QACRC,KAAK;IACP;IAEA,MAAMC,gBAAgB,MAAMV,OAAOI,OAAO,CAAiC;QACzEI,QAAQ;QACRG,OAAO;YAACC,KAAKT,gBAAgBS,GAAG;QAAA;QAChCH,KAAK;IACP;IAEA,OAAOC,cAAcG,KAAK;AAC5B;AAEA;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,eAAeC,iBAAiBD,KAAa;IAClD,MAAMb,SAAS,MAAMR,mBAAmB;QACtCS,YAAYN;QACZO,aAAa;QACbW;IACF;IAEA,IAAI;QACF,MAAMb,OAAOI,OAAO,CAAC;YAACW,SAAS;YAAMN,KAAK;QAAW;QACrD,OAAO;IACT,EAAE,OAAOO,KAAK;QACZ,yCAAyC;QACzC,IAAItB,YAAYsB,QAASA,CAAAA,IAAIC,UAAU,KAAK,OAAOD,IAAIC,UAAU,KAAK,GAAE,GAAI;YAC1EnB,MAAM,uCAAuCkB,IAAIC,UAAU;YAC3D,OAAO;QACT;QAEA,qEAAqE;QACrE,2EAA2E;QAC3E,MAAMD;IACR;AACF;AAEA;;;;CAIC,GACD,OAAO,eAAeE;IACpB,MAAMlB,SAAS,MAAMR,mBAAmB;QAACS,YAAYJ;QAAyBK,aAAa;IAAK;IAChG,OAAO,MAAMF,OAAOI,OAAO,CAAgC;QACzDI,QAAQ;QACRO,SAAS;QACTN,KAAK;IACP;AACF"}
|
|
@@ -31,7 +31,7 @@ async function getMediaLibraryClient() {
|
|
|
31
31
|
]
|
|
32
32
|
},
|
|
33
33
|
method: 'POST',
|
|
34
|
-
|
|
34
|
+
url: `/media-libraries/${mediaLibraryId}/mutate`
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
@@ -47,7 +47,7 @@ async function getMediaLibraryClient() {
|
|
|
47
47
|
query: {
|
|
48
48
|
projectId
|
|
49
49
|
},
|
|
50
|
-
|
|
50
|
+
url: `/media-libraries`
|
|
51
51
|
});
|
|
52
52
|
return response.data.filter((library)=>library.status === 'active');
|
|
53
53
|
}
|
|
@@ -67,7 +67,7 @@ async function getMediaLibraryClient() {
|
|
|
67
67
|
}))
|
|
68
68
|
},
|
|
69
69
|
method: 'POST',
|
|
70
|
-
|
|
70
|
+
url: `/media-libraries/${mediaLibraryId}/mutate`
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/mediaLibraries.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {\n MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n type MediaLibraryAssetAspectDocument,\n} from '@sanity/types'\n\nexport const MEDIA_LIBRARY_API_VERSION = 'v2025-02-19'\n\nasync function getMediaLibraryClient() {\n return getGlobalCliClient({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n requireUser: true,\n })\n}\n\ninterface DeleteAspectOptions {\n aspectName: string\n mediaLibraryId: string\n projectId: string\n}\n\ninterface DeleteAspectResponse {\n results: Array<{id: string}>\n}\n\n/**\n * Delete an aspect from a media library\n * @param options - The options for deleting an aspect\n * @returns A promise that resolves to the deletion response\n *\n * @internal\n */\nexport async function deleteAspect(options: DeleteAspectOptions): Promise<DeleteAspectResponse> {\n const {aspectName, mediaLibraryId} = options\n\n const client = await getMediaLibraryClient()\n\n return client.request<DeleteAspectResponse>({\n body: {\n mutations: [\n {\n delete: {\n params: {\n id: aspectName,\n type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n },\n query: `*[_type == $type && _id == $id]`,\n },\n },\n ],\n },\n method: 'POST',\n
|
|
1
|
+
{"version":3,"sources":["../../src/services/mediaLibraries.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {\n MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n type MediaLibraryAssetAspectDocument,\n} from '@sanity/types'\n\nexport const MEDIA_LIBRARY_API_VERSION = 'v2025-02-19'\n\nasync function getMediaLibraryClient() {\n return getGlobalCliClient({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n requireUser: true,\n })\n}\n\ninterface DeleteAspectOptions {\n aspectName: string\n mediaLibraryId: string\n projectId: string\n}\n\ninterface DeleteAspectResponse {\n results: Array<{id: string}>\n}\n\n/**\n * Delete an aspect from a media library\n * @param options - The options for deleting an aspect\n * @returns A promise that resolves to the deletion response\n *\n * @internal\n */\nexport async function deleteAspect(options: DeleteAspectOptions): Promise<DeleteAspectResponse> {\n const {aspectName, mediaLibraryId} = options\n\n const client = await getMediaLibraryClient()\n\n return client.request<DeleteAspectResponse>({\n body: {\n mutations: [\n {\n delete: {\n params: {\n id: aspectName,\n type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n },\n query: `*[_type == $type && _id == $id]`,\n },\n },\n ],\n },\n method: 'POST',\n url: `/media-libraries/${mediaLibraryId}/mutate`,\n })\n}\n\nexport interface MediaLibrary {\n id: string\n organizationId: string\n status: 'active' | 'inactive'\n}\n\ninterface MediaLibrariesResponse {\n data: MediaLibrary[]\n}\n\n/**\n * Get a list of media libraries for a project\n * @param projectId - The project ID\n * @returns A promise that resolves to the media libraries\n *\n * @internal\n */\nexport async function getMediaLibraries(projectId: string): Promise<MediaLibrary[]> {\n const client = await getMediaLibraryClient()\n\n const response = await client.request<MediaLibrariesResponse>({\n method: 'GET',\n query: {\n projectId,\n },\n url: `/media-libraries`,\n })\n\n return response.data.filter((library) => library.status === 'active')\n}\n\ninterface DeployAspectsOptions {\n aspects: MediaLibraryAssetAspectDocument[]\n mediaLibraryId: string\n}\n\ninterface DeployAspectsResponse {\n results: Array<{id: string; operation: string}>\n}\n\n/**\n * Deploy one or more aspects to a media library\n * @param options - The options for deploying aspects\n * @returns A promise that resolves to the deployment response\n *\n * @internal\n */\nexport async function deployAspects(options: DeployAspectsOptions): Promise<DeployAspectsResponse> {\n const {aspects, mediaLibraryId} = options\n\n const client = await getMediaLibraryClient()\n\n return client.request<DeployAspectsResponse>({\n body: {\n mutations: aspects.map((aspect) => ({\n createOrReplace: aspect,\n })),\n },\n method: 'POST',\n url: `/media-libraries/${mediaLibraryId}/mutate`,\n })\n}\n"],"names":["getGlobalCliClient","MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME","MEDIA_LIBRARY_API_VERSION","getMediaLibraryClient","apiVersion","requireUser","deleteAspect","options","aspectName","mediaLibraryId","client","request","body","mutations","delete","params","id","type","query","method","url","getMediaLibraries","projectId","response","data","filter","library","status","deployAspects","aspects","map","aspect","createOrReplace"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AACnD,SACEC,oCAAoC,QAE/B,gBAAe;AAEtB,OAAO,MAAMC,4BAA4B,cAAa;AAEtD,eAAeC;IACb,OAAOH,mBAAmB;QACxBI,YAAYF;QACZG,aAAa;IACf;AACF;AAYA;;;;;;CAMC,GACD,OAAO,eAAeC,aAAaC,OAA4B;IAC7D,MAAM,EAACC,UAAU,EAAEC,cAAc,EAAC,GAAGF;IAErC,MAAMG,SAAS,MAAMP;IAErB,OAAOO,OAAOC,OAAO,CAAuB;QAC1CC,MAAM;YACJC,WAAW;gBACT;oBACEC,QAAQ;wBACNC,QAAQ;4BACNC,IAAIR;4BACJS,MAAMhB;wBACR;wBACAiB,OAAO,CAAC,+BAA+B,CAAC;oBAC1C;gBACF;aACD;QACH;QACAC,QAAQ;QACRC,KAAK,CAAC,iBAAiB,EAAEX,eAAe,OAAO,CAAC;IAClD;AACF;AAYA;;;;;;CAMC,GACD,OAAO,eAAeY,kBAAkBC,SAAiB;IACvD,MAAMZ,SAAS,MAAMP;IAErB,MAAMoB,WAAW,MAAMb,OAAOC,OAAO,CAAyB;QAC5DQ,QAAQ;QACRD,OAAO;YACLI;QACF;QACAF,KAAK,CAAC,gBAAgB,CAAC;IACzB;IAEA,OAAOG,SAASC,IAAI,CAACC,MAAM,CAAC,CAACC,UAAYA,QAAQC,MAAM,KAAK;AAC9D;AAWA;;;;;;CAMC,GACD,OAAO,eAAeC,cAAcrB,OAA6B;IAC/D,MAAM,EAACsB,OAAO,EAAEpB,cAAc,EAAC,GAAGF;IAElC,MAAMG,SAAS,MAAMP;IAErB,OAAOO,OAAOC,OAAO,CAAwB;QAC3CC,MAAM;YACJC,WAAWgB,QAAQC,GAAG,CAAC,CAACC,SAAY,CAAA;oBAClCC,iBAAiBD;gBACnB,CAAA;QACF;QACAZ,QAAQ;QACRC,KAAK,CAAC,iBAAiB,EAAEX,eAAe,OAAO,CAAC;IAClD;AACF"}
|
|
@@ -5,12 +5,7 @@ import { TERMS_OF_SERVICE_FALLBACK_NOTICE, TERMS_OF_SERVICE_FALLBACK_URL } from
|
|
|
5
5
|
const debug = subdebug('new:provision');
|
|
6
6
|
/** Provision API version for minting unclaimed projects. */ export const PROVISION_API_VERSION = 'v2026-06-23';
|
|
7
7
|
const request = createRequester({
|
|
8
|
-
|
|
9
|
-
httpErrors: false,
|
|
10
|
-
promise: {
|
|
11
|
-
onlyBody: false
|
|
12
|
-
}
|
|
13
|
-
}
|
|
8
|
+
httpErrors: false
|
|
14
9
|
});
|
|
15
10
|
function getProvisionApiBase() {
|
|
16
11
|
const override = process.env.SANITY_API_HOST;
|
|
@@ -76,16 +71,16 @@ function parseProvisionResponse(body) {
|
|
|
76
71
|
method: 'POST',
|
|
77
72
|
url
|
|
78
73
|
});
|
|
79
|
-
if (response.
|
|
74
|
+
if (response.status === 404) {
|
|
80
75
|
throw new Error('Creating projects without an account is currently unavailable. Try again later, or run `sanity login` and `sanity init`.');
|
|
81
76
|
}
|
|
82
|
-
if (response.
|
|
77
|
+
if (response.status === 429) {
|
|
83
78
|
throw new Error('Project creation rate limit reached for this machine. Try again later.');
|
|
84
79
|
}
|
|
85
|
-
if (response.
|
|
86
|
-
throw new Error(`Project creation failed (HTTP ${response.
|
|
80
|
+
if (response.status < 200 || response.status >= 300) {
|
|
81
|
+
throw new Error(`Project creation failed (HTTP ${response.status}). Try again later.`);
|
|
87
82
|
}
|
|
88
|
-
return parseProvisionResponse(response.
|
|
83
|
+
return parseProvisionResponse(response.text());
|
|
89
84
|
}
|
|
90
85
|
|
|
91
86
|
//# sourceMappingURL=mintProject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/mintProject.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core/debug'\nimport {createRequester} from '@sanity/cli-core/request'\nimport {isStaging} from '@sanity/cli-core/util'\n\nimport {\n TERMS_OF_SERVICE_FALLBACK_NOTICE,\n TERMS_OF_SERVICE_FALLBACK_URL,\n} from '../util/mintProjectConstants.js'\n\nconst debug = subdebug('new:provision')\n\n/** Provision API version for minting unclaimed projects. */\nexport const PROVISION_API_VERSION = 'v2026-06-23'\n\nconst request = createRequester({
|
|
1
|
+
{"version":3,"sources":["../../src/services/mintProject.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core/debug'\nimport {createRequester} from '@sanity/cli-core/request'\nimport {isStaging} from '@sanity/cli-core/util'\n\nimport {\n TERMS_OF_SERVICE_FALLBACK_NOTICE,\n TERMS_OF_SERVICE_FALLBACK_URL,\n} from '../util/mintProjectConstants.js'\n\nconst debug = subdebug('new:provision')\n\n/** Provision API version for minting unclaimed projects. */\nexport const PROVISION_API_VERSION = 'v2026-06-23'\n\nconst request = createRequester({httpErrors: false})\n\nexport interface MintedProject {\n apiHost: string\n claimApiUrl: string\n claimToken: string\n claimUrl: string\n datasetName: string\n expiresAt: string\n resourceId: string\n /** Terms of Service accepted by using the project. Falls back to the bundled constants. */\n termsNotice: string\n termsUrl: string\n token: string\n}\n\nfunction getProvisionApiBase(): string {\n const override = process.env.SANITY_API_HOST\n if (override) return override.replace(/\\/$/u, '')\n return isStaging() ? 'https://api.sanity.work' : 'https://api.sanity.io'\n}\n\nfunction parseJsonBody(body: unknown): unknown {\n if (typeof body !== 'string') return body\n\n try {\n return JSON.parse(body)\n } catch {\n return undefined\n }\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction parseProvisionResponse(body: unknown): MintedProject {\n const data = parseJsonBody(body)\n const response =\n data && typeof data === 'object' && !Array.isArray(data)\n ? (data as Record<string, unknown>)\n : {}\n const links =\n response.links && typeof response.links === 'object' && !Array.isArray(response.links)\n ? (response.links as Record<string, unknown>)\n : {}\n const terms =\n response.terms && typeof response.terms === 'object' && !Array.isArray(response.terms)\n ? (response.terms as Record<string, unknown>)\n : {}\n\n const minted = {\n apiHost: getString(response.apiHost),\n claimApiUrl: getString(links.claimApiUrl),\n claimToken: getString(response.claimToken),\n claimUrl: getString(links.claimUrl),\n datasetName: getString(response.datasetName),\n expiresAt: getString(response.expiresAt),\n resourceId: getString(response.resourceId),\n token: getString(response.token),\n }\n const missing = Object.entries(minted)\n .filter(([, value]) => value === undefined)\n .map(([key]) => key)\n\n if (response.resourceType !== 'project') {\n missing.push('resourceType')\n }\n if (missing.length > 0) {\n throw new Error(`Project creation response is missing or invalid: ${missing.join(', ')}`)\n }\n\n return {\n ...(minted as Omit<MintedProject, 'termsNotice' | 'termsUrl'>),\n termsNotice: getString(terms.notice) ?? TERMS_OF_SERVICE_FALLBACK_NOTICE,\n termsUrl: getString(terms.url) ?? TERMS_OF_SERVICE_FALLBACK_URL,\n }\n}\n\n/**\n * Mint an unclaimed Sanity project through the public provision endpoint.\n */\nexport async function mintUnclaimedProject(options: {displayName: string}): Promise<MintedProject> {\n const displayName = options.displayName.trim()\n if (!displayName || displayName.length > 80) {\n throw new Error('Project name must be 1-80 characters.')\n }\n\n const url = `${getProvisionApiBase()}/${PROVISION_API_VERSION}/provision`\n debug('minting unclaimed project at %s', url)\n\n const response = await request({\n body: JSON.stringify({displayName, resourceType: 'project'}),\n headers: {'Content-Type': 'application/json'},\n method: 'POST',\n url,\n })\n\n if (response.status === 404) {\n throw new Error(\n 'Creating projects without an account is currently unavailable. Try again later, or run `sanity login` and `sanity init`.',\n )\n }\n if (response.status === 429) {\n throw new Error('Project creation rate limit reached for this machine. Try again later.')\n }\n if (response.status < 200 || response.status >= 300) {\n throw new Error(`Project creation failed (HTTP ${response.status}). Try again later.`)\n }\n\n return parseProvisionResponse(response.text())\n}\n"],"names":["subdebug","createRequester","isStaging","TERMS_OF_SERVICE_FALLBACK_NOTICE","TERMS_OF_SERVICE_FALLBACK_URL","debug","PROVISION_API_VERSION","request","httpErrors","getProvisionApiBase","override","process","env","SANITY_API_HOST","replace","parseJsonBody","body","JSON","parse","undefined","getString","value","length","parseProvisionResponse","data","response","Array","isArray","links","terms","minted","apiHost","claimApiUrl","claimToken","claimUrl","datasetName","expiresAt","resourceId","token","missing","Object","entries","filter","map","key","resourceType","push","Error","join","termsNotice","notice","termsUrl","url","mintUnclaimedProject","options","displayName","trim","stringify","headers","method","status","text"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
|
|
|
9
9
|
});
|
|
10
10
|
return client.request({
|
|
11
11
|
query,
|
|
12
|
-
|
|
12
|
+
url: '/organizations'
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
@@ -27,7 +27,7 @@ export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
|
|
|
27
27
|
} : {}
|
|
28
28
|
},
|
|
29
29
|
method: 'post',
|
|
30
|
-
|
|
30
|
+
url: '/organizations'
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
@@ -38,7 +38,7 @@ export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
|
|
|
38
38
|
requireUser: true
|
|
39
39
|
});
|
|
40
40
|
return client.request({
|
|
41
|
-
|
|
41
|
+
url: `/organizations/${organizationId}/grants`
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
@@ -53,7 +53,7 @@ export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
|
|
|
53
53
|
includeFeatures: 'false',
|
|
54
54
|
includeMembers: 'false'
|
|
55
55
|
},
|
|
56
|
-
|
|
56
|
+
url: `/organizations/${organizationId}`
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
@@ -66,7 +66,7 @@ export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
|
|
|
66
66
|
return client.request({
|
|
67
67
|
body: params,
|
|
68
68
|
method: 'patch',
|
|
69
|
-
|
|
69
|
+
url: `/organizations/${organizationId}`
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
@@ -78,7 +78,7 @@ export const ORGANIZATIONS_API_VERSION = 'v2025-05-14';
|
|
|
78
78
|
});
|
|
79
79
|
return client.request({
|
|
80
80
|
method: 'delete',
|
|
81
|
-
|
|
81
|
+
url: `/organizations/${organizationId}`
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
84
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/organizations.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {RawRequestOptions} from '@sanity/client'\n\nexport const ORGANIZATIONS_API_VERSION = 'v2025-05-14'\n\nexport interface ProjectOrganization {\n id: string\n name: string\n slug: string | null\n}\n\nexport interface OrganizationCreateResponse {\n createdByUserId: string\n defaultRoleName: string | null\n features: unknown[]\n id: string\n members: unknown[]\n name: string\n slug: string | null\n}\n\ninterface Organization extends ProjectOrganization {\n createdAt: string\n defaultRoleName: string | null\n updatedAt: string\n}\n\nexport interface OrganizationUpdateParams {\n defaultRoleName?: string\n name?: string\n slug?: string\n}\n\ninterface OrganizationDeleteResponse {\n deleted: boolean\n}\n\nexport interface OrganizationWithGrant {\n hasAttachGrant: boolean\n organization: ProjectOrganization\n}\n\ninterface OrganizationGrant {\n grants: {name: string}[]\n}\n\ninterface OrganizationGrantsResponse {\n [key: string]: OrganizationGrant[]\n}\n\ntype OrganizationRequestQuery = RawRequestOptions['query']\n\n/**\n * List all organizations the user has access to\n */\nexport async function listOrganizations(\n query?: OrganizationRequestQuery,\n): Promise<ProjectOrganization[]> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<ProjectOrganization[]>({\n query,\n
|
|
1
|
+
{"version":3,"sources":["../../src/services/organizations.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\nimport {RawRequestOptions} from '@sanity/client'\n\nexport const ORGANIZATIONS_API_VERSION = 'v2025-05-14'\n\nexport interface ProjectOrganization {\n id: string\n name: string\n slug: string | null\n}\n\nexport interface OrganizationCreateResponse {\n createdByUserId: string\n defaultRoleName: string | null\n features: unknown[]\n id: string\n members: unknown[]\n name: string\n slug: string | null\n}\n\ninterface Organization extends ProjectOrganization {\n createdAt: string\n defaultRoleName: string | null\n updatedAt: string\n}\n\nexport interface OrganizationUpdateParams {\n defaultRoleName?: string\n name?: string\n slug?: string\n}\n\ninterface OrganizationDeleteResponse {\n deleted: boolean\n}\n\nexport interface OrganizationWithGrant {\n hasAttachGrant: boolean\n organization: ProjectOrganization\n}\n\ninterface OrganizationGrant {\n grants: {name: string}[]\n}\n\ninterface OrganizationGrantsResponse {\n [key: string]: OrganizationGrant[]\n}\n\ntype OrganizationRequestQuery = RawRequestOptions['query']\n\n/**\n * List all organizations the user has access to\n */\nexport async function listOrganizations(\n query?: OrganizationRequestQuery,\n): Promise<ProjectOrganization[]> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<ProjectOrganization[]>({\n query,\n url: '/organizations',\n })\n}\n\n/**\n * Create a new organization\n */\nexport async function createOrganization(\n name: string,\n defaultRoleName?: string,\n): Promise<OrganizationCreateResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationCreateResponse>({\n body: {name, ...(defaultRoleName ? {defaultRoleName} : {})},\n method: 'post',\n url: '/organizations',\n })\n}\n\n/**\n * Get organization grants for a specific organization\n */\nexport async function getOrganizationGrants(\n organizationId: string,\n): Promise<OrganizationGrantsResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationGrantsResponse>({\n url: `/organizations/${organizationId}/grants`,\n })\n}\n\n/**\n * Get a single organization by ID\n */\nexport async function getOrganization(organizationId: string): Promise<Organization> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Organization>({\n query: {includeFeatures: 'false', includeMembers: 'false'},\n url: `/organizations/${organizationId}`,\n })\n}\n\n/**\n * Update an organization\n */\nexport async function updateOrganization(\n organizationId: string,\n params: OrganizationUpdateParams,\n): Promise<Organization> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Organization>({\n body: params,\n method: 'patch',\n url: `/organizations/${organizationId}`,\n })\n}\n\n/**\n * Delete an organization\n */\nexport async function deleteOrganization(\n organizationId: string,\n): Promise<OrganizationDeleteResponse> {\n const client = await getGlobalCliClient({\n apiVersion: ORGANIZATIONS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<OrganizationDeleteResponse>({\n method: 'delete',\n url: `/organizations/${organizationId}`,\n })\n}\n"],"names":["getGlobalCliClient","ORGANIZATIONS_API_VERSION","listOrganizations","query","client","apiVersion","requireUser","request","url","createOrganization","name","defaultRoleName","body","method","getOrganizationGrants","organizationId","getOrganization","includeFeatures","includeMembers","updateOrganization","params","deleteOrganization"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAGnD,OAAO,MAAMC,4BAA4B,cAAa;AAiDtD;;CAEC,GACD,OAAO,eAAeC,kBACpBC,KAAgC;IAEhC,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAwB;QAC3CJ;QACAK,KAAK;IACP;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,mBACpBC,IAAY,EACZC,eAAwB;IAExB,MAAMP,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDK,MAAM;YAACF;YAAM,GAAIC,kBAAkB;gBAACA;YAAe,IAAI,CAAC,CAAC;QAAC;QAC1DE,QAAQ;QACRL,KAAK;IACP;AACF;AAEA;;CAEC,GACD,OAAO,eAAeM,sBACpBC,cAAsB;IAEtB,MAAMX,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDC,KAAK,CAAC,eAAe,EAAEO,eAAe,OAAO,CAAC;IAChD;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,gBAAgBD,cAAsB;IAC1D,MAAMX,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAe;QAClCJ,OAAO;YAACc,iBAAiB;YAASC,gBAAgB;QAAO;QACzDV,KAAK,CAAC,eAAe,EAAEO,gBAAgB;IACzC;AACF;AAEA;;CAEC,GACD,OAAO,eAAeI,mBACpBJ,cAAsB,EACtBK,MAAgC;IAEhC,MAAMhB,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAAe;QAClCK,MAAMQ;QACNP,QAAQ;QACRL,KAAK,CAAC,eAAe,EAAEO,gBAAgB;IACzC;AACF;AAEA;;CAEC,GACD,OAAO,eAAeM,mBACpBN,cAAsB;IAEtB,MAAMX,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,OAAOF,OAAOG,OAAO,CAA6B;QAChDM,QAAQ;QACRL,KAAK,CAAC,eAAe,EAAEO,gBAAgB;IACzC;AACF"}
|
package/dist/services/plans.js
CHANGED
|
@@ -6,7 +6,7 @@ export async function getPlanId(intendedPlanId) {
|
|
|
6
6
|
requireUser: false
|
|
7
7
|
});
|
|
8
8
|
const response = await client.request({
|
|
9
|
-
|
|
9
|
+
url: `plans/${intendedPlanId}`
|
|
10
10
|
});
|
|
11
11
|
if (Array.isArray(response) && response.length > 0) {
|
|
12
12
|
const planId = response[0]?.id;
|
|
@@ -22,7 +22,7 @@ export async function getPlanIdFromCoupon(couponCode) {
|
|
|
22
22
|
requireUser: false
|
|
23
23
|
});
|
|
24
24
|
const response = await client.request({
|
|
25
|
-
|
|
25
|
+
url: `plans/coupon/${encodeURIComponent(couponCode)}`
|
|
26
26
|
});
|
|
27
27
|
if (!Array.isArray(response) || response.length === 0) {
|
|
28
28
|
throw new Error(`No plans found for coupon code "${couponCode}"`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/plans.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {INIT_API_VERSION} from '../actions/init/constants.js'\n\nexport async function getPlanId(intendedPlanId: string) {\n const client = await getGlobalCliClient({\n apiVersion: INIT_API_VERSION,\n requireUser: false,\n })\n\n const response = await client.request<{id: string}[]>({
|
|
1
|
+
{"version":3,"sources":["../../src/services/plans.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {INIT_API_VERSION} from '../actions/init/constants.js'\n\nexport async function getPlanId(intendedPlanId: string) {\n const client = await getGlobalCliClient({\n apiVersion: INIT_API_VERSION,\n requireUser: false,\n })\n\n const response = await client.request<{id: string}[]>({url: `plans/${intendedPlanId}`})\n if (Array.isArray(response) && response.length > 0) {\n const planId = response[0]?.id\n if (!planId) {\n throw new Error(`Unable to find a plan with id ${intendedPlanId}`)\n }\n\n return response[0].id\n }\n}\n\nexport async function getPlanIdFromCoupon(couponCode: string) {\n const client = await getGlobalCliClient({\n apiVersion: INIT_API_VERSION,\n requireUser: false,\n })\n\n const response = await client.request<{id: string}[]>({\n url: `plans/coupon/${encodeURIComponent(couponCode)}`,\n })\n\n if (!Array.isArray(response) || response.length === 0) {\n throw new Error(`No plans found for coupon code \"${couponCode}\"`)\n }\n\n const planId = response[0].id\n if (!planId) {\n throw new Error('Unable to find a plan from coupon code')\n }\n\n return planId\n}\n"],"names":["getGlobalCliClient","INIT_API_VERSION","getPlanId","intendedPlanId","client","apiVersion","requireUser","response","request","url","Array","isArray","length","planId","id","Error","getPlanIdFromCoupon","couponCode","encodeURIComponent"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAEnD,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,OAAO,eAAeC,UAAUC,cAAsB;IACpD,MAAMC,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,MAAMC,WAAW,MAAMH,OAAOI,OAAO,CAAiB;QAACC,KAAK,CAAC,MAAM,EAAEN,gBAAgB;IAAA;IACrF,IAAIO,MAAMC,OAAO,CAACJ,aAAaA,SAASK,MAAM,GAAG,GAAG;QAClD,MAAMC,SAASN,QAAQ,CAAC,EAAE,EAAEO;QAC5B,IAAI,CAACD,QAAQ;YACX,MAAM,IAAIE,MAAM,CAAC,8BAA8B,EAAEZ,gBAAgB;QACnE;QAEA,OAAOI,QAAQ,CAAC,EAAE,CAACO,EAAE;IACvB;AACF;AAEA,OAAO,eAAeE,oBAAoBC,UAAkB;IAC1D,MAAMb,SAAS,MAAMJ,mBAAmB;QACtCK,YAAYJ;QACZK,aAAa;IACf;IAEA,MAAMC,WAAW,MAAMH,OAAOI,OAAO,CAAiB;QACpDC,KAAK,CAAC,aAAa,EAAES,mBAAmBD,aAAa;IACvD;IAEA,IAAI,CAACP,MAAMC,OAAO,CAACJ,aAAaA,SAASK,MAAM,KAAK,GAAG;QACrD,MAAM,IAAIG,MAAM,CAAC,gCAAgC,EAAEE,WAAW,CAAC,CAAC;IAClE;IAEA,MAAMJ,SAASN,QAAQ,CAAC,EAAE,CAACO,EAAE;IAC7B,IAAI,CAACD,QAAQ;QACX,MAAM,IAAIE,MAAM;IAClB;IAEA,OAAOF;AACT"}
|
|
@@ -19,7 +19,7 @@ const UNCLAIMED_PROJECT_ORGANIZATION_ID = 'oSystemUnclaimed';
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
method: 'POST',
|
|
22
|
-
|
|
22
|
+
url: '/projects'
|
|
23
23
|
});
|
|
24
24
|
return {
|
|
25
25
|
displayName: options.displayName || '',
|
|
@@ -62,7 +62,7 @@ export async function getProjectRoles(projectId) {
|
|
|
62
62
|
requireUser: true
|
|
63
63
|
});
|
|
64
64
|
return client.request({
|
|
65
|
-
|
|
65
|
+
url: `/projects/${projectId}/roles`
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
68
|
export async function inviteUser({ email, projectId, role }) {
|
|
@@ -77,7 +77,7 @@ export async function inviteUser({ email, projectId, role }) {
|
|
|
77
77
|
},
|
|
78
78
|
maxRedirects: 0,
|
|
79
79
|
method: 'POST',
|
|
80
|
-
|
|
80
|
+
url: `/invitations/project/${projectId}`,
|
|
81
81
|
useGlobalApi: true
|
|
82
82
|
});
|
|
83
83
|
}
|
|
@@ -96,7 +96,7 @@ export async function getProjectInvites(projectId) {
|
|
|
96
96
|
requireUser: true
|
|
97
97
|
});
|
|
98
98
|
return client.request({
|
|
99
|
-
|
|
99
|
+
url: `/invitations/project/${projectId}`
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
export async function updateProjectInitializedAt(projectId) {
|
|
@@ -106,7 +106,7 @@ export async function updateProjectInitializedAt(projectId) {
|
|
|
106
106
|
requireUser: true
|
|
107
107
|
});
|
|
108
108
|
const project = await client.request({
|
|
109
|
-
|
|
109
|
+
url: `/projects/${projectId}`
|
|
110
110
|
});
|
|
111
111
|
if (!project?.metadata?.cliInitializedAt) {
|
|
112
112
|
await client.request({
|
|
@@ -116,7 +116,7 @@ export async function updateProjectInitializedAt(projectId) {
|
|
|
116
116
|
}
|
|
117
117
|
},
|
|
118
118
|
method: 'PATCH',
|
|
119
|
-
|
|
119
|
+
url: `/projects/${projectId}`
|
|
120
120
|
});
|
|
121
121
|
}
|
|
122
122
|
}
|
|
@@ -133,7 +133,7 @@ export async function updateProjectInitalTemplate(projectId, templateName) {
|
|
|
133
133
|
}
|
|
134
134
|
},
|
|
135
135
|
method: 'PATCH',
|
|
136
|
-
|
|
136
|
+
url: `/projects/${projectId}`
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
139
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/projects.ts"],"sourcesContent":["import {debug, getGlobalCliClient, getProjectCliClient} from '@sanity/cli-core'\nimport {SanityProject} from '@sanity/client'\n\nimport {type Invite, type Role} from '../actions/users/types.js'\n\nexport const PROJECTS_API_VERSION = '2025-09-22'\n\nexport const CREATE_PROJECT_API_VERSION = 'v2025-05-14'\n\nconst UNCLAIMED_PROJECT_ORGANIZATION_ID = 'oSystemUnclaimed'\n\nexport type ProjectClaimStatus = 'claimed' | 'unclaimed' | 'unknown'\n\ninterface CreateProjectOptions {\n displayName: string\n\n metadata?: {\n coupon?: string\n integration?: string\n }\n organizationId?: string\n subscription?: {planId: string}\n}\n\nexport interface CreateProjectResult {\n displayName: string\n projectId: string\n}\n\n/**\n * Create a new Sanity project\n */\nexport async function createProject(options: CreateProjectOptions): Promise<CreateProjectResult> {\n const client = await getGlobalCliClient({\n apiVersion: CREATE_PROJECT_API_VERSION,\n requireUser: true,\n })\n\n try {\n const response = await client.request({\n body: {\n ...options,\n metadata: {\n ...options?.metadata,\n integration: 'cli',\n },\n },\n method: 'POST',\n
|
|
1
|
+
{"version":3,"sources":["../../src/services/projects.ts"],"sourcesContent":["import {debug, getGlobalCliClient, getProjectCliClient} from '@sanity/cli-core'\nimport {SanityProject} from '@sanity/client'\n\nimport {type Invite, type Role} from '../actions/users/types.js'\n\nexport const PROJECTS_API_VERSION = '2025-09-22'\n\nexport const CREATE_PROJECT_API_VERSION = 'v2025-05-14'\n\nconst UNCLAIMED_PROJECT_ORGANIZATION_ID = 'oSystemUnclaimed'\n\nexport type ProjectClaimStatus = 'claimed' | 'unclaimed' | 'unknown'\n\ninterface CreateProjectOptions {\n displayName: string\n\n metadata?: {\n coupon?: string\n integration?: string\n }\n organizationId?: string\n subscription?: {planId: string}\n}\n\nexport interface CreateProjectResult {\n displayName: string\n projectId: string\n}\n\n/**\n * Create a new Sanity project\n */\nexport async function createProject(options: CreateProjectOptions): Promise<CreateProjectResult> {\n const client = await getGlobalCliClient({\n apiVersion: CREATE_PROJECT_API_VERSION,\n requireUser: true,\n })\n\n try {\n const response = await client.request({\n body: {\n ...options,\n metadata: {\n ...options?.metadata,\n integration: 'cli',\n },\n },\n method: 'POST',\n url: '/projects',\n })\n\n return {\n displayName: options.displayName || '',\n projectId: response.projectId || response.id,\n }\n } catch (err) {\n debug('Error creating project', err)\n throw err\n }\n}\n\nexport async function getProjectById(projectId: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n return client.projects.getById(projectId)\n}\n\nexport async function getProjectClaimStatus(\n projectId: string,\n token: string,\n): Promise<ProjectClaimStatus> {\n try {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n token,\n })\n const project = await client.projects.getById(projectId)\n\n if (typeof project.organizationId !== 'string' || project.organizationId.length === 0) {\n return 'unknown'\n }\n\n return project.organizationId === UNCLAIMED_PROJECT_ORGANIZATION_ID ? 'unclaimed' : 'claimed'\n } catch (error) {\n debug(\n 'failed to check claim status for project %s: %s',\n projectId,\n error instanceof Error ? error.message : `${error}`,\n )\n return 'unknown'\n }\n}\n\nexport async function getProjectRoles(projectId: string) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Role[]>({url: `/projects/${projectId}/roles`})\n}\n\ninterface InviteUserOptions {\n email: string\n projectId: string\n role: string\n}\n\nexport async function inviteUser({email, projectId, role}: InviteUserOptions) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request({\n body: {email, role},\n maxRedirects: 0,\n method: 'POST',\n url: `/invitations/project/${projectId}`,\n useGlobalApi: true,\n })\n}\n\nexport async function listProjects({\n onlyExplicitMembership = true,\n}: {\n onlyExplicitMembership?: boolean\n} = {}) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.projects.list({onlyExplicitMembership})\n}\n\nexport async function getProjectInvites(projectId: string) {\n const client = await getGlobalCliClient({\n apiVersion: PROJECTS_API_VERSION,\n requireUser: true,\n })\n\n return client.request<Invite[]>({url: `/invitations/project/${projectId}`})\n}\n\nexport async function updateProjectInitializedAt(projectId: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n const project = await client.request<SanityProject>({url: `/projects/${projectId}`})\n\n if (!project?.metadata?.cliInitializedAt) {\n await client.request({\n body: {metadata: {cliInitializedAt: new Date().toISOString()}},\n method: 'PATCH',\n url: `/projects/${projectId}`,\n })\n }\n}\n\nexport async function updateProjectInitalTemplate(projectId: string, templateName: string) {\n const client = await getProjectCliClient({\n apiVersion: PROJECTS_API_VERSION,\n projectId,\n requireUser: true,\n })\n\n await client.request({\n body: {metadata: {initialTemplate: templateName}},\n method: 'PATCH',\n url: `/projects/${projectId}`,\n })\n}\n"],"names":["debug","getGlobalCliClient","getProjectCliClient","PROJECTS_API_VERSION","CREATE_PROJECT_API_VERSION","UNCLAIMED_PROJECT_ORGANIZATION_ID","createProject","options","client","apiVersion","requireUser","response","request","body","metadata","integration","method","url","displayName","projectId","id","err","getProjectById","projects","getById","getProjectClaimStatus","token","project","organizationId","length","error","Error","message","getProjectRoles","inviteUser","email","role","maxRedirects","useGlobalApi","listProjects","onlyExplicitMembership","list","getProjectInvites","updateProjectInitializedAt","cliInitializedAt","Date","toISOString","updateProjectInitalTemplate","templateName","initialTemplate"],"mappings":"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"}
|
package/dist/services/schemas.js
CHANGED
|
@@ -10,7 +10,7 @@ export async function getSchemas(dataset, projectId, id) {
|
|
|
10
10
|
const client = await getSchemaClient();
|
|
11
11
|
return client.request({
|
|
12
12
|
method: 'GET',
|
|
13
|
-
|
|
13
|
+
url: `/projects/${projectId}/datasets/${dataset}/schemas${id ? `/${id}` : ''}`
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
export async function deleteSchema(dataset, projectId, id) {
|
|
@@ -23,7 +23,7 @@ export async function deleteSchema(dataset, projectId, id) {
|
|
|
23
23
|
const client = await getSchemaClient();
|
|
24
24
|
return client.request({
|
|
25
25
|
method: 'DELETE',
|
|
26
|
-
|
|
26
|
+
url: `/projects/${projectId}/datasets/${dataset}/schemas/${id}`
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
export async function updateSchemas(dataset, projectId, schemas) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/schemas.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {type StoredWorkspaceSchema} from '../actions/manifest/types.js'\n\nexport const SCHEMA_API_VERSION = 'v2025-03-01'\n\nasync function getSchemaClient() {\n return await getGlobalCliClient({\n apiVersion: SCHEMA_API_VERSION,\n requireUser: true,\n })\n}\n\nexport async function getSchemas(dataset: string, projectId: string, id?: string) {\n const client = await getSchemaClient()\n\n return client.request<StoredWorkspaceSchema[]>({\n method: 'GET',\n
|
|
1
|
+
{"version":3,"sources":["../../src/services/schemas.ts"],"sourcesContent":["import {getGlobalCliClient} from '@sanity/cli-core'\n\nimport {type StoredWorkspaceSchema} from '../actions/manifest/types.js'\n\nexport const SCHEMA_API_VERSION = 'v2025-03-01'\n\nasync function getSchemaClient() {\n return await getGlobalCliClient({\n apiVersion: SCHEMA_API_VERSION,\n requireUser: true,\n })\n}\n\nexport async function getSchemas(dataset: string, projectId: string, id?: string) {\n const client = await getSchemaClient()\n\n return client.request<StoredWorkspaceSchema[]>({\n method: 'GET',\n url: `/projects/${projectId}/datasets/${dataset}/schemas${id ? `/${id}` : ''}`,\n })\n}\n\nexport async function deleteSchema(dataset: string, projectId: string, id: string) {\n const exists = await getSchemas(dataset, projectId, id)\n\n if (exists?.length === 0) {\n return {\n deleted: false,\n }\n }\n\n const client = await getSchemaClient()\n\n return client.request({\n method: 'DELETE',\n url: `/projects/${projectId}/datasets/${dataset}/schemas/${id}`,\n })\n}\n\nexport async function updateSchemas<T>(dataset: string, projectId: string, schemas: T) {\n const client = await getSchemaClient()\n\n return client.request({\n body: {\n schemas,\n },\n method: 'PUT',\n url: `/projects/${projectId}/datasets/${dataset}/schemas`,\n })\n}\n"],"names":["getGlobalCliClient","SCHEMA_API_VERSION","getSchemaClient","apiVersion","requireUser","getSchemas","dataset","projectId","id","client","request","method","url","deleteSchema","exists","length","deleted","updateSchemas","schemas","body"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mBAAkB;AAInD,OAAO,MAAMC,qBAAqB,cAAa;AAE/C,eAAeC;IACb,OAAO,MAAMF,mBAAmB;QAC9BG,YAAYF;QACZG,aAAa;IACf;AACF;AAEA,OAAO,eAAeC,WAAWC,OAAe,EAAEC,SAAiB,EAAEC,EAAW;IAC9E,MAAMC,SAAS,MAAMP;IAErB,OAAOO,OAAOC,OAAO,CAA0B;QAC7CC,QAAQ;QACRC,KAAK,CAAC,UAAU,EAAEL,UAAU,UAAU,EAAED,QAAQ,QAAQ,EAAEE,KAAK,CAAC,CAAC,EAAEA,IAAI,GAAG,IAAI;IAChF;AACF;AAEA,OAAO,eAAeK,aAAaP,OAAe,EAAEC,SAAiB,EAAEC,EAAU;IAC/E,MAAMM,SAAS,MAAMT,WAAWC,SAASC,WAAWC;IAEpD,IAAIM,QAAQC,WAAW,GAAG;QACxB,OAAO;YACLC,SAAS;QACX;IACF;IAEA,MAAMP,SAAS,MAAMP;IAErB,OAAOO,OAAOC,OAAO,CAAC;QACpBC,QAAQ;QACRC,KAAK,CAAC,UAAU,EAAEL,UAAU,UAAU,EAAED,QAAQ,SAAS,EAAEE,IAAI;IACjE;AACF;AAEA,OAAO,eAAeS,cAAiBX,OAAe,EAAEC,SAAiB,EAAEW,OAAU;IACnF,MAAMT,SAAS,MAAMP;IAErB,OAAOO,OAAOC,OAAO,CAAC;QACpBS,MAAM;YACJD;QACF;QACAP,QAAQ;QACRC,KAAK,CAAC,UAAU,EAAEL,UAAU,UAAU,EAAED,QAAQ,QAAQ,CAAC;IAC3D;AACF"}
|
|
@@ -22,7 +22,7 @@ export async function sendEvents(batch) {
|
|
|
22
22
|
},
|
|
23
23
|
json: true,
|
|
24
24
|
method: 'POST',
|
|
25
|
-
|
|
25
|
+
url: '/intake/batch'
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
28
|
async function getTelemetryConsent() {
|
|
@@ -32,7 +32,7 @@ async function getTelemetryConsent() {
|
|
|
32
32
|
});
|
|
33
33
|
return client.request({
|
|
34
34
|
tag: 'telemetry-consent',
|
|
35
|
-
|
|
35
|
+
url: '/intake/telemetry-status'
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/telemetry.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\n\nimport {getCliToken, getGlobalCliClient, getUserConfig} from '@sanity/cli-core'\nimport {getCliExecutionContext} from '@sanity/cli-core/executionContext'\nimport {type TelemetryEvent} from '@sanity/telemetry'\n\nimport {telemetryDebug} from '../actions/telemetry/telemetryDebug.js'\nimport {createExpiringConfig} from '../util/createExpiringConfig.js'\n\nexport const TELEMETRY_API_VERSION = 'v2026-01-22'\n\nexport const VALID_API_STATUSES = ['granted', 'denied', 'unset'] as const\nexport type ValidApiConsentStatus = (typeof VALID_API_STATUSES)[number]\n\nexport async function sendEvents(batch: TelemetryEvent[]) {\n const client = await getGlobalCliClient({\n apiVersion: TELEMETRY_API_VERSION,\n requireUser: true,\n })\n\n const projectId = process.env.SANITY_TELEMETRY_PROJECT_ID\n\n return client.request({\n body: {batch, projectId},\n json: true,\n method: 'POST',\n
|
|
1
|
+
{"version":3,"sources":["../../src/services/telemetry.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\n\nimport {getCliToken, getGlobalCliClient, getUserConfig} from '@sanity/cli-core'\nimport {getCliExecutionContext} from '@sanity/cli-core/executionContext'\nimport {type TelemetryEvent} from '@sanity/telemetry'\n\nimport {telemetryDebug} from '../actions/telemetry/telemetryDebug.js'\nimport {createExpiringConfig} from '../util/createExpiringConfig.js'\n\nexport const TELEMETRY_API_VERSION = 'v2026-01-22'\n\nexport const VALID_API_STATUSES = ['granted', 'denied', 'unset'] as const\nexport type ValidApiConsentStatus = (typeof VALID_API_STATUSES)[number]\n\nexport async function sendEvents(batch: TelemetryEvent[]) {\n const client = await getGlobalCliClient({\n apiVersion: TELEMETRY_API_VERSION,\n requireUser: true,\n })\n\n const projectId = process.env.SANITY_TELEMETRY_PROJECT_ID\n\n return client.request({\n body: {batch, projectId},\n json: true,\n method: 'POST',\n url: '/intake/batch',\n })\n}\n\nasync function getTelemetryConsent(): Promise<{\n status: ValidApiConsentStatus\n}> {\n const client = await getGlobalCliClient({\n apiVersion: TELEMETRY_API_VERSION,\n requireUser: false,\n })\n\n return client.request({tag: 'telemetry-consent', url: '/intake/telemetry-status'})\n}\n\n/**\n * Check if the given status is a valid consent status\n *\n * @param status - The status to check\n * @returns True if the status is valid, false otherwise\n * @internal\n */\nexport function isValidApiConsentStatus(status: string): status is ValidApiConsentStatus {\n return VALID_API_STATUSES.includes(status as ValidApiConsentStatus)\n}\n\n/**\n * Check if the given response is a valid API consent response\n *\n * @param response - The response to check\n * @returns True if the response is valid, false otherwise\n * @internal\n */\nfunction isValidApiConsentResponse(response: unknown): response is {status: ValidApiConsentStatus} {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'status' in response &&\n typeof response.status === 'string' &&\n isValidApiConsentStatus(response.status)\n )\n}\n\nexport const TELEMETRY_CONSENT_CONFIG_KEY = 'telemetryConsent'\nconst FIVE_MINUTES = 1000 * 60 * 5\n\n/**\n * Get a token-scoped cache key for telemetry consent. This ensures that switching\n * users (via login/logout) always results in a cache miss, preventing one user\n * from inheriting another user's cached consent status.\n *\n * @param token - The current auth token, or undefined if not logged in\n * @returns A cache key scoped to the token\n */\nexport function getTelemetryConsentCacheKey(token: string | undefined): string {\n if (!token) {\n return TELEMETRY_CONSENT_CONFIG_KEY\n }\n\n const hash = createHash('sha256').update(token).digest('hex').slice(0, 12)\n return `${TELEMETRY_CONSENT_CONFIG_KEY}:${hash}`\n}\n\n/**\n * Fetch the telemetry consent status for the current user\n * @returns The telemetry consent status\n *\n * @internal\n */\nexport async function fetchTelemetryConsent(): Promise<{\n status: ValidApiConsentStatus\n}> {\n // Programmatic invocations must not use the host user's disk-backed consent\n // cache. The request is already authenticated with the invocation token.\n if (getCliExecutionContext()) return getTelemetryConsent()\n\n const token = await getCliToken()\n const cacheKey = getTelemetryConsentCacheKey(token)\n\n // NOTE: createExpiringConfig is instantiated on every call, so in-flight request\n // deduplication (via currentFetch) does not work across concurrent calls to\n // fetchTelemetryConsent(). Two concurrent callers will make two HTTP requests.\n // Consider moving to module-level instance if this becomes a bottleneck.\n const telemetryConsentConfig = createExpiringConfig<{\n status: ValidApiConsentStatus\n }>({\n fetchValue: () => getTelemetryConsent(),\n key: cacheKey,\n onCacheHit() {\n telemetryDebug('Retrieved telemetry consent status from cache')\n },\n onFetch() {\n telemetryDebug('Fetching telemetry consent status...')\n },\n onRevalidate() {\n telemetryDebug('Revalidating cached telemetry consent status...')\n },\n store: getUserConfig(),\n ttl: FIVE_MINUTES,\n validateValue: isValidApiConsentResponse,\n })\n\n return telemetryConsentConfig.get()\n}\n"],"names":["createHash","getCliToken","getGlobalCliClient","getUserConfig","getCliExecutionContext","telemetryDebug","createExpiringConfig","TELEMETRY_API_VERSION","VALID_API_STATUSES","sendEvents","batch","client","apiVersion","requireUser","projectId","process","env","SANITY_TELEMETRY_PROJECT_ID","request","body","json","method","url","getTelemetryConsent","tag","isValidApiConsentStatus","status","includes","isValidApiConsentResponse","response","TELEMETRY_CONSENT_CONFIG_KEY","FIVE_MINUTES","getTelemetryConsentCacheKey","token","hash","update","digest","slice","fetchTelemetryConsent","cacheKey","telemetryConsentConfig","fetchValue","key","onCacheHit","onFetch","onRevalidate","store","ttl","validateValue","get"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AAEtC,SAAQC,WAAW,EAAEC,kBAAkB,EAAEC,aAAa,QAAO,mBAAkB;AAC/E,SAAQC,sBAAsB,QAAO,oCAAmC;AAGxE,SAAQC,cAAc,QAAO,yCAAwC;AACrE,SAAQC,oBAAoB,QAAO,kCAAiC;AAEpE,OAAO,MAAMC,wBAAwB,cAAa;AAElD,OAAO,MAAMC,qBAAqB;IAAC;IAAW;IAAU;CAAQ,CAAS;AAGzE,OAAO,eAAeC,WAAWC,KAAuB;IACtD,MAAMC,SAAS,MAAMT,mBAAmB;QACtCU,YAAYL;QACZM,aAAa;IACf;IAEA,MAAMC,YAAYC,QAAQC,GAAG,CAACC,2BAA2B;IAEzD,OAAON,OAAOO,OAAO,CAAC;QACpBC,MAAM;YAACT;YAAOI;QAAS;QACvBM,MAAM;QACNC,QAAQ;QACRC,KAAK;IACP;AACF;AAEA,eAAeC;IAGb,MAAMZ,SAAS,MAAMT,mBAAmB;QACtCU,YAAYL;QACZM,aAAa;IACf;IAEA,OAAOF,OAAOO,OAAO,CAAC;QAACM,KAAK;QAAqBF,KAAK;IAA0B;AAClF;AAEA;;;;;;CAMC,GACD,OAAO,SAASG,wBAAwBC,MAAc;IACpD,OAAOlB,mBAAmBmB,QAAQ,CAACD;AACrC;AAEA;;;;;;CAMC,GACD,SAASE,0BAA0BC,QAAiB;IAClD,OACE,OAAOA,aAAa,YACpBA,aAAa,QACb,YAAYA,YACZ,OAAOA,SAASH,MAAM,KAAK,YAC3BD,wBAAwBI,SAASH,MAAM;AAE3C;AAEA,OAAO,MAAMI,+BAA+B,mBAAkB;AAC9D,MAAMC,eAAe,OAAO,KAAK;AAEjC;;;;;;;CAOC,GACD,OAAO,SAASC,4BAA4BC,KAAyB;IACnE,IAAI,CAACA,OAAO;QACV,OAAOH;IACT;IAEA,MAAMI,OAAOlC,WAAW,UAAUmC,MAAM,CAACF,OAAOG,MAAM,CAAC,OAAOC,KAAK,CAAC,GAAG;IACvE,OAAO,GAAGP,6BAA6B,CAAC,EAAEI,MAAM;AAClD;AAEA;;;;;CAKC,GACD,OAAO,eAAeI;IAGpB,4EAA4E;IAC5E,yEAAyE;IACzE,IAAIlC,0BAA0B,OAAOmB;IAErC,MAAMU,QAAQ,MAAMhC;IACpB,MAAMsC,WAAWP,4BAA4BC;IAE7C,iFAAiF;IACjF,4EAA4E;IAC5E,+EAA+E;IAC/E,yEAAyE;IACzE,MAAMO,yBAAyBlC,qBAE5B;QACDmC,YAAY,IAAMlB;QAClBmB,KAAKH;QACLI;YACEtC,eAAe;QACjB;QACAuC;YACEvC,eAAe;QACjB;QACAwC;YACExC,eAAe;QACjB;QACAyC,OAAO3C;QACP4C,KAAKhB;QACLiB,eAAepB;IACjB;IAEA,OAAOY,uBAAuBS,GAAG;AACnC"}
|