headers-for-firebase
Version:
Converts _headers file to entries within a .firebase.json file
79 lines (78 loc) • 2.73 kB
JavaScript
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 };
});
}