@sanity/cli 6.0.0-alpha.20 → 6.0.0-alpha.21
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/README.md +405 -225
- package/dist/actions/auth/authServer.js +13 -11
- package/dist/actions/auth/authServer.js.map +1 -1
- package/dist/actions/auth/login/getProvider.js +43 -39
- package/dist/actions/auth/login/getProvider.js.map +1 -1
- package/dist/actions/auth/login/getSSOProvider.js +25 -19
- package/dist/actions/auth/login/getSSOProvider.js.map +1 -1
- package/dist/actions/auth/login/login.js +12 -33
- package/dist/actions/auth/login/login.js.map +1 -1
- package/dist/actions/auth/types.js.map +1 -1
- package/dist/actions/codemods/reactIconsV3.js +2 -2
- package/dist/actions/codemods/reactIconsV3.js.map +1 -1
- package/dist/actions/debug/formatters.js +22 -0
- package/dist/actions/debug/formatters.js.map +1 -0
- package/dist/actions/dev/getDashboardAppUrl.js +3 -3
- package/dist/actions/dev/getDashboardAppUrl.js.map +1 -1
- package/dist/actions/documents/validateDocuments.worker.js +2 -2
- package/dist/actions/documents/validateDocuments.worker.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/formatDocumentValidation.js.map +1 -1
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js +108 -0
- package/dist/actions/documents/validation/reporters/prettyReporter/tree.js.map +1 -0
- package/dist/actions/graphql/SchemaError.js +4 -26
- package/dist/actions/graphql/SchemaError.js.map +1 -1
- package/dist/actions/graphql/extractFromSanitySchema.js +3 -4
- package/dist/actions/graphql/extractFromSanitySchema.js.map +1 -1
- package/dist/actions/graphql/extractGraphQLAPIs.js +150 -0
- package/dist/actions/graphql/extractGraphQLAPIs.js.map +1 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js +12 -0
- package/dist/actions/graphql/extractGraphQLAPIs.worker.js.map +1 -0
- package/dist/actions/graphql/gen1/index.js +5 -5
- package/dist/actions/graphql/gen1/index.js.map +1 -1
- package/dist/actions/graphql/gen2/index.js +6 -6
- package/dist/actions/graphql/gen2/index.js.map +1 -1
- package/dist/actions/graphql/gen3/generateTypeQueries.js +2 -3
- package/dist/actions/graphql/gen3/generateTypeQueries.js.map +1 -1
- package/dist/actions/graphql/gen3/index.js +6 -7
- package/dist/actions/graphql/gen3/index.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +12 -35
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.worker.js +75 -106
- package/dist/actions/graphql/getGraphQLAPIs.worker.js.map +1 -1
- package/dist/actions/graphql/helpers.js +13 -0
- package/dist/actions/graphql/helpers.js.map +1 -1
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js +187 -0
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -0
- package/dist/actions/graphql/types.js +1 -1
- package/dist/actions/graphql/types.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.js +2 -1
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/bootstrapRemoteTemplate.js +6 -5
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -1
- package/dist/actions/init/createPackageManifest.js +5 -0
- package/dist/actions/init/createPackageManifest.js.map +1 -1
- package/dist/actions/init/templates/appQuickstart.js +2 -1
- package/dist/actions/init/templates/appQuickstart.js.map +1 -1
- package/dist/actions/init/templates/appSanityUi.js +2 -1
- package/dist/actions/init/templates/appSanityUi.js.map +1 -1
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/media/importMedia.js +1 -2
- package/dist/actions/media/importMedia.js.map +1 -1
- package/dist/actions/projects/getManageUrl.js +1 -2
- package/dist/actions/projects/getManageUrl.js.map +1 -1
- package/dist/actions/schema/validateSchema.worker.js +1 -3
- package/dist/actions/schema/validateSchema.worker.js.map +1 -1
- package/dist/actions/telemetry/isTrueish.js +10 -0
- package/dist/actions/telemetry/isTrueish.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.js +2 -1
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.js +2 -1
- package/dist/actions/telemetry/setConsent.js.map +1 -1
- package/dist/actions/versions/findSanityModulesVersions.js +1 -2
- package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
- package/dist/commands/backup/disable.js +21 -1
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/download.js +18 -4
- package/dist/commands/backup/download.js.map +1 -1
- package/dist/commands/backup/enable.js +21 -1
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +15 -1
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/add.js +19 -1
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +21 -1
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +21 -1
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/alias/create.js +4 -2
- package/dist/commands/dataset/alias/create.js.map +1 -1
- package/dist/commands/dataset/alias/delete.js +4 -2
- package/dist/commands/dataset/alias/delete.js.map +1 -1
- package/dist/commands/dataset/alias/link.js +4 -2
- package/dist/commands/dataset/alias/link.js.map +1 -1
- package/dist/commands/dataset/alias/unlink.js +4 -2
- package/dist/commands/dataset/alias/unlink.js.map +1 -1
- package/dist/commands/dataset/copy.js +4 -2
- package/dist/commands/dataset/copy.js.map +1 -1
- package/dist/commands/dataset/create.js +4 -2
- package/dist/commands/dataset/create.js.map +1 -1
- package/dist/commands/dataset/delete.js +4 -2
- package/dist/commands/dataset/delete.js.map +1 -1
- package/dist/commands/dataset/embeddings/disable.js +4 -2
- package/dist/commands/dataset/embeddings/disable.js.map +1 -1
- package/dist/commands/dataset/embeddings/enable.js +6 -4
- package/dist/commands/dataset/embeddings/enable.js.map +1 -1
- package/dist/commands/dataset/embeddings/status.js +4 -2
- package/dist/commands/dataset/embeddings/status.js.map +1 -1
- package/dist/commands/dataset/export.js +7 -11
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/list.js +4 -2
- package/dist/commands/dataset/list.js.map +1 -1
- package/dist/commands/dataset/visibility/get.js +4 -2
- package/dist/commands/dataset/visibility/get.js.map +1 -1
- package/dist/commands/dataset/visibility/set.js +4 -2
- package/dist/commands/dataset/visibility/set.js.map +1 -1
- package/dist/commands/debug.js +2 -1
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/documents/create.js +15 -5
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +17 -6
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +15 -6
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +24 -12
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +29 -9
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/deploy.js +55 -28
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +14 -1
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +36 -14
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/attempt.js +21 -1
- package/dist/commands/hook/attempt.js.map +1 -1
- package/dist/commands/hook/create.js +22 -2
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +21 -1
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +21 -1
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/hook/logs.js +19 -1
- package/dist/commands/hook/logs.js.map +1 -1
- package/dist/commands/init.js +13 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +13 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +8 -6
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/media/create-aspect.js +3 -3
- package/dist/commands/media/create-aspect.js.map +1 -1
- package/dist/commands/media/delete-aspect.js +8 -1
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/deploy-aspect.js +20 -3
- package/dist/commands/media/deploy-aspect.js.map +1 -1
- package/dist/commands/media/export.js +8 -1
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +9 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/schema/delete.js +19 -6
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.js +8 -2
- package/dist/commands/schema/deploy.js.map +1 -1
- package/dist/commands/tokens/add.js +23 -1
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/tokens/delete.js +19 -1
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +19 -1
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +23 -1
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +23 -1
- package/dist/commands/users/list.js.map +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -1
- package/dist/hooks/prerun/setupTelemetry.js +2 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/prompts/promptForProject.js.map +1 -1
- package/dist/{actions/auth/login/promptProviders.js → prompts/promptForProviders.js} +3 -3
- package/dist/prompts/promptForProviders.js.map +1 -0
- package/dist/services/auth.js +36 -3
- package/dist/services/auth.js.map +1 -1
- package/dist/services/docs.js +2 -2
- package/dist/services/docs.js.map +1 -1
- package/dist/services/getUrlHeaders.js +0 -2
- package/dist/services/getUrlHeaders.js.map +1 -1
- package/dist/services/projects.js +4 -2
- package/dist/services/projects.js.map +1 -1
- package/dist/services/telemetry.js +2 -1
- package/dist/services/telemetry.js.map +1 -1
- package/dist/util/createExpiringConfig.js +64 -0
- package/dist/util/createExpiringConfig.js.map +1 -0
- package/dist/util/detectFramework.js +135 -0
- package/dist/util/detectFramework.js.map +1 -0
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js +1 -2
- package/dist/util/extractDocumentsFromNdjsonOrTarball.js.map +1 -1
- package/dist/util/isSchemaError.js +11 -0
- package/dist/util/isSchemaError.js.map +1 -0
- package/dist/util/isTar.js +8 -0
- package/dist/util/isTar.js.map +1 -0
- package/dist/util/sharedFlags.js +44 -14
- package/dist/util/sharedFlags.js.map +1 -1
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js +30 -0
- package/dist/util/telemetry/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/createTelemetryStore.js +95 -0
- package/dist/util/telemetry/createTelemetryStore.js.map +1 -0
- package/dist/util/telemetry/createTraceId.js +10 -0
- package/dist/util/telemetry/createTraceId.js.map +1 -0
- package/dist/util/telemetry/findTelemetryFiles.js +35 -0
- package/dist/util/telemetry/findTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/flushTelemetryFiles.js +118 -0
- package/dist/util/telemetry/flushTelemetryFiles.js.map +1 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js +30 -0
- package/dist/util/telemetry/generateTelemetryFilePath.js.map +1 -0
- package/dist/util/telemetry/logger.js +59 -0
- package/dist/util/telemetry/logger.js.map +1 -0
- package/dist/util/telemetry/readNDJSON.js +28 -0
- package/dist/util/telemetry/readNDJSON.js.map +1 -0
- package/dist/util/telemetry/telemetryStoreDebug.js +7 -0
- package/dist/util/telemetry/telemetryStoreDebug.js.map +1 -0
- package/dist/util/telemetry/trace.js +150 -0
- package/dist/util/telemetry/trace.js.map +1 -0
- package/dist/util/update/updateChecker.js +2 -1
- package/dist/util/update/updateChecker.js.map +1 -1
- package/oclif.manifest.json +966 -529
- package/package.json +19 -22
- package/dist/actions/auth/login/promptProviders.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
2
|
import os from 'node:os';
|
|
3
|
-
import { subdebug } from '@sanity/cli-core';
|
|
3
|
+
import { getSanityUrl, subdebug } from '@sanity/cli-core';
|
|
4
|
+
import { getTokenDetails } from '../../services/auth.js';
|
|
4
5
|
const debug = subdebug('auth');
|
|
5
6
|
const callbackPorts = [
|
|
6
7
|
4321,
|
|
@@ -30,13 +31,11 @@ const platformNames = {
|
|
|
30
31
|
*
|
|
31
32
|
* If we fail to bind to the first port, we retry with the next port in the list.
|
|
32
33
|
*
|
|
33
|
-
* @param
|
|
34
|
+
* @param providerUrl - The URL of the login provider
|
|
34
35
|
* @returns Resolves with HTTP server instance, a login URL to send user to, and a `token` promise
|
|
35
36
|
* @internal
|
|
36
|
-
*/ export function startServerForTokenCallback(
|
|
37
|
-
const
|
|
38
|
-
const { apiHost } = client.config();
|
|
39
|
-
const domain = apiHost.includes('.sanity.work') ? 'www.sanity.work' : 'www.sanity.io';
|
|
37
|
+
*/ export function startServerForTokenCallback(providerUrl) {
|
|
38
|
+
const sanityUrl = getSanityUrl();
|
|
40
39
|
const attemptPorts = [
|
|
41
40
|
...callbackPorts
|
|
42
41
|
];
|
|
@@ -52,7 +51,8 @@ const platformNames = {
|
|
|
52
51
|
const server = createServer(async function onCallbackServerRequest(req, res) {
|
|
53
52
|
function failLoginRequest(code = '') {
|
|
54
53
|
res.writeHead(303, 'See Other', {
|
|
55
|
-
|
|
54
|
+
Connection: 'close',
|
|
55
|
+
Location: `${sanityUrl}/login/error${code ? `?error=${code}` : ''}`
|
|
56
56
|
});
|
|
57
57
|
res.end();
|
|
58
58
|
server.close();
|
|
@@ -60,6 +60,7 @@ const platformNames = {
|
|
|
60
60
|
const url = new URL(req.url || '/', `http://localhost:${callbackPort}`);
|
|
61
61
|
if (url.pathname !== callbackEndpoint) {
|
|
62
62
|
res.writeHead(404, 'Not Found', {
|
|
63
|
+
Connection: 'close',
|
|
63
64
|
'Content-Type': 'text/plain'
|
|
64
65
|
});
|
|
65
66
|
res.write('404 Not Found');
|
|
@@ -69,25 +70,26 @@ const platformNames = {
|
|
|
69
70
|
const absoluteTokenUrl = url.searchParams.get('url');
|
|
70
71
|
if (!absoluteTokenUrl) {
|
|
71
72
|
failLoginRequest();
|
|
73
|
+
rejectToken(new Error('Missing callback URL'));
|
|
72
74
|
return;
|
|
73
75
|
}
|
|
74
76
|
const tokenUrl = new URL(absoluteTokenUrl);
|
|
75
77
|
if (!tokenUrl.searchParams.has('sid')) {
|
|
76
78
|
failLoginRequest('NO_SESSION_ID');
|
|
79
|
+
rejectToken(new Error('Missing session ID in callback'));
|
|
77
80
|
return;
|
|
78
81
|
}
|
|
79
82
|
let token;
|
|
80
83
|
try {
|
|
81
|
-
token = await
|
|
82
|
-
uri: `/auth/fetch${tokenUrl.search}`
|
|
83
|
-
});
|
|
84
|
+
token = await getTokenDetails(tokenUrl.search);
|
|
84
85
|
} catch (err) {
|
|
85
86
|
failLoginRequest('UNRESOLVED_SESSION');
|
|
86
87
|
rejectToken(err instanceof Error ? err : new Error(`Unknown error: ${err}`));
|
|
87
88
|
return;
|
|
88
89
|
}
|
|
89
90
|
res.writeHead(303, 'See Other', {
|
|
90
|
-
|
|
91
|
+
Connection: 'close',
|
|
92
|
+
Location: `${sanityUrl}/login/success`
|
|
91
93
|
});
|
|
92
94
|
res.end();
|
|
93
95
|
server.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/auth/authServer.ts"],"sourcesContent":["import {createServer, type Server} from 'node:http'\nimport os from 'node:os'\n\nimport {subdebug} from '@sanity/cli-core'\nimport {type
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/auth/authServer.ts"],"sourcesContent":["import {createServer, type Server} from 'node:http'\nimport os from 'node:os'\n\nimport {getSanityUrl, subdebug} from '@sanity/cli-core'\n\nimport {getTokenDetails} from '../../services/auth.js'\nimport {type TokenDetails} from './types.js'\n\nconst debug = subdebug('auth')\nconst callbackPorts = [4321, 4000, 3003, 1234, 8080, 13_333]\nconst callbackEndpoint = '/callback'\n\nconst platformNames: Record<string, string | undefined> = {\n aix: 'AIX',\n android: 'Android',\n darwin: 'MacOS',\n freebsd: 'FreeBSD',\n linux: 'Linux',\n openbsd: 'OpenBSD',\n sunos: 'SunOS',\n win32: 'Windows',\n}\n\n/**\n * Start a local HTTP server and wait for a request to the auth callback endpoint.\n * This happens by the user being sent to a login page with a callback URL that points to\n * this local server. This request includes a short-lived \"SID\" (session ID) that we then\n * do a request to the `/auth/fetch` endpoint with to get the actual auth token,\n * invalidating the SID in the process.\n *\n * If we fail to bind to the first port, we retry with the next port in the list.\n *\n * @param providerUrl - The URL of the login provider\n * @returns Resolves with HTTP server instance, a login URL to send user to, and a `token` promise\n * @internal\n */\nexport function startServerForTokenCallback(\n providerUrl: string,\n): Promise<{loginUrl: URL; server: Server; token: Promise<TokenDetails>}> {\n const sanityUrl = getSanityUrl()\n\n const attemptPorts = [...callbackPorts]\n let callbackPort = attemptPorts.shift()\n\n // note: replace with `Promise.withResolvers()` when minimum Node.js is 22+\n let resolveToken: (resolvedToken: PromiseLike<TokenDetails> | TokenDetails) => void\n let rejectToken: (reason: Error) => void\n const tokenPromise = new Promise<TokenDetails>((resolve, reject) => {\n resolveToken = resolve\n rejectToken = reject\n })\n\n return new Promise((resolve, reject) => {\n const server = createServer(async function onCallbackServerRequest(req, res) {\n function failLoginRequest(code = '') {\n res.writeHead(303, 'See Other', {\n Connection: 'close',\n Location: `${sanityUrl}/login/error${code ? `?error=${code}` : ''}`,\n })\n res.end()\n server.close()\n }\n\n const url = new URL(req.url || '/', `http://localhost:${callbackPort}`)\n if (url.pathname !== callbackEndpoint) {\n res.writeHead(404, 'Not Found', {Connection: 'close', 'Content-Type': 'text/plain'})\n res.write('404 Not Found')\n res.end()\n return\n }\n\n const absoluteTokenUrl = url.searchParams.get('url')\n if (!absoluteTokenUrl) {\n failLoginRequest()\n rejectToken(new Error('Missing callback URL'))\n return\n }\n\n const tokenUrl = new URL(absoluteTokenUrl)\n if (!tokenUrl.searchParams.has('sid')) {\n failLoginRequest('NO_SESSION_ID')\n rejectToken(new Error('Missing session ID in callback'))\n return\n }\n\n let token: TokenDetails\n try {\n token = await getTokenDetails(tokenUrl.search)\n } catch (err) {\n failLoginRequest('UNRESOLVED_SESSION')\n rejectToken(err instanceof Error ? err : new Error(`Unknown error: ${err}`))\n return\n }\n\n res.writeHead(303, 'See Other', {\n Connection: 'close',\n Location: `${sanityUrl}/login/success`,\n })\n res.end()\n server.close()\n resolveToken(token)\n })\n\n server.on('listening', function onCallbackListen() {\n // Once the server is successfully listening on a port, we can return the promise.\n // We'll then await the _token promise_, while the server is running in the background.\n const loginUrl = getLoginUrl(server, providerUrl)\n resolve({loginUrl, server, token: tokenPromise})\n })\n\n server.on('error', function onCallbackServerError(err) {\n if ('code' in err && err.code === 'EADDRINUSE') {\n callbackPort = attemptPorts.shift()\n if (!callbackPort) {\n reject(new Error('Failed to find port number to bind auth callback server to'))\n return\n }\n\n debug('Port busy, trying %d', callbackPort)\n server.listen(callbackPort)\n } else {\n reject(err)\n }\n })\n\n debug('Starting callback server on port %d', callbackPort)\n server.listen(callbackPort)\n })\n}\n\n/**\n * Get the login URL to send the user to for the given local auth token server.\n *\n * The generated URL will include a label for the session that includes the\n * hostname and platform of the current computer, to help identify the session.\n *\n * @param server - The local auth token server\n * @param providerUrl - The URL of the login provider\n * @returns The login URL\n * @internal\n */\nfunction getLoginUrl(server: Server, providerUrl: string): URL {\n const serverUrl = server.address()\n if (!serverUrl || typeof serverUrl === 'string') {\n // Note: `serverUrl` is string only when binding to unix sockets,\n // thus we can safely assume Something Is Wrong™ if it's a string\n throw new Error('Failed to start auth callback server')\n }\n\n // Build a login URL that redirects back back to OAuth flow on success\n const loginUrl = new URL(providerUrl)\n\n // Prefer `MacOS` over `darwin` etc\n const platformName = os.platform()\n const platform = platformName in platformNames ? platformNames[platformName] : platformName\n\n // Prefer `espens-macbook` over `espens-macbook.local`\n const hostname = os.hostname().replaceAll(/\\.(local|lan)$/g, '')\n\n loginUrl.searchParams.set('type', 'token')\n loginUrl.searchParams.set('label', `${hostname} / ${platform}`)\n loginUrl.searchParams.set('origin', `http://localhost:${serverUrl.port}${callbackEndpoint}`)\n\n return loginUrl\n}\n"],"names":["createServer","os","getSanityUrl","subdebug","getTokenDetails","debug","callbackPorts","callbackEndpoint","platformNames","aix","android","darwin","freebsd","linux","openbsd","sunos","win32","startServerForTokenCallback","providerUrl","sanityUrl","attemptPorts","callbackPort","shift","resolveToken","rejectToken","tokenPromise","Promise","resolve","reject","server","onCallbackServerRequest","req","res","failLoginRequest","code","writeHead","Connection","Location","end","close","url","URL","pathname","write","absoluteTokenUrl","searchParams","get","Error","tokenUrl","has","token","search","err","on","onCallbackListen","loginUrl","getLoginUrl","onCallbackServerError","listen","serverUrl","address","platformName","platform","hostname","replaceAll","set","port"],"mappings":"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"}
|
|
@@ -1,54 +1,58 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
1
2
|
import { input, spinner } from '@sanity/cli-core/ux';
|
|
3
|
+
import { promptForProviders } from '../../../prompts/promptForProviders.js';
|
|
4
|
+
import { getProviders } from '../../../services/auth.js';
|
|
2
5
|
import { getSSOProvider } from './getSSOProvider.js';
|
|
3
|
-
|
|
6
|
+
const debug = subdebug('login:getProvider');
|
|
4
7
|
/**
|
|
5
8
|
* Prompt the user to select a login provider, or use the specified provider if given.
|
|
6
9
|
*
|
|
7
10
|
* @param options - Options for the provider resolve operation
|
|
8
11
|
* @returns Promise that resolves to the selected login provider
|
|
9
12
|
* @internal
|
|
10
|
-
*/ export async function getProvider({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
orgSlug
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
*/ export async function getProvider({ experimental, orgSlug, specifiedProvider }) {
|
|
14
|
+
let spin;
|
|
15
|
+
try {
|
|
16
|
+
if (orgSlug) {
|
|
17
|
+
return getSSOProvider(orgSlug);
|
|
18
|
+
}
|
|
19
|
+
spin = spinner('Fetching providers...').start();
|
|
20
|
+
// Fetch and prompt for login provider to use
|
|
21
|
+
let { providers } = await getProviders();
|
|
22
|
+
if (experimental) {
|
|
23
|
+
providers = [
|
|
24
|
+
...providers,
|
|
25
|
+
{
|
|
26
|
+
name: 'sso',
|
|
27
|
+
title: 'SSO',
|
|
28
|
+
url: '_not_used_'
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
spin.stop();
|
|
33
|
+
if (specifiedProvider) {
|
|
34
|
+
const provider = providers.find((prov)=>prov.name === specifiedProvider);
|
|
35
|
+
if (!provider) {
|
|
36
|
+
throw new Error(`Cannot find login provider with name "${specifiedProvider}"`);
|
|
29
37
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const provider = providers
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
+
return provider;
|
|
39
|
+
}
|
|
40
|
+
if (providers.length === 0) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const provider = await promptForProviders(providers);
|
|
44
|
+
if (provider.name === 'sso') {
|
|
45
|
+
const orgSlug = await input({
|
|
46
|
+
message: 'Organization slug:'
|
|
47
|
+
});
|
|
48
|
+
return getSSOProvider(orgSlug);
|
|
38
49
|
}
|
|
39
50
|
return provider;
|
|
51
|
+
} catch (err) {
|
|
52
|
+
spin?.stop();
|
|
53
|
+
debug('Error retrieving providers', err);
|
|
54
|
+
throw err;
|
|
40
55
|
}
|
|
41
|
-
const provider = await promptProviders(providers);
|
|
42
|
-
if (provider.name === 'sso') {
|
|
43
|
-
const orgSlug = await input({
|
|
44
|
-
message: 'Organization slug:'
|
|
45
|
-
});
|
|
46
|
-
return getSSOProvider({
|
|
47
|
-
client,
|
|
48
|
-
orgSlug
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
return provider;
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
//# sourceMappingURL=getProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/auth/login/getProvider.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/auth/login/getProvider.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\nimport {input, spinner, SpinnerInstance} from '@sanity/cli-core/ux'\n\nimport {promptForProviders} from '../../../prompts/promptForProviders.js'\nimport {getProviders} from '../../../services/auth.js'\nimport {type LoginProvider} from '../types.js'\nimport {getSSOProvider} from './getSSOProvider.js'\n\nconst debug = subdebug('login:getProvider')\n\n/**\n * Prompt the user to select a login provider, or use the specified provider if given.\n *\n * @param options - Options for the provider resolve operation\n * @returns Promise that resolves to the selected login provider\n * @internal\n */\nexport async function getProvider({\n experimental,\n orgSlug,\n specifiedProvider,\n}: {\n experimental: boolean | undefined\n orgSlug: string | undefined\n specifiedProvider: string | undefined\n}): Promise<LoginProvider | undefined> {\n let spin: SpinnerInstance | undefined\n\n try {\n if (orgSlug) {\n return getSSOProvider(orgSlug)\n }\n\n spin = spinner('Fetching providers...').start()\n // Fetch and prompt for login provider to use\n let {providers} = await getProviders()\n if (experimental) {\n providers = [...providers, {name: 'sso', title: 'SSO', url: '_not_used_'}]\n }\n spin.stop()\n\n if (specifiedProvider) {\n const provider = providers.find((prov) => prov.name === specifiedProvider)\n if (!provider) {\n throw new Error(`Cannot find login provider with name \"${specifiedProvider}\"`)\n }\n return provider\n }\n\n if (providers.length === 0) {\n return undefined\n }\n\n const provider = await promptForProviders(providers)\n if (provider.name === 'sso') {\n const orgSlug = await input({message: 'Organization slug:'})\n return getSSOProvider(orgSlug)\n }\n\n return provider\n } catch (err) {\n spin?.stop()\n debug('Error retrieving providers', err)\n throw err\n }\n}\n"],"names":["subdebug","input","spinner","promptForProviders","getProviders","getSSOProvider","debug","getProvider","experimental","orgSlug","specifiedProvider","spin","start","providers","name","title","url","stop","provider","find","prov","Error","length","undefined","message","err"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AACzC,SAAQC,KAAK,EAAEC,OAAO,QAAwB,sBAAqB;AAEnE,SAAQC,kBAAkB,QAAO,yCAAwC;AACzE,SAAQC,YAAY,QAAO,4BAA2B;AAEtD,SAAQC,cAAc,QAAO,sBAAqB;AAElD,MAAMC,QAAQN,SAAS;AAEvB;;;;;;CAMC,GACD,OAAO,eAAeO,YAAY,EAChCC,YAAY,EACZC,OAAO,EACPC,iBAAiB,EAKlB;IACC,IAAIC;IAEJ,IAAI;QACF,IAAIF,SAAS;YACX,OAAOJ,eAAeI;QACxB;QAEAE,OAAOT,QAAQ,yBAAyBU,KAAK;QAC7C,6CAA6C;QAC7C,IAAI,EAACC,SAAS,EAAC,GAAG,MAAMT;QACxB,IAAII,cAAc;YAChBK,YAAY;mBAAIA;gBAAW;oBAACC,MAAM;oBAAOC,OAAO;oBAAOC,KAAK;gBAAY;aAAE;QAC5E;QACAL,KAAKM,IAAI;QAET,IAAIP,mBAAmB;YACrB,MAAMQ,WAAWL,UAAUM,IAAI,CAAC,CAACC,OAASA,KAAKN,IAAI,KAAKJ;YACxD,IAAI,CAACQ,UAAU;gBACb,MAAM,IAAIG,MAAM,CAAC,sCAAsC,EAAEX,kBAAkB,CAAC,CAAC;YAC/E;YACA,OAAOQ;QACT;QAEA,IAAIL,UAAUS,MAAM,KAAK,GAAG;YAC1B,OAAOC;QACT;QAEA,MAAML,WAAW,MAAMf,mBAAmBU;QAC1C,IAAIK,SAASJ,IAAI,KAAK,OAAO;YAC3B,MAAML,UAAU,MAAMR,MAAM;gBAACuB,SAAS;YAAoB;YAC1D,OAAOnB,eAAeI;QACxB;QAEA,OAAOS;IACT,EAAE,OAAOO,KAAK;QACZd,MAAMM;QACNX,MAAM,8BAA8BmB;QACpC,MAAMA;IACR;AACF"}
|
|
@@ -1,30 +1,36 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
1
2
|
import { select } from '@sanity/cli-core/ux';
|
|
3
|
+
import { getSSOProviders } from '../../../services/auth.js';
|
|
2
4
|
import { samlProviderToLoginProvider } from './samlProviderToLoginProvider.js';
|
|
5
|
+
const debug = subdebug('login:getSSOProvider');
|
|
3
6
|
/**
|
|
4
7
|
* Get the SSO provider for the given slug
|
|
5
8
|
*
|
|
6
|
-
* @param
|
|
9
|
+
* @param orgSlug - The slug of the organization to get the SSO provider for
|
|
7
10
|
* @returns Promise that resolves to the SSO provider
|
|
8
11
|
* @internal
|
|
9
|
-
*/ export async function getSSOProvider(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
*/ export async function getSSOProvider(orgSlug) {
|
|
13
|
+
try {
|
|
14
|
+
const providers = await getSSOProviders(orgSlug);
|
|
15
|
+
const enabledProviders = providers.filter((candidate)=>!candidate.disabled);
|
|
16
|
+
if (enabledProviders.length === 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
if (enabledProviders.length === 1) {
|
|
20
|
+
return samlProviderToLoginProvider(enabledProviders[0]);
|
|
21
|
+
}
|
|
22
|
+
const selectedProvider = await select({
|
|
23
|
+
choices: enabledProviders.map((provider)=>({
|
|
24
|
+
name: provider.name,
|
|
25
|
+
value: provider
|
|
26
|
+
})),
|
|
27
|
+
message: 'Select SSO provider'
|
|
28
|
+
});
|
|
29
|
+
return samlProviderToLoginProvider(selectedProvider);
|
|
30
|
+
} catch (err) {
|
|
31
|
+
debug('Error retrieving SSO Providers: %O', err);
|
|
32
|
+
throw err;
|
|
16
33
|
}
|
|
17
|
-
if (enabledProviders.length === 1) {
|
|
18
|
-
return samlProviderToLoginProvider(enabledProviders[0]);
|
|
19
|
-
}
|
|
20
|
-
const selectedProvider = await select({
|
|
21
|
-
choices: enabledProviders.map((provider)=>({
|
|
22
|
-
name: provider.name,
|
|
23
|
-
value: provider
|
|
24
|
-
})),
|
|
25
|
-
message: 'Select SSO provider'
|
|
26
|
-
});
|
|
27
|
-
return selectedProvider ? samlProviderToLoginProvider(selectedProvider) : undefined;
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
//# sourceMappingURL=getSSOProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/auth/login/getSSOProvider.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/auth/login/getSSOProvider.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {getSSOProviders} from '../../../services/auth.js'\nimport {type LoginProvider} from '../types.js'\nimport {samlProviderToLoginProvider} from './samlProviderToLoginProvider.js'\n\nconst debug = subdebug('login:getSSOProvider')\n\n/**\n * Get the SSO provider for the given slug\n *\n * @param orgSlug - The slug of the organization to get the SSO provider for\n * @returns Promise that resolves to the SSO provider\n * @internal\n */\nexport async function getSSOProvider(orgSlug: string): Promise<LoginProvider | undefined> {\n try {\n const providers = await getSSOProviders(orgSlug)\n\n const enabledProviders = providers.filter((candidate) => !candidate.disabled)\n if (enabledProviders.length === 0) {\n return undefined\n }\n\n if (enabledProviders.length === 1) {\n return samlProviderToLoginProvider(enabledProviders[0])\n }\n\n const selectedProvider = await select({\n choices: enabledProviders.map((provider) => ({name: provider.name, value: provider})),\n message: 'Select SSO provider',\n })\n\n return samlProviderToLoginProvider(selectedProvider)\n } catch (err) {\n debug('Error retrieving SSO Providers: %O', err)\n throw err\n }\n}\n"],"names":["subdebug","select","getSSOProviders","samlProviderToLoginProvider","debug","getSSOProvider","orgSlug","providers","enabledProviders","filter","candidate","disabled","length","undefined","selectedProvider","choices","map","provider","name","value","message","err"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AACzC,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAQC,eAAe,QAAO,4BAA2B;AAEzD,SAAQC,2BAA2B,QAAO,mCAAkC;AAE5E,MAAMC,QAAQJ,SAAS;AAEvB;;;;;;CAMC,GACD,OAAO,eAAeK,eAAeC,OAAe;IAClD,IAAI;QACF,MAAMC,YAAY,MAAML,gBAAgBI;QAExC,MAAME,mBAAmBD,UAAUE,MAAM,CAAC,CAACC,YAAc,CAACA,UAAUC,QAAQ;QAC5E,IAAIH,iBAAiBI,MAAM,KAAK,GAAG;YACjC,OAAOC;QACT;QAEA,IAAIL,iBAAiBI,MAAM,KAAK,GAAG;YACjC,OAAOT,4BAA4BK,gBAAgB,CAAC,EAAE;QACxD;QAEA,MAAMM,mBAAmB,MAAMb,OAAO;YACpCc,SAASP,iBAAiBQ,GAAG,CAAC,CAACC,WAAc,CAAA;oBAACC,MAAMD,SAASC,IAAI;oBAAEC,OAAOF;gBAAQ,CAAA;YAClFG,SAAS;QACX;QAEA,OAAOjB,4BAA4BW;IACrC,EAAE,OAAOO,KAAK;QACZjB,MAAM,sCAAsCiB;QAC5C,MAAMA;IACR;AACF"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { getCliToken,
|
|
1
|
+
import { getCliToken, setCliUserConfig, subdebug } from '@sanity/cli-core';
|
|
2
2
|
import { spinner } from '@sanity/cli-core/ux';
|
|
3
3
|
import open from 'open';
|
|
4
|
+
import { logout } from '../../../services/auth.js';
|
|
4
5
|
import { LoginTrace } from '../../../telemetry/login.telemetry.js';
|
|
5
6
|
import { canLaunchBrowser } from '../../../util/canLaunchBrowser.js';
|
|
6
7
|
import { startServerForTokenCallback } from '../authServer.js';
|
|
7
8
|
import { getProvider } from './getProvider.js';
|
|
8
|
-
const
|
|
9
|
+
const debug = subdebug('login');
|
|
9
10
|
/**
|
|
10
11
|
* Trigger the authentication flow for the CLI.
|
|
11
12
|
*
|
|
@@ -21,15 +22,7 @@ const LOGIN_API_VERSION = '2024-02-01';
|
|
|
21
22
|
const hasExistingToken = Boolean(previousToken);
|
|
22
23
|
const trace = telemetry.trace(LoginTrace);
|
|
23
24
|
trace.start();
|
|
24
|
-
// We explicitly want to use an unauthenticated client here, even if we already logged in
|
|
25
|
-
const globalClient = await getGlobalCliClient({
|
|
26
|
-
apiVersion: LOGIN_API_VERSION
|
|
27
|
-
});
|
|
28
|
-
const client = globalClient.withConfig({
|
|
29
|
-
token: undefined
|
|
30
|
-
});
|
|
31
25
|
const provider = await getProvider({
|
|
32
|
-
client,
|
|
33
26
|
experimental: options.experimental,
|
|
34
27
|
orgSlug: options.sso,
|
|
35
28
|
specifiedProvider: options.provider
|
|
@@ -41,19 +34,10 @@ const LOGIN_API_VERSION = '2024-02-01';
|
|
|
41
34
|
if (provider === undefined) {
|
|
42
35
|
throw new Error('No authentication providers found');
|
|
43
36
|
}
|
|
44
|
-
const { loginUrl, server, token: tokenPromise } = await startServerForTokenCallback(
|
|
45
|
-
client,
|
|
46
|
-
providerUrl: provider.url
|
|
47
|
-
});
|
|
37
|
+
const { loginUrl, server, token: tokenPromise } = await startServerForTokenCallback(provider.url);
|
|
48
38
|
trace.log({
|
|
49
39
|
step: 'waitForToken'
|
|
50
40
|
});
|
|
51
|
-
const serverUrl = server.address();
|
|
52
|
-
if (!serverUrl || typeof serverUrl === 'string') {
|
|
53
|
-
// Note: `serverUrl` is string only when binding to unix sockets,
|
|
54
|
-
// thus we can safely assume Something Is Wrong™ if it's a string
|
|
55
|
-
throw new Error('Failed to start auth callback server');
|
|
56
|
-
}
|
|
57
41
|
// Open a browser on the login page (or tell the user to)
|
|
58
42
|
const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false;
|
|
59
43
|
const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at';
|
|
@@ -70,25 +54,20 @@ const LOGIN_API_VERSION = '2024-02-01';
|
|
|
70
54
|
} catch (err) {
|
|
71
55
|
spin.stop();
|
|
72
56
|
trace.error(err);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}) : new Error(`${err}`);
|
|
57
|
+
debug('Error retrieving token: %O', err);
|
|
58
|
+
throw err;
|
|
76
59
|
} finally{
|
|
77
|
-
|
|
78
|
-
|
|
60
|
+
await new Promise((resolve)=>{
|
|
61
|
+
server.close(()=>resolve());
|
|
62
|
+
});
|
|
79
63
|
}
|
|
80
64
|
// Store the token
|
|
81
|
-
await
|
|
65
|
+
await setCliUserConfig('authToken', authToken);
|
|
82
66
|
// Clear cached telemetry consent
|
|
83
|
-
await
|
|
67
|
+
await setCliUserConfig('telemetryConsent', undefined);
|
|
84
68
|
// If we had a session previously, attempt to clear it
|
|
85
69
|
if (hasExistingToken) {
|
|
86
|
-
await
|
|
87
|
-
token: previousToken
|
|
88
|
-
}).request({
|
|
89
|
-
method: 'POST',
|
|
90
|
-
uri: '/auth/logout'
|
|
91
|
-
}).catch((err)=>{
|
|
70
|
+
await logout(previousToken).catch((err)=>{
|
|
92
71
|
const statusCode = err && err.response && err.response.statusCode;
|
|
93
72
|
if (statusCode !== 401) {
|
|
94
73
|
output.warn('Failed to invalidate previous session');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/auth/login/login.ts"],"sourcesContent":["import {\n type CLITelemetryStore,\n getCliToken,\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/auth/login/login.ts"],"sourcesContent":["import {\n type CLITelemetryStore,\n getCliToken,\n type Output,\n setCliUserConfig,\n subdebug,\n} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport open from 'open'\n\nimport {logout} from '../../../services/auth.js'\nimport {LoginTrace} from '../../../telemetry/login.telemetry.js'\nimport {canLaunchBrowser} from '../../../util/canLaunchBrowser.js'\nimport {startServerForTokenCallback} from '../authServer.js'\nimport {getProvider} from './getProvider.js'\n\nconst debug = subdebug('login')\n\ninterface LoginOptions {\n output: Output\n\n telemetry: CLITelemetryStore\n\n experimental?: boolean\n open?: boolean\n provider?: string\n sso?: string\n}\n\n/**\n * Trigger the authentication flow for the CLI.\n *\n * NOTE: This uses terminal prompts and will not work for non-interactive/programmatic uses.\n *\n * @param options - Options for the login operation\n * @returns Promise that resolves when the login operation is complete\n * @throws Will throw if login fails or is cancelled\n * @internal\n */\nexport async function login(options: LoginOptions) {\n const {output, telemetry} = options\n const previousToken = await getCliToken()\n const hasExistingToken = Boolean(previousToken)\n\n const trace = telemetry.trace(LoginTrace)\n trace.start()\n\n const provider = await getProvider({\n experimental: options.experimental,\n orgSlug: options.sso,\n specifiedProvider: options.provider,\n })\n\n trace.log({provider: provider?.name, step: 'selectProvider'})\n\n if (provider === undefined) {\n throw new Error('No authentication providers found')\n }\n\n const {loginUrl, server, token: tokenPromise} = await startServerForTokenCallback(provider.url)\n\n trace.log({step: 'waitForToken'})\n\n // Open a browser on the login page (or tell the user to)\n const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false\n const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at'\n\n output.log(`\\n${actionText} ${loginUrl.href}\\n`)\n\n const spin = spinner('Waiting for browser login to complete... Press Ctrl + C to cancel').start()\n\n if (shouldLaunchBrowser) {\n open(loginUrl.href)\n }\n\n // Wait for a success/error on the HTTP callback server\n let authToken: string\n try {\n authToken = (await tokenPromise).token\n spin.stop()\n } catch (err: unknown) {\n spin.stop()\n trace.error(err as Error)\n debug('Error retrieving token: %O', err)\n throw err\n } finally {\n await new Promise<void>((resolve) => {\n server.close(() => resolve())\n })\n }\n\n // Store the token\n await setCliUserConfig('authToken', authToken)\n\n // Clear cached telemetry consent\n await setCliUserConfig('telemetryConsent', undefined)\n\n // If we had a session previously, attempt to clear it\n if (hasExistingToken) {\n await logout(previousToken).catch((err) => {\n const statusCode = err && err.response && err.response.statusCode\n if (statusCode !== 401) {\n output.warn('Failed to invalidate previous session')\n }\n })\n }\n\n trace.complete()\n}\n"],"names":["getCliToken","setCliUserConfig","subdebug","spinner","open","logout","LoginTrace","canLaunchBrowser","startServerForTokenCallback","getProvider","debug","login","options","output","telemetry","previousToken","hasExistingToken","Boolean","trace","start","provider","experimental","orgSlug","sso","specifiedProvider","log","name","step","undefined","Error","loginUrl","server","token","tokenPromise","url","shouldLaunchBrowser","actionText","href","spin","authToken","stop","err","error","Promise","resolve","close","catch","statusCode","response","warn","complete"],"mappings":"AAAA,SAEEA,WAAW,EAEXC,gBAAgB,EAChBC,QAAQ,QACH,mBAAkB;AACzB,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,OAAOC,UAAU,OAAM;AAEvB,SAAQC,MAAM,QAAO,4BAA2B;AAChD,SAAQC,UAAU,QAAO,wCAAuC;AAChE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,2BAA2B,QAAO,mBAAkB;AAC5D,SAAQC,WAAW,QAAO,mBAAkB;AAE5C,MAAMC,QAAQR,SAAS;AAavB;;;;;;;;;CASC,GACD,OAAO,eAAeS,MAAMC,OAAqB;IAC/C,MAAM,EAACC,MAAM,EAAEC,SAAS,EAAC,GAAGF;IAC5B,MAAMG,gBAAgB,MAAMf;IAC5B,MAAMgB,mBAAmBC,QAAQF;IAEjC,MAAMG,QAAQJ,UAAUI,KAAK,CAACZ;IAC9BY,MAAMC,KAAK;IAEX,MAAMC,WAAW,MAAMX,YAAY;QACjCY,cAAcT,QAAQS,YAAY;QAClCC,SAASV,QAAQW,GAAG;QACpBC,mBAAmBZ,QAAQQ,QAAQ;IACrC;IAEAF,MAAMO,GAAG,CAAC;QAACL,UAAUA,UAAUM;QAAMC,MAAM;IAAgB;IAE3D,IAAIP,aAAaQ,WAAW;QAC1B,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAM,EAACC,QAAQ,EAAEC,MAAM,EAAEC,OAAOC,YAAY,EAAC,GAAG,MAAMzB,4BAA4BY,SAASc,GAAG;IAE9FhB,MAAMO,GAAG,CAAC;QAACE,MAAM;IAAc;IAE/B,yDAAyD;IACzD,MAAMQ,sBAAsB5B,sBAAsBK,QAAQR,IAAI,KAAK;IACnE,MAAMgC,aAAaD,sBAAsB,uBAAuB;IAEhEtB,OAAOY,GAAG,CAAC,CAAC,EAAE,EAAEW,WAAW,CAAC,EAAEN,SAASO,IAAI,CAAC,EAAE,CAAC;IAE/C,MAAMC,OAAOnC,QAAQ,qEAAqEgB,KAAK;IAE/F,IAAIgB,qBAAqB;QACvB/B,KAAK0B,SAASO,IAAI;IACpB;IAEA,uDAAuD;IACvD,IAAIE;IACJ,IAAI;QACFA,YAAY,AAAC,CAAA,MAAMN,YAAW,EAAGD,KAAK;QACtCM,KAAKE,IAAI;IACX,EAAE,OAAOC,KAAc;QACrBH,KAAKE,IAAI;QACTtB,MAAMwB,KAAK,CAACD;QACZ/B,MAAM,8BAA8B+B;QACpC,MAAMA;IACR,SAAU;QACR,MAAM,IAAIE,QAAc,CAACC;YACvBb,OAAOc,KAAK,CAAC,IAAMD;QACrB;IACF;IAEA,kBAAkB;IAClB,MAAM3C,iBAAiB,aAAasC;IAEpC,iCAAiC;IACjC,MAAMtC,iBAAiB,oBAAoB2B;IAE3C,sDAAsD;IACtD,IAAIZ,kBAAkB;QACpB,MAAMX,OAAOU,eAAe+B,KAAK,CAAC,CAACL;YACjC,MAAMM,aAAaN,OAAOA,IAAIO,QAAQ,IAAIP,IAAIO,QAAQ,CAACD,UAAU;YACjE,IAAIA,eAAe,KAAK;gBACtBlC,OAAOoC,IAAI,CAAC;YACd;QACF;IACF;IAEA/B,MAAMgC,QAAQ;AAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/auth/types.ts"],"sourcesContent":["/**\n * @internal\n */\nexport interface LoginProvider {\n name: string\n title: string\n url: string\n}\n\n/**\n * @internal\n */\nexport interface SamlLoginProvider {\n callbackUrl: string\n disabled: boolean\n id: string\n loginUrl: string\n name: string\n organizationId: string\n type: 'saml'\n}\n\n/**\n * @internal\n */\nexport interface ProvidersResponse {\n providers: LoginProvider[]\n}\n"],"names":[],"mappings":"AAAA;;CAEC,
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/auth/types.ts"],"sourcesContent":["/**\n * @internal\n */\nexport interface LoginProvider {\n name: string\n title: string\n url: string\n}\n\n/**\n * @internal\n */\nexport interface SamlLoginProvider {\n callbackUrl: string\n disabled: boolean\n id: string\n loginUrl: string\n name: string\n organizationId: string\n type: 'saml'\n}\n\n/**\n * @internal\n */\nexport interface ProvidersResponse {\n providers: LoginProvider[]\n}\n\n/**\n * @internal\n */\nexport interface TokenDetails {\n label: string\n token: string\n}\n"],"names":[],"mappings":"AAAA;;CAEC,GA2BD;;CAEC,GACD,WAGC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import semver from 'semver';
|
|
2
2
|
import { getLocalPackageVersion } from '../../util/getLocalPackageVersion.js';
|
|
3
3
|
const purpose = 'Transform react-icons v2 imports to v3 form';
|
|
4
4
|
const description = `
|
|
@@ -21,7 +21,7 @@ export const reactIconsV3 = {
|
|
|
21
21
|
if (!dependencyVersion) {
|
|
22
22
|
throw new Error('Could not find react-icons declared as dependency in package.json');
|
|
23
23
|
}
|
|
24
|
-
if (
|
|
24
|
+
if (semver.compare(dependencyVersion, '3.0.0') < 0) {
|
|
25
25
|
throw new Error('react-icons declared in package.json dependencies is lower than 3.0.0');
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/codemods/reactIconsV3.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/codemods/reactIconsV3.ts"],"sourcesContent":["import semver from 'semver'\n\nimport {getLocalPackageVersion} from '../../util/getLocalPackageVersion.js'\nimport {type CodeMod} from './types.js'\n\nconst purpose = 'Transform react-icons v2 imports to v3 form'\nconst description = `\nModifies all found react-icons import and require statements from their v2 form\nto the path structure used in react-icons v3. For instance:\n\nfrom: import {MdPerson} from 'react-icons/lib/md'\n to: import {MdPerson} from 'react-icons/md'\n\nfrom: import PersonIcon from 'react-icons/lib/md/person'\n to: import {MdPerson as PersonIcon} from 'react-icons/md'\n`.trim()\n\nexport const reactIconsV3: CodeMod = {\n description,\n filename: 'reactIconsV3.js',\n purpose,\n verify: async (context) => {\n const {workDir} = context\n\n const dependencyVersion = await getLocalPackageVersion('react-icons', workDir)\n if (!dependencyVersion) {\n throw new Error('Could not find react-icons declared as dependency in package.json')\n }\n\n if (semver.compare(dependencyVersion, '3.0.0') < 0) {\n throw new Error('react-icons declared in package.json dependencies is lower than 3.0.0')\n }\n },\n}\n"],"names":["semver","getLocalPackageVersion","purpose","description","trim","reactIconsV3","filename","verify","context","workDir","dependencyVersion","Error","compare"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAE3B,SAAQC,sBAAsB,QAAO,uCAAsC;AAG3E,MAAMC,UAAU;AAChB,MAAMC,cAAc,CAAC;;;;;;;;;AASrB,CAAC,CAACC,IAAI;AAEN,OAAO,MAAMC,eAAwB;IACnCF;IACAG,UAAU;IACVJ;IACAK,QAAQ,OAAOC;QACb,MAAM,EAACC,OAAO,EAAC,GAAGD;QAElB,MAAME,oBAAoB,MAAMT,uBAAuB,eAAeQ;QACtE,IAAI,CAACC,mBAAmB;YACtB,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIX,OAAOY,OAAO,CAACF,mBAAmB,WAAW,GAAG;YAClD,MAAM,IAAIC,MAAM;QAClB;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { inspect } from 'node:util';
|
|
2
|
+
import { ux } from '@oclif/core';
|
|
3
|
+
export function formatObject(obj) {
|
|
4
|
+
return inspect(obj, {
|
|
5
|
+
colors: true,
|
|
6
|
+
depth: +Infinity
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export function printKeyValue(obj) {
|
|
10
|
+
let printedLines = 0;
|
|
11
|
+
for (const key of Object.keys(obj)){
|
|
12
|
+
if (obj[key] !== undefined) {
|
|
13
|
+
ux.stdout(` ${key}: ${formatObject(obj[key])}`);
|
|
14
|
+
printedLines++;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (printedLines > 0) {
|
|
18
|
+
ux.stdout('');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/debug/formatters.ts"],"sourcesContent":["import {inspect} from 'node:util'\n\nimport {ux} from '@oclif/core'\n\nexport function formatObject(obj: unknown): string {\n return inspect(obj, {colors: true, depth: +Infinity})\n}\n\nexport function printKeyValue(obj: Record<string, unknown>): void {\n let printedLines = 0\n for (const key of Object.keys(obj)) {\n if (obj[key] !== undefined) {\n ux.stdout(` ${key}: ${formatObject(obj[key])}`)\n printedLines++\n }\n }\n\n if (printedLines > 0) {\n ux.stdout('')\n }\n}\n"],"names":["inspect","ux","formatObject","obj","colors","depth","Infinity","printKeyValue","printedLines","key","Object","keys","undefined","stdout"],"mappings":"AAAA,SAAQA,OAAO,QAAO,YAAW;AAEjC,SAAQC,EAAE,QAAO,cAAa;AAE9B,OAAO,SAASC,aAAaC,GAAY;IACvC,OAAOH,QAAQG,KAAK;QAACC,QAAQ;QAAMC,OAAO,CAACC;IAAQ;AACrD;AAEA,OAAO,SAASC,cAAcJ,GAA4B;IACxD,IAAIK,eAAe;IACnB,KAAK,MAAMC,OAAOC,OAAOC,IAAI,CAACR,KAAM;QAClC,IAAIA,GAAG,CAACM,IAAI,KAAKG,WAAW;YAC1BX,GAAGY,MAAM,CAAC,CAAC,EAAE,EAAEJ,IAAI,EAAE,EAAEP,aAAaC,GAAG,CAACM,IAAI,GAAG;YAC/CD;QACF;IACF;IAEA,IAAIA,eAAe,GAAG;QACpBP,GAAGY,MAAM,CAAC;IACZ;AACF"}
|
|
@@ -2,9 +2,9 @@ import { getSanityUrl, subdebug } from '@sanity/cli-core';
|
|
|
2
2
|
const debug = subdebug('dev:getDashboardAppURL');
|
|
3
3
|
const DEFAULT_TIMEOUT = 5000;
|
|
4
4
|
const getDefaultDashboardURL = ({ organizationId, url })=>{
|
|
5
|
-
return
|
|
5
|
+
return getSanityUrl(`/@${organizationId}?${new URLSearchParams({
|
|
6
6
|
dev: url
|
|
7
|
-
}).toString()}
|
|
7
|
+
}).toString()}`);
|
|
8
8
|
};
|
|
9
9
|
/**
|
|
10
10
|
* Gets the dashboard URL from API or uses the default dashboard URL
|
|
@@ -18,7 +18,7 @@ const getDefaultDashboardURL = ({ organizationId, url })=>{
|
|
|
18
18
|
organizationId,
|
|
19
19
|
url
|
|
20
20
|
});
|
|
21
|
-
const res = await globalThis.fetch(
|
|
21
|
+
const res = await globalThis.fetch(getSanityUrl(`/api/dashboard/mode/development/resolve-url?${queryParams.toString()}`), {
|
|
22
22
|
signal: abortController.signal
|
|
23
23
|
});
|
|
24
24
|
if (!res.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/dev/getDashboardAppUrl.ts"],"sourcesContent":["import {getSanityUrl, subdebug} from '@sanity/cli-core'\n\nconst debug = subdebug('dev:getDashboardAppURL')\n\nconst DEFAULT_TIMEOUT = 5000\n\nconst getDefaultDashboardURL = ({\n organizationId,\n url,\n}: {\n organizationId: string\n url: string\n}): string => {\n return
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/dev/getDashboardAppUrl.ts"],"sourcesContent":["import {getSanityUrl, subdebug} from '@sanity/cli-core'\n\nconst debug = subdebug('dev:getDashboardAppURL')\n\nconst DEFAULT_TIMEOUT = 5000\n\nconst getDefaultDashboardURL = ({\n organizationId,\n url,\n}: {\n organizationId: string\n url: string\n}): string => {\n return getSanityUrl(\n `/@${organizationId}?${new URLSearchParams({\n dev: url,\n }).toString()}`,\n )\n}\n\n/**\n * Gets the dashboard URL from API or uses the default dashboard URL\n */\nexport const getDashboardAppURL = async ({\n httpHost = 'localhost',\n httpPort = 3333,\n organizationId,\n}: {\n httpHost?: string\n httpPort?: number\n organizationId: string\n}): Promise<string> => {\n const url = `http://${httpHost}:${httpPort}`\n\n const abortController = new AbortController()\n // Wait for 5 seconds before aborting the request\n const timer = setTimeout(() => abortController.abort(), DEFAULT_TIMEOUT)\n try {\n const queryParams = new URLSearchParams({\n organizationId,\n url,\n })\n\n const res = await globalThis.fetch(\n getSanityUrl(`/api/dashboard/mode/development/resolve-url?${queryParams.toString()}`),\n {\n signal: abortController.signal,\n },\n )\n\n if (!res.ok) {\n debug(`Failed to fetch dashboard URL: ${res.statusText}`)\n return getDefaultDashboardURL({organizationId, url})\n }\n\n const body = await res.json()\n // <dashboard-app-url>/<orgniazationId>?dev=<dev-server-url>\n return body?.url ?? getDefaultDashboardURL({organizationId, url})\n } catch (err) {\n debug(`Failed to fetch dashboard URL: ${err instanceof Error ? err.message : String(err)}`)\n return getDefaultDashboardURL({organizationId, url})\n } finally {\n clearTimeout(timer)\n }\n}\n"],"names":["getSanityUrl","subdebug","debug","DEFAULT_TIMEOUT","getDefaultDashboardURL","organizationId","url","URLSearchParams","dev","toString","getDashboardAppURL","httpHost","httpPort","abortController","AbortController","timer","setTimeout","abort","queryParams","res","globalThis","fetch","signal","ok","statusText","body","json","err","Error","message","String","clearTimeout"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,QAAQ,QAAO,mBAAkB;AAEvD,MAAMC,QAAQD,SAAS;AAEvB,MAAME,kBAAkB;AAExB,MAAMC,yBAAyB,CAAC,EAC9BC,cAAc,EACdC,GAAG,EAIJ;IACC,OAAON,aACL,CAAC,EAAE,EAAEK,eAAe,CAAC,EAAE,IAAIE,gBAAgB;QACzCC,KAAKF;IACP,GAAGG,QAAQ,IAAI;AAEnB;AAEA;;CAEC,GACD,OAAO,MAAMC,qBAAqB,OAAO,EACvCC,WAAW,WAAW,EACtBC,WAAW,IAAI,EACfP,cAAc,EAKf;IACC,MAAMC,MAAM,CAAC,OAAO,EAAEK,SAAS,CAAC,EAAEC,UAAU;IAE5C,MAAMC,kBAAkB,IAAIC;IAC5B,iDAAiD;IACjD,MAAMC,QAAQC,WAAW,IAAMH,gBAAgBI,KAAK,IAAId;IACxD,IAAI;QACF,MAAMe,cAAc,IAAIX,gBAAgB;YACtCF;YACAC;QACF;QAEA,MAAMa,MAAM,MAAMC,WAAWC,KAAK,CAChCrB,aAAa,CAAC,4CAA4C,EAAEkB,YAAYT,QAAQ,IAAI,GACpF;YACEa,QAAQT,gBAAgBS,MAAM;QAChC;QAGF,IAAI,CAACH,IAAII,EAAE,EAAE;YACXrB,MAAM,CAAC,+BAA+B,EAAEiB,IAAIK,UAAU,EAAE;YACxD,OAAOpB,uBAAuB;gBAACC;gBAAgBC;YAAG;QACpD;QAEA,MAAMmB,OAAO,MAAMN,IAAIO,IAAI;QAC3B,4DAA4D;QAC5D,OAAOD,MAAMnB,OAAOF,uBAAuB;YAACC;YAAgBC;QAAG;IACjE,EAAE,OAAOqB,KAAK;QACZzB,MAAM,CAAC,+BAA+B,EAAEyB,eAAeC,QAAQD,IAAIE,OAAO,GAAGC,OAAOH,MAAM;QAC1F,OAAOvB,uBAAuB;YAACC;YAAgBC;QAAG;IACpD,SAAU;QACRyB,aAAahB;IACf;AACF,EAAC"}
|
|
@@ -4,7 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import readline from 'node:readline';
|
|
5
5
|
import { Readable } from 'node:stream';
|
|
6
6
|
import { workerData as _workerData, isMainThread, parentPort } from 'node:worker_threads';
|
|
7
|
-
import { getStudioWorkspaces,
|
|
7
|
+
import { getStudioWorkspaces, resolveLocalPackage } from '@sanity/cli-core';
|
|
8
8
|
import { createClient } from '@sanity/client';
|
|
9
9
|
import { WorkerChannelReporter } from '@sanity/worker-channels';
|
|
10
10
|
import pMap from 'p-map';
|
|
@@ -215,7 +215,7 @@ async function main() {
|
|
|
215
215
|
return markerValue <= flagLevelValue;
|
|
216
216
|
});
|
|
217
217
|
} catch (err) {
|
|
218
|
-
const errorMessage =
|
|
218
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
219
219
|
const message = `Exception occurred while validating value: ${errorMessage}`;
|
|
220
220
|
markers = [
|
|
221
221
|
{
|