amazon-route-53-dns-zone-file
Version:
Makes DNS Zone File easy. Parses and validates BIND zone files and can be extended for custom features. Functionality is modular. Features are made open for extension and closed for runtime mutation. Written in TypeScript.
135 lines • 4.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRecordNameUsingOrigin = exports.zipArrayToObj = exports.transformInputText = exports.removeComments = exports.flattenStartOfAuthority = exports.splitArgs = void 0;
const utils_generic_1 = require("../shared/utils_generic");
/**
* @perf use collections, benchmark
* @note we do not validate invalid quotes (missing close)
*/
const splitArgs = (input, sep) => {
const separator = sep || /\s/g;
let isSingleQuoteOpen = false;
let isDoubleQuoteOpen = false;
let tokenBuffer = [];
const tokensFromArgs = [];
const characters = input.split('');
for (const element of characters) {
const matches = element.match(separator);
if (element === "'" && !isDoubleQuoteOpen) {
tokenBuffer.push(element);
isSingleQuoteOpen = !isSingleQuoteOpen;
continue;
}
else if (element === '"' && !isSingleQuoteOpen) {
tokenBuffer.push(element);
isDoubleQuoteOpen = !isDoubleQuoteOpen;
continue;
}
if (!isSingleQuoteOpen && !isDoubleQuoteOpen && matches) {
if (tokenBuffer.length > 0) {
tokensFromArgs.push(tokenBuffer.join(''));
tokenBuffer = [];
}
else if (!!sep) {
tokensFromArgs.push(element);
}
}
else {
tokenBuffer.push(element);
}
}
if (tokenBuffer.length > 0) {
tokensFromArgs.push(tokenBuffer.join(''));
}
else if (!!sep) {
tokensFromArgs.push('');
}
return tokensFromArgs;
};
exports.splitArgs = splitArgs;
/** @note not checking invalid format of nested parens */
const flattenStartOfAuthority = (input) => {
let isParenOpen = false;
let isInSoa = false;
let soa = '';
let flattened = '';
const addSoa = () => {
flattened +=
utils_generic_1.newLinesIntoSpaces(soa).replace(/\s+/gm, ' ') + utils_generic_1.UNIX_NEW_LINE_CHAR;
soa = '';
isInSoa = false;
};
for (let index = 0; index < input.length; ++index) {
const element = input[index];
if (element === 'S' &&
input[index + 1] === 'O' &&
input[index + 2] === 'A') {
isInSoa = true;
soa = '';
}
if (!isInSoa) {
flattened += element;
}
else {
if (element === '(' && !isParenOpen) {
isParenOpen = true;
}
else if (element === ')' && isParenOpen) {
addSoa();
isParenOpen = false;
}
else if (element === utils_generic_1.UNIX_NEW_LINE_CHAR && !isParenOpen) {
addSoa();
}
else {
soa += element;
}
}
}
return flattened;
};
exports.flattenStartOfAuthority = flattenStartOfAuthority;
const removeComments = (text) => {
const matchComment = /\\"|"(?:\\"|[^"])*"|((^|[^\\])\;.*)/g;
return text.replace(matchComment, (match, g1) => {
// if g1 is not set/matched, re-insert it, else remove
return !g1 ? match : '';
});
};
exports.removeComments = removeComments;
const transformInputText = (text) => {
const withoutComments = exports.removeComments(text);
const flattened = exports.flattenStartOfAuthority(withoutComments);
const lines = utils_generic_1.splitByNewLine(flattened).filter(x => x.trim() !== '');
return [flattened, lines];
};
exports.transformInputText = transformInputText;
const zipArrayToObj = (template, mapper) => (recordData, parser) => {
const { tokens, ...rest } = recordData;
const obj = { ...rest };
template.split(' ').forEach((key, index) => {
obj[key] = tokens[index];
});
return (mapper ? mapper(obj, parser) : obj);
};
exports.zipArrayToObj = zipArrayToObj;
const getRecordNameUsingOrigin = (name, zoneObj) => {
const $origin = zoneObj.$ORIGIN;
if (!name ||
name === '@' ||
name === $origin ||
utils_generic_1.trimDot(name) === utils_generic_1.trimDot($origin)) {
return utils_generic_1.withDot($origin);
}
else if (!name.includes($origin) && name.endsWith('.')) {
return name + $origin;
}
else if (!name.includes($origin)) {
return name + '.' + $origin;
}
else {
return name;
}
};
exports.getRecordNameUsingOrigin = getRecordNameUsingOrigin;
//# sourceMappingURL=utils_parser.js.map