UNPKG

ts-caddyfile

Version:
72 lines (71 loc) 2.86 kB
"use strict"; 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;