UNPKG

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.

170 lines 17.3 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; import { trimDot, withDot, newLinesIntoSpaces, splitByNewLine, UNIX_NEW_LINE_CHAR, } from '../shared/utils_generic'; /** * @perf use collections, benchmark * @note we do not validate invalid quotes (missing close) */ export var splitArgs = function (input, sep) { var e_1, _a; var separator = sep || /\s/g; var isSingleQuoteOpen = false; var isDoubleQuoteOpen = false; var tokenBuffer = []; var tokensFromArgs = []; var characters = input.split(''); try { for (var characters_1 = __values(characters), characters_1_1 = characters_1.next(); !characters_1_1.done; characters_1_1 = characters_1.next()) { var element = characters_1_1.value; var 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); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (characters_1_1 && !characters_1_1.done && (_a = characters_1["return"])) _a.call(characters_1); } finally { if (e_1) throw e_1.error; } } if (tokenBuffer.length > 0) { tokensFromArgs.push(tokenBuffer.join('')); } else if (!!sep) { tokensFromArgs.push(''); } return tokensFromArgs; }; /** @note not checking invalid format of nested parens */ export var flattenStartOfAuthority = function (input) { var isParenOpen = false; var isInSoa = false; var soa = ''; var flattened = ''; var addSoa = function () { flattened += newLinesIntoSpaces(soa).replace(/\s+/gm, ' ') + UNIX_NEW_LINE_CHAR; soa = ''; isInSoa = false; }; for (var index = 0; index < input.length; ++index) { var 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 === UNIX_NEW_LINE_CHAR && !isParenOpen) { addSoa(); } else { soa += element; } } } return flattened; }; export var removeComments = function (text) { var matchComment = /\\"|"(?:\\"|[^"])*"|((^|[^\\])\;.*)/g; return text.replace(matchComment, function (match, g1) { // if g1 is not set/matched, re-insert it, else remove return !g1 ? match : ''; }); }; export var transformInputText = function (text) { var withoutComments = removeComments(text); var flattened = flattenStartOfAuthority(withoutComments); var lines = splitByNewLine(flattened).filter(function (x) { return x.trim() !== ''; }); return [flattened, lines]; }; export var zipArrayToObj = function (template, mapper) { return function (recordData, parser) { var tokens = recordData.tokens, rest = __rest(recordData, ["tokens"]); var obj = __assign({}, rest); template.split(' ').forEach(function (key, index) { obj[key] = tokens[index]; }); return (mapper ? mapper(obj, parser) : obj); }; }; export var getRecordNameUsingOrigin = function (name, zoneObj) { var $origin = zoneObj.$ORIGIN; if (!name || name === '@' || name === $origin || trimDot(name) === trimDot($origin)) { return withDot($origin); } else if (!name.includes($origin) && name.endsWith('.')) { return name + $origin; } else if (!name.includes($origin)) { return name + '.' + $origin; } else { return name; } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHNfcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci91dGlsc19wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1Asa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxrQkFBa0IsR0FDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsSUFBTSxTQUFTLEdBQUcsVUFBQyxLQUFhLEVBQUUsR0FBcUI7O0lBQzVELElBQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUM7SUFDL0IsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDOUIsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDOUIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUMxQixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztRQUVuQyxLQUFzQixJQUFBLGVBQUEsU0FBQSxVQUFVLENBQUEsc0NBQUEsOERBQUU7WUFBN0IsSUFBTSxPQUFPLHVCQUFBO1lBQ2hCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFCLGlCQUFpQixHQUFHLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3ZDLFNBQVM7YUFDVjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDaEQsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFD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QixDQVFyQixDQUFDO0FBRUYsTUFBTSxDQUFDLElBQU0sd0JBQXdCLEdBQUcsVUFDdEMsSUFBWSxFQUNaLE9BQTBCO0lBRTFCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFFaEMsSUFDRSxDQUFDLElBQUk7UUFDTCxJQUFJLEtBQUssR0FBRztRQUNaLElBQUksS0FBSyxPQUFPO1FBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQ2xDO1FBQ0EsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDekI7U0FBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3hELE9BQU8sSUFBSSxHQUFHLE9BQU8sQ0FBQztLQUN2QjtTQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2xDLE9BQU8sSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7S0FDN0I7U0FBTTtRQUNMLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0cmltRG90LFxuICB3aXRoRG90LFxuICBuZXdMaW5lc0ludG9TcGFjZXMsXG4gIHNwbGl0QnlOZXdMaW5lLFxuICBVTklYX05FV19MSU5FX0NIQVIsXG59IGZyb20gJy4uL3NoYXJlZC91dGlsc19nZW5lcmljJztcbmltcG9ydCB7IFBhcnNlZFR5cGluZ3MgfSBmcm9tICcuLi9zaGFyZWQvdHlwZXNfZG9tYWluX3NwZWNpZmljJztcbmltcG9ydCB7IFBhcnNlclR5cGluZ3MsIFBhcnNpbmdSZWNvcmREYXRhVHlwZSB9IGZyb20gJy4vdHlwZXNfcGFyc2VyJztcblxuLyoqXG4gKiBAcGVyZiB1c2UgY29sbGVjdGlvbnMsIGJlbmNobWFya1xuICogQG5vdGUgd2UgZG8gbm90IHZhbGlkYXRlIGludmFsaWQgcXVvdGVzIChtaXNzaW5nIGNsb3NlKVxuICovXG5leHBvcnQgY29uc3Qgc3BsaXRBcmdzID0gKGlucHV0OiBzdHJpbmcsIHNlcD86IFJlZ0V4cCB8IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc2VwYXJhdG9yID0gc2VwIHx8IC9cXHMvZztcbiAgbGV0IGlzU2luZ2xlUXVvdGVPcGVuID0gZmFsc2U7XG4gIGxldCBpc0RvdWJsZVF1b3RlT3BlbiA9IGZhbHNlO1xuICBsZXQgdG9rZW5CdWZmZXIgPSBbXTtcbiAgY29uc3QgdG9rZW5zRnJvbUFyZ3MgPSBbXTtcbiAgY29uc3QgY2hhcmFjdGVycyA9IGlucHV0LnNwbGl0KCcnKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgY2hhcmFjdGVycykge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBlbGVtZW50Lm1hdGNoKHNlcGFyYXRvcik7XG5cbiAgICBpZiAoZWxlbWVudCA9PT0gXCInXCIgJiYgIWlzRG91YmxlUXVvdGVPcGVuKSB7XG4gICAgICB0b2tlbkJ1ZmZlci5wdXNoKGVsZW1lbnQpO1xuICAgICAgaXNTaW5nbGVRdW90ZU9wZW4gPSAhaXNTaW5nbGVRdW90ZU9wZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT09ICdcIicgJiYgIWlzU2luZ2xlUXVvdGVPcGVuKSB7XG4gICAgICB0b2tlbkJ1ZmZlci5wdXNoKGVsZW1lbnQpO1xuICAgICAgaXNEb3VibGVRdW90ZU9wZW4gPSAhaXNEb3VibGVRdW90ZU9wZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzU2luZ2xlUXVvdGVPcGVuICYmICFpc0RvdWJsZVF1b3RlT3BlbiAmJiBtYXRjaGVzKSB7XG4gICAgICBpZiAodG9rZW5CdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICB0b2tlbnNGcm9tQXJncy5wdXNoKHRva2VuQnVmZmVyLmpvaW4oJycpKTtcbiAgICAgICAgdG9rZW5CdWZmZXIgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAoISFzZXApIHtcbiAgICAgICAgdG9rZW5zRnJvbUFyZ3MucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW5CdWZmZXIucHVzaChlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgaWYgKHRva2VuQnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICB0b2tlbnNGcm9tQXJncy5wdXNoKHRva2VuQnVmZmVyLmpvaW4oJycpKTtcbiAgfSBlbHNlIGlmICghIXNlcCkge1xuICAgIHRva2Vuc0Zyb21BcmdzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiB0b2tlbnNGcm9tQXJncztcbn07XG5cbi8qKiBAbm90ZSBub3QgY2hlY2tpbmcgaW52YWxpZCBmb3JtYXQgb2YgbmVzdGVkIHBhcmVucyAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5TdGFydE9mQXV0aG9yaXR5ID0gKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgaXNQYXJlbk9wZW4gPSBmYWxzZTtcbiAgbGV0IGlzSW5Tb2EgPSBmYWxzZTtcbiAgbGV0IHNvYSA9ICcnO1xuICBsZXQgZmxhdHRlbmVkID0gJyc7XG5cbiAgY29uc3QgYWRkU29hID0gKCkgPT4ge1xuICAgIGZsYXR0ZW5lZCArPVxuICAgICAgbmV3TGluZXNJbnRvU3BhY2VzKHNvYSkucmVwbGFjZSgvXFxzKy9nbSwgJyAnKSArIFVOSVhfTkVXX0xJTkVfQ0hBUjtcbiAgICBzb2EgPSAnJztcbiAgICBpc0luU29hID0gZmFsc2U7XG4gIH07XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGlucHV0Lmxlbmd0aDsgKytpbmRleCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpbnB1dFtpbmRleF07XG5cbiAgICBpZiAoXG4gICAgICBlbGVtZW50ID09PSAnUycgJiZcbiAgICAgIGlucHV0W2luZGV4ICsgMV0gPT09ICdPJyAmJlxuICAgICAgaW5wdXRbaW5kZXggKyAyXSA9PT0gJ0EnXG4gICAgKSB7XG4gICAgICBpc0luU29hID0gdHJ1ZTtcbiAgICAgIHNvYSA9ICcnO1xuICAgIH1cbiAgICBpZiAoIWlzSW5Tb2EpIHtcbiAgICAgIGZsYXR0ZW5lZCArPSBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudCA9PT0gJygnICYmICFpc1BhcmVuT3Blbikge1xuICAgICAgICBpc1BhcmVuT3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT09ICcpJyAmJiBpc1BhcmVuT3Blbikge1xuICAgICAgICBhZGRTb2EoKTtcbiAgICAgICAgaXNQYXJlbk9wZW4gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCA9PT0gVU5JWF9ORVdfTElORV9DSEFSICYmICFpc1BhcmVuT3Blbikge1xuICAgICAgICBhZGRTb2EoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvYSArPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmbGF0dGVuZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ29tbWVudHMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbWF0Y2hDb21tZW50ID0gL1xcXFxcInxcIig/OlxcXFxcInxbXlwiXSkqXCJ8KChefFteXFxcXF0pXFw7LiopL2c7XG5cbiAgcmV0dXJuIHRleHQucmVwbGFjZShtYXRjaENvbW1lbnQsIChtYXRjaDogc3RyaW5nLCBnMTogdW5rbm93bikgPT4ge1xuICAgIC8vIGlmIGcxIGlzIG5vdCBzZXQvbWF0Y2hlZCwgcmUtaW5zZXJ0IGl0LCBlbHNlIHJlbW92ZVxuICAgIHJldHVybiAhZzEgPyBtYXRjaCA6ICcnO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1JbnB1dFRleHQgPSAodGV4dDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW11dID0+IHtcbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gcmVtb3ZlQ29tbWVudHModGV4dCk7XG4gIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5TdGFydE9mQXV0aG9yaXR5KHdpdGhvdXRDb21tZW50cyk7XG4gIGNvbnN0IGxpbmVzID0gc3BsaXRCeU5ld0xpbmUoZmxhdHRlbmVkKS5maWx0ZXIoeCA9PiB4LnRyaW0oKSAhPT0gJycpO1xuXG4gIHJldHVybiBbZmxhdHRlbmVkLCBsaW5lc107XG59O1xuXG5leHBvcnQgdHlwZSBaaXBNYXBwZXJGblR5cGU8VCBleHRlbmRzIHt9PiA9IChcbiAgdmFsdWU6IFQgJiBPbWl0PFBhcnNpbmdSZWNvcmREYXRhVHlwZSwgJ3Rva2Vucyc+LFxuICBwYXJzZXI6IFBhcnNlclR5cGluZ3MuUGFyc2VyXG4pID0+IFQ7XG5leHBvcnQgdHlwZSBaaXBPYmpGblR5cGU8VCBleHRlbmRzIHt9PiA9IChcbiAgeDogUGFyc2luZ1JlY29yZERhdGFUeXBlLFxuICBwYXJzZXI6IFBhcnNlclR5cGluZ3MuUGFyc2VyXG4pID0+IFQ7XG5cbmV4cG9ydCBjb25zdCB6aXBBcnJheVRvT2JqID0gPFQgZXh0ZW5kcyB7fT4oXG4gIHRlbXBsYXRlOiBzdHJpbmcsXG4gIG1hcHBlcj86IFppcE1hcHBlckZuVHlwZTxUPlxuKTogWmlwT2JqRm5UeXBlPFQ+ID0+IChyZWNvcmREYXRhLCBwYXJzZXIpID0+IHtcbiAgY29uc3QgeyB0b2tlbnMsIC4uLnJlc3QgfSA9IHJlY29yZERhdGE7XG4gIGNvbnN0IG9iaiA9IHsgLi4ucmVzdCB9IGFzIGFueTtcblxuICB0ZW1wbGF0ZS5zcGxpdCgnICcpLmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICBvYmpba2V5XSA9IHRva2Vuc1tpbmRleF07XG4gIH0pO1xuICByZXR1cm4gKG1hcHBlciA/IG1hcHBlcihvYmogYXMgYW55LCBwYXJzZXIpIDogb2JqKSBhcyBUO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlY29yZE5hbWVVc2luZ09yaWdpbiA9IChcbiAgbmFtZTogc3RyaW5nLFxuICB6b25lT2JqOiBQYXJzZWRUeXBpbmdzLk9ialxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgJG9yaWdpbiA9IHpvbmVPYmouJE9SSUdJTjtcblxuICBpZiAoXG4gICAgIW5hbWUgfHxcbiAgICBuYW1lID09PSAnQCcgfHxcbiAgICBuYW1lID09PSAkb3JpZ2luIHx8XG4gICAgdHJpbURvdChuYW1lKSA9PT0gdHJpbURvdCgkb3JpZ2luKVxuICApIHtcbiAgICByZXR1cm4gd2l0aERvdCgkb3JpZ2luKTtcbiAgfSBlbHNlIGlmICghbmFtZS5pbmNsdWRlcygkb3JpZ2luKSAmJiBuYW1lLmVuZHNXaXRoKCcuJykpIHtcbiAgICByZXR1cm4gbmFtZSArICRvcmlnaW47XG4gIH0gZWxzZSBpZiAoIW5hbWUuaW5jbHVkZXMoJG9yaWdpbikpIHtcbiAgICByZXR1cm4gbmFtZSArICcuJyArICRvcmlnaW47XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbn07XG4iXX0=