vercel 46.0.1 → 46.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/index.js +321 -255
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -41527,6 +41527,261 @@ var init_print_indications = __esm({
|
|
|
41527
41527
|
}
|
|
41528
41528
|
});
|
|
41529
41529
|
|
|
41530
|
+
// src/util/oauth.ts
|
|
41531
|
+
async function as() {
|
|
41532
|
+
if (!_as) {
|
|
41533
|
+
const discoveryResponse = await discoveryEndpointRequest(VERCEL_ISSUER);
|
|
41534
|
+
const [discoveryResponseError, as2] = await processDiscoveryEndpointResponse(discoveryResponse);
|
|
41535
|
+
if (discoveryResponseError) {
|
|
41536
|
+
throw discoveryResponseError;
|
|
41537
|
+
}
|
|
41538
|
+
_as = as2;
|
|
41539
|
+
}
|
|
41540
|
+
return _as;
|
|
41541
|
+
}
|
|
41542
|
+
async function discoveryEndpointRequest(issuer) {
|
|
41543
|
+
return await (0, import_node_fetch.default)(new URL(".well-known/openid-configuration", issuer), {
|
|
41544
|
+
headers: { "Content-Type": "application/json", "user-agent": userAgent }
|
|
41545
|
+
});
|
|
41546
|
+
}
|
|
41547
|
+
async function processDiscoveryEndpointResponse(response) {
|
|
41548
|
+
const json = await response.json();
|
|
41549
|
+
if (!response.ok) {
|
|
41550
|
+
return [new Error("Discovery endpoint request failed")];
|
|
41551
|
+
}
|
|
41552
|
+
if (typeof json !== "object" || json === null || !canParseURL(json.issuer) || !canParseURL(json.device_authorization_endpoint) || !canParseURL(json.token_endpoint) || !canParseURL(json.revocation_endpoint) || !canParseURL(json.jwks_uri) || !canParseURL(json.introspection_endpoint)) {
|
|
41553
|
+
return [new TypeError("Invalid discovery response")];
|
|
41554
|
+
}
|
|
41555
|
+
const issuer = new URL(json.issuer);
|
|
41556
|
+
if (issuer.href !== VERCEL_ISSUER.href) {
|
|
41557
|
+
return [new Error("Issuer mismatch")];
|
|
41558
|
+
}
|
|
41559
|
+
return [
|
|
41560
|
+
null,
|
|
41561
|
+
{
|
|
41562
|
+
issuer,
|
|
41563
|
+
device_authorization_endpoint: new URL(
|
|
41564
|
+
json.device_authorization_endpoint
|
|
41565
|
+
),
|
|
41566
|
+
token_endpoint: new URL(json.token_endpoint),
|
|
41567
|
+
revocation_endpoint: new URL(json.revocation_endpoint),
|
|
41568
|
+
jwks_uri: new URL(json.jwks_uri),
|
|
41569
|
+
introspection_endpoint: new URL(json.introspection_endpoint)
|
|
41570
|
+
}
|
|
41571
|
+
];
|
|
41572
|
+
}
|
|
41573
|
+
async function deviceAuthorizationRequest() {
|
|
41574
|
+
return await (0, import_node_fetch.default)((await as()).device_authorization_endpoint, {
|
|
41575
|
+
method: "POST",
|
|
41576
|
+
headers: {
|
|
41577
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
41578
|
+
"user-agent": userAgent
|
|
41579
|
+
},
|
|
41580
|
+
body: new URLSearchParams({
|
|
41581
|
+
client_id: VERCEL_CLI_CLIENT_ID,
|
|
41582
|
+
scope: "openid offline_access"
|
|
41583
|
+
})
|
|
41584
|
+
});
|
|
41585
|
+
}
|
|
41586
|
+
async function processDeviceAuthorizationResponse(response) {
|
|
41587
|
+
const json = await response.json();
|
|
41588
|
+
if (!response.ok) {
|
|
41589
|
+
return [new OAuthError("Device authorization request failed", json)];
|
|
41590
|
+
}
|
|
41591
|
+
if (typeof json !== "object" || json === null)
|
|
41592
|
+
return [new TypeError("Expected response to be an object")];
|
|
41593
|
+
if (!("device_code" in json) || typeof json.device_code !== "string")
|
|
41594
|
+
return [new TypeError("Expected `device_code` to be a string")];
|
|
41595
|
+
if (!("user_code" in json) || typeof json.user_code !== "string")
|
|
41596
|
+
return [new TypeError("Expected `user_code` to be a string")];
|
|
41597
|
+
if (!("verification_uri" in json) || typeof json.verification_uri !== "string" || !canParseURL(json.verification_uri)) {
|
|
41598
|
+
return [new TypeError("Expected `verification_uri` to be a string")];
|
|
41599
|
+
}
|
|
41600
|
+
if (!("verification_uri_complete" in json) || typeof json.verification_uri_complete !== "string" || !canParseURL(json.verification_uri_complete)) {
|
|
41601
|
+
return [
|
|
41602
|
+
new TypeError("Expected `verification_uri_complete` to be a string")
|
|
41603
|
+
];
|
|
41604
|
+
}
|
|
41605
|
+
if (!("expires_in" in json) || typeof json.expires_in !== "number")
|
|
41606
|
+
return [new TypeError("Expected `expires_in` to be a number")];
|
|
41607
|
+
if (!("interval" in json) || typeof json.interval !== "number")
|
|
41608
|
+
return [new TypeError("Expected `interval` to be a number")];
|
|
41609
|
+
return [
|
|
41610
|
+
null,
|
|
41611
|
+
{
|
|
41612
|
+
device_code: json.device_code,
|
|
41613
|
+
user_code: json.user_code,
|
|
41614
|
+
verification_uri: json.verification_uri,
|
|
41615
|
+
verification_uri_complete: json.verification_uri_complete,
|
|
41616
|
+
expiresAt: Date.now() + json.expires_in * 1e3,
|
|
41617
|
+
interval: json.interval
|
|
41618
|
+
}
|
|
41619
|
+
];
|
|
41620
|
+
}
|
|
41621
|
+
async function deviceAccessTokenRequest(options) {
|
|
41622
|
+
try {
|
|
41623
|
+
return [
|
|
41624
|
+
null,
|
|
41625
|
+
await (0, import_node_fetch.default)((await as()).token_endpoint, {
|
|
41626
|
+
method: "POST",
|
|
41627
|
+
headers: {
|
|
41628
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
41629
|
+
"user-agent": userAgent
|
|
41630
|
+
},
|
|
41631
|
+
body: new URLSearchParams({
|
|
41632
|
+
client_id: VERCEL_CLI_CLIENT_ID,
|
|
41633
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
41634
|
+
...options
|
|
41635
|
+
}),
|
|
41636
|
+
// TODO: Drop `node-fetch` and just use `signal`
|
|
41637
|
+
timeout: 10 * 1e3,
|
|
41638
|
+
// @ts-expect-error: Signal is part of `fetch` spec, should drop `node-fetch`
|
|
41639
|
+
signal: AbortSignal.timeout(10 * 1e3)
|
|
41640
|
+
})
|
|
41641
|
+
];
|
|
41642
|
+
} catch (error3) {
|
|
41643
|
+
if (error3 instanceof Error)
|
|
41644
|
+
return [error3];
|
|
41645
|
+
return [
|
|
41646
|
+
new Error("An unknown error occurred. See the logs for details.", {
|
|
41647
|
+
cause: error3
|
|
41648
|
+
})
|
|
41649
|
+
];
|
|
41650
|
+
}
|
|
41651
|
+
}
|
|
41652
|
+
async function processTokenResponse(response) {
|
|
41653
|
+
const json = await response.json();
|
|
41654
|
+
if (!response.ok) {
|
|
41655
|
+
return [new OAuthError("Device access token request failed", json)];
|
|
41656
|
+
}
|
|
41657
|
+
if (typeof json !== "object" || json === null)
|
|
41658
|
+
return [new TypeError("Expected response to be an object")];
|
|
41659
|
+
if (!("access_token" in json) || typeof json.access_token !== "string")
|
|
41660
|
+
return [new TypeError("Expected `access_token` to be a string")];
|
|
41661
|
+
if (!("token_type" in json) || json.token_type !== "Bearer")
|
|
41662
|
+
return [new TypeError('Expected `token_type` to be "Bearer"')];
|
|
41663
|
+
if (!("expires_in" in json) || typeof json.expires_in !== "number")
|
|
41664
|
+
return [new TypeError("Expected `expires_in` to be a number")];
|
|
41665
|
+
if ("refresh_token" in json && (typeof json.refresh_token !== "string" || !json.refresh_token))
|
|
41666
|
+
return [new TypeError("Expected `refresh_token` to be a string")];
|
|
41667
|
+
if ("scope" in json && typeof json.scope !== "string")
|
|
41668
|
+
return [new TypeError("Expected `scope` to be a string")];
|
|
41669
|
+
return [null, json];
|
|
41670
|
+
}
|
|
41671
|
+
async function revocationRequest(options) {
|
|
41672
|
+
return await (0, import_node_fetch.default)((await as()).revocation_endpoint, {
|
|
41673
|
+
method: "POST",
|
|
41674
|
+
headers: {
|
|
41675
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
41676
|
+
"user-agent": userAgent
|
|
41677
|
+
},
|
|
41678
|
+
body: new URLSearchParams({ ...options, client_id: VERCEL_CLI_CLIENT_ID })
|
|
41679
|
+
});
|
|
41680
|
+
}
|
|
41681
|
+
async function processRevocationResponse(response) {
|
|
41682
|
+
if (response.ok)
|
|
41683
|
+
return [null, null];
|
|
41684
|
+
const json = await response.json();
|
|
41685
|
+
return [new OAuthError("Revocation request failed", json)];
|
|
41686
|
+
}
|
|
41687
|
+
async function refreshTokenRequest(options) {
|
|
41688
|
+
return await (0, import_node_fetch.default)((await as()).token_endpoint, {
|
|
41689
|
+
method: "POST",
|
|
41690
|
+
headers: {
|
|
41691
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
41692
|
+
"user-agent": ua_default
|
|
41693
|
+
},
|
|
41694
|
+
body: new URLSearchParams({
|
|
41695
|
+
client_id: VERCEL_CLI_CLIENT_ID,
|
|
41696
|
+
grant_type: "refresh_token",
|
|
41697
|
+
...options
|
|
41698
|
+
})
|
|
41699
|
+
});
|
|
41700
|
+
}
|
|
41701
|
+
function processOAuthErrorResponse(json) {
|
|
41702
|
+
if (typeof json !== "object" || json === null)
|
|
41703
|
+
return new TypeError("Expected response to be an object");
|
|
41704
|
+
if (!("error" in json) || typeof json.error !== "string")
|
|
41705
|
+
return new TypeError("Expected `error` to be a string");
|
|
41706
|
+
if ("error_description" in json && typeof json.error_description !== "string")
|
|
41707
|
+
return new TypeError("Expected `error_description` to be a string");
|
|
41708
|
+
if ("error_uri" in json && typeof json.error_uri !== "string")
|
|
41709
|
+
return new TypeError("Expected `error_uri` to be a string");
|
|
41710
|
+
return json;
|
|
41711
|
+
}
|
|
41712
|
+
function isOAuthError(error3) {
|
|
41713
|
+
return error3 instanceof OAuthError;
|
|
41714
|
+
}
|
|
41715
|
+
function canParseURL(url3) {
|
|
41716
|
+
try {
|
|
41717
|
+
return !!new URL(url3);
|
|
41718
|
+
} catch {
|
|
41719
|
+
return false;
|
|
41720
|
+
}
|
|
41721
|
+
}
|
|
41722
|
+
async function inspectTokenRequest(token) {
|
|
41723
|
+
return (0, import_node_fetch.default)((await as()).introspection_endpoint, {
|
|
41724
|
+
method: "POST",
|
|
41725
|
+
headers: {
|
|
41726
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
41727
|
+
"user-agent": ua_default
|
|
41728
|
+
},
|
|
41729
|
+
body: new URLSearchParams({ token })
|
|
41730
|
+
});
|
|
41731
|
+
}
|
|
41732
|
+
async function processInspectTokenResponse(response) {
|
|
41733
|
+
try {
|
|
41734
|
+
const token = await response.json();
|
|
41735
|
+
if (!token || typeof token !== "object" || !("active" in token)) {
|
|
41736
|
+
throw new IntrospectionError("Invalid token introspection response");
|
|
41737
|
+
}
|
|
41738
|
+
return [null, token];
|
|
41739
|
+
} catch (cause) {
|
|
41740
|
+
return [new IntrospectionError("Could not introspect token.", { cause })];
|
|
41741
|
+
}
|
|
41742
|
+
}
|
|
41743
|
+
var import_node_fetch, import_os3, VERCEL_ISSUER, VERCEL_CLI_CLIENT_ID, userAgent, _as, OAuthError, IntrospectionError;
|
|
41744
|
+
var init_oauth = __esm({
|
|
41745
|
+
"src/util/oauth.ts"() {
|
|
41746
|
+
"use strict";
|
|
41747
|
+
import_node_fetch = __toESM3(require_lib7());
|
|
41748
|
+
init_ua();
|
|
41749
|
+
import_os3 = require("os");
|
|
41750
|
+
VERCEL_ISSUER = new URL("https://vercel.com");
|
|
41751
|
+
VERCEL_CLI_CLIENT_ID = "cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp";
|
|
41752
|
+
userAgent = `${(0, import_os3.hostname)()} @ ${ua_default}`;
|
|
41753
|
+
OAuthError = class extends Error {
|
|
41754
|
+
constructor(message2, response) {
|
|
41755
|
+
var __super = (...args) => {
|
|
41756
|
+
super(...args);
|
|
41757
|
+
};
|
|
41758
|
+
const error3 = processOAuthErrorResponse(response);
|
|
41759
|
+
if (error3 instanceof TypeError) {
|
|
41760
|
+
const message3 = `Unexpected server response: ${JSON.stringify(response)}`;
|
|
41761
|
+
__super(message3);
|
|
41762
|
+
this.cause = new Error(message3, { cause: error3 });
|
|
41763
|
+
this.code = "server_error";
|
|
41764
|
+
return;
|
|
41765
|
+
}
|
|
41766
|
+
let cause = error3.error;
|
|
41767
|
+
if (error3.error_description)
|
|
41768
|
+
cause += `: ${error3.error_description}`;
|
|
41769
|
+
if (error3.error_uri)
|
|
41770
|
+
cause += ` (${error3.error_uri})`;
|
|
41771
|
+
__super(message2, { cause });
|
|
41772
|
+
this.cause = new Error(cause);
|
|
41773
|
+
this.code = error3.error;
|
|
41774
|
+
}
|
|
41775
|
+
};
|
|
41776
|
+
IntrospectionError = class extends Error {
|
|
41777
|
+
constructor() {
|
|
41778
|
+
super(...arguments);
|
|
41779
|
+
this.name = "IntrospectionError";
|
|
41780
|
+
}
|
|
41781
|
+
};
|
|
41782
|
+
}
|
|
41783
|
+
});
|
|
41784
|
+
|
|
41530
41785
|
// ../../node_modules/.pnpm/is-docker@2.2.1/node_modules/is-docker/index.js
|
|
41531
41786
|
var require_is_docker = __commonJS2({
|
|
41532
41787
|
"../../node_modules/.pnpm/is-docker@2.2.1/node_modules/is-docker/index.js"(exports2, module2) {
|
|
@@ -42185,7 +42440,7 @@ function verify(client2, verificationToken, email2, provider, ssoUserId) {
|
|
|
42185
42440
|
}
|
|
42186
42441
|
if (!client2.authConfig.token) {
|
|
42187
42442
|
const hyphens = new RegExp("-", "g");
|
|
42188
|
-
const host = (0,
|
|
42443
|
+
const host = (0, import_os4.hostname)().replace(hyphens, " ").replace(".local", "");
|
|
42189
42444
|
const tokenName = `${getTitleName()} CLI on ${host} via ${provider}`;
|
|
42190
42445
|
url3.searchParams.set("tokenName", tokenName);
|
|
42191
42446
|
}
|
|
@@ -42194,12 +42449,12 @@ function verify(client2, verificationToken, email2, provider, ssoUserId) {
|
|
|
42194
42449
|
}
|
|
42195
42450
|
return client2.fetch(url3.href, { useCurrentTeam: false });
|
|
42196
42451
|
}
|
|
42197
|
-
var import_url2,
|
|
42452
|
+
var import_url2, import_os4;
|
|
42198
42453
|
var init_verify = __esm({
|
|
42199
42454
|
"src/util/login/verify.ts"() {
|
|
42200
42455
|
"use strict";
|
|
42201
42456
|
import_url2 = require("url");
|
|
42202
|
-
|
|
42457
|
+
import_os4 = require("os");
|
|
42203
42458
|
init_pkg_name();
|
|
42204
42459
|
}
|
|
42205
42460
|
});
|
|
@@ -42310,7 +42565,7 @@ var init_github = __esm({
|
|
|
42310
42565
|
"src/util/login/github.ts"() {
|
|
42311
42566
|
"use strict";
|
|
42312
42567
|
import_url3 = require("url");
|
|
42313
|
-
|
|
42568
|
+
init_oauth2();
|
|
42314
42569
|
}
|
|
42315
42570
|
});
|
|
42316
42571
|
|
|
@@ -42324,7 +42579,7 @@ var init_google = __esm({
|
|
|
42324
42579
|
"src/util/login/google.ts"() {
|
|
42325
42580
|
"use strict";
|
|
42326
42581
|
import_url4 = require("url");
|
|
42327
|
-
|
|
42582
|
+
init_oauth2();
|
|
42328
42583
|
}
|
|
42329
42584
|
});
|
|
42330
42585
|
|
|
@@ -42338,7 +42593,7 @@ var init_gitlab = __esm({
|
|
|
42338
42593
|
"src/util/login/gitlab.ts"() {
|
|
42339
42594
|
"use strict";
|
|
42340
42595
|
import_url5 = require("url");
|
|
42341
|
-
|
|
42596
|
+
init_oauth2();
|
|
42342
42597
|
}
|
|
42343
42598
|
});
|
|
42344
42599
|
|
|
@@ -42357,7 +42612,7 @@ var init_bitbucket = __esm({
|
|
|
42357
42612
|
"src/util/login/bitbucket.ts"() {
|
|
42358
42613
|
"use strict";
|
|
42359
42614
|
import_url6 = require("url");
|
|
42360
|
-
|
|
42615
|
+
init_oauth2();
|
|
42361
42616
|
}
|
|
42362
42617
|
});
|
|
42363
42618
|
|
|
@@ -42391,7 +42646,7 @@ async function prompt(client2, error3, outOfBand, ssoUserId) {
|
|
|
42391
42646
|
const email2 = await readInput(client2, "Enter your email address:");
|
|
42392
42647
|
result = await doEmailLogin(client2, email2, ssoUserId);
|
|
42393
42648
|
} else if (choice === "saml") {
|
|
42394
|
-
const slug = error3?.teamId || await readInput(client2, "Enter your Team slug:");
|
|
42649
|
+
const slug = error3?.scope || error3?.teamId || await readInput(client2, "Enter your Team slug:");
|
|
42395
42650
|
result = await doSamlLogin(client2, slug, outOfBand, ssoUserId);
|
|
42396
42651
|
}
|
|
42397
42652
|
return result;
|
|
@@ -42558,7 +42813,7 @@ function isSSH() {
|
|
|
42558
42813
|
return Boolean(process.env.SSH_CLIENT || process.env.SSH_TTY);
|
|
42559
42814
|
}
|
|
42560
42815
|
var import_http, import_open, import_url7, import_async_listen, import_is_docker;
|
|
42561
|
-
var
|
|
42816
|
+
var init_oauth2 = __esm({
|
|
42562
42817
|
"src/util/login/oauth.ts"() {
|
|
42563
42818
|
"use strict";
|
|
42564
42819
|
import_http = __toESM3(require("http"));
|
|
@@ -42576,17 +42831,53 @@ var init_oauth = __esm({
|
|
|
42576
42831
|
});
|
|
42577
42832
|
|
|
42578
42833
|
// src/util/login/saml.ts
|
|
42579
|
-
function doSamlLogin(client2, teamIdOrSlug, outOfBand, ssoUserId) {
|
|
42834
|
+
async function doSamlLogin(client2, teamIdOrSlug, outOfBand, ssoUserId) {
|
|
42835
|
+
if (client2.authConfig.type === "oauth") {
|
|
42836
|
+
const { session_id, client_id } = await decodeToken(client2);
|
|
42837
|
+
const params2 = { session_id, client_id };
|
|
42838
|
+
const url4 = new import_url8.URL(
|
|
42839
|
+
`https://vercel.com/sso/${teamIdOrSlug}?${new URLSearchParams(params2).toString()}`
|
|
42840
|
+
);
|
|
42841
|
+
return doOauthLogin(
|
|
42842
|
+
client2,
|
|
42843
|
+
url4,
|
|
42844
|
+
"SAML Single Sign-On",
|
|
42845
|
+
outOfBand,
|
|
42846
|
+
ssoUserId
|
|
42847
|
+
);
|
|
42848
|
+
}
|
|
42580
42849
|
const url3 = new import_url8.URL("/auth/sso", client2.apiUrl);
|
|
42581
42850
|
url3.searchParams.set("teamId", teamIdOrSlug);
|
|
42582
42851
|
return doOauthLogin(client2, url3, "SAML Single Sign-On", outOfBand, ssoUserId);
|
|
42583
42852
|
}
|
|
42853
|
+
async function decodeToken(client2) {
|
|
42854
|
+
const { token } = client2.authConfig;
|
|
42855
|
+
if (!token) {
|
|
42856
|
+
throw new Error(
|
|
42857
|
+
`No existing credentials found. Please run \`vercel login --future\`.`
|
|
42858
|
+
);
|
|
42859
|
+
}
|
|
42860
|
+
const inspectResponse = await inspectTokenRequest(token);
|
|
42861
|
+
const [inspectError, inspectResult] = await processInspectTokenResponse(inspectResponse);
|
|
42862
|
+
if (inspectError)
|
|
42863
|
+
throw inspectError;
|
|
42864
|
+
if (!inspectResult.active || !inspectResult.session_id || !inspectResult.client_id) {
|
|
42865
|
+
throw new Error(
|
|
42866
|
+
`Invalid token type. Run \`vercel login --future\` to log-in and try again.`
|
|
42867
|
+
);
|
|
42868
|
+
}
|
|
42869
|
+
return {
|
|
42870
|
+
session_id: inspectResult.session_id,
|
|
42871
|
+
client_id: inspectResult.client_id
|
|
42872
|
+
};
|
|
42873
|
+
}
|
|
42584
42874
|
var import_url8;
|
|
42585
42875
|
var init_saml = __esm({
|
|
42586
42876
|
"src/util/login/saml.ts"() {
|
|
42587
42877
|
"use strict";
|
|
42588
42878
|
import_url8 = require("url");
|
|
42589
42879
|
init_oauth();
|
|
42880
|
+
init_oauth2();
|
|
42590
42881
|
}
|
|
42591
42882
|
});
|
|
42592
42883
|
|
|
@@ -42597,7 +42888,7 @@ async function reauthenticate(client2, error3) {
|
|
|
42597
42888
|
`You must re-authenticate with SAML to use ${(0, import_chalk16.bold)(error3.scope)} scope.`
|
|
42598
42889
|
);
|
|
42599
42890
|
if (await client2.input.confirm(`Log in with SAML?`, true)) {
|
|
42600
|
-
return doSamlLogin(client2, error3.teamId);
|
|
42891
|
+
return doSamlLogin(client2, error3.scope ?? error3.teamId);
|
|
42601
42892
|
}
|
|
42602
42893
|
} else {
|
|
42603
42894
|
output_manager_default.log(`You must re-authenticate to use ${(0, import_chalk16.bold)(error3.scope)} scope.`);
|
|
@@ -60768,11 +61059,11 @@ var require_dist7 = __commonJS2({
|
|
|
60768
61059
|
});
|
|
60769
61060
|
|
|
60770
61061
|
// src/util/config/global-path.ts
|
|
60771
|
-
var
|
|
61062
|
+
var import_os5, import_fs, import_path3, import_xdg_app_paths2, isDirectory, getGlobalPathConfig, global_path_default;
|
|
60772
61063
|
var init_global_path = __esm({
|
|
60773
61064
|
"src/util/config/global-path.ts"() {
|
|
60774
61065
|
"use strict";
|
|
60775
|
-
|
|
61066
|
+
import_os5 = require("os");
|
|
60776
61067
|
import_fs = __toESM3(require("fs"));
|
|
60777
61068
|
import_path3 = __toESM3(require("path"));
|
|
60778
61069
|
import_xdg_app_paths2 = __toESM3(require_xdg_app_paths());
|
|
@@ -60791,7 +61082,7 @@ var init_global_path = __esm({
|
|
|
60791
61082
|
const possibleConfigPaths = [
|
|
60792
61083
|
...vercelDirectories,
|
|
60793
61084
|
// latest vercel directory
|
|
60794
|
-
import_path3.default.join((0,
|
|
61085
|
+
import_path3.default.join((0, import_os5.homedir)(), ".now"),
|
|
60795
61086
|
// legacy config in user's home directory
|
|
60796
61087
|
...(0, import_xdg_app_paths2.default)("now").dataDirs()
|
|
60797
61088
|
// legacy XDG directory
|
|
@@ -60982,233 +61273,6 @@ var init_promise = __esm({
|
|
|
60982
61273
|
}
|
|
60983
61274
|
});
|
|
60984
61275
|
|
|
60985
|
-
// src/util/oauth.ts
|
|
60986
|
-
async function as() {
|
|
60987
|
-
if (!_as) {
|
|
60988
|
-
const discoveryResponse = await discoveryEndpointRequest(VERCEL_ISSUER);
|
|
60989
|
-
const [discoveryResponseError, as2] = await processDiscoveryEndpointResponse(discoveryResponse);
|
|
60990
|
-
if (discoveryResponseError) {
|
|
60991
|
-
throw discoveryResponseError;
|
|
60992
|
-
}
|
|
60993
|
-
_as = as2;
|
|
60994
|
-
}
|
|
60995
|
-
return _as;
|
|
60996
|
-
}
|
|
60997
|
-
async function discoveryEndpointRequest(issuer) {
|
|
60998
|
-
return await (0, import_node_fetch.default)(new URL(".well-known/openid-configuration", issuer), {
|
|
60999
|
-
headers: { "Content-Type": "application/json", "user-agent": userAgent }
|
|
61000
|
-
});
|
|
61001
|
-
}
|
|
61002
|
-
async function processDiscoveryEndpointResponse(response) {
|
|
61003
|
-
const json = await response.json();
|
|
61004
|
-
if (!response.ok) {
|
|
61005
|
-
return [new Error("Discovery endpoint request failed")];
|
|
61006
|
-
}
|
|
61007
|
-
if (typeof json !== "object" || json === null || !canParseURL(json.issuer) || !canParseURL(json.device_authorization_endpoint) || !canParseURL(json.token_endpoint) || !canParseURL(json.revocation_endpoint) || !canParseURL(json.jwks_uri)) {
|
|
61008
|
-
return [new TypeError("Invalid discovery response")];
|
|
61009
|
-
}
|
|
61010
|
-
const issuer = new URL(json.issuer);
|
|
61011
|
-
if (issuer.href !== VERCEL_ISSUER.href) {
|
|
61012
|
-
return [new Error("Issuer mismatch")];
|
|
61013
|
-
}
|
|
61014
|
-
return [
|
|
61015
|
-
null,
|
|
61016
|
-
{
|
|
61017
|
-
issuer,
|
|
61018
|
-
device_authorization_endpoint: new URL(
|
|
61019
|
-
json.device_authorization_endpoint
|
|
61020
|
-
),
|
|
61021
|
-
token_endpoint: new URL(json.token_endpoint),
|
|
61022
|
-
revocation_endpoint: new URL(json.revocation_endpoint),
|
|
61023
|
-
jwks_uri: new URL(json.jwks_uri)
|
|
61024
|
-
}
|
|
61025
|
-
];
|
|
61026
|
-
}
|
|
61027
|
-
async function deviceAuthorizationRequest() {
|
|
61028
|
-
return await (0, import_node_fetch.default)((await as()).device_authorization_endpoint, {
|
|
61029
|
-
method: "POST",
|
|
61030
|
-
headers: {
|
|
61031
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
61032
|
-
"user-agent": userAgent
|
|
61033
|
-
},
|
|
61034
|
-
body: new URLSearchParams({
|
|
61035
|
-
client_id: VERCEL_CLI_CLIENT_ID,
|
|
61036
|
-
scope: "openid offline_access"
|
|
61037
|
-
})
|
|
61038
|
-
});
|
|
61039
|
-
}
|
|
61040
|
-
async function processDeviceAuthorizationResponse(response) {
|
|
61041
|
-
const json = await response.json();
|
|
61042
|
-
if (!response.ok) {
|
|
61043
|
-
return [new OAuthError("Device authorization request failed", json)];
|
|
61044
|
-
}
|
|
61045
|
-
if (typeof json !== "object" || json === null)
|
|
61046
|
-
return [new TypeError("Expected response to be an object")];
|
|
61047
|
-
if (!("device_code" in json) || typeof json.device_code !== "string")
|
|
61048
|
-
return [new TypeError("Expected `device_code` to be a string")];
|
|
61049
|
-
if (!("user_code" in json) || typeof json.user_code !== "string")
|
|
61050
|
-
return [new TypeError("Expected `user_code` to be a string")];
|
|
61051
|
-
if (!("verification_uri" in json) || typeof json.verification_uri !== "string" || !canParseURL(json.verification_uri)) {
|
|
61052
|
-
return [new TypeError("Expected `verification_uri` to be a string")];
|
|
61053
|
-
}
|
|
61054
|
-
if (!("verification_uri_complete" in json) || typeof json.verification_uri_complete !== "string" || !canParseURL(json.verification_uri_complete)) {
|
|
61055
|
-
return [
|
|
61056
|
-
new TypeError("Expected `verification_uri_complete` to be a string")
|
|
61057
|
-
];
|
|
61058
|
-
}
|
|
61059
|
-
if (!("expires_in" in json) || typeof json.expires_in !== "number")
|
|
61060
|
-
return [new TypeError("Expected `expires_in` to be a number")];
|
|
61061
|
-
if (!("interval" in json) || typeof json.interval !== "number")
|
|
61062
|
-
return [new TypeError("Expected `interval` to be a number")];
|
|
61063
|
-
return [
|
|
61064
|
-
null,
|
|
61065
|
-
{
|
|
61066
|
-
device_code: json.device_code,
|
|
61067
|
-
user_code: json.user_code,
|
|
61068
|
-
verification_uri: json.verification_uri,
|
|
61069
|
-
verification_uri_complete: json.verification_uri_complete,
|
|
61070
|
-
expiresAt: Date.now() + json.expires_in * 1e3,
|
|
61071
|
-
interval: json.interval
|
|
61072
|
-
}
|
|
61073
|
-
];
|
|
61074
|
-
}
|
|
61075
|
-
async function deviceAccessTokenRequest(options) {
|
|
61076
|
-
try {
|
|
61077
|
-
return [
|
|
61078
|
-
null,
|
|
61079
|
-
await (0, import_node_fetch.default)((await as()).token_endpoint, {
|
|
61080
|
-
method: "POST",
|
|
61081
|
-
headers: {
|
|
61082
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
61083
|
-
"user-agent": userAgent
|
|
61084
|
-
},
|
|
61085
|
-
body: new URLSearchParams({
|
|
61086
|
-
client_id: VERCEL_CLI_CLIENT_ID,
|
|
61087
|
-
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
61088
|
-
...options
|
|
61089
|
-
}),
|
|
61090
|
-
// TODO: Drop `node-fetch` and just use `signal`
|
|
61091
|
-
timeout: 10 * 1e3,
|
|
61092
|
-
// @ts-expect-error: Signal is part of `fetch` spec, should drop `node-fetch`
|
|
61093
|
-
signal: AbortSignal.timeout(10 * 1e3)
|
|
61094
|
-
})
|
|
61095
|
-
];
|
|
61096
|
-
} catch (error3) {
|
|
61097
|
-
if (error3 instanceof Error)
|
|
61098
|
-
return [error3];
|
|
61099
|
-
return [
|
|
61100
|
-
new Error("An unknown error occurred. See the logs for details.", {
|
|
61101
|
-
cause: error3
|
|
61102
|
-
})
|
|
61103
|
-
];
|
|
61104
|
-
}
|
|
61105
|
-
}
|
|
61106
|
-
async function processTokenResponse(response) {
|
|
61107
|
-
const json = await response.json();
|
|
61108
|
-
if (!response.ok) {
|
|
61109
|
-
return [new OAuthError("Device access token request failed", json)];
|
|
61110
|
-
}
|
|
61111
|
-
if (typeof json !== "object" || json === null)
|
|
61112
|
-
return [new TypeError("Expected response to be an object")];
|
|
61113
|
-
if (!("access_token" in json) || typeof json.access_token !== "string")
|
|
61114
|
-
return [new TypeError("Expected `access_token` to be a string")];
|
|
61115
|
-
if (!("token_type" in json) || json.token_type !== "Bearer")
|
|
61116
|
-
return [new TypeError('Expected `token_type` to be "Bearer"')];
|
|
61117
|
-
if (!("expires_in" in json) || typeof json.expires_in !== "number")
|
|
61118
|
-
return [new TypeError("Expected `expires_in` to be a number")];
|
|
61119
|
-
if ("refresh_token" in json && (typeof json.refresh_token !== "string" || !json.refresh_token))
|
|
61120
|
-
return [new TypeError("Expected `refresh_token` to be a string")];
|
|
61121
|
-
if ("scope" in json && typeof json.scope !== "string")
|
|
61122
|
-
return [new TypeError("Expected `scope` to be a string")];
|
|
61123
|
-
return [null, json];
|
|
61124
|
-
}
|
|
61125
|
-
async function revocationRequest(options) {
|
|
61126
|
-
return await (0, import_node_fetch.default)((await as()).revocation_endpoint, {
|
|
61127
|
-
method: "POST",
|
|
61128
|
-
headers: {
|
|
61129
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
61130
|
-
"user-agent": userAgent
|
|
61131
|
-
},
|
|
61132
|
-
body: new URLSearchParams({ ...options, client_id: VERCEL_CLI_CLIENT_ID })
|
|
61133
|
-
});
|
|
61134
|
-
}
|
|
61135
|
-
async function processRevocationResponse(response) {
|
|
61136
|
-
if (response.ok)
|
|
61137
|
-
return [null, null];
|
|
61138
|
-
const json = await response.json();
|
|
61139
|
-
return [new OAuthError("Revocation request failed", json)];
|
|
61140
|
-
}
|
|
61141
|
-
async function refreshTokenRequest(options) {
|
|
61142
|
-
return await (0, import_node_fetch.default)((await as()).token_endpoint, {
|
|
61143
|
-
method: "POST",
|
|
61144
|
-
headers: {
|
|
61145
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
61146
|
-
"user-agent": ua_default
|
|
61147
|
-
},
|
|
61148
|
-
body: new URLSearchParams({
|
|
61149
|
-
client_id: VERCEL_CLI_CLIENT_ID,
|
|
61150
|
-
grant_type: "refresh_token",
|
|
61151
|
-
...options
|
|
61152
|
-
})
|
|
61153
|
-
});
|
|
61154
|
-
}
|
|
61155
|
-
function processOAuthErrorResponse(json) {
|
|
61156
|
-
if (typeof json !== "object" || json === null)
|
|
61157
|
-
return new TypeError("Expected response to be an object");
|
|
61158
|
-
if (!("error" in json) || typeof json.error !== "string")
|
|
61159
|
-
return new TypeError("Expected `error` to be a string");
|
|
61160
|
-
if ("error_description" in json && typeof json.error_description !== "string")
|
|
61161
|
-
return new TypeError("Expected `error_description` to be a string");
|
|
61162
|
-
if ("error_uri" in json && typeof json.error_uri !== "string")
|
|
61163
|
-
return new TypeError("Expected `error_uri` to be a string");
|
|
61164
|
-
return json;
|
|
61165
|
-
}
|
|
61166
|
-
function isOAuthError(error3) {
|
|
61167
|
-
return error3 instanceof OAuthError;
|
|
61168
|
-
}
|
|
61169
|
-
function canParseURL(url3) {
|
|
61170
|
-
try {
|
|
61171
|
-
return !!new URL(url3);
|
|
61172
|
-
} catch {
|
|
61173
|
-
return false;
|
|
61174
|
-
}
|
|
61175
|
-
}
|
|
61176
|
-
var import_node_fetch, import_os5, VERCEL_ISSUER, VERCEL_CLI_CLIENT_ID, userAgent, _as, OAuthError;
|
|
61177
|
-
var init_oauth2 = __esm({
|
|
61178
|
-
"src/util/oauth.ts"() {
|
|
61179
|
-
"use strict";
|
|
61180
|
-
import_node_fetch = __toESM3(require_lib7());
|
|
61181
|
-
init_ua();
|
|
61182
|
-
import_os5 = require("os");
|
|
61183
|
-
VERCEL_ISSUER = new URL("https://vercel.com");
|
|
61184
|
-
VERCEL_CLI_CLIENT_ID = "cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp";
|
|
61185
|
-
userAgent = `${(0, import_os5.hostname)()} @ ${ua_default}`;
|
|
61186
|
-
OAuthError = class extends Error {
|
|
61187
|
-
constructor(message2, response) {
|
|
61188
|
-
var __super = (...args) => {
|
|
61189
|
-
super(...args);
|
|
61190
|
-
};
|
|
61191
|
-
const error3 = processOAuthErrorResponse(response);
|
|
61192
|
-
if (error3 instanceof TypeError) {
|
|
61193
|
-
const message3 = `Unexpected server response: ${JSON.stringify(response)}`;
|
|
61194
|
-
__super(message3);
|
|
61195
|
-
this.cause = new Error(message3, { cause: error3 });
|
|
61196
|
-
this.code = "server_error";
|
|
61197
|
-
return;
|
|
61198
|
-
}
|
|
61199
|
-
let cause = error3.error;
|
|
61200
|
-
if (error3.error_description)
|
|
61201
|
-
cause += `: ${error3.error_description}`;
|
|
61202
|
-
if (error3.error_uri)
|
|
61203
|
-
cause += ` (${error3.error_uri})`;
|
|
61204
|
-
__super(message2, { cause });
|
|
61205
|
-
this.cause = new Error(cause);
|
|
61206
|
-
this.code = error3.error;
|
|
61207
|
-
}
|
|
61208
|
-
};
|
|
61209
|
-
}
|
|
61210
|
-
});
|
|
61211
|
-
|
|
61212
61276
|
// src/util/client.ts
|
|
61213
61277
|
function isOAuthAuth(authConfig) {
|
|
61214
61278
|
return authConfig.type === "oauth";
|
|
@@ -61243,7 +61307,7 @@ var init_client = __esm({
|
|
|
61243
61307
|
import_error_utils6 = __toESM3(require_dist2());
|
|
61244
61308
|
init_sleep();
|
|
61245
61309
|
init_output_manager();
|
|
61246
|
-
|
|
61310
|
+
init_oauth();
|
|
61247
61311
|
isSAMLError = (v) => {
|
|
61248
61312
|
return v && v.saml;
|
|
61249
61313
|
};
|
|
@@ -61265,8 +61329,10 @@ var init_client = __esm({
|
|
|
61265
61329
|
}
|
|
61266
61330
|
throw error3;
|
|
61267
61331
|
}
|
|
61268
|
-
this.authConfig.
|
|
61269
|
-
|
|
61332
|
+
if (this.authConfig.type !== "oauth") {
|
|
61333
|
+
this.authConfig.token = result.token;
|
|
61334
|
+
writeToAuthConfigFile(this.authConfig);
|
|
61335
|
+
}
|
|
61270
61336
|
});
|
|
61271
61337
|
this._onRetry = (error3) => {
|
|
61272
61338
|
output_manager_default.debug(`Retrying: ${error3}
|
|
@@ -146816,7 +146882,7 @@ async function main4(client2) {
|
|
|
146816
146882
|
if (!subcommand && needHelp) {
|
|
146817
146883
|
telemetry2.trackCliFlagHelp(cacheCommand.name);
|
|
146818
146884
|
output_manager_default.print(help2(cacheCommand, { columns: client2.stderr.columns }));
|
|
146819
|
-
return
|
|
146885
|
+
return 0;
|
|
146820
146886
|
}
|
|
146821
146887
|
function printHelp(command) {
|
|
146822
146888
|
telemetry2.trackCliFlagHelp(command.name, subcommandOriginal);
|
|
@@ -178253,7 +178319,7 @@ async function link3(client2) {
|
|
|
178253
178319
|
if (parsedArgs.flags["--help"]) {
|
|
178254
178320
|
telemetry2.trackCliFlagHelp("link");
|
|
178255
178321
|
output_manager_default.print(help2(linkCommand, { columns: client2.stderr.columns }));
|
|
178256
|
-
return
|
|
178322
|
+
return 0;
|
|
178257
178323
|
}
|
|
178258
178324
|
telemetry2.trackCliFlagRepo(parsedArgs.flags["--repo"]);
|
|
178259
178325
|
telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);
|
|
@@ -178433,7 +178499,7 @@ async function list5(client2) {
|
|
|
178433
178499
|
if (parsedArgs.flags["--help"]) {
|
|
178434
178500
|
telemetry2.trackCliFlagHelp("list");
|
|
178435
178501
|
print(help2(listCommand, { columns: client2.stderr.columns }));
|
|
178436
|
-
return
|
|
178502
|
+
return 0;
|
|
178437
178503
|
}
|
|
178438
178504
|
if (parsedArgs.args.length > 2) {
|
|
178439
178505
|
error3(`${getCommandName("ls [app]")} accepts at most one argument`);
|
|
@@ -179376,7 +179442,7 @@ var init_future = __esm({
|
|
|
179376
179442
|
init_pkg_name();
|
|
179377
179443
|
init_emoji();
|
|
179378
179444
|
init_humanize_path();
|
|
179379
|
-
|
|
179445
|
+
init_oauth();
|
|
179380
179446
|
init_output_manager();
|
|
179381
179447
|
}
|
|
179382
179448
|
});
|
|
@@ -179408,7 +179474,7 @@ async function login3(client2) {
|
|
|
179408
179474
|
if (parsedArgs.flags["--help"]) {
|
|
179409
179475
|
telemetry2.trackCliFlagHelp("login");
|
|
179410
179476
|
output_manager_default.print(help2(loginCommand, { columns: client2.stderr.columns }));
|
|
179411
|
-
return
|
|
179477
|
+
return 0;
|
|
179412
179478
|
}
|
|
179413
179479
|
if (parsedArgs.flags["--token"]) {
|
|
179414
179480
|
output_manager_default.error('`--token` may not be used with the "login" command');
|
|
@@ -179543,7 +179609,7 @@ var init_future2 = __esm({
|
|
|
179543
179609
|
"use strict";
|
|
179544
179610
|
import_error_utils31 = __toESM3(require_dist2());
|
|
179545
179611
|
init_pkg_name();
|
|
179546
|
-
|
|
179612
|
+
init_oauth();
|
|
179547
179613
|
init_output_manager();
|
|
179548
179614
|
}
|
|
179549
179615
|
});
|
|
@@ -179571,7 +179637,7 @@ async function logout2(client2) {
|
|
|
179571
179637
|
if (parsedArgs.flags["--help"]) {
|
|
179572
179638
|
telemetry2.trackCliFlagHelp("logout");
|
|
179573
179639
|
output_manager_default.print(help2(logoutCommand, { columns: client2.stderr.columns }));
|
|
179574
|
-
return
|
|
179640
|
+
return 0;
|
|
179575
179641
|
}
|
|
179576
179642
|
if (authConfig.type === "oauth") {
|
|
179577
179643
|
return await logout(client2);
|
|
@@ -180456,13 +180522,13 @@ async function main15(client2) {
|
|
|
180456
180522
|
if (!subcommand && needHelp) {
|
|
180457
180523
|
telemetry2.trackCliFlagHelp("project");
|
|
180458
180524
|
output_manager_default.print(help2(projectCommand, { columns: client2.stderr.columns }));
|
|
180459
|
-
return
|
|
180525
|
+
return 0;
|
|
180460
180526
|
}
|
|
180461
180527
|
function printHelp(command) {
|
|
180462
180528
|
output_manager_default.print(
|
|
180463
180529
|
help2(command, { parent: projectCommand, columns: client2.stderr.columns })
|
|
180464
180530
|
);
|
|
180465
|
-
return
|
|
180531
|
+
return 0;
|
|
180466
180532
|
}
|
|
180467
180533
|
if (!parsedArgs.args[1]) {
|
|
180468
180534
|
subcommand = "list";
|
|
@@ -183920,7 +183986,7 @@ async function whoami(client2) {
|
|
|
183920
183986
|
if (parsedArgs.flags["--help"]) {
|
|
183921
183987
|
telemetry2.trackCliFlagHelp("whoami");
|
|
183922
183988
|
output_manager_default.print(help2(whoamiCommand, { columns: client2.stderr.columns }));
|
|
183923
|
-
return
|
|
183989
|
+
return 0;
|
|
183924
183990
|
}
|
|
183925
183991
|
const { contextName } = await getScope(client2, { getTeam: false });
|
|
183926
183992
|
if (client2.stdout.isTTY) {
|
|
@@ -184906,7 +184972,7 @@ var main17 = async () => {
|
|
|
184906
184972
|
const bareHelpSubcommand = targetOrSubcommand === "help" && !subSubCommand;
|
|
184907
184973
|
if (bareHelpOption || bareHelpSubcommand) {
|
|
184908
184974
|
output_manager_default.print(help());
|
|
184909
|
-
return
|
|
184975
|
+
return 0;
|
|
184910
184976
|
}
|
|
184911
184977
|
try {
|
|
184912
184978
|
await (0, import_fs_extra24.mkdirp)(VERCEL_DIR4);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vercel",
|
|
3
|
-
"version": "46.0.
|
|
3
|
+
"version": "46.0.2",
|
|
4
4
|
"preferGlobal": true,
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"description": "The command-line interface for Vercel",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@vercel/express": "0.0.6",
|
|
29
29
|
"@vercel/hono": "0.0.14",
|
|
30
30
|
"@vercel/hydrogen": "1.2.3",
|
|
31
|
-
"@vercel/next": "4.11.
|
|
31
|
+
"@vercel/next": "4.11.3",
|
|
32
32
|
"@vercel/node": "5.3.13",
|
|
33
33
|
"@vercel/python": "5.0.0",
|
|
34
34
|
"@vercel/redwood": "2.3.4",
|
|
@@ -165,8 +165,8 @@
|
|
|
165
165
|
"write-json-file": "2.2.0",
|
|
166
166
|
"xdg-app-paths": "5.1.0",
|
|
167
167
|
"yauzl-promise": "2.1.3",
|
|
168
|
-
"@vercel-internals/constants": "1.0.4",
|
|
169
168
|
"@vercel-internals/get-package-json": "1.0.0",
|
|
169
|
+
"@vercel-internals/constants": "1.0.4",
|
|
170
170
|
"@vercel-internals/types": "3.0.6"
|
|
171
171
|
},
|
|
172
172
|
"scripts": {
|