web-ext-deploy
Version:
A tool for deploying WebExtensions to multiple stores.
76 lines (75 loc) • 2.83 kB
JavaScript
import chalk from "chalk";
import dotenv from "dotenv";
import { chromium } from "playwright";
import { createGitIgnoreIfNeeded, headersToEnv } from "./utils.js";
import fs from "fs";
function getFilename(site) {
return `./${site}.env`;
}
function extractCookies({ cookiesInput, cookiesToLogin }) {
return cookiesInput
.split("; ")
.filter(cookieName => cookieName.match(new RegExp("^(" + cookiesToLogin.join("|") + ")")))
.map(cookieNameValuePair => {
const [name, value] = cookieNameValuePair.split("=");
return `${name.toUpperCase()}=${value}`;
})
.join("\n");
}
async function addNavigationListener({ page, cookiesToLogin, urlToEnd, resolve }) {
page.on("request", async (data) => {
const { cookie } = await data.allHeaders();
if (!cookie) {
return;
}
const isRequiredCookiesExist = cookiesToLogin.every(cookieName => cookie.includes(` ${cookieName}=`));
if (isRequiredCookiesExist && data.url() === urlToEnd) {
resolve(extractCookies({ cookiesInput: cookie, cookiesToLogin }));
}
});
}
async function saveOperaHeaders(page) {
return new Promise(async (resolve) => {
const cookiesToLogin = ["sessionid", "csrftoken"];
const url = "https://addons.opera.com/developer/";
await addNavigationListener({ page, cookiesToLogin, resolve, urlToEnd: url });
await page.goto(url);
});
}
const siteFuncs = {
opera: saveOperaHeaders
};
function appendToEnv(filename, headers) {
const { parsed: envCurrent = {} } = dotenv.config({ path: filename });
const envHeaders = dotenv.parse(headers);
const envNew = { ...envCurrent, ...envHeaders };
fs.writeFileSync(filename, headersToEnv(envNew));
}
function getInvalidSIte(siteNames) {
return siteNames.find(site => !siteFuncs[site]);
}
export async function getSignInCookie(siteNames) {
const invalidSIte = getInvalidSIte(siteNames);
if (invalidSIte) {
throw new Error(`Invalid site: ${invalidSIte}`);
}
const [width, height] = [1280, 720];
const browser = await chromium.launch({
headless: false,
args: [`--window-size=${width},${height}`] //, "--window-position=0,0"]
});
const context = await browser.newContext({
viewport: { width, height }
});
for (const siteName of siteNames) {
const page = await context.newPage();
const pagesCurrent = context.pages();
if (pagesCurrent.length > 1) {
await pagesCurrent[0].close();
}
const headersTotal = await siteFuncs[siteName](page);
appendToEnv(getFilename(siteName), headersTotal);
}
createGitIgnoreIfNeeded(siteNames);
console.log(chalk.blue(`Info: Saved the login cookies of: ${siteNames.join(", ")}`));
}