@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
166 lines • 25.4 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const babel_core_1 = require("babel-core");
const compiler_1 = __importDefault(require("./compiler"));
const test_file_parser_base_1 = require("../../test-file-parser-base");
const TOKEN_TYPE = {
Identifier: 'Identifier',
PropertyAccessExpression: 'MemberExpression',
CallExpression: 'CallExpression',
TaggedTemplateExpression: 'TaggedTemplateExpression',
TemplateLiteral: 'TemplateLiteral',
StringLiteral: 'StringLiteral',
ArrowFunctionExpression: 'ArrowFunctionExpression',
FunctionExpression: 'FunctionExpression',
ExpressionStatement: 'ExpressionStatement',
ReturnStatement: 'ReturnStatement',
FunctionDeclaration: 'FunctionDeclaration',
VariableStatement: 'VariableStatement',
VariableDeclaration: 'VariableDeclaration',
ObjectLiteralExpression: 'ObjectExpression'
};
class EsNextTestFileParser extends test_file_parser_base_1.TestFileParserBase {
constructor() {
super(TOKEN_TYPE);
}
static getTagStrValue(exp) {
//NOTE: we set <computed name> if template literal has at least one computed substring ${...}
return exp.expressions.length ? EsNextTestFileParser.formatComputedName(exp.loc.start.line) : exp.quasis[0].value.raw;
}
isAsyncFn(token) {
return token.async || token.generator;
}
getTokenType(token) {
return token.type;
}
getRValue(token) {
return token.declarations[0].init;
}
getStringValue(token) {
const stringTypes = [this.tokenType.StringLiteral, this.tokenType.TemplateLiteral, this.tokenType.Identifier];
if (stringTypes.indexOf(token.type) > -1)
return this.formatFnArg(token);
return null;
}
getFunctionBody(token) {
return token.body && token.body.body ? token.body.body : [];
}
getCalleeToken(token) {
return token.callee;
}
getMemberFnName(token) {
return token.callee.property.name;
}
formatFnData(name, value, token, meta = [{}]) {
return {
fnName: name,
value: value,
loc: token.loc,
start: token.start,
end: token.end,
meta: lodash_1.merge({}, ...meta)
};
}
getKeyValue(prop) {
const { key, value } = prop;
return {
key: key.name || this.formatFnArg(key),
value: this.getStringValue(value)
};
}
analyzeMemberExp(token) {
let exp = token;
const tokenType = this.tokenType;
const callStack = [exp];
while (exp.type !== tokenType.Identifier) {
if (exp.type === tokenType.CallExpression)
exp = exp.callee;
else if (exp.type === tokenType.PropertyAccessExpression)
exp = exp.object;
else if (exp.type === tokenType.TaggedTemplateExpression)
exp = exp.tag;
else
return null;
if (exp.type !== tokenType.Identifier)
callStack.push(exp);
}
if (!this.isApiFn(exp.name))
return null;
const meta = this.getMetaInfo(callStack.slice());
let parentExp = callStack.pop();
if (parentExp.type === tokenType.CallExpression)
return this.formatFnData(exp.name, this.formatFnArg(parentExp.arguments[0]), token, meta);
if (parentExp.type === tokenType.TaggedTemplateExpression)
return this.formatFnData(exp.name, EsNextTestFileParser.getTagStrValue(parentExp.quasi), token, meta);
if (parentExp.type === tokenType.PropertyAccessExpression) {
while (parentExp) {
if (parentExp.type === tokenType.CallExpression && parentExp.callee) {
const calleeType = parentExp.callee.type;
const calleeMemberFn = parentExp.callee.property && parentExp.callee.property.name;
if (this.checkExpDefineTargetName(calleeType, calleeMemberFn))
return this.formatFnData(exp.name, this.formatFnArg(parentExp.arguments[0]), token, meta);
}
if (parentExp.type === tokenType.TaggedTemplateExpression && parentExp.tag) {
const tagType = parentExp.tag.type;
const tagMemberFn = parentExp.tag.property && parentExp.tag.property.name;
if (this.checkExpDefineTargetName(tagType, tagMemberFn))
return this.formatFnData(exp.name, EsNextTestFileParser.getTagStrValue(parentExp.quasi), token, meta);
}
parentExp = callStack.pop();
}
}
return null;
}
formatFnArg(arg) {
if (arg.type === this.tokenType.Identifier)
return EsNextTestFileParser.formatComputedName(arg.loc.start.line);
if (arg.type === this.tokenType.TemplateLiteral)
return EsNextTestFileParser.getTagStrValue(arg);
if (arg.type === this.tokenType.StringLiteral)
return arg.value;
return null;
}
getFnCall(token) {
if (!this.isApiFn(token.callee.name))
return null;
return this.formatFnData(token.callee.name, this.formatFnArg(token.arguments[0]), token);
}
getTaggedTemplateExp(token) {
return this.formatFnData(token.tag.name, EsNextTestFileParser.getTagStrValue(token.quasi), token);
}
analyzeFnCall(token) {
const tokenType = this.tokenType;
if (token.type === tokenType.PropertyAccessExpression)
return this.analyzeMemberExp(token);
if (token.type === tokenType.CallExpression) {
const calleeType = token.callee.type;
if (calleeType === tokenType.PropertyAccessExpression || calleeType === tokenType.CallExpression)
return this.analyzeMemberExp(token);
if (calleeType === tokenType.FunctionExpression || calleeType === tokenType.ArrowFunctionExpression)
return this.collectTestCafeCalls(token.callee.body.body);
return this.getFnCall(token);
}
if (token.type === tokenType.TaggedTemplateExpression) {
if (token.tag.type === tokenType.PropertyAccessExpression)
return this.analyzeMemberExp(token);
return this.getTaggedTemplateExp(token);
}
return null;
}
parse(code) {
const compilerOptions = compiler_1.default.getBabelOptions(null, code);
delete compilerOptions.filename;
const opts = lodash_1.assign(compilerOptions, { ast: true });
const ast = babel_core_1.transform(code, opts).ast;
return this.analyze(ast.program.body);
}
}
exports.EsNextTestFileParser = EsNextTestFileParser;
const parser = new EsNextTestFileParser();
exports.getTestList = parser.getTestList.bind(parser);
exports.getTestListFromCode = parser.getTestListFromCode.bind(parser);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXRlc3QtbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlci90ZXN0LWZpbGUvZm9ybWF0cy9lcy1uZXh0L2dldC10ZXN0LWxpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBdUM7QUFDdkMsMkNBQXVDO0FBQ3ZDLDBEQUFnRDtBQUNoRCx1RUFBaUU7QUFFakUsTUFBTSxVQUFVLEdBQUc7SUFDZixVQUFVLEVBQWdCLFlBQVk7SUFDdEMsd0JBQXdCLEVBQUUsa0JBQWtCO0lBQzVDLGNBQWMsRUFBWSxnQkFBZ0I7SUFDMUMsd0JBQXdCLEVBQUUsMEJBQTBCO0lBQ3BELGVBQWUsRUFBVyxpQkFBaUI7SUFDM0MsYUFBYSxFQUFhLGVBQWU7SUFDekMsdUJBQXVCLEVBQUcseUJBQXlCO0lBQ25ELGtCQUFrQixFQUFRLG9CQUFvQjtJQUM5QyxtQkFBbUIsRUFBTyxxQkFBcUI7SUFDL0MsZUFBZSxFQUFXLGlCQUFpQjtJQUMzQyxtQkFBbUIsRUFBTyxxQkFBcUI7SUFDL0MsaUJBQWlCLEVBQVMsbUJBQW1CO0lBQzdDLG1CQUFtQixFQUFPLHFCQUFxQjtJQUMvQyx1QkFBdUIsRUFBRyxrQkFBa0I7Q0FDL0MsQ0FBQztBQUVGLE1BQWEsb0JBQXFCLFNBQVEsMENBQWtCO0lBQ3hEO1FBQ0ksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFFLEdBQUc7UUFDdEIsNkZBQTZGO1FBQzdGLE9BQU8sR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDMUgsQ0FB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QUFXLEdBQVcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQsUUFBQSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzaWduLCBtZXJnZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICdiYWJlbC1jb3JlJztcbmltcG9ydCBFU05leHRUZXN0RmlsZUNvbXBpbGVyIGZyb20gJy4vY29tcGlsZXInO1xuaW1wb3J0IHsgVGVzdEZpbGVQYXJzZXJCYXNlIH0gZnJvbSAnLi4vLi4vdGVzdC1maWxlLXBhcnNlci1iYXNlJztcblxuY29uc3QgVE9LRU5fVFlQRSA9IHtcbiAgICBJZGVudGlmaWVyOiAgICAgICAgICAgICAgICdJZGVudGlmaWVyJyxcbiAgICBQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICBDYWxsRXhwcmVzc2lvbjogICAgICAgICAgICdDYWxsRXhwcmVzc2lvbicsXG4gICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiAnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJyxcbiAgICBUZW1wbGF0ZUxpdGVyYWw6ICAgICAgICAgICdUZW1wbGF0ZUxpdGVyYWwnLFxuICAgIFN0cmluZ0xpdGVyYWw6ICAgICAgICAgICAgJ1N0cmluZ0xpdGVyYWwnLFxuICAgIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiAgJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICBGdW5jdGlvbkV4cHJlc3Npb246ICAgICAgICdGdW5jdGlvbkV4cHJlc3Npb24nLFxuICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6ICAgICAgJ0V4cHJlc3Npb25TdGF0ZW1lbnQnLFxuICAgIFJldHVyblN0YXRlbWVudDogICAgICAgICAgJ1JldHVyblN0YXRlbWVudCcsXG4gICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogICAgICAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG4gICAgVmFyaWFibGVTdGF0ZW1lbnQ6ICAgICAgICAnVmFyaWFibGVTdGF0ZW1lbnQnLFxuICAgIFZhcmlhYmxlRGVjbGFyYXRpb246ICAgICAgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuICAgIE9iamVjdExpdGVyYWxFeHByZXNzaW9uOiAgJ09iamVjdEV4cHJlc3Npb24nXG59O1xuXG5leHBvcnQgY2xhc3MgRXNOZXh0VGVzdEZpbGVQYXJzZXIgZXh0ZW5kcyBUZXN0RmlsZVBhcnNlckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVE9LRU5fVFlQRSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRhZ1N0clZhbHVlIChleHApIHtcbiAgICAgICAgLy9OT1RFOiB3ZSBzZXQgPGNvbXB1dGVkIG5hbWU+IGlmIHRlbXBsYXRlIGxpdGVyYWwgaGFzIGF0IGxlYXN0IG9uZSBjb21wdXRlZCBzdWJzdHJpbmcgJHsuLi59XG4gICAgICAgIHJldHVybiBleHAuZXhwcmVzc2lvbnMubGVuZ3RoID8gRXNOZXh0VGVzdEZpbGVQYXJzZXIuZm9ybWF0Q29tcHV0ZWROYW1lKGV4cC5sb2Muc3RhcnQubGluZSkgOiBleHAucXVhc2lzWzBdLnZhbHVlLnJhdztcbiAgICB9XG5cbiAgICBpc0FzeW5jRm4gKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5hc3luYyB8fCB0b2tlbi5nZW5lcmF0b3I7XG4gICAgfVxuXG4gICAgZ2V0VG9rZW5UeXBlICh0b2tlbikge1xuICAgICAgICByZXR1cm4gdG9rZW4udHlwZTtcbiAgICB9XG5cbiAgICBnZXRSVmFsdWUgKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5kZWNsYXJhdGlvbnNbMF0uaW5pdDtcbiAgICB9XG5cbiAgICBnZXRTdHJpbmdWYWx1ZSAodG9rZW4pIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nVHlwZXMgPSBbdGhpcy50b2tlblR5cGUuU3RyaW5nTGl0ZXJhbCwgdGhpcy50b2tlblR5cGUuVGVtcGxhdGVMaXRlcmFsLCB0aGlzLnRva2VuVHlwZS5JZGVudGlmaWVyXTtcblxuICAgICAgICBpZiAoc3RyaW5nVHlwZXMuaW5kZXhPZih0b2tlbi50eXBlKSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Rm5BcmcodG9rZW4pO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldEZ1bmN0aW9uQm9keSAodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLmJvZHkgJiYgdG9rZW4uYm9keS5ib2R5ID8gdG9rZW4uYm9keS5ib2R5IDogW107XG4gICAgfVxuXG4gICAgZ2V0Q2FsbGVlVG9rZW4gKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5jYWxsZWU7XG4gICAgfVxuXG4gICAgZ2V0TWVtYmVyRm5OYW1lICh0b2tlbikge1xuICAgICAgICByZXR1cm4gdG9rZW4uY2FsbGVlLnByb3BlcnR5Lm5hbWU7XG4gICAgfVxuXG4gICAgZm9ybWF0Rm5EYXRhIChuYW1lLCB2YWx1ZSwgdG9rZW4sIG1ldGEgPSBbe31dKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmbk5hbWU6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogIHZhbHVlLFxuICAgICAgICAgICAgbG9jOiAgICB0b2tlbi5sb2MsXG4gICAgICAgICAgICBzdGFydDogIHRva2VuLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiAgICB0b2tlbi5lbmQsXG4gICAgICAgICAgICBtZXRhOiAgIG1lcmdlKHt9LCAuLi5tZXRhKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldEtleVZhbHVlIChwcm9wKSB7XG4gICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcHJvcDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiAgIGtleS5uYW1lIHx8IHRoaXMuZm9ybWF0Rm5Bcmcoa2V5KSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFN0cmluZ1ZhbHVlKHZhbHVlKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFuYWx5emVNZW1iZXJFeHAgKHRva2VuKSB7XG4gICAgICAgIGxldCBleHAgICAgICAgICA9IHRva2VuO1xuICAgICAgICBjb25zdCB0b2tlblR5cGUgPSB0aGlzLnRva2VuVHlwZTtcbiAgICAgICAgY29uc3QgY2FsbFN0YWNrID0gW2V4cF07XG5cbiAgICAgICAgd2hpbGUgKGV4cC50eXBlICE9PSB0b2tlblR5cGUuSWRlbnRpZmllcikge1xuICAgICAgICAgICAgaWYgKGV4cC50eXBlID09PSB0b2tlblR5cGUuQ2FsbEV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgZXhwID0gZXhwLmNhbGxlZTtcblxuICAgICAgICAgICAgZWxzZSBpZiAoZXhwLnR5cGUgPT09IHRva2VuVHlwZS5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgZXhwID0gZXhwLm9iamVjdDtcblxuICAgICAgICAgICAgZWxzZSBpZiAoZXhwLnR5cGUgPT09IHRva2VuVHlwZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgZXhwID0gZXhwLnRhZztcblxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZXhwLnR5cGUgIT09IHRva2VuVHlwZS5JZGVudGlmaWVyKVxuICAgICAgICAgICAgICAgIGNhbGxTdGFjay5wdXNoKGV4cCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNBcGlGbihleHAubmFtZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldE1ldGFJbmZvKGNhbGxTdGFjay5zbGljZSgpKTtcblxuICAgICAgICBsZXQgcGFyZW50RXhwID0gY2FsbFN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRFeHAudHlwZSA9PT0gdG9rZW5UeXBlLkNhbGxFeHByZXNzaW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Rm5EYXRhKGV4cC5uYW1lLCB0aGlzLmZvcm1hdEZuQXJnKHBhcmVudEV4cC5hcmd1bWVudHNbMF0pLCB0b2tlbiwgbWV0YSk7XG5cbiAgICAgICAgaWYgKHBhcmVudEV4cC50eXBlID09PSB0b2tlblR5cGUuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Rm5EYXRhKGV4cC5uYW1lLCBFc05leHRUZXN0RmlsZVBhcnNlci5nZXRUYWdTdHJWYWx1ZShwYXJlbnRFeHAucXVhc2kpLCB0b2tlbiwgbWV0YSk7XG5cbiAgICAgICAgaWYgKHBhcmVudEV4cC50eXBlID09PSB0b2tlblR5cGUuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB3aGlsZSAocGFyZW50RXhwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEV4cC50eXBlID09PSB0b2tlblR5cGUuQ2FsbEV4cHJlc3Npb24gJiYgcGFyZW50RXhwLmNhbGxlZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsZWVUeXBlICAgICA9IHBhcmVudEV4cC5jYWxsZWUudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGVlTWVtYmVyRm4gPSBwYXJlbnRFeHAuY2FsbGVlLnByb3BlcnR5ICYmIHBhcmVudEV4cC5jYWxsZWUucHJvcGVydHkubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0V4cERlZmluZVRhcmdldE5hbWUoY2FsbGVlVHlwZSwgY2FsbGVlTWVtYmVyRm4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Rm5EYXRhKGV4cC5uYW1lLCB0aGlzLmZvcm1hdEZuQXJnKHBhcmVudEV4cC5hcmd1bWVudHNbMF0pLCB0b2tlbiwgbWV0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEV4cC50eXBlID09PSB0b2tlblR5cGUuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uICYmIHBhcmVudEV4cC50YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnVHlwZSAgICAgPSBwYXJlbnRFeHAudGFnLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ01lbWJlckZuID0gcGFyZW50RXhwLnRhZy5wcm9wZXJ0eSAmJiBwYXJlbnRFeHAudGFnLnByb3BlcnR5Lm5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tFeHBEZWZpbmVUYXJnZXROYW1lKHRhZ1R5cGUsIHRhZ01lbWJlckZuKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZuRGF0YShleHAubmFtZSwgRXNOZXh0VGVzdEZpbGVQYXJzZXIuZ2V0VGFnU3RyVmFsdWUocGFyZW50RXhwLnF1YXNpKSwgdG9rZW4sIG1ldGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEV4cCA9IGNhbGxTdGFjay5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvcm1hdEZuQXJnIChhcmcpIHtcbiAgICAgICAgaWYgKGFyZy50eXBlID09PSB0aGlzLnRva2VuVHlwZS5JZGVudGlmaWVyKVxuICAgICAgICAgICAgcmV0dXJuIEVzTmV4dFRlc3RGaWxlUGFyc2VyLmZvcm1hdENvbXB1dGVkTmFtZShhcmcubG9jLnN0YXJ0LmxpbmUpO1xuXG4gICAgICAgIGlmIChhcmcudHlwZSA9PT0gdGhpcy50b2tlblR5cGUuVGVtcGxhdGVMaXRlcmFsKVxuICAgICAgICAgICAgcmV0dXJuIEVzTmV4dFRlc3RGaWxlUGFyc2VyLmdldFRhZ1N0clZhbHVlKGFyZyk7XG5cbiAgICAgICAgaWYgKGFyZy50eXBlID09PSB0aGlzLnRva2VuVHlwZS5TdHJpbmdMaXRlcmFsKVxuICAgICAgICAgICAgcmV0dXJuIGFyZy52YWx1ZTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRGbkNhbGwgKHRva2VuKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0FwaUZuKHRva2VuLmNhbGxlZS5uYW1lKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Rm5EYXRhKHRva2VuLmNhbGxlZS5uYW1lLCB0aGlzLmZvcm1hdEZuQXJnKHRva2VuLmFyZ3VtZW50c1swXSksIHRva2VuKTtcbiAgICB9XG5cbiAgICBnZXRUYWdnZWRUZW1wbGF0ZUV4cCAodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Rm5EYXRhKHRva2VuLnRhZy5uYW1lLCBFc05leHRUZXN0RmlsZVBhcnNlci5nZXRUYWdTdHJWYWx1ZSh0b2tlbi5xdWFzaSksIHRva2VuKTtcbiAgICB9XG5cbiAgICBhbmFseXplRm5DYWxsICh0b2tlbikge1xuICAgICAgICBjb25zdCB0b2tlblR5cGUgPSB0aGlzLnRva2VuVHlwZTtcblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gdG9rZW5UeXBlLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFuYWx5emVNZW1iZXJFeHAodG9rZW4pO1xuXG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSB0b2tlblR5cGUuQ2FsbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxlZVR5cGUgPSB0b2tlbi5jYWxsZWUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGNhbGxlZVR5cGUgPT09IHRva2VuVHlwZS5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24gfHwgY2FsbGVlVHlwZSA9PT0gdG9rZW5UeXBlLkNhbGxFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFuYWx5emVNZW1iZXJFeHAodG9rZW4pO1xuXG4gICAgICAgICAgICBpZiAoY2FsbGVlVHlwZSA9PT0gdG9rZW5UeXBlLkZ1bmN0aW9uRXhwcmVzc2lvbiB8fCBjYWxsZWVUeXBlID09PSB0b2tlblR5cGUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdFRlc3RDYWZlQ2FsbHModG9rZW4uY2FsbGVlLmJvZHkuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZuQ2FsbCh0b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gdG9rZW5UeXBlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKHRva2VuLnRhZy50eXBlID09PSB0b2tlblR5cGUuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFuYWx5emVNZW1iZXJFeHAodG9rZW4pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUYWdnZWRUZW1wbGF0ZUV4cCh0b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwYXJzZSAoY29kZSkge1xuICAgICAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBFU05leHRUZXN0RmlsZUNvbXBpbGVyLmdldEJhYmVsT3B0aW9ucyhudWxsLCBjb2RlKTtcblxuICAgICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmZpbGVuYW1lO1xuXG4gICAgICAgIGNvbnN0IG9wdHMgPSBhc3NpZ24oY29tcGlsZXJPcHRpb25zLCB7IGFzdDogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgYXN0ICA9IHRyYW5zZm9ybShjb2RlLCBvcHRzKS5hc3Q7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYW5hbHl6ZShhc3QucHJvZ3JhbS5ib2R5KTtcbiAgICB9XG59XG5cbmNvbnN0IHBhcnNlciA9IG5ldyBFc05leHRUZXN0RmlsZVBhcnNlcigpO1xuXG5leHBvcnQgY29uc3QgZ2V0VGVzdExpc3QgICAgICAgICA9IHBhcnNlci5nZXRUZXN0TGlzdC5iaW5kKHBhcnNlcik7XG5leHBvcnQgY29uc3QgZ2V0VGVzdExpc3RGcm9tQ29kZSA9IHBhcnNlci5nZXRUZXN0TGlzdEZyb21Db2RlLmJpbmQocGFyc2VyKTtcbiJdfQ==