json-ts
Version:
Automatically generate Typescript Definition files or Flow types from JSON input
201 lines • 31.4 kB
JavaScript
;
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=