123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.cleanAuthState = exports.getCleanDomains = exports.removeAuthDomain = exports.addAuthDomains = exports.deleteSite = exports.updateSite = exports.createSite = exports.getSite = exports.listSites = exports.createRelease = exports.cloneVersion = exports.listVersions = exports.updateVersion = exports.createVersion = exports.deleteChannel = exports.updateChannelTtl = exports.createChannel = exports.listChannels = exports.getChannel = exports.normalizeName = void 0;
- const error_1 = require("../error");
- const api_1 = require("../api");
- const apiv2_1 = require("../apiv2");
- const operationPoller = require("../operation-poller");
- const expireUtils_1 = require("../hosting/expireUtils");
- const auth_1 = require("../gcp/auth");
- const proto = require("../gcp/proto");
- const ONE_WEEK_MS = 604800000;
- var ReleaseType;
- (function (ReleaseType) {
- ReleaseType["TYPE_UNSPECIFIED"] = "TYPE_UNSPECIFIED";
- ReleaseType["DEPLOY"] = "DEPLOY";
- ReleaseType["ROLLBACK"] = "ROLLBACK";
- ReleaseType["SITE_DISABLE"] = "SITE_DISABLE";
- })(ReleaseType || (ReleaseType = {}));
- function normalizeName(s) {
- return s.replace(/[/:_#]/g, "-");
- }
- exports.normalizeName = normalizeName;
- const apiClient = new apiv2_1.Client({
- urlPrefix: api_1.hostingApiOrigin,
- apiVersion: "v1beta1",
- auth: true,
- });
- async function getChannel(project = "-", site, channelId) {
- try {
- const res = await apiClient.get(`/projects/${project}/sites/${site}/channels/${channelId}`);
- return res.body;
- }
- catch (e) {
- if (e instanceof error_1.FirebaseError && e.status === 404) {
- return null;
- }
- throw e;
- }
- }
- exports.getChannel = getChannel;
- async function listChannels(project = "-", site) {
- const channels = [];
- let nextPageToken = "";
- for (;;) {
- try {
- const res = await apiClient.get(`/projects/${project}/sites/${site}/channels`, { queryParams: { pageToken: nextPageToken, pageSize: 10 } });
- const c = res.body.channels;
- if (c) {
- channels.push(...c);
- }
- nextPageToken = res.body.nextPageToken || "";
- if (!nextPageToken) {
- return channels;
- }
- }
- catch (e) {
- if (e instanceof error_1.FirebaseError && e.status === 404) {
- throw new error_1.FirebaseError(`could not find channels for site "${site}"`, {
- original: e,
- });
- }
- throw e;
- }
- }
- }
- exports.listChannels = listChannels;
- async function createChannel(project = "-", site, channelId, ttlMillis = expireUtils_1.DEFAULT_DURATION) {
- const res = await apiClient.post(`/projects/${project}/sites/${site}/channels?channelId=${channelId}`, { ttl: `${ttlMillis / 1000}s` });
- return res.body;
- }
- exports.createChannel = createChannel;
- async function updateChannelTtl(project = "-", site, channelId, ttlMillis = ONE_WEEK_MS) {
- const res = await apiClient.patch(`/projects/${project}/sites/${site}/channels/${channelId}`, { ttl: `${ttlMillis / 1000}s` }, { queryParams: { updateMask: "ttl" } });
- return res.body;
- }
- exports.updateChannelTtl = updateChannelTtl;
- async function deleteChannel(project = "-", site, channelId) {
- await apiClient.delete(`/projects/${project}/sites/${site}/channels/${channelId}`);
- }
- exports.deleteChannel = deleteChannel;
- async function createVersion(siteId, version) {
- const res = await apiClient.post(`projects/-/sites/${siteId}/versions`, version);
- return res.body.name;
- }
- exports.createVersion = createVersion;
- async function updateVersion(site, versionId, version) {
- const res = await apiClient.patch(`projects/-/sites/${site}/versions/${versionId}`, version, {
- queryParams: {
- updateMask: proto.fieldMasks(version, "labels", "config").join(","),
- },
- });
- return res.body;
- }
- exports.updateVersion = updateVersion;
- async function listVersions(site) {
- let pageToken = undefined;
- const versions = [];
- do {
- const queryParams = {};
- if (pageToken) {
- queryParams.pageToken = pageToken;
- }
- const res = await apiClient.get(`projects/-/sites/${site}/versions`, {
- queryParams,
- });
- versions.push(...res.body.versions);
- pageToken = res.body.nextPageToken;
- } while (pageToken);
- return versions;
- }
- exports.listVersions = listVersions;
- async function cloneVersion(site, versionName, finalize = false) {
- const res = await apiClient.post(`/projects/-/sites/${site}/versions:clone`, {
- sourceVersion: versionName,
- finalize,
- });
- const { name: operationName } = res.body;
- const pollRes = await operationPoller.pollOperation({
- apiOrigin: api_1.hostingApiOrigin,
- apiVersion: "v1beta1",
- operationResourceName: operationName,
- masterTimeout: 600000,
- });
- return pollRes;
- }
- exports.cloneVersion = cloneVersion;
- async function createRelease(site, channel, version, partialRelease) {
- const res = await apiClient.post(`/projects/-/sites/${site}/channels/${channel}/releases`, partialRelease, { queryParams: { versionName: version } });
- return res.body;
- }
- exports.createRelease = createRelease;
- async function listSites(project) {
- const sites = [];
- let nextPageToken = "";
- for (;;) {
- try {
- const res = await apiClient.get(`/projects/${project}/sites`, { queryParams: { pageToken: nextPageToken, pageSize: 10 } });
- const c = res.body.sites;
- if (c) {
- sites.push(...c);
- }
- nextPageToken = res.body.nextPageToken || "";
- if (!nextPageToken) {
- return sites;
- }
- }
- catch (e) {
- if (e instanceof error_1.FirebaseError && e.status === 404) {
- throw new error_1.FirebaseError(`could not find sites for project "${project}"`, {
- original: e,
- });
- }
- throw e;
- }
- }
- }
- exports.listSites = listSites;
- async function getSite(project, site) {
- try {
- const res = await apiClient.get(`/projects/${project}/sites/${site}`);
- return res.body;
- }
- catch (e) {
- if (e instanceof error_1.FirebaseError && e.status === 404) {
- throw new error_1.FirebaseError(`could not find site "${site}" for project "${project}"`, {
- original: e,
- });
- }
- throw e;
- }
- }
- exports.getSite = getSite;
- async function createSite(project, site, appId = "") {
- const res = await apiClient.post(`/projects/${project}/sites`, { appId: appId }, { queryParams: { siteId: site } });
- return res.body;
- }
- exports.createSite = createSite;
- async function updateSite(project, site, fields) {
- const res = await apiClient.patch(`/projects/${project}/sites/${site.name}`, site, {
- queryParams: { updateMask: fields.join(",") },
- });
- return res.body;
- }
- exports.updateSite = updateSite;
- async function deleteSite(project, site) {
- await apiClient.delete(`/projects/${project}/sites/${site}`);
- }
- exports.deleteSite = deleteSite;
- async function addAuthDomains(project, urls) {
- const domains = await (0, auth_1.getAuthDomains)(project);
- const authDomains = domains || [];
- for (const url of urls) {
- const domain = url.replace("https://", "");
- if (authDomains.includes(domain)) {
- continue;
- }
- authDomains.push(domain);
- }
- return await (0, auth_1.updateAuthDomains)(project, authDomains);
- }
- exports.addAuthDomains = addAuthDomains;
- async function removeAuthDomain(project, url) {
- const domains = await (0, auth_1.getAuthDomains)(project);
- if (!domains.length) {
- return domains;
- }
- const targetDomain = url.replace("https://", "");
- const authDomains = domains.filter((domain) => domain !== targetDomain);
- return (0, auth_1.updateAuthDomains)(project, authDomains);
- }
- exports.removeAuthDomain = removeAuthDomain;
- async function getCleanDomains(project, site) {
- const channels = await listChannels(project, site);
- const channelMap = channels
- .map((channel) => channel.url.replace("https://", ""))
- .reduce((acc, current) => {
- acc[current] = true;
- return acc;
- }, {});
- const siteMatch = new RegExp(`${site}--`, "i");
- const firebaseAppMatch = new RegExp(/firebaseapp.com$/);
- const domains = await (0, auth_1.getAuthDomains)(project);
- const authDomains = [];
- domains.forEach((domain) => {
- const endsWithFirebaseApp = firebaseAppMatch.test(domain);
- if (endsWithFirebaseApp) {
- authDomains.push(domain);
- return;
- }
- const domainWithNoChannel = siteMatch.test(domain) && !channelMap[domain];
- if (domainWithNoChannel) {
- return;
- }
- authDomains.push(domain);
- });
- return authDomains;
- }
- exports.getCleanDomains = getCleanDomains;
- async function cleanAuthState(project, sites) {
- const siteDomainMap = new Map();
- for (const site of sites) {
- const authDomains = await getCleanDomains(project, site);
- const updatedDomains = await (0, auth_1.updateAuthDomains)(project, authDomains);
- siteDomainMap.set(site, updatedDomains);
- }
- return siteDomainMap;
- }
- exports.cleanAuthState = cleanAuthState;
|