UNPKG

json-ts

Version:

Automatically generate Typescript Definition files or Flow types from JSON input

201 lines 31.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var ts = require("typescript"); var immutable_1 = require("immutable"); var needsQuotes = require("needsquotes"); var collapse_interfaces_1 = require("./collapse-interfaces"); var _a = require('../_'), startCase = _a.startCase, toLower = _a.toLower; exports.log = function (input) { return console.log('--\n', JSON.stringify(input, null, 2)); }; exports.kindMap = (_b = {}, _b[ts.SyntaxKind.NullKeyword] = ts.SyntaxKind.NullKeyword, _b[ts.SyntaxKind.StringLiteral] = ts.SyntaxKind.StringKeyword, _b[ts.SyntaxKind.FirstLiteralToken] = ts.SyntaxKind.NumberKeyword, _b[ts.SyntaxKind.TrueKeyword] = ts.SyntaxKind.BooleanKeyword, _b[ts.SyntaxKind.FalseKeyword] = ts.SyntaxKind.BooleanKeyword, _b[ts.SyntaxKind.NumericLiteral] = ts.SyntaxKind.NumberKeyword, _b); function namedProp(member) { var qs = needsQuotes(member.name); var output = qs.needsQuotes ? qs.quotedValue : member.name; var prop = ts.createNode(ts.SyntaxKind.PropertySignature); prop.name = ts.createIdentifier(output); if (member.optional) { prop.questionToken = ts.createNode(ts.SyntaxKind.QuestionToken); } return prop; } exports.namedProp = namedProp; var safeUnions = immutable_1.Set([ ts.SyntaxKind.TrueKeyword, ts.SyntaxKind.FalseKeyword, ts.SyntaxKind.StringLiteral, ts.SyntaxKind.NumericLiteral, ts.SyntaxKind.PrefixUnaryExpression, ts.SyntaxKind.NullKeyword, ]); function transform(stack, options) { var wrapper = [{ kind: ts.SyntaxKind.ObjectLiteralExpression, _kind: 'ObjectLiteralExpression', name: options.rootName, interfaceCandidate: true, body: stack }]; var interfaces = getInterfaces(wrapper); return collapse_interfaces_1.collapseInterfaces(interfaces); function createOne(node) { var thisMembers = getMembers(node.body); var item = ts.createNode(ts.SyntaxKind.InterfaceDeclaration); item.name = ts.createIdentifier(newInterfaceName(node)); item.members = ts.createNodeArray(thisMembers, false); return item; } function getInterfaces(nodes) { return nodes.reduce(function (acc, node) { if (node.kind === ts.SyntaxKind.ObjectLiteralExpression) { var newInterface = createOne(node); // const asMap = fromJS(newInterface); if (node.interfaceCandidate) { return acc.concat([newInterface], getInterfaces(node.body)); } return acc.concat(getInterfaces(node.body)); } if (node.kind === ts.SyntaxKind.ArrayLiteralExpression) { var decorated = node.body.map(function (arrayNode) { arrayNode.name = getArrayItemName(node.name); return arrayNode; }); var other = getInterfaces(decorated); return acc.concat(other); } return acc; }, []); } function getMembers(stack) { var members = stack.map(function (node) { switch (node.kind) { case ts.SyntaxKind.FalseKeyword: case ts.SyntaxKind.TrueKeyword: { var item = namedProp({ name: node.name }); item.type = ts.createNode(ts.SyntaxKind.BooleanKeyword); return item; } case ts.SyntaxKind.StringLiteral: { var item = namedProp({ name: node.name }); item.type = ts.createNode(ts.SyntaxKind.StringKeyword); return item; } case ts.SyntaxKind.NullKeyword: { var item = namedProp({ name: node.name }); item.type = ts.createNode(ts.SyntaxKind.NullKeyword); return item; } case ts.SyntaxKind.NumericLiteral: { var item = namedProp({ name: node.name }); item.type = ts.createNode(ts.SyntaxKind.NumberKeyword); return item; } case ts.SyntaxKind.ObjectLiteralExpression: { if (node.interfaceCandidate) { var item = namedProp({ name: node.name }); item.type = ts.createTypeReferenceNode(newInterfaceName(node), undefined); return item; } else { var item = namedProp({ name: node.name }); item.type = ts.createTypeLiteralNode(getMembers(node.body)); return item; } } case ts.SyntaxKind.ArrayLiteralExpression: { if (node.body.length) { var item = namedProp({ name: node.name }); var elements = getArrayElementsType(node); item.type = ts.createArrayTypeNode(elements); return item; } else { var item = namedProp({ name: node.name }); var anyNode = ts.createNode(ts.SyntaxKind.AnyKeyword); item.type = ts.createArrayTypeNode(anyNode); return item; } } } }); return members; } function getArrayElementsType(node) { var kinds = immutable_1.Set(node.body.map(function (x) { return x.kind; })); if (kinds.size === 1) { var kind = kinds.first(); switch (kind) { case ts.SyntaxKind.NullKeyword: case ts.SyntaxKind.StringLiteral: case ts.SyntaxKind.TrueKeyword: case ts.SyntaxKind.FalseKeyword: case ts.SyntaxKind.NumericLiteral: return ts.createNode(exports.kindMap[kind]); case ts.SyntaxKind.ObjectLiteralExpression: var item = ts.createTypeReferenceNode(getArrayInterfaceItemName(node.name), undefined); return item; default: return ts.createNode(ts.SyntaxKind.AnyKeyword); } } else if (kinds.size === 2) { if (kinds.has(ts.SyntaxKind.TrueKeyword) && kinds.has(ts.SyntaxKind.FalseKeyword)) { return ts.createNode(ts.SyntaxKind.BooleanKeyword); } } // console.log(node.body); if (kinds.every(function (kind) { return safeUnions.has(kind); })) { // console.log(node.body); var types = kinds.map(function (x) { return ts.createNode(exports.kindMap[x]); }).toJS(); var item = ts.createNode(ts.SyntaxKind.ParenthesizedType); item.type = ts.createUnionOrIntersectionTypeNode(ts.SyntaxKind.UnionType, types); return item; } else { // console.log('Not creating union as this array contains mixed complexr types'); } return ts.createNode(ts.SyntaxKind.AnyKeyword); } function newInterfaceName(node) { var base = node.name[0].toUpperCase() + node.name.slice(1); if (options.prefix) { return options.prefix + base; } var qs = needsQuotes(base); if (qs.needsQuotes) { return "_" + base; } return base; } function upper(string) { return string[0].toUpperCase() + string.slice(1); } function pascalCase(input) { return startCase(input).replace(/ /g, ''); } function getArrayInterfaceItemName(input) { if (options.prefix) { return pascalCase(options.prefix + "_" + input + "_Item"); } var qs = needsQuotes(input); if (qs.needsQuotes) { return '_' + pascalCase(input + "_Item"); } return pascalCase(input + "_Item"); } function getArrayItemName(input) { return pascalCase(input + "_Item"); } // function getArrayInterfaceItemName(input) { // return pascalCase(`I_${input}_Item`) // } } exports.transform = transform; var _b; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBaUM7QUFFakMsdUNBQThDO0FBQzlDLHlDQUE0QztBQUU1Qyw2REFBeUQ7QUFHbkQsSUFBQSxvQkFBc0MsRUFBckMsd0JBQVMsRUFBRSxvQkFBTyxDQUFvQjtBQUVoQyxRQUFBLEdBQUcsR0FBRyxVQUFDLEtBQUssSUFBSyxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFuRCxDQUFtRCxDQUFDO0FBZXJFLFFBQUEsT0FBTztJQUNoQixHQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxJQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVztJQUN0RCxHQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxJQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYTtJQUMxRCxHQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhO0lBQzlELEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjO0lBQ3pELEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLElBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjO0lBQzFELEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLElBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhO1FBQzdEO0FBRUYsbUJBQTBCLE1BQU07SUFDNUIsSUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxX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QztRQUM3QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBSSxLQUFLLFVBQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFDRCwwQkFBMEIsS0FBSztRQUMzQixNQUFNLENBQUMsVUFBVSxDQUFJLEtBQUssVUFBTyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUNELDhDQUE4QztJQUM5QywyQ0FBMkM7SUFDM0MsSUFBSTtBQUNSLENBQUM7QUFyTEQsOEJBcUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge1BhcnNlZE5vZGV9IGZyb20gXCIuL3BhcnNlclwiO1xuaW1wb3J0IHtTZXQgYXMgSW1tdXRhYmxlU2V0fSBmcm9tIFwiaW1tdXRhYmxlXCI7XG5pbXBvcnQgbmVlZHNRdW90ZXMgPSByZXF1aXJlKCduZWVkc3F1b3RlcycpO1xuaW1wb3J0IHtKc29uVHNPcHRpb25zfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHtjb2xsYXBzZUludGVyZmFjZXN9IGZyb20gXCIuL2NvbGxhcHNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7Tm9kZX0gZnJvbSBcInR5cGVzY3JpcHRcIjtcblxuY29uc3Qge3N0YXJ0Q2FzZSwgdG9Mb3dlcn0gPSByZXF1aXJlKCcuLi9fJyk7XG5cbmV4cG9ydCBjb25zdCBsb2cgPSAoaW5wdXQpID0+IGNvbnNvbGUubG9nKCctLVxcbicsIEpTT04uc3RyaW5naWZ5KGlucHV0LCBudWxsLCAyKSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtYmVyTm9kZSB7XG4gICAgdHlwZXM6IEltbXV0YWJsZVNldDxzdHJpbmc+XG4gICAgbWVtYmVyczogTWVtYmVyTm9kZVtdXG4gICAgbmFtZTogc3RyaW5nXG4gICAgb3B0aW9uYWw6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmZhY2VOb2RlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgb3JpZ2luYWw6IHN0cmluZztcbiAgICBtZW1iZXJzOiBNZW1iZXJOb2RlW107XG59XG5cbmV4cG9ydCBjb25zdCBraW5kTWFwID0ge1xuICAgIFt0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkXTogdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZCxcbiAgICBbdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsXTogdHMuU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkLFxuICAgIFt0cy5TeW50YXhLaW5kLkZpcnN0TGl0ZXJhbFRva2VuXTogdHMuU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkLFxuICAgIFt0cy5TeW50YXhLaW5kLlRydWVLZXl3b3JkXTogdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZCxcbiAgICBbdHMuU3ludGF4S2luZC5GYWxzZUtleXdvcmRdOiB0cy5TeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkLFxuICAgIFt0cy5TeW50YXhLaW5kLk51bWVyaWNMaXRlcmFsXTogdHMuU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5hbWVkUHJvcChtZW1iZXIpIHtcbiAgICBjb25zdCBxcyA9IG5lZWRzUXVvdGVzKG1lbWJlci5uYW1lKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IHFzLm5lZWRzUXVvdGVzID8gcXMucXVvdGVkVmFsdWUgOiBtZW1iZXIubmFtZTtcblxuICAgIGNvbnN0IHByb3A6IGFueSA9IHRzLmNyZWF0ZU5vZGUodHMuU3ludGF4S2luZC5Qcm9wZXJ0eVNpZ25hdHVyZSk7XG4gICAgcHJvcC5uYW1lID0gdHMuY3JlYXRlSWRlbnRpZmllcihvdXRwdXQpO1xuXG4gICAgaWYgKG1lbWJlci5vcHRpb25hbCkge1xuICAgICAgICBwcm9wLnF1ZXN0aW9uVG9rZW4gPSB0cy5jcmVhdGVOb2RlKHRzLlN5bnRheEtpbmQuUXVlc3Rpb25Ub2tlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3A7XG59XG5cbmNvbnN0IHNhZmVVbmlvbnMgPSBJbW11dGFibGVTZXQoW1xuICAgIHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQsXG4gICAgdHMuU3ludGF4S2luZC5GYWxzZUtleXdvcmQsXG4gICAgdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsLFxuICAgIHRzLlN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWwsXG4gICAgdHMuU3ludGF4S2luZC5QcmVmaXhVbmFyeUV4cHJlc3Npb24sXG4gICAgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZCxcbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtKHN0YWNrOiBQYXJzZWROb2RlW10sIG9wdGlvbnM6IEpzb25Uc09wdGlvbnMpOiBJbnRlcmZhY2VOb2RlW10ge1xuXG4gICAgY29uc3Qgd3JhcHBlciA9IFt7XG4gICAgICAgIGtpbmQ6IHRzLlN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgICAgIF9raW5kOiAnT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24nLFxuICAgICAgICBuYW1lOiBvcHRpb25zLnJvb3ROYW1lLFxuICAgICAgICBpbnRlcmZhY2VDYW5kaWRhdGU6IHRydWUsXG4gICAgICAgIGJvZHk6IHN0YWNrXG4gICAgfV07XG5cbiAgICBjb25zdCBpbnRlcmZhY2VzID0gZ2V0SW50ZXJmYWNlcyh3cmFwcGVyKTtcblxuICAgIHJldHVybiBjb2xsYXBzZUludGVyZmFjZXMoaW50ZXJmYWNlcyk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVPbmUobm9kZTogUGFyc2VkTm9kZSk6IEludGVyZmFjZU5vZGUge1xuXG4gICAgICAgIGNvbnN0IHRoaXNNZW1iZXJzID0gZ2V0TWVtYmVycyhub2RlLmJvZHkpO1xuICAgICAgICBjb25zdCBpdGVtOiBhbnkgICA9IHRzLmNyZWF0ZU5vZGUodHMuU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbik7XG4gICAgICAgIGl0ZW0ubmFtZSAgICAgICAgID0gdHMuY3JlYXRlSWRlbnRpZmllcihuZXdJbnRlcmZhY2VOYW1lKG5vZGUpKTtcbiAgICAgICAgaXRlbS5tZW1iZXJzICAgICAgPSB0cy5jcmVhdGVOb2RlQXJyYXkodGhpc01lbWJlcnMsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJbnRlcmZhY2VzKG5vZGVzOiBQYXJzZWROb2RlW10pOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJbnRlcmZhY2UgPSBjcmVhdGVPbmUobm9kZSk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgYXNNYXAgPSBmcm9tSlMobmV3SW50ZXJmYWNlKTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLmludGVyZmFjZUNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChbbmV3SW50ZXJmYWNlXSwgZ2V0SW50ZXJmYWNlcyhub2RlLmJvZHkpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRJbnRlcmZhY2VzKG5vZGUuYm9keSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb24pIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRlZCA9IG5vZGUuYm9keS5tYXAoYXJyYXlOb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlOb2RlLm5hbWUgPSBnZXRBcnJheUl0ZW1OYW1lKG5vZGUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheU5vZGU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlciA9IGdldEludGVyZmFjZXMoZGVjb3JhdGVkKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KG90aGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGFjYztcblxuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0TWVtYmVycyhzdGFjazogUGFyc2VkTm9kZVtdKSB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBzdGFjay5tYXAobm9kZSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2gobm9kZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZDpcbiAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5hbWVkUHJvcCh7bmFtZTogbm9kZS5uYW1lfSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udHlwZSA9IHRzLmNyZWF0ZU5vZGUodHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbmFtZWRQcm9wKHtuYW1lOiBub2RlLm5hbWV9KTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS50eXBlID0gdHMuY3JlYXRlTm9kZSh0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuYW1lZFByb3Aoe25hbWU6IG5vZGUubmFtZX0pO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSB0cy5jcmVhdGVOb2RlKHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bWVyaWNMaXRlcmFsOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuYW1lZFByb3Aoe25hbWU6IG5vZGUubmFtZX0pO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSB0cy5jcmVhdGVOb2RlKHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb246IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaW50ZXJmYWNlQ2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbmFtZWRQcm9wKHtuYW1lOiBub2RlLm5hbWV9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udHlwZSA9IHRzLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKG5ld0ludGVyZmFjZU5hbWUobm9kZSksIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuYW1lZFByb3Aoe25hbWU6IG5vZGUubmFtZX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50eXBlID0gdHMuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKGdldE1lbWJlcnMobm9kZS5ib2R5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjoge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ib2R5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5hbWVkUHJvcCh7bmFtZTogbm9kZS5uYW1lfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGdldEFycmF5RWxlbWVudHNUeXBlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50eXBlID0gdHMuY3JlYXRlQXJyYXlUeXBlTm9kZShlbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuYW1lZFByb3Aoe25hbWU6IG5vZGUubmFtZX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW55Tm9kZTogYW55ID0gdHMuY3JlYXRlTm9kZSh0cy5TeW50YXhLaW5kLkFueUtleXdvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50eXBlID0gdHMuY3JlYXRlQXJyYXlUeXBlTm9kZShhbnlOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lbWJlcnNcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRBcnJheUVsZW1lbnRzVHlwZShub2RlOiBQYXJzZWROb2RlKTogYW55IHtcbiAgICAgICAgY29uc3Qga2luZHMgPSBJbW11dGFibGVTZXQobm9kZS5ib2R5Lm1hcCh4ID0+IHgua2luZCkpO1xuICAgICAgICBpZiAoa2luZHMuc2l6ZSA9PT0gMSkgeyAvLyBpZiB0aGVyZSdzIG9ubHkgMSBraW5kIGluIHRoZSBhcnJheSwgaXQncyBzYWZlIHRvIHVzZSB0eXBlW107XG4gICAgICAgICAgICBjb25zdCBraW5kID0ga2luZHMuZmlyc3QoKTtcbiAgICAgICAgICAgIHN3aXRjaChraW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsOlxuICAgICAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5UcnVlS2V5d29yZDpcbiAgICAgICAgICAgICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRmFsc2VLZXl3b3JkOlxuICAgICAgICAgICAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdW1lcmljTGl0ZXJhbDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRzLmNyZWF0ZU5vZGUoa2luZE1hcFtraW5kXSk7XG4gICAgICAgICAgICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZ2V0QXJyYXlJbnRlcmZhY2VJdGVtTmFtZShub2RlLm5hbWUpLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdHMuY3JlYXRlTm9kZSh0cy5TeW50YXhLaW5kLkFueUtleXdvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtpbmRzLnNpemUgPT09IDIpIHsgLy8gYSBtaXggb2YgdHJ1ZS9mYWxzZSBpcyBzdGlsbCBhIGJvb2xlYW5bXTtcbiAgICAgICAgICAgIGlmIChraW5kcy5oYXModHMuU3ludGF4S2luZC5UcnVlS2V5d29yZCkgJiYga2luZHMuaGFzKHRzLlN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cy5jcmVhdGVOb2RlKHRzLlN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKG5vZGUuYm9keSk7XG4gICAgICAgIGlmIChraW5kcy5ldmVyeShraW5kID0+IHNhZmVVbmlvbnMuaGFzKGtpbmQpKSkge1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhub2RlLmJvZHkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBraW5kcy5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRzLmNyZWF0ZU5vZGUoa2luZE1hcFt4XSk7XG4gICAgICAgICAgICB9KS50b0pTKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0cy5jcmVhdGVOb2RlKHRzLlN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGUpO1xuICAgICAgICAgICAgKGl0ZW0gYXMgYW55KS50eXBlID0gdHMuY3JlYXRlVW5pb25PckludGVyc2VjdGlvblR5cGVOb2RlKHRzLlN5bnRheEtpbmQuVW5pb25UeXBlLCB0eXBlcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ05vdCBjcmVhdGluZyB1bmlvbiBhcyB0aGlzIGFycmF5IGNvbnRhaW5zIG1peGVkIGNvbXBsZXhyIHR5cGVzJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHMuY3JlYXRlTm9kZSh0cy5TeW50YXhLaW5kLkFueUtleXdvcmQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBuZXdJbnRlcmZhY2VOYW1lKG5vZGU6IFBhcnNlZE5vZGUpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IG5vZGUubmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbm9kZS5uYW1lLnNsaWNlKDEpO1xuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnByZWZpeCArIGJhc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXMgPSBuZWVkc1F1b3RlcyhiYXNlKTtcbiAgICAgICAgaWYgKHFzLm5lZWRzUXVvdGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gYF9gICsgYmFzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBwZXIoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdbMF0udG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGFzY2FsQ2FzZShpbnB1dCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzdGFydENhc2UoaW5wdXQpLnJlcGxhY2UoLyAvZywgJycpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBcnJheUludGVyZmFjZUl0ZW1OYW1lKGlucHV0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucHJlZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gcGFzY2FsQ2FzZShgJHtvcHRpb25zLnByZWZpeH1fJHtpbnB1dH1fSXRlbWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHFzID0gbmVlZHNRdW90ZXMoaW5wdXQpO1xuICAgICAgICBpZiAocXMubmVlZHNRdW90ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAnXycgKyBwYXNjYWxDYXNlKGAke2lucHV0fV9JdGVtYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc2NhbENhc2UoYCR7aW5wdXR9X0l0ZW1gKVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBcnJheUl0ZW1OYW1lKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBwYXNjYWxDYXNlKGAke2lucHV0fV9JdGVtYClcbiAgICB9XG4gICAgLy8gZnVuY3Rpb24gZ2V0QXJyYXlJbnRlcmZhY2VJdGVtTmFtZShpbnB1dCkge1xuICAgIC8vICAgICByZXR1cm4gcGFzY2FsQ2FzZShgSV8ke2lucHV0fV9JdGVtYClcbiAgICAvLyB9XG59XG5cblxuXG4iXX0=