UNPKG

headers-for-firebase

Version:

Converts _headers file to entries within a .firebase.json file

79 lines (78 loc) 2.73 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { readFile } from "node:fs/promises"; export class HeadersConverter { static createFromPath(headersPath) { return __awaiter(this, void 0, void 0, function* () { const parsed = new HeadersConverter(); parsed.content = yield readFile(headersPath, "utf-8"); return parsed; }); } get firebaseHeaders() { return convertHeadersToFirebaseArray(this.content); } } function convertHeadersToFirebaseArray(headersContent) { const targets = getTargetsFrom(headersContent); return targets.map(({ source, headers }) => { return { source: convertSource(source), headers: convertHeaders(headers), }; }); } function getTargetsFrom(headers) { const lines = headers.split("\n"); const targets = []; let currentTarget; for (const line of lines) { if (isEmpty(line) || isComment(line)) { continue; } if (!hasIndentation(line)) { currentTarget = createEmptyTargetFor(line); targets.push(currentTarget); continue; } if (hasIndentation(line) && currentTarget) { currentTarget.headers.push(line.trim()); continue; } else { throw new Error(`Failed to associate line "${line}" to a target`); } } return targets.filter(target => target.headers.length > 0); } function isEmpty(line) { return line.trim() === ""; } function isComment(line) { return line.trim().startsWith("#"); } function hasIndentation(line) { return /^\s/.test(line); } function createEmptyTargetFor(source) { return { source, headers: [], }; } function convertSource(originalSource) { return originalSource.replace("*", "**").replace(/:\w+/, "*"); } function convertHeaders(originalHeaders) { return originalHeaders.map(header => { const { key, value } = header.match(/^(?<key>[^:]*): (?<value>.*)$/).groups; return { key, value }; }); }