@sanity/cli 7.12.0 → 7.13.0

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.
Files changed (177) hide show
  1. package/README.md +88 -0
  2. package/dist/actions/api/constants.js +13 -0
  3. package/dist/actions/api/constants.js.map +1 -0
  4. package/dist/actions/api/distillApiRoutes.js +106 -0
  5. package/dist/actions/api/distillApiRoutes.js.map +1 -0
  6. package/dist/actions/api/errors.js +18 -0
  7. package/dist/actions/api/errors.js.map +1 -0
  8. package/dist/actions/api/parseFields.js +183 -0
  9. package/dist/actions/api/parseFields.js.map +1 -0
  10. package/dist/actions/api/resolveEndpoint.js +159 -0
  11. package/dist/actions/api/resolveEndpoint.js.map +1 -0
  12. package/dist/actions/api/types.js +10 -0
  13. package/dist/actions/api/types.js.map +1 -0
  14. package/dist/actions/build/buildApp.js +4 -2
  15. package/dist/actions/build/buildApp.js.map +1 -1
  16. package/dist/actions/build/buildStudio.js +105 -14
  17. package/dist/actions/build/buildStudio.js.map +1 -1
  18. package/dist/actions/build/eventListenerFactory.js +70 -0
  19. package/dist/actions/build/eventListenerFactory.js.map +1 -0
  20. package/dist/actions/dev/servers/startStudioDevServer.js +5 -1
  21. package/dist/actions/dev/servers/startStudioDevServer.js.map +1 -1
  22. package/dist/commands/api.js +294 -0
  23. package/dist/commands/api.js.map +1 -0
  24. package/dist/commands/backups/disable.js +4 -4
  25. package/dist/commands/backups/disable.js.map +1 -1
  26. package/dist/commands/backups/download.js +7 -7
  27. package/dist/commands/backups/download.js.map +1 -1
  28. package/dist/commands/backups/enable.js +4 -4
  29. package/dist/commands/backups/enable.js.map +1 -1
  30. package/dist/commands/backups/list.js +7 -7
  31. package/dist/commands/backups/list.js.map +1 -1
  32. package/dist/commands/codemod.js +5 -5
  33. package/dist/commands/codemod.js.map +1 -1
  34. package/dist/commands/cors/add.js +1 -1
  35. package/dist/commands/cors/add.js.map +1 -1
  36. package/dist/commands/cors/delete.js +4 -4
  37. package/dist/commands/cors/delete.js.map +1 -1
  38. package/dist/commands/cors/list.js +2 -2
  39. package/dist/commands/cors/list.js.map +1 -1
  40. package/dist/commands/datasets/alias/create.js +5 -5
  41. package/dist/commands/datasets/alias/create.js.map +1 -1
  42. package/dist/commands/datasets/alias/delete.js +2 -2
  43. package/dist/commands/datasets/alias/delete.js.map +1 -1
  44. package/dist/commands/datasets/alias/link.js +5 -5
  45. package/dist/commands/datasets/alias/link.js.map +1 -1
  46. package/dist/commands/datasets/alias/unlink.js +3 -3
  47. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  48. package/dist/commands/datasets/copy.js +7 -7
  49. package/dist/commands/datasets/copy.js.map +1 -1
  50. package/dist/commands/datasets/create.js +3 -3
  51. package/dist/commands/datasets/create.js.map +1 -1
  52. package/dist/commands/datasets/delete.js +2 -2
  53. package/dist/commands/datasets/delete.js.map +1 -1
  54. package/dist/commands/datasets/embeddings/disable.js +3 -3
  55. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  56. package/dist/commands/datasets/embeddings/enable.js +5 -5
  57. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  58. package/dist/commands/datasets/embeddings/status.js +3 -3
  59. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  60. package/dist/commands/datasets/export.js +6 -6
  61. package/dist/commands/datasets/export.js.map +1 -1
  62. package/dist/commands/datasets/import.js +3 -3
  63. package/dist/commands/datasets/import.js.map +1 -1
  64. package/dist/commands/datasets/list.js +2 -2
  65. package/dist/commands/datasets/list.js.map +1 -1
  66. package/dist/commands/datasets/visibility/get.js +2 -2
  67. package/dist/commands/datasets/visibility/get.js.map +1 -1
  68. package/dist/commands/datasets/visibility/set.js +3 -3
  69. package/dist/commands/datasets/visibility/set.js.map +1 -1
  70. package/dist/commands/deploy.js +2 -2
  71. package/dist/commands/deploy.js.map +1 -1
  72. package/dist/commands/dev.js +2 -2
  73. package/dist/commands/dev.js.map +1 -1
  74. package/dist/commands/docs/read.js +1 -1
  75. package/dist/commands/docs/read.js.map +1 -1
  76. package/dist/commands/docs/search.js +3 -3
  77. package/dist/commands/docs/search.js.map +1 -1
  78. package/dist/commands/doctor.js +3 -3
  79. package/dist/commands/doctor.js.map +1 -1
  80. package/dist/commands/documents/create.js +3 -3
  81. package/dist/commands/documents/create.js.map +1 -1
  82. package/dist/commands/documents/delete.js +3 -3
  83. package/dist/commands/documents/delete.js.map +1 -1
  84. package/dist/commands/documents/get.js +2 -2
  85. package/dist/commands/documents/get.js.map +1 -1
  86. package/dist/commands/documents/query.js +2 -2
  87. package/dist/commands/documents/query.js.map +1 -1
  88. package/dist/commands/documents/validate.js +3 -3
  89. package/dist/commands/documents/validate.js.map +1 -1
  90. package/dist/commands/graphql/deploy.js +13 -13
  91. package/dist/commands/graphql/deploy.js.map +1 -1
  92. package/dist/commands/graphql/list.js +2 -2
  93. package/dist/commands/graphql/list.js.map +1 -1
  94. package/dist/commands/graphql/undeploy.js +2 -2
  95. package/dist/commands/graphql/undeploy.js.map +1 -1
  96. package/dist/commands/hooks/attempt.js +2 -2
  97. package/dist/commands/hooks/attempt.js.map +1 -1
  98. package/dist/commands/hooks/create.js +3 -3
  99. package/dist/commands/hooks/create.js.map +1 -1
  100. package/dist/commands/hooks/delete.js +4 -4
  101. package/dist/commands/hooks/delete.js.map +1 -1
  102. package/dist/commands/hooks/list.js +2 -2
  103. package/dist/commands/hooks/list.js.map +1 -1
  104. package/dist/commands/hooks/logs.js +5 -5
  105. package/dist/commands/hooks/logs.js.map +1 -1
  106. package/dist/commands/login.js +2 -2
  107. package/dist/commands/login.js.map +1 -1
  108. package/dist/commands/logout.js +2 -2
  109. package/dist/commands/logout.js.map +1 -1
  110. package/dist/commands/manifest/extract.js +3 -3
  111. package/dist/commands/manifest/extract.js.map +1 -1
  112. package/dist/commands/mcp/configure.js +4 -4
  113. package/dist/commands/mcp/configure.js.map +1 -1
  114. package/dist/commands/media/create-aspect.js +3 -3
  115. package/dist/commands/media/create-aspect.js.map +1 -1
  116. package/dist/commands/media/delete-aspect.js +1 -1
  117. package/dist/commands/media/delete-aspect.js.map +1 -1
  118. package/dist/commands/media/deploy-aspect.js +4 -4
  119. package/dist/commands/media/deploy-aspect.js.map +1 -1
  120. package/dist/commands/media/export.js +7 -7
  121. package/dist/commands/media/export.js.map +1 -1
  122. package/dist/commands/media/import.js +6 -6
  123. package/dist/commands/media/import.js.map +1 -1
  124. package/dist/commands/migrations/create.js +4 -4
  125. package/dist/commands/migrations/create.js.map +1 -1
  126. package/dist/commands/migrations/list.js +2 -2
  127. package/dist/commands/migrations/list.js.map +1 -1
  128. package/dist/commands/migrations/run.js +14 -14
  129. package/dist/commands/migrations/run.js.map +1 -1
  130. package/dist/commands/openapi/get.js +3 -3
  131. package/dist/commands/openapi/get.js.map +1 -1
  132. package/dist/commands/openapi/list.js +2 -2
  133. package/dist/commands/openapi/list.js.map +1 -1
  134. package/dist/commands/organizations/create.js +5 -5
  135. package/dist/commands/organizations/create.js.map +1 -1
  136. package/dist/commands/organizations/delete.js +6 -6
  137. package/dist/commands/organizations/delete.js.map +1 -1
  138. package/dist/commands/organizations/get.js +3 -3
  139. package/dist/commands/organizations/get.js.map +1 -1
  140. package/dist/commands/organizations/list.js +2 -2
  141. package/dist/commands/organizations/list.js.map +1 -1
  142. package/dist/commands/organizations/update.js +6 -6
  143. package/dist/commands/organizations/update.js.map +1 -1
  144. package/dist/commands/preview.js +2 -2
  145. package/dist/commands/preview.js.map +1 -1
  146. package/dist/commands/projects/create.js +2 -2
  147. package/dist/commands/projects/create.js.map +1 -1
  148. package/dist/commands/projects/list.js +2 -2
  149. package/dist/commands/projects/list.js.map +1 -1
  150. package/dist/commands/schemas/delete.js +2 -2
  151. package/dist/commands/schemas/delete.js.map +1 -1
  152. package/dist/commands/schemas/deploy.js +2 -2
  153. package/dist/commands/schemas/deploy.js.map +1 -1
  154. package/dist/commands/schemas/list.js +1 -1
  155. package/dist/commands/schemas/list.js.map +1 -1
  156. package/dist/commands/schemas/validate.js +2 -1
  157. package/dist/commands/schemas/validate.js.map +1 -1
  158. package/dist/commands/skills/install.js +2 -2
  159. package/dist/commands/skills/install.js.map +1 -1
  160. package/dist/commands/telemetry/disable.js +2 -2
  161. package/dist/commands/telemetry/disable.js.map +1 -1
  162. package/dist/commands/telemetry/enable.js +2 -2
  163. package/dist/commands/telemetry/enable.js.map +1 -1
  164. package/dist/commands/tokens/create.js +2 -2
  165. package/dist/commands/tokens/create.js.map +1 -1
  166. package/dist/commands/tokens/delete.js +2 -2
  167. package/dist/commands/tokens/delete.js.map +1 -1
  168. package/dist/commands/tokens/list.js +2 -2
  169. package/dist/commands/tokens/list.js.map +1 -1
  170. package/dist/commands/users/invite.js +3 -3
  171. package/dist/commands/users/invite.js.map +1 -1
  172. package/dist/generated/apiRoutes.js +401 -0
  173. package/dist/generated/apiRoutes.js.map +1 -0
  174. package/dist/services/api.js +116 -0
  175. package/dist/services/api.js.map +1 -0
  176. package/oclif.manifest.json +433 -252
  177. package/package.json +5 -3
@@ -0,0 +1,116 @@
1
+ import { getCliToken, getGlobalCliClient, getProjectCliClient } from '@sanity/cli-core';
2
+ import { createRequester } from '@sanity/cli-core/request';
3
+ const API_REQUEST_TAG = 'sanity.cli.api';
4
+ /**
5
+ * Perform an authenticated raw HTTP request against a Sanity API.
6
+ *
7
+ * URL construction and token resolution reuse the standard CLI client
8
+ * factories; the request itself uses a bare requester so the response
9
+ * (status, headers, non-JSON bodies) can be passed through unfiltered.
10
+ */ export async function performApiRequest(options) {
11
+ const { body, headers = {}, method, query = {}, resolved, token: providedToken, unauthenticated = false } = options;
12
+ const { token, url } = await resolveRequestTarget(resolved, unauthenticated, providedToken);
13
+ // Header names are case-insensitive - keyed lowercase so a user-provided
14
+ // header (eg `-H 'authorization: ...'`) replaces the default regardless of
15
+ // how either side is cased.
16
+ const requestHeaders = {};
17
+ if (token) requestHeaders.authorization = `Bearer ${token}`;
18
+ let requestBody;
19
+ if (typeof body === 'string' || Buffer.isBuffer(body)) {
20
+ // Raw bodies (--input) pass through without a default Content-Type - the
21
+ // caller knows the media type, we don't (gh api behaves the same way)
22
+ requestBody = body;
23
+ } else if (body !== undefined) {
24
+ requestBody = JSON.stringify(body);
25
+ requestHeaders['content-type'] = 'application/json';
26
+ }
27
+ for (const [key, value] of Object.entries(headers)){
28
+ requestHeaders[key.toLowerCase()] = value;
29
+ }
30
+ const request = createRequester({
31
+ middleware: {
32
+ httpErrors: false,
33
+ promise: {
34
+ onlyBody: false
35
+ }
36
+ }
37
+ });
38
+ const mergedQuery = {
39
+ ...resolved.query,
40
+ ...query
41
+ };
42
+ const response = await request({
43
+ ...requestBody === undefined ? {} : {
44
+ body: requestBody
45
+ },
46
+ headers: requestHeaders,
47
+ method,
48
+ query: {
49
+ tag: API_REQUEST_TAG,
50
+ ...mergedQuery
51
+ },
52
+ url
53
+ });
54
+ const rawBody = typeof response.body === 'string' ? response.body : String(response.body ?? '');
55
+ const parsed = parseBody(rawBody, response.headers['content-type']);
56
+ return {
57
+ body: parsed.body,
58
+ headers: response.headers,
59
+ jsonBody: parsed.jsonBody,
60
+ rawBody,
61
+ statusCode: response.statusCode,
62
+ statusMessage: response.statusMessage,
63
+ url: response.url
64
+ };
65
+ }
66
+ async function resolveRequestTarget(resolved, unauthenticated, providedToken) {
67
+ if (resolved.kind === 'url') {
68
+ const token = unauthenticated ? undefined : providedToken || await getCliToken();
69
+ if (!token && !unauthenticated) {
70
+ throw new Error('You must login first - run "sanity login"');
71
+ }
72
+ return {
73
+ token,
74
+ url: resolved.url
75
+ };
76
+ }
77
+ // The client factories handle token resolution, staging/production API
78
+ // hosts and the project subdomain - we only use them to build the URL.
79
+ const client = resolved.host === 'project' ? await getProjectCliClient({
80
+ apiVersion: resolved.apiVersion,
81
+ projectId: resolved.projectId,
82
+ requireUser: !unauthenticated,
83
+ token: providedToken
84
+ }) : await getGlobalCliClient({
85
+ apiVersion: resolved.apiVersion,
86
+ requireUser: !unauthenticated,
87
+ token: providedToken,
88
+ unauthenticated
89
+ });
90
+ const token = unauthenticated ? undefined : client.config().token ?? undefined;
91
+ return {
92
+ token,
93
+ url: client.getUrl(resolved.path)
94
+ };
95
+ }
96
+ function parseBody(rawBody, contentType) {
97
+ if (rawBody === '' || !contentType || !/\bjson\b/.test(contentType)) {
98
+ return {
99
+ body: rawBody,
100
+ jsonBody: false
101
+ };
102
+ }
103
+ try {
104
+ return {
105
+ body: JSON.parse(rawBody),
106
+ jsonBody: true
107
+ };
108
+ } catch {
109
+ return {
110
+ body: rawBody,
111
+ jsonBody: false
112
+ };
113
+ }
114
+ }
115
+
116
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/api.ts"],"sourcesContent":["import {getCliToken, getGlobalCliClient, getProjectCliClient} from '@sanity/cli-core'\nimport {createRequester} from '@sanity/cli-core/request'\n\nimport {type ResolvedEndpoint} from '../actions/api/resolveEndpoint.js'\n\nconst API_REQUEST_TAG = 'sanity.cli.api'\n\n/**\n * Options for {@link performApiRequest}.\n */\nexport interface PerformApiRequestOptions {\n /** HTTP method (upper case). */\n method: string\n\n /** The resolved request target. */\n resolved: ResolvedEndpoint\n\n /** Request body: objects are JSON-serialized; strings and raw byte buffers are sent verbatim. */\n body?: Buffer | string | unknown\n\n /** Extra request headers. A user-provided `Authorization` header wins over the CLI token. */\n headers?: Record<string, string>\n\n /** Extra query parameters, merged with those from the endpoint argument. */\n query?: Record<string, string | string[]>\n\n /** Explicit API token, used instead of the logged-in user's token. */\n token?: string\n\n /** Send the request without an authorization token. */\n unauthenticated?: boolean\n}\n\n/**\n * The full HTTP response of an API request. Non-2xx responses are returned,\n * not thrown - the command decides how to surface them.\n */\nexport interface ApiResponse {\n /** Parsed JSON body for JSON responses, raw text otherwise. */\n body: unknown\n\n headers: Record<string, string>\n\n /** Whether `body` was parsed from a JSON response. */\n jsonBody: boolean\n\n /** The raw response body text. */\n rawBody: string\n\n statusCode: number\n\n url: string\n\n statusMessage?: string\n}\n\n/**\n * Perform an authenticated raw HTTP request against a Sanity API.\n *\n * URL construction and token resolution reuse the standard CLI client\n * factories; the request itself uses a bare requester so the response\n * (status, headers, non-JSON bodies) can be passed through unfiltered.\n */\nexport async function performApiRequest(options: PerformApiRequestOptions): Promise<ApiResponse> {\n const {\n body,\n headers = {},\n method,\n query = {},\n resolved,\n token: providedToken,\n unauthenticated = false,\n } = options\n\n const {token, url} = await resolveRequestTarget(resolved, unauthenticated, providedToken)\n\n // Header names are case-insensitive - keyed lowercase so a user-provided\n // header (eg `-H 'authorization: ...'`) replaces the default regardless of\n // how either side is cased.\n const requestHeaders: Record<string, string> = {}\n if (token) requestHeaders.authorization = `Bearer ${token}`\n\n let requestBody: Buffer | string | undefined\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\n // Raw bodies (--input) pass through without a default Content-Type - the\n // caller knows the media type, we don't (gh api behaves the same way)\n requestBody = body\n } else if (body !== undefined) {\n requestBody = JSON.stringify(body)\n requestHeaders['content-type'] = 'application/json'\n }\n\n for (const [key, value] of Object.entries(headers)) {\n requestHeaders[key.toLowerCase()] = value\n }\n\n const request = createRequester({\n middleware: {httpErrors: false, promise: {onlyBody: false}},\n })\n\n const mergedQuery = {...resolved.query, ...query}\n\n const response = await request({\n ...(requestBody === undefined ? {} : {body: requestBody}),\n headers: requestHeaders,\n method,\n query: {tag: API_REQUEST_TAG, ...mergedQuery},\n url,\n })\n\n const rawBody = typeof response.body === 'string' ? response.body : String(response.body ?? '')\n const parsed = parseBody(rawBody, response.headers['content-type'])\n\n return {\n body: parsed.body,\n headers: response.headers,\n jsonBody: parsed.jsonBody,\n rawBody,\n statusCode: response.statusCode,\n statusMessage: response.statusMessage,\n url: response.url,\n }\n}\n\nasync function resolveRequestTarget(\n resolved: ResolvedEndpoint,\n unauthenticated: boolean,\n providedToken?: string,\n): Promise<{token?: string; url: string}> {\n if (resolved.kind === 'url') {\n const token = unauthenticated ? undefined : providedToken || (await getCliToken())\n if (!token && !unauthenticated) {\n throw new Error('You must login first - run \"sanity login\"')\n }\n return {token, url: resolved.url}\n }\n\n // The client factories handle token resolution, staging/production API\n // hosts and the project subdomain - we only use them to build the URL.\n const client =\n resolved.host === 'project'\n ? await getProjectCliClient({\n apiVersion: resolved.apiVersion,\n projectId: resolved.projectId as string,\n requireUser: !unauthenticated,\n token: providedToken,\n })\n : await getGlobalCliClient({\n apiVersion: resolved.apiVersion,\n requireUser: !unauthenticated,\n token: providedToken,\n unauthenticated,\n })\n\n const token = unauthenticated ? undefined : (client.config().token ?? undefined)\n\n return {token, url: client.getUrl(resolved.path)}\n}\n\nfunction parseBody(\n rawBody: string,\n contentType: string | undefined,\n): {body: unknown; jsonBody: boolean} {\n if (rawBody === '' || !contentType || !/\\bjson\\b/.test(contentType)) {\n return {body: rawBody, jsonBody: false}\n }\n try {\n return {body: JSON.parse(rawBody), jsonBody: true}\n } catch {\n return {body: rawBody, jsonBody: false}\n }\n}\n"],"names":["getCliToken","getGlobalCliClient","getProjectCliClient","createRequester","API_REQUEST_TAG","performApiRequest","options","body","headers","method","query","resolved","token","providedToken","unauthenticated","url","resolveRequestTarget","requestHeaders","authorization","requestBody","Buffer","isBuffer","undefined","JSON","stringify","key","value","Object","entries","toLowerCase","request","middleware","httpErrors","promise","onlyBody","mergedQuery","response","tag","rawBody","String","parsed","parseBody","jsonBody","statusCode","statusMessage","kind","Error","client","host","apiVersion","projectId","requireUser","config","getUrl","path","contentType","test","parse"],"mappings":"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"}