178 lines
6.2 KiB
JavaScript
178 lines
6.2 KiB
JavaScript
"use strict";
|
|
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __export = (target, all) => {
|
|
for (var name in all)
|
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
};
|
|
var __copyProps = (to, from, except, desc) => {
|
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
for (let key of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
// If the importer is in node compatibility mode or this is not an ESM
|
|
// file that has been converted to a CommonJS file using a Babel-
|
|
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
mod
|
|
));
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var token_util_exports = {};
|
|
__export(token_util_exports, {
|
|
assertVercelOidcTokenResponse: () => assertVercelOidcTokenResponse,
|
|
findProjectInfo: () => findProjectInfo,
|
|
getTokenPayload: () => getTokenPayload,
|
|
getVercelCliToken: () => getVercelCliToken,
|
|
getVercelDataDir: () => getVercelDataDir,
|
|
getVercelOidcToken: () => getVercelOidcToken,
|
|
isExpired: () => isExpired,
|
|
loadToken: () => loadToken,
|
|
saveToken: () => saveToken
|
|
});
|
|
module.exports = __toCommonJS(token_util_exports);
|
|
var path = __toESM(require("path"));
|
|
var fs = __toESM(require("fs"));
|
|
var import_token_error = require("./token-error");
|
|
var import_token_io = require("./token-io");
|
|
function getVercelDataDir() {
|
|
const vercelFolder = "com.vercel.cli";
|
|
const dataDir = (0, import_token_io.getUserDataDir)();
|
|
if (!dataDir) {
|
|
return null;
|
|
}
|
|
return path.join(dataDir, vercelFolder);
|
|
}
|
|
function getVercelCliToken() {
|
|
const dataDir = getVercelDataDir();
|
|
if (!dataDir) {
|
|
return null;
|
|
}
|
|
const tokenPath = path.join(dataDir, "auth.json");
|
|
if (!fs.existsSync(tokenPath)) {
|
|
return null;
|
|
}
|
|
const token = fs.readFileSync(tokenPath, "utf8");
|
|
if (!token) {
|
|
return null;
|
|
}
|
|
return JSON.parse(token).token;
|
|
}
|
|
async function getVercelOidcToken(authToken, projectId, teamId) {
|
|
try {
|
|
const url = `https://api.vercel.com/v1/projects/${projectId}/token?source=vercel-oidc-refresh${teamId ? `&teamId=${teamId}` : ""}`;
|
|
const res = await fetch(url, {
|
|
method: "POST",
|
|
headers: {
|
|
Authorization: `Bearer ${authToken}`
|
|
}
|
|
});
|
|
if (!res.ok) {
|
|
throw new import_token_error.VercelOidcTokenError(
|
|
`Failed to refresh OIDC token: ${res.statusText}`
|
|
);
|
|
}
|
|
const tokenRes = await res.json();
|
|
assertVercelOidcTokenResponse(tokenRes);
|
|
return tokenRes;
|
|
} catch (e) {
|
|
throw new import_token_error.VercelOidcTokenError(`Failed to refresh OIDC token`, e);
|
|
}
|
|
}
|
|
function assertVercelOidcTokenResponse(res) {
|
|
if (!res || typeof res !== "object") {
|
|
throw new TypeError("Expected an object");
|
|
}
|
|
if (!("token" in res) || typeof res.token !== "string") {
|
|
throw new TypeError("Expected a string-valued token property");
|
|
}
|
|
}
|
|
function findProjectInfo() {
|
|
const dir = (0, import_token_io.findRootDir)();
|
|
if (!dir) {
|
|
throw new import_token_error.VercelOidcTokenError("Unable to find root directory");
|
|
}
|
|
try {
|
|
const prjPath = path.join(dir, ".vercel", "project.json");
|
|
if (!fs.existsSync(prjPath)) {
|
|
throw new import_token_error.VercelOidcTokenError("project.json not found");
|
|
}
|
|
const prj = JSON.parse(fs.readFileSync(prjPath, "utf8"));
|
|
if (typeof prj.projectId !== "string" && typeof prj.orgId !== "string") {
|
|
throw new TypeError("Expected a string-valued projectId property");
|
|
}
|
|
return { projectId: prj.projectId, teamId: prj.orgId };
|
|
} catch (e) {
|
|
throw new import_token_error.VercelOidcTokenError(`Unable to find project ID`, e);
|
|
}
|
|
}
|
|
function saveToken(token, projectId) {
|
|
try {
|
|
const dir = (0, import_token_io.getUserDataDir)();
|
|
if (!dir) {
|
|
throw new import_token_error.VercelOidcTokenError("Unable to find user data directory");
|
|
}
|
|
const tokenPath = path.join(dir, "com.vercel.token", `${projectId}.json`);
|
|
const tokenJson = JSON.stringify(token);
|
|
fs.mkdirSync(path.dirname(tokenPath), { mode: 432, recursive: true });
|
|
fs.writeFileSync(tokenPath, tokenJson);
|
|
fs.chmodSync(tokenPath, 432);
|
|
return;
|
|
} catch (e) {
|
|
throw new import_token_error.VercelOidcTokenError(`Failed to save token`, e);
|
|
}
|
|
}
|
|
function loadToken(projectId) {
|
|
try {
|
|
const dir = (0, import_token_io.getUserDataDir)();
|
|
if (!dir) {
|
|
return null;
|
|
}
|
|
const tokenPath = path.join(dir, "com.vercel.token", `${projectId}.json`);
|
|
if (!fs.existsSync(tokenPath)) {
|
|
return null;
|
|
}
|
|
const token = JSON.parse(fs.readFileSync(tokenPath, "utf8"));
|
|
assertVercelOidcTokenResponse(token);
|
|
return token;
|
|
} catch (e) {
|
|
throw new import_token_error.VercelOidcTokenError(`Failed to load token`, e);
|
|
}
|
|
}
|
|
function getTokenPayload(token) {
|
|
const tokenParts = token.split(".");
|
|
if (tokenParts.length !== 3) {
|
|
throw new import_token_error.VercelOidcTokenError("Invalid token");
|
|
}
|
|
const base64 = tokenParts[1].replace(/-/g, "+").replace(/_/g, "/");
|
|
const padded = base64.padEnd(
|
|
base64.length + (4 - base64.length % 4) % 4,
|
|
"="
|
|
);
|
|
return JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
|
|
}
|
|
const TIME_15_MINUTES_IN_MS = 15 * 60 * 1e3;
|
|
function isExpired(token) {
|
|
return token.exp * 1e3 < Date.now() + TIME_15_MINUTES_IN_MS;
|
|
}
|
|
// Annotate the CommonJS export names for ESM import in node:
|
|
0 && (module.exports = {
|
|
assertVercelOidcTokenResponse,
|
|
findProjectInfo,
|
|
getTokenPayload,
|
|
getVercelCliToken,
|
|
getVercelDataDir,
|
|
getVercelOidcToken,
|
|
isExpired,
|
|
loadToken,
|
|
saveToken
|
|
});
|