ts-caddyfile
Version:
CaddyFile Parser and generator VERY WIP
72 lines (71 loc) • 2.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// src/CaddyFileParser.ts
const types_1 = require("./types");
const ProxyDirective_1 = require("./Parser/Process/ProxyDirective");
const BasicAuth_1 = require("./Parser/Process/BasicAuth");
const TLS_1 = require("./Parser/Process/TLS");
const GZIP_1 = require("./Parser/Process/GZIP");
const commentTest = /^#.*/;
const textTest = /\S+(?<!\s{)/;
const bracketTest = /.*{/;
const closeBracketTest = /.*}/;
// @ts-ignore
const getLayer = (CaddyFile, path) => path.reduce((obj, prop) => obj[prop], CaddyFile);
const directiveTest = new RegExp(`(?!\\s)(${Object.entries(types_1.HTTPDirectiveTypes)
.map(([value], a, b) => (a === b.length - 1 ? `${value}` : `${value}|`))
.join('')})`);
function extractDirective(directive, directiveString) {
if (directive === 'basicauth')
return BasicAuth_1.processBasicAuthDirective(directiveString);
else if (directive === 'proxy')
return ProxyDirective_1.processProxyDirective(directiveString);
else if (directive === 'tls')
return TLS_1.ProcessTLSDirective(directiveString);
else if (directive === 'gzip')
return GZIP_1.processGZIP(directiveString);
else if (directive === 'bind')
return { type: 'bind', .../(?!.*bind)\s(?<host>.*)/.exec(directiveString).groups };
}
/**
*
* @param CaddyFile CaddyFile as a string.
*/
function parseCaddyFile(CaddyFileSTR) {
const lines = CaddyFileSTR.split(/\n/);
const CaddyFileOBJ = {};
/**
* Current path in which to add stuff
*/
let path = [];
let comment;
let directive;
for (const line of lines) {
if (commentTest.test(line)) {
if (comment)
comment = `${comment}\n${line}`;
}
else if (path.length < 1 && textTest.test(line)) {
CaddyFileOBJ[textTest.exec(line)[0]] = { directives: [] };
path.push(textTest.exec(line)[0]);
}
else if (directiveTest.test(line) && !bracketTest.test(line)) {
getLayer(CaddyFileOBJ, path).directives.push(extractDirective(directiveTest.exec(line)[0], line));
}
else if (directiveTest.test(line) && bracketTest.test(line))
directive = line;
else if (/\S+/.test(line) && directive) {
directive = `${directive}\n${line.replace(/(\s|\t){2,}/g, '')}`;
if (closeBracketTest.test(line)) {
getLayer(CaddyFileOBJ, path).directives.push(extractDirective(directiveTest.exec(directive)[0], directive));
directive = undefined;
}
}
else if (closeBracketTest.test(line) && directive)
directive = undefined;
else if (closeBracketTest.test(line))
path = [];
}
return CaddyFileOBJ;
}
exports.parseCaddyFile = parseCaddyFile;