@glimmer/compiler
Version:
166 lines (135 loc) • 16.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.APPEND_KEYWORDS = void 0;
var _syntax = require("@glimmer/syntax");
var _result = require("../../../shared/result");
var mir = _interopRequireWildcard(require("../../2-encoding/mir"));
var _expressions = require("../visitors/expressions");
var _impl = require("./impl");
var _callToAppend = require("./utils/call-to-append");
var _curry = require("./utils/curry");
var _dynamicVars = require("./utils/dynamic-vars");
var _hasBlock = require("./utils/has-block");
var _ifUnless = require("./utils/if-unless");
var _log = require("./utils/log");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
const APPEND_KEYWORDS = (0, _impl.keywords)('Append').kw('has-block', (0, _callToAppend.toAppend)((0, _hasBlock.hasBlockKeyword)('has-block'))).kw('has-block-params', (0, _callToAppend.toAppend)((0, _hasBlock.hasBlockKeyword)('has-block-params'))).kw('-get-dynamic-var', (0, _callToAppend.toAppend)(_dynamicVars.getDynamicVarKeyword)).kw('log', (0, _callToAppend.toAppend)(_log.logKeyword)).kw('if', (0, _callToAppend.toAppend)((0, _ifUnless.ifUnlessInlineKeyword)('if'))).kw('unless', (0, _callToAppend.toAppend)((0, _ifUnless.ifUnlessInlineKeyword)('unless'))).kw('yield', {
assert(node) {
let {
args
} = node;
if (args.named.isEmpty()) {
return (0, _result.Ok)({
target: _syntax.SourceSpan.synthetic('default').toSlice(),
positional: args.positional
});
} else {
let target = args.named.get('to');
if (args.named.size > 1 || target === null) {
return (0, _result.Err)((0, _syntax.generateSyntaxError)(`yield only takes a single named argument: 'to'`, args.named.loc));
}
if (_syntax.ASTv2.isLiteral(target, 'string')) {
return (0, _result.Ok)({
target: target.toSlice(),
positional: args.positional
});
} else {
return (0, _result.Err)((0, _syntax.generateSyntaxError)(`you can only yield to a literal string value`, target.loc));
}
}
},
translate({
node,
state
}, {
target,
positional
}) {
return _expressions.VISIT_EXPRS.Positional(positional, state).mapOk(positional => new mir.Yield({
loc: node.loc,
target,
to: state.scope.allocateBlock(target.chars),
positional
}));
}
}).kw('debugger', {
assert(node) {
let {
args
} = node;
let {
positional
} = args;
if (args.isEmpty()) {
return (0, _result.Ok)(undefined);
} else {
if (positional.isEmpty()) {
return (0, _result.Err)((0, _syntax.generateSyntaxError)(`debugger does not take any named arguments`, node.loc));
} else {
return (0, _result.Err)((0, _syntax.generateSyntaxError)(`debugger does not take any positional arguments`, node.loc));
}
}
},
translate({
node,
state: {
scope
}
}) {
scope.setHasEval();
return (0, _result.Ok)(new mir.Debugger({
loc: node.loc,
scope
}));
}
}).kw('component', {
assert: (0, _curry.assertCurryKeyword)(0
/* Component */
),
translate({
node,
state
}, {
definition,
args
}) {
let definitionResult = _expressions.VISIT_EXPRS.visit(definition, state);
let argsResult = _expressions.VISIT_EXPRS.Args(args, state);
return _result.Result.all(definitionResult, argsResult).mapOk(([definition, args]) => new mir.InvokeComponent({
loc: node.loc,
definition,
args,
blocks: null
}));
}
}).kw('helper', {
assert: (0, _curry.assertCurryKeyword)(1
/* Helper */
),
translate({
node,
state
}, {
definition,
args
}) {
let definitionResult = _expressions.VISIT_EXPRS.visit(definition, state);
let argsResult = _expressions.VISIT_EXPRS.Args(args, state);
return _result.Result.all(definitionResult, argsResult).mapOk(([definition, args]) => {
let text = new mir.CallExpression({
callee: definition,
args,
loc: node.loc
});
return new mir.AppendTextNode({
loc: node.loc,
text
});
});
}
});
exports.APPEND_KEYWORDS = APPEND_KEYWORDS;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2tleXdvcmRzL2FwcGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVPLE1BQU0sZUFBZSxHQUFHLG9CQUFBLFFBQUEsRUFBQSxFQUFBLENBQUEsV0FBQSxFQUNaLDRCQUFTLCtCQURHLFdBQ0gsQ0FBVCxDQURZLEVBQUEsRUFBQSxDQUFBLGtCQUFBLEVBRUwsNEJBQVMsK0JBRkosa0JBRUksQ0FBVCxDQUZLLEVBQUEsRUFBQSxDQUFBLGtCQUFBLEVBR0wsNEJBSEssaUNBR0wsQ0FISyxFQUFBLEVBQUEsQ0FBQSxLQUFBLEVBSWxCLDRCQUprQixlQUlsQixDQUprQixFQUFBLEVBQUEsQ0FBQSxJQUFBLEVBS25CLDRCQUFTLHFDQUxVLElBS1YsQ0FBVCxDQUxtQixFQUFBLEVBQUEsQ0FBQSxRQUFBLEVBTWYsNEJBQVMscUNBTk0sUUFNTixDQUFULENBTmUsRUFBQSxFQUFBLENBQUEsT0FBQSxFQU9oQjtBQUNYLEVBQUEsTUFBTSxDQUFBLElBQUEsRUFDcUI7QUFLekIsUUFBSTtBQUFFLE1BQUE7QUFBRixRQUFKLElBQUE7O0FBRUEsUUFBSSxJQUFJLENBQUosS0FBQSxDQUFKLE9BQUksRUFBSixFQUEwQjtBQUN4QixhQUFPLGdCQUFHO0FBQ1IsUUFBQSxNQUFNLEVBQUUsbUJBQUEsU0FBQSxDQUFBLFNBQUEsRUFEQSxPQUNBLEVBREE7QUFFUixRQUFBLFVBQVUsRUFBRSxJQUFJLENBQUM7QUFGVCxPQUFILENBQVA7QUFERixLQUFBLE1BS087QUFDTCxVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUosS0FBQSxDQUFBLEdBQUEsQ0FBYixJQUFhLENBQWI7O0FBRUEsVUFBSSxJQUFJ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QUEsQ0FBd0I7QUFDdEIsTUFBQSxHQUFHLEVBQUUsSUFBSSxDQURhLEdBQUE7QUFBQSxNQUFBLFVBQUE7QUFBQSxNQUFBLElBQUE7QUFJdEIsTUFBQSxNQUFNLEVBQUU7QUFKYyxLQUF4QixDQUZHLENBQVA7QUFTRDs7QUFuQmMsQ0ExRlksRUFBQSxFQUFBLENBQUEsUUFBQSxFQStHZjtBQUNaLEVBQUEsTUFBTSxFQUFFLCtCQUFrQjtBQUFBO0FBQWxCLEdBREk7O0FBR1osRUFBQSxTQUFTLENBQ1A7QUFBQSxJQUFBLElBQUE7QUFBUSxJQUFBO0FBQVIsR0FETyxFQUVQO0FBQUEsSUFBQSxVQUFBO0FBQWMsSUFBQTtBQUFkLEdBRk8sRUFFcUU7QUFFNUUsUUFBSSxnQkFBZ0IsR0FBRyx5QkFBQSxLQUFBLENBQUEsVUFBQSxFQUF2QixLQUF1QixDQUF2Qjs7QUFDQSxRQUFJLFVBQVUsR0FBRyx5QkFBQSxJQUFBLENBQUEsSUFBQSxFQUFqQixLQUFpQixDQUFqQjs7QUFFQSxXQUFPLGVBQUEsR0FBQSxDQUFBLGdCQUFBLEVBQUEsVUFBQSxFQUFBLEtBQUEsQ0FBK0MsQ0FBQyxDQUFBLFVBQUEsRUFBRCxJQUFDLENBQUQsS0FBdUI7QUFDM0UsVUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQVAsY0FBQSxDQUF1QjtBQUFFLFFBQUEsTUFBTSxFQUFSLFVBQUE7QUFBQSxRQUFBLElBQUE7QUFBNEIsUUFBQSxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQXRDLE9BQXZCLENBQVg7QUFFQSxhQUFPLElBQUksR0FBRyxDQUFQLGNBQUEsQ0FBdUI7QUFDNUIsUUFBQSxHQUFHLEVBQUUsSUFBSSxDQURtQixHQUFBO0FBRTVCLFFBQUE7QUFGNEIsT0FBdkIsQ0FBUDtBQUhGLEtBQU8sQ0FBUDtBQVFEOztBQWxCVyxDQS9HZSxDQUF4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJpZWRUeXBlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBU1R2MiwgZ2VuZXJhdGVTeW50YXhFcnJvciwgU291cmNlU2xpY2UsIFNvdXJjZVNwYW4gfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuXG5pbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcmVzdWx0JztcbmltcG9ydCAqIGFzIG1pciBmcm9tICcuLi8uLi8yLWVuY29kaW5nL21pcic7XG5pbXBvcnQgeyBOb3JtYWxpemF0aW9uU3RhdGUgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB7IFZJU0lUX0VYUFJTIH0gZnJvbSAnLi4vdmlzaXRvcnMvZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tICcuL2ltcGwnO1xuaW1wb3J0IHsgdG9BcHBlbmQgfSBmcm9tICcuL3V0aWxzL2NhbGwtdG8tYXBwZW5kJztcbmltcG9ydCB7IGFzc2VydEN1cnJ5S2V5d29yZCB9IGZyb20gJy4vdXRpbHMvY3VycnknO1xuaW1wb3J0IHsgZ2V0RHluYW1pY1ZhcktleXdvcmQgfSBmcm9tICcuL3V0aWxzL2R5bmFtaWMtdmFycyc7XG5pbXBvcnQgeyBoYXNCbG9ja0tleXdvcmQgfSBmcm9tICcuL3V0aWxzL2hhcy1ibG9jayc7XG5pbXBvcnQgeyBpZlVubGVzc0lubGluZUtleXdvcmQgfSBmcm9tICcuL3V0aWxzL2lmLXVubGVzcyc7XG5pbXBvcnQgeyBsb2dLZXl3b3JkIH0gZnJvbSAnLi91dGlscy9sb2cnO1xuXG5leHBvcnQgY29uc3QgQVBQRU5EX0tFWVdPUkRTID0ga2V5d29yZHMoJ0FwcGVuZCcpXG4gIC5rdygnaGFzLWJsb2NrJywgdG9BcHBlbmQoaGFzQmxvY2tLZXl3b3JkKCdoYXMtYmxvY2snKSkpXG4gIC5rdygnaGFzLWJsb2NrLXBhcmFtcycsIHRvQXBwZW5kKGhhc0Jsb2NrS2V5d29yZCgnaGFzLWJsb2NrLXBhcmFtcycpKSlcbiAgLmt3KCctZ2V0LWR5bmFtaWMtdmFyJywgdG9BcHBlbmQoZ2V0RHluYW1pY1ZhcktleXdvcmQpKVxuICAua3coJ2xvZycsIHRvQXBwZW5kKGxvZ0tleXdvcmQpKVxuICAua3coJ2lmJywgdG9BcHBlbmQoaWZVbmxlc3NJbmxpbmVLZXl3b3JkKCdpZicpKSlcbiAgLmt3KCd1bmxlc3MnLCB0b0FwcGVuZChpZlVubGVzc0lubGluZUtleXdvcmQoJ3VubGVzcycpKSlcbiAgLmt3KCd5aWVsZCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5BcHBlbmRDb250ZW50XG4gICAgKTogUmVzdWx0PHtcbiAgICAgIHRhcmdldDogU291cmNlU2xpY2U7XG4gICAgICBwb3NpdGlvbmFsOiBBU1R2Mi5Qb3NpdGlvbmFsQXJndW1lbnRzO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmIChhcmdzLm5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gT2soe1xuICAgICAgICAgIHRhcmdldDogU291cmNlU3Bhbi5zeW50aGV0aWMoJ2RlZmF1bHQnKS50b1NsaWNlKCksXG4gICAgICAgICAgcG9zaXRpb25hbDogYXJncy5wb3NpdGlvbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0YXJnZXQgPSBhcmdzLm5hbWVkLmdldCgndG8nKTtcblxuICAgICAgICBpZiAoYXJncy5uYW1lZC5zaXplID4gMSB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihgeWllbGQgb25seSB0YWtlcyBhIHNpbmdsZSBuYW1lZCBhcmd1bWVudDogJ3RvJ2AsIGFyZ3MubmFtZWQubG9jKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQVNUdjIuaXNMaXRlcmFsKHRhcmdldCwgJ3N0cmluZycpKSB7XG4gICAgICAgICAgcmV0dXJuIE9rKHsgdGFyZ2V0OiB0YXJnZXQudG9TbGljZSgpLCBwb3NpdGlvbmFsOiBhcmdzLnBvc2l0aW9uYWwgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoYHlvdSBjYW4gb25seSB5aWVsZCB0byBhIGxpdGVyYWwgc3RyaW5nIHZhbHVlYCwgdGFyZ2V0LmxvYylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5BcHBlbmRDb250ZW50OyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgIH06IHtcbiAgICAgICAgdGFyZ2V0OiBTb3VyY2VTbGljZTtcbiAgICAgICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICAgIH1cbiAgICApOiBSZXN1bHQ8bWlyLlN0YXRlbWVudD4ge1xuICAgICAgcmV0dXJuIFZJU0lUX0VYUFJTLlBvc2l0aW9uYWwocG9zaXRpb25hbCwgc3RhdGUpLm1hcE9rKFxuICAgICAgICAocG9zaXRpb25hbCkgPT5cbiAgICAgICAgICBuZXcgbWlyLllpZWxkKHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICB0bzogc3RhdGUuc2NvcGUuYWxsb2NhdGVCbG9jayh0YXJnZXQuY2hhcnMpLFxuICAgICAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KVxuICAua3coJ2RlYnVnZ2VyJywge1xuICAgIGFzc2VydChub2RlOiBBU1R2Mi5BcHBlbmRDb250ZW50KTogUmVzdWx0PHZvaWQ+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG4gICAgICBsZXQgeyBwb3NpdGlvbmFsIH0gPSBhcmdzO1xuXG4gICAgICBpZiAoYXJncy5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIE9rKHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocG9zaXRpb25hbC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICByZXR1cm4gRXJyKGdlbmVyYXRlU3ludGF4RXJyb3IoYGRlYnVnZ2VyIGRvZXMgbm90IHRha2UgYW55IG5hbWVkIGFyZ3VtZW50c2AsIG5vZGUubG9jKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoYGRlYnVnZ2VyIGRvZXMgbm90IHRha2UgYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzYCwgbm9kZS5sb2MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoe1xuICAgICAgbm9kZSxcbiAgICAgIHN0YXRlOiB7IHNjb3BlIH0sXG4gICAgfToge1xuICAgICAgbm9kZTogQVNUdjIuQXBwZW5kQ29udGVudDtcbiAgICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGU7XG4gICAgfSk6IFJlc3VsdDxtaXIuU3RhdGVtZW50PiB7XG4gICAgICBzY29wZS5zZXRIYXNFdmFsKCk7XG4gICAgICByZXR1cm4gT2sobmV3IG1pci5EZWJ1Z2dlcih7IGxvYzogbm9kZS5sb2MsIHNjb3BlIH0pKTtcbiAgICB9LFxuICB9KVxuICAua3coJ2NvbXBvbmVudCcsIHtcbiAgICBhc3NlcnQ6IGFzc2VydEN1cnJ5S2V5d29yZChDdXJyaWVkVHlwZS5Db21wb25lbnQpLFxuXG4gICAgdHJhbnNsYXRlKFxuICAgICAgeyBub2RlLCBzdGF0ZSB9OiB7IG5vZGU6IEFTVHYyLkFwcGVuZENvbnRlbnQ7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgZGVmaW5pdGlvbiwgYXJncyB9OiB7IGRlZmluaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyBhcmdzOiBBU1R2Mi5BcmdzIH1cbiAgICApOiBSZXN1bHQ8bWlyLkludm9rZUNvbXBvbmVudD4ge1xuICAgICAgbGV0IGRlZmluaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChkZWZpbml0aW9uLCBzdGF0ZSk7XG4gICAgICBsZXQgYXJnc1Jlc3VsdCA9IFZJU0lUX0VYUFJTLkFyZ3MoYXJncywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChkZWZpbml0aW9uUmVzdWx0LCBhcmdzUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFtkZWZpbml0aW9uLCBhcmdzXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkludm9rZUNvbXBvbmVudCh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBibG9ja3M6IG51bGwsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdoZWxwZXInLCB7XG4gICAgYXNzZXJ0OiBhc3NlcnRDdXJyeUtleXdvcmQoQ3VycmllZFR5cGUuSGVscGVyKSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5BcHBlbmRDb250ZW50OyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAgICB7IGRlZmluaXRpb24sIGFyZ3MgfTogeyBkZWZpbml0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTsgYXJnczogQVNUdjIuQXJncyB9XG4gICAgKTogUmVzdWx0PG1pci5BcHBlbmRUZXh0Tm9kZT4ge1xuICAgICAgbGV0IGRlZmluaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChkZWZpbml0aW9uLCBzdGF0ZSk7XG4gICAgICBsZXQgYXJnc1Jlc3VsdCA9IFZJU0lUX0VYUFJTLkFyZ3MoYXJncywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChkZWZpbml0aW9uUmVzdWx0LCBhcmdzUmVzdWx0KS5tYXBPaygoW2RlZmluaXRpb24sIGFyZ3NdKSA9PiB7XG4gICAgICAgIGxldCB0ZXh0ID0gbmV3IG1pci5DYWxsRXhwcmVzc2lvbih7IGNhbGxlZTogZGVmaW5pdGlvbiwgYXJncywgbG9jOiBub2RlLmxvYyB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IG1pci5BcHBlbmRUZXh0Tm9kZSh7XG4gICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==