UNPKG

@glimmer/application-test-helpers

Version:

Test helpers for developing @glimmer/component and @glimmer/application

387 lines (318 loc) 33.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildApp = exports.AppBuilder = exports.TestApplication = undefined; var _resolver = require("@glimmer/resolver"); var _resolver2 = _interopRequireDefault(_resolver); var _defaultResolverConfiguration = require("./default-resolver-configuration"); var _defaultResolverConfiguration2 = _interopRequireDefault(_defaultResolverConfiguration); var _compiler = require("./compiler"); var _application = require("@glimmer/application"); var _application2 = _interopRequireDefault(_application); var _util = require("@glimmer/util"); var _bundleCompiler = require("@glimmer/bundle-compiler"); var _opcodeCompiler = require("@glimmer/opcode-compiler"); var _ssr = require("@glimmer/ssr"); var _didRender = require("./did-render"); var _didRender2 = _interopRequireDefault(_didRender); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _defaults(subClass, superClass); } var TestApplication = /*#__PURE__*/ exports.TestApplication = function (_Application) { _inheritsLoose(TestApplication, _Application); function TestApplication() { return _Application.apply(this, arguments) || this; } return TestApplication; }(_application2.default); function locatorFor(module, name) { return { kind: 'template', module: module, name: name, meta: { module: module, name: name } }; } var AppBuilder = /*#__PURE__*/ exports.AppBuilder = function () { function AppBuilder(name, options) { this.modules = {}; this.templates = {}; this.rootName = name; this.options = options; this.template('Main', '<div />'); this.helper('action', _application.buildAction, true); } var _proto = AppBuilder.prototype; _proto.template = function template(name, _template) { (0, _util.assert)(name.charAt(0) === name.charAt(0).toUpperCase(), 'template names must start with a capital letter'); var specifier = "template:/" + this.rootName + "/components/" + name; this.modules[specifier] = (0, _compiler.precompile)(_template, { meta: { specifier: specifier } }); this.templates[specifier] = _template; return this; }; _proto.component = function component(name, componentFactory) { var specifier = "component:/" + this.rootName + "/components/" + name; this.modules[specifier] = componentFactory; return this; }; _proto.helper = function helper(name, helperFunc, isFactory) { if (isFactory === void 0) { isFactory = false; } var specifier = "helper:/" + this.rootName + "/components/" + name; helperFunc.isFactory = isFactory; this.modules[specifier] = helperFunc; return this; }; _proto.buildResolver = function buildResolver() { var resolverConfiguration = this.options.resolverConfiguration || _defaultResolverConfiguration2.default; resolverConfiguration.app = resolverConfiguration.app || { name: this.rootName, rootName: this.rootName }; var registry = new _resolver.BasicModuleRegistry(this.modules); return new _resolver2.default(resolverConfiguration, registry); }; _proto.buildRuntimeCompilerLoader = function buildRuntimeCompilerLoader() { return new _application.RuntimeCompilerLoader(); }; _proto.buildBytecodeLoader = function buildBytecodeLoader(resolver) { var _this = this; var delegate = new CompilerDelegate(resolver); var compiler = new _bundleCompiler.BundleCompiler(delegate); var mainLocator = locatorFor('template:mainTemplate', 'default'); mainLocator.meta.module = 'template:mainTemplate'; var block = JSON.parse(_application.mainTemplate.block); var compilableTemplate = (0, _opcodeCompiler.compilable)({ block: block, referrer: mainLocator.meta }); compiler.addCompilableTemplate(mainLocator, compilableTemplate); for (var module in this.templates) { compiler.addTemplateSource(locatorFor(module, 'default'), this.templates[module]); } var _compiler$compile = compiler.compile(), heap = _compiler$compile.heap, pool = _compiler$compile.pool, table = _compiler$compile.table; var resolverTable = []; var meta = {}; table.vmHandleByModuleLocator.forEach(function (vmHandle, locator) { var handle = table.byModuleLocator.get(locator); var template = compiler.getTemplate(locator); meta[locator.module] = { v: vmHandle, h: handle, sT: template.symbolTable }; }); table.byHandle.forEach(function (locator, handle) { var module = locator.module.replace('template:/', 'component:/'); if (_this.modules[module]) { if (module.indexOf('helper:') === 0) { var moduleType = _this.modules[module].isFactory ? 0 /* HELPER_FACTORY */ : 1 /* HELPER */ ; resolverTable[handle] = [moduleType, _this.modules[module]]; } else { resolverTable[handle] = _this.modules[module]; } } }); var bytecode = heap.buffer; var data = { prefix: '', mainEntry: table.vmHandleByModuleLocator.get(mainLocator), pool: pool, table: resolverTable, meta: meta, heap: { table: heap.table, handle: heap.handle } }; return new _application.BytecodeLoader({ bytecode: bytecode, data: data }); }; _proto.buildLoader = function buildLoader(resolver) { switch (this.options.loader) { case 'runtime-compiler': return this.buildRuntimeCompilerLoader(); case 'bytecode': return this.buildBytecodeLoader(resolver); default: throw new Error("Unrecognized loader " + this.options.loader); } }; _proto.renderToString = function renderToString(componentName, data, options) { var resolver = this.buildResolver(); var loader = this.buildLoader(resolver); return _ssr.SSRApplication.renderToString(componentName, data, Object.assign({ rootName: this.rootName, resolver: resolver, loader: loader, renderer: new _application.SyncRenderer() }, options)); }; _proto.boot = /*#__PURE__*/ function () { var _boot = _asyncToGenerator(function* () { var resolver = this.buildResolver(); var loader = this.buildLoader(resolver); var doc = this.options.document || document; var element = doc.body; var builder = new _application.DOMBuilder({ element: element }); var renderer = new _application.SyncRenderer(); var app = new this.options.ApplicationClass({ resolver: resolver, builder: builder, loader: loader, renderer: renderer, rootName: this.rootName, document: this.options.document }); var rootElement = doc.createElement('div'); app.rootElement = rootElement; app.renderComponent('Main', rootElement); app.boot(); yield (0, _didRender2.default)(app); return app; }); function boot() { return _boot.apply(this, arguments); } return boot; }(); return AppBuilder; }(); var CAPABILITIES = { createInstance: true, dynamicLayout: false, dynamicTag: false, wrapped: false, prepareArgs: false, createArgs: true, attributeHook: false, elementHook: false, updateHook: true, createCaller: false, dynamicScope: true }; var CompilerDelegate = /*#__PURE__*/ function () { function CompilerDelegate(resolver) { this.resolver = resolver; } var _proto2 = CompilerDelegate.prototype; _proto2.hasComponentInScope = function hasComponentInScope(name, referrer) { return !!this.resolver.identify("template:" + name, referrer.module); }; _proto2.resolveComponent = function resolveComponent(name, referrer) { var resolved = this.resolver.identify("template:" + name, referrer.module); return { module: resolved, name: 'default' }; }; _proto2.getComponentCapabilities = function getComponentCapabilities() { return CAPABILITIES; }; _proto2.hasHelperInScope = function hasHelperInScope(helperName, referrer) { return !!this.resolver.identify("helper:" + helperName, referrer.module); }; _proto2.resolveHelper = function resolveHelper(helperName, referrer) { var resolved = this.resolver.identify("helper:" + helperName, referrer.module); return { module: resolved, name: 'default' }; }; _proto2.hasPartialInScope = function hasPartialInScope(partialName, referrer) { throw new Error('Method not implemented.'); }; _proto2.resolvePartial = function resolvePartial(partialName, referrer) { throw new Error('Method not implemented.'); }; _proto2.hasModifierInScope = function hasModifierInScope(modifierName, referrer) { throw new Error('Method not implemented.'); }; _proto2.resolveModifier = function resolveModifier(modifierName, referrer) { throw new Error('Method not implemented.'); }; return CompilerDelegate; }(); function buildApp(options) { if (options === void 0) { options = {}; } options.appName = options.appName || 'test-app'; options.loader = options.loader || 'runtime-compiler'; options.ApplicationClass = options.ApplicationClass || TestApplication; return new AppBuilder(options.appName, options); } exports.buildApp = buildApp; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2FwcGxpY2F0aW9uLXRlc3QtaGVscGVycy9zcmMvYXBwLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBRUE7Ozs7QUFDQTs7QUFDQTs7OztBQVVBOztBQUNBOztBQUVBOztBQUdBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYUEsSUFBYSxlQUFiO0FBQUE7QUFBQSxRQUFhLGVBQWIsR0FBQSxVQUFBLFlBQUEsRUFBQTtBQUFBLEVBQUEsY0FBQSxDQUFBLGVBQUEsRUFBQSxZQUFBLENBQUE7O0FBQUEsV0FBQSxlQUFBLEdBQUE7QUFBQSxXQUFBLFlBQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxFQUFBLFNBQUEsS0FBQSxJQUFBO0FBQUE7O0FBQUEsU0FBQSxlQUFBO0FBQUEsQ0FBQSxDQUFBLHFCQUFBLENBQUE7O0FBcUJBLFNBQUEsVUFBQSxDQUFBLE1BQUEsRUFBQSxJQUFBLEVBQWdEO0FBQzlDLFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxVQUFBO0FBRUwsSUFBQSxNQUFNLEVBRkQsTUFBQTtBQUdMLElBQUEsSUFBSSxFQUhDLElBQUE7QUFJTCxJQUFBLElBQUksRUFBRTtBQUNKLE1BQUEsTUFBTSxFQURGLE1BQUE7QUFFSixNQUFBLElBQUksRUFBSjtBQUZJO0FBSkQsR0FBUDtBQVNEOztBQUVELElBQWEsVUFBYjtBQUFBO0FBQUEsUUFBYSxVQUFiLEdBQUEsWUFBQTtBQU1FLFdBQUEsVUFBQSxDQUFBLElBQUEsRUFBQSxPQUFBLEVBQXVEO0FBSnZELFNBQUEsT0FBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLFNBQUEsR0FBQSxFQUFBO0FBSUUsU0FBQSxRQUFBLEdBQUEsSUFBQTtBQUNBLFNBQUEsT0FBQSxHQUFBLE9BQUE7QUFDQSxTQUFBLFFBQUEsQ0FBQSxNQUFBLEVB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QUFBLFFBQUEsRUFBOEQ7QUFDNUQsVUFBTSxJQUFBLEtBQUEsQ0FBTix5QkFBTSxDQUFOOzs7VUFHRixjLEdBQUEsU0FBQSxjQUFBLENBQUEsV0FBQSxFQUFBLFFBQUEsRUFBMkQ7QUFDekQsVUFBTSxJQUFBLEtBQUEsQ0FBTix5QkFBTSxDQUFOOzs7VUFHRixrQixHQUFBLFNBQUEsa0JBQUEsQ0FBQSxZQUFBLEVBQUEsUUFBQSxFQUFnRTtBQUM5RCxVQUFNLElBQUEsS0FBQSxDQUFOLHlCQUFNLENBQU47OztVQUdGLGUsR0FBQSxTQUFBLGVBQUEsQ0FBQSxZQUFBLEVBQUEsUUFBQSxFQUE2RDtBQUMzRCxVQUFNLElBQUEsS0FBQSxDQUFOLHlCQUFNLENBQU47Ozs7OztBQUlKLFNBQUEsUUFBQSxDQUFBLE9BQUEsRUFBK0U7QUFBQSxNQUFsQyxPQUFrQyxLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQWxDLElBQUEsT0FBa0MsR0FBRixFQUFoQztBQUFrQzs7QUFDN0UsRUFBQSxPQUFPLENBQVAsT0FBQSxHQUFrQixPQUFPLENBQVAsT0FBQSxJQUFsQixVQUFBO0FBQ0EsRUFBQSxPQUFPLENBQVAsTUFBQSxHQUFpQixPQUFPLENBQVAsTUFBQSxJQUFqQixrQkFBQTtBQUNBLEVBQUEsT0FBTyxDQUFQLGdCQUFBLEdBQ0UsT0FBTyxDQUFQLGdCQUFBLElBREYsZUFBQTtBQUdBLFNBQU8sSUFBQSxVQUFBLENBQWUsT0FBTyxDQUF0QixPQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0Q7O1FBRUQsUSxHQUFBLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVzb2x2ZXIsIHsgQmFzaWNNb2R1bGVSZWdpc3RyeSwgUmVzb2x2ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnQGdsaW1tZXIvcmVzb2x2ZXInO1xuaW1wb3J0IHsgRGljdCwgTW9kdWxlTG9jYXRvciwgVGVtcGxhdGVMb2NhdG9yLCBDb21wb25lbnRDYXBhYmlsaXRpZXMgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCBkZWZhdWx0UmVzb2x2ZXJDb25maWd1cmF0aW9uIGZyb20gJy4vZGVmYXVsdC1yZXNvbHZlci1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IHByZWNvbXBpbGUgfSBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCBBcHBsaWNhdGlvbiwge1xuICBBcHBsaWNhdGlvbkNvbnN0cnVjdG9yLFxuICBCeXRlY29kZUxvYWRlcixcbiAgRE9NQnVpbGRlcixcbiAgTG9hZGVyLFxuICBSdW50aW1lQ29tcGlsZXJMb2FkZXIsXG4gIFN5bmNSZW5kZXJlcixcbiAgTW9kdWxlVHlwZXMsXG4gIElOVEVSTkFMX0RZTkFNSUNfU0NPUEVcbn0gZnJvbSAnQGdsaW1tZXIvYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBCdW5kbGVDb21waWxlciwgQ29tcGlsZXJEZWxlZ2F0ZSBhcyBJQ29tcGlsZXJEZWxlZ2F0ZSB9IGZyb20gJ0BnbGltbWVyL2J1bmRsZS1jb21waWxlcic7XG5pbXBvcnQgeyBidWlsZEFjdGlvbiwgbWFpblRlbXBsYXRlLCBSZW5kZXJlciwgQnl0ZWNvZGVNZXRhZGF0YSB9IGZyb20gJ0BnbGltbWVyL2FwcGxpY2F0aW9uJztcbmltcG9ydCB7IGNvbXBpbGFibGUgfSBmcm9tICdAZ2xpbW1lci9vcGNvZGUtY29tcGlsZXInO1xuaW1wb3J0IHsgU2ltcGxlRG9jdW1lbnQgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuaW1wb3J0IEhUTUxTZXJpYWxpemVyIGZyb20gJ0BzaW1wbGUtZG9tL3NlcmlhbGl6ZXInO1xuaW1wb3J0IHsgU1NSQXBwbGljYXRpb24gfSBmcm9tICdAZ2xpbW1lci9zc3InO1xuXG5pbXBvcnQgZGlkUmVuZGVyIGZyb20gJy4vZGlkLXJlbmRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwQnVpbGRlck9wdGlvbnM8VD4ge1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsb2FkZXI/OiBzdHJpbmc7XG4gIEFwcGxpY2F0aW9uQ2xhc3M/OiBBcHBsaWNhdGlvbkNvbnN0cnVjdG9yPFQ+O1xuICBDb21wb25lbnRNYW5hZ2VyPzogYW55OyAvLyBUT0RPIC0gdHlwaW5nXG4gIHJlc29sdmVyQ29uZmlndXJhdGlvbj86IFJlc29sdmVyQ29uZmlndXJhdGlvbjtcbiAgZG9jdW1lbnQ/OiBTaW1wbGVEb2N1bWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRGYWN0b3J5IHt9XG5cbmV4cG9ydCBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7XG4gIHJvb3RFbGVtZW50OiBFbGVtZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcEJ1aWxkZXJUZW1wbGF0ZU1ldGEge1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEhlbHBlckZ1bmN0aW9uIGV4dGVuZHMgRnVuY3Rpb24ge1xuICBpc0ZhY3Rvcnk/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGVzdFNTUkFwcGxpY2F0aW9uT3B0aW9ucyB7XG4gIHJvb3ROYW1lPzogc3RyaW5nO1xuICByZXNvbHZlcj86IFJlc29sdmVyO1xuICBsb2FkZXI/OiBMb2FkZXI7XG4gIHJlbmRlcmVyPzogUmVuZGVyZXI7XG4gIHNlcmlhbGl6ZXI/OiBIVE1MU2VyaWFsaXplcjtcbiAgW0lOVEVSTkFMX0RZTkFNSUNfU0NPUEVdPzogRGljdDx1bmtub3duPjtcbn1cblxuZnVuY3Rpb24gbG9jYXRvckZvcihtb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogVGVtcGxhdGVMb2NhdG9yPE1vZHVsZUxvY2F0b3I+IHtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiAndGVtcGxhdGUnLFxuICAgIG1vZHVsZSxcbiAgICBuYW1lLFxuICAgIG1ldGE6IHtcbiAgICAgIG1vZHVsZSxcbiAgICAgIG5hbWUsXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcEJ1aWxkZXI8VCBleHRlbmRzIFRlc3RBcHBsaWNhdGlvbj4ge1xuICByb290TmFtZTogc3RyaW5nO1xuICBtb2R1bGVzOiBEaWN0PHVua25vd24+ID0ge307XG4gIHRlbXBsYXRlczogRGljdDxzdHJpbmc+ID0ge307XG4gIG9wdGlvbnM6IEFwcEJ1aWxkZXJPcHRpb25zPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgb3B0aW9uczogQXBwQnVpbGRlck9wdGlvbnM8VD4pIHtcbiAgICB0aGlzLnJvb3ROYW1lID0gbmFtZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVtcGxhdGUoJ01haW4nLCAnPGRpdiAvPicpO1xuICAgIHRoaXMuaGVscGVyKCdhY3Rpb24nLCBidWlsZEFjdGlvbiwgdHJ1ZSk7XG4gIH1cblxuICB0ZW1wbGF0ZShuYW1lOiBzdHJpbmcsIHRlbXBsYXRlOiBzdHJpbmcpIHtcbiAgICBhc3NlcnQoXG4gICAgICBuYW1lLmNoYXJBdCgwKSA9PT0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSxcbiAgICAgICd0ZW1wbGF0ZSBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlcidcbiAgICApO1xuXG4gICAgbGV0IHNwZWNpZmllciA9IGB0ZW1wbGF0ZTovJHt0aGlzLnJvb3ROYW1lfS9jb21wb25lbnRzLyR7bmFtZX1gO1xuICAgIHRoaXMubW9kdWxlc1tzcGVjaWZpZXJdID0gcHJlY29tcGlsZSh0ZW1wbGF0ZSwgeyBtZXRhOiB7IHNwZWNpZmllciB9IH0pO1xuICAgIHRoaXMudGVtcGxhdGVzW3NwZWNpZmllcl0gPSB0ZW1wbGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbXBvbmVudChuYW1lOiBzdHJpbmcsIGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3RvcnkpIHtcbiAgICBsZXQgc3BlY2lmaWVyID0gYGNvbXBvbmVudDovJHt0aGlzLnJvb3ROYW1lfS9jb21wb25lbnRzLyR7bmFtZX1gO1xuICAgIHRoaXMubW9kdWxlc1tzcGVjaWZpZXJdID0gY29tcG9uZW50RmFjdG9yeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGhlbHBlcihuYW1lOiBzdHJpbmcsIGhlbHBlckZ1bmM6IEhlbHBlckZ1bmN0aW9uLCBpc0ZhY3RvcnkgPSBmYWxzZSkge1xuICAgIGxldCBzcGVjaWZpZXIgPSBgaGVscGVyOi8ke3RoaXMucm9vdE5hbWV9L2NvbXBvbmVudHMvJHtuYW1lfWA7XG4gICAgaGVscGVyRnVuYy5pc0ZhY3RvcnkgPSBpc0ZhY3Rvcnk7XG4gICAgdGhpcy5tb2R1bGVzW3NwZWNpZmllcl0gPSBoZWxwZXJGdW5jO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVzb2x2ZXIoKTogUmVzb2x2ZXIge1xuICAgIGxldCByZXNvbHZlckNvbmZpZ3VyYXRpb24gPSB0aGlzLm9wdGlvbnMucmVzb2x2ZXJDb25maWd1cmF0aW9uIHx8IGRlZmF1bHRSZXNvbHZlckNvbmZpZ3VyYXRpb247XG4gICAgcmVzb2x2ZXJDb25maWd1cmF0aW9uLmFwcCA9IHJlc29sdmVyQ29uZmlndXJhdGlvbi5hcHAgfHwge1xuICAgICAgbmFtZTogdGhpcy5yb290TmFtZSxcbiAgICAgIHJvb3ROYW1lOiB0aGlzLnJvb3ROYW1lLFxuICAgIH07XG5cbiAgICBsZXQgcmVnaXN0cnkgPSBuZXcgQmFzaWNNb2R1bGVSZWdpc3RyeSh0aGlzLm1vZHVsZXMpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZXIocmVzb2x2ZXJDb25maWd1cmF0aW9uLCByZWdpc3RyeSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSdW50aW1lQ29tcGlsZXJMb2FkZXIoKTogTG9hZGVyIHtcbiAgICByZXR1cm4gbmV3IFJ1bnRpbWVDb21waWxlckxvYWRlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkQnl0ZWNvZGVMb2FkZXIocmVzb2x2ZXI6IFJlc29sdmVyKSB7XG4gICAgbGV0IGRlbGVnYXRlID0gbmV3IENvbXBpbGVyRGVsZWdhdGUocmVzb2x2ZXIpO1xuICAgIGxldCBjb21waWxlciA9IG5ldyBCdW5kbGVDb21waWxlcihkZWxlZ2F0ZSk7XG5cbiAgICBsZXQgbWFpbkxvY2F0b3IgPSBsb2NhdG9yRm9yKCd0ZW1wbGF0ZTptYWluVGVtcGxhdGUnLCAnZGVmYXVsdCcpO1xuICAgIG1haW5Mb2NhdG9yLm1ldGEubW9kdWxlID0gJ3RlbXBsYXRlOm1haW5UZW1wbGF0ZSc7XG5cbiAgICBsZXQgYmxvY2sgPSBKU09OLnBhcnNlKG1haW5UZW1wbGF0ZS5ibG9jayk7XG4gICAgbGV0IGNvbXBpbGFibGVUZW1wbGF0ZSA9IGNvbXBpbGFibGUoe1xuICAgICAgYmxvY2ssXG4gICAgICByZWZlcnJlcjogbWFpbkxvY2F0b3IubWV0YSxcbiAgICB9KTtcblxuICAgIGNvbXBpbGVyLmFkZENvbXBpbGFibGVUZW1wbGF0ZShtYWluTG9jYXRvciwgY29tcGlsYWJsZVRlbXBsYXRlKTtcblxuICAgIGZvciAobGV0IG1vZHVsZSBpbiB0aGlzLnRlbXBsYXRlcykge1xuICAgICAgY29tcGlsZXIuYWRkVGVtcGxhdGVTb3VyY2UobG9jYXRvckZvcihtb2R1bGUsICdkZWZhdWx0JyksIHRoaXMudGVtcGxhdGVzW21vZHVsZV0pO1xuICAgIH1cblxuICAgIGxldCB7IGhlYXAsIHBvb2wsIHRhYmxlIH0gPSBjb21waWxlci5jb21waWxlKCk7XG5cbiAgICBsZXQgcmVzb2x2ZXJUYWJsZTogdW5rbm93bltdID0gW107XG5cbiAgICBsZXQgbWV0YTogRGljdDxCeXRlY29kZU1ldGFkYXRhPiA9IHt9O1xuXG4gICAgdGFibGUudm1IYW5kbGVCeU1vZHVsZUxvY2F0b3IuZm9yRWFjaCgodm1IYW5kbGUsIGxvY2F0b3IpID0+IHtcbiAgICAgIGxldCBoYW5kbGUgPSB0YWJsZS5ieU1vZHVsZUxvY2F0b3IuZ2V0KGxvY2F0b3IpO1xuICAgICAgbGV0IHRlbXBsYXRlID0gY29tcGlsZXIuZ2V0VGVtcGxhdGUobG9jYXRvcik7XG5cbiAgICAgIG1ldGFbbG9jYXRvci5tb2R1bGVdID0ge1xuICAgICAgICB2OiB2bUhhbmRsZSxcbiAgICAgICAgaDogaGFuZGxlLFxuICAgICAgICBzVDogdGVtcGxhdGUuc3ltYm9sVGFibGUsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGFibGUuYnlIYW5kbGUuZm9yRWFjaCgobG9jYXRvciwgaGFuZGxlKSA9PiB7XG4gICAgICBsZXQgbW9kdWxlID0gbG9jYXRvci5tb2R1bGUucmVwbGFjZSgndGVtcGxhdGU6LycsICdjb21wb25lbnQ6LycpO1xuICAgICAgaWYgKHRoaXMubW9kdWxlc1ttb2R1bGVdKSB7XG4gICAgICAgIGlmIChtb2R1bGUuaW5kZXhPZignaGVscGVyOicpID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlVHlwZSA9ICh0aGlzLm1vZHVsZXNbbW9kdWxlXSBhcyBIZWxwZXJGdW5jdGlvbikuaXNGYWN0b3J5ID8gTW9kdWxlVHlwZXMuSEVMUEVSX0ZBQ1RPUlkgOiBNb2R1bGVUeXBlcy5IRUxQRVI7XG4gICAgICAgICAgcmVzb2x2ZXJUYWJsZVtoYW5kbGVdID0gW21vZHVsZVR5cGUsIHRoaXMubW9kdWxlc1ttb2R1bGVdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlclRhYmxlW2hhbmRsZV0gPSB0aGlzLm1vZHVsZXNbbW9kdWxlXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGJ5dGVjb2RlID0gaGVhcC5idWZmZXI7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBwcmVmaXg6ICcnLFxuICAgICAgbWFpbkVudHJ5OiB0YWJsZS52bUhhbmRsZUJ5TW9kdWxlTG9jYXRvci5nZXQobWFpbkxvY2F0b3IpLFxuICAgICAgcG9vbCxcbiAgICAgIHRhYmxlOiByZXNvbHZlclRhYmxlLFxuICAgICAgbWV0YSxcbiAgICAgIGhlYXA6IHtcbiAgICAgICAgdGFibGU6IGhlYXAudGFibGUsXG4gICAgICAgIGhhbmRsZTogaGVhcC5oYW5kbGUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IEJ5dGVjb2RlTG9hZGVyKHsgYnl0ZWNvZGUsIGRhdGEgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRMb2FkZXIocmVzb2x2ZXIpOiBMb2FkZXIge1xuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmxvYWRlcikge1xuICAgICAgY2FzZSAncnVudGltZS1jb21waWxlcic6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUnVudGltZUNvbXBpbGVyTG9hZGVyKCk7XG4gICAgICBjYXNlICdieXRlY29kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkQnl0ZWNvZGVMb2FkZXIocmVzb2x2ZXIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgbG9hZGVyICR7dGhpcy5vcHRpb25zLmxvYWRlcn1gKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXJUb1N0cmluZyhjb21wb25lbnROYW1lOiBzdHJpbmcsIGRhdGE6IERpY3Q8dW5rbm93bj4sIG9wdGlvbnM/OiBUZXN0U1NSQXBwbGljYXRpb25PcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuYnVpbGRSZXNvbHZlcigpO1xuICAgIGxldCBsb2FkZXIgPSB0aGlzLmJ1aWxkTG9hZGVyKHJlc29sdmVyKTtcblxuICAgIHJldHVybiBTU1JBcHBsaWNhdGlvbi5yZW5kZXJUb1N0cmluZyhjb21wb25lbnROYW1lLCBkYXRhLCB7XG4gICAgICByb290TmFtZTogdGhpcy5yb290TmFtZSxcbiAgICAgIHJlc29sdmVyLFxuICAgICAgbG9hZGVyLFxuICAgICAgcmVuZGVyZXI6IG5ldyBTeW5jUmVuZGVyZXIoKSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGJvb3QoKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHJlc29sdmVyID0gdGhpcy5idWlsZFJlc29sdmVyKCk7XG4gICAgbGV0IGxvYWRlcjogTG9hZGVyID0gdGhpcy5idWlsZExvYWRlcihyZXNvbHZlcik7XG5cbiAgICBsZXQgZG9jOiBEb2N1bWVudCA9ICh0aGlzLm9wdGlvbnMuZG9jdW1lbnQgYXMgRG9jdW1lbnQpIHx8IGRvY3VtZW50O1xuICAgIGxldCBlbGVtZW50ID0gZG9jLmJvZHk7XG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgRE9NQnVpbGRlcih7IGVsZW1lbnQgfSk7XG4gICAgbGV0IHJlbmRlcmVyID0gbmV3IFN5bmNSZW5kZXJlcigpO1xuXG4gICAgbGV0IGFwcCA9IG5ldyB0aGlzLm9wdGlvbnMuQXBwbGljYXRpb25DbGFzcyh7XG4gICAgICByZXNvbHZlcixcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBsb2FkZXIsXG4gICAgICByZW5kZXJlcixcbiAgICAgIHJvb3ROYW1lOiB0aGlzLnJvb3ROYW1lLFxuICAgICAgZG9jdW1lbnQ6IHRoaXMub3B0aW9ucy5kb2N1bWVudCxcbiAgICB9KTtcblxuICAgIGxldCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBhcHAucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDtcbiAgICBhcHAucmVuZGVyQ29tcG9uZW50KCdNYWluJywgcm9vdEVsZW1lbnQpO1xuICAgIGFwcC5ib290KCk7XG5cbiAgICBhd2FpdCBkaWRSZW5kZXIoYXBwKTtcblxuICAgIHJldHVybiBhcHA7XG4gIH1cbn1cblxuY29uc3QgQ0FQQUJJTElUSUVTOiBDb21wb25lbnRDYXBhYmlsaXRpZXMgPSB7XG4gIGNyZWF0ZUluc3RhbmNlOiB0cnVlLFxuICBkeW5hbWljTGF5b3V0OiBmYWxzZSxcbiAgZHluYW1pY1RhZzogZmFsc2UsXG4gIHdyYXBwZWQ6IGZhbHNlLFxuICBwcmVwYXJlQXJnczogZmFsc2UsXG4gIGNyZWF0ZUFyZ3M6IHRydWUsXG4gIGF0dHJpYnV0ZUhvb2s6IGZhbHNlLFxuICBlbGVtZW50SG9vazogZmFsc2UsXG4gIHVwZGF0ZUhvb2s6IHRydWUsXG4gIGNyZWF0ZUNhbGxlcjogZmFsc2UsXG4gIGR5bmFtaWNTY29wZTogdHJ1ZSxcbn07XG5cbmNsYXNzIENvbXBpbGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQ29tcGlsZXJEZWxlZ2F0ZTxNb2R1bGVMb2NhdG9yPiB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZXNvbHZlcjogUmVzb2x2ZXIpIHt9XG5cbiAgaGFzQ29tcG9uZW50SW5TY29wZShuYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlci5pZGVudGlmeShgdGVtcGxhdGU6JHtuYW1lfWAsIHJlZmVycmVyLm1vZHVsZSk7XG4gIH1cblxuICByZXNvbHZlQ29tcG9uZW50KG5hbWU6IHN0cmluZywgcmVmZXJyZXI6IE1vZHVsZUxvY2F0b3IpOiBNb2R1bGVMb2NhdG9yIHtcbiAgICBsZXQgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVyLmlkZW50aWZ5KGB0ZW1wbGF0ZToke25hbWV9YCwgcmVmZXJyZXIubW9kdWxlKTtcbiAgICByZXR1cm4geyBtb2R1bGU6IHJlc29sdmVkLCBuYW1lOiAnZGVmYXVsdCcgfTtcbiAgfVxuXG4gIGdldENvbXBvbmVudENhcGFiaWxpdGllcygpIHtcbiAgICByZXR1cm4gQ0FQQUJJTElUSUVTO1xuICB9XG5cbiAgaGFzSGVscGVySW5TY29wZShoZWxwZXJOYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlci5pZGVudGlmeShgaGVscGVyOiR7aGVscGVyTmFtZX1gLCByZWZlcnJlci5tb2R1bGUpO1xuICB9XG5cbiAgcmVzb2x2ZUhlbHBlcihoZWxwZXJOYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogTW9kdWxlTG9jYXRvciB7XG4gICAgbGV0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlci5pZGVudGlmeShgaGVscGVyOiR7aGVscGVyTmFtZX1gLCByZWZlcnJlci5tb2R1bGUpO1xuICAgIHJldHVybiB7IG1vZHVsZTogcmVzb2x2ZWQsIG5hbWU6ICdkZWZhdWx0JyB9O1xuICB9XG5cbiAgaGFzUGFydGlhbEluU2NvcGUocGFydGlhbE5hbWU6IHN0cmluZywgcmVmZXJyZXI6IE1vZHVsZUxvY2F0b3IpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICByZXNvbHZlUGFydGlhbChwYXJ0aWFsTmFtZTogc3RyaW5nLCByZWZlcnJlcjogTW9kdWxlTG9jYXRvcik6IE1vZHVsZUxvY2F0b3Ige1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGhhc01vZGlmaWVySW5TY29wZShtb2RpZmllck5hbWU6IHN0cmluZywgcmVmZXJyZXI6IE1vZHVsZUxvY2F0b3IpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICByZXNvbHZlTW9kaWZpZXIobW9kaWZpZXJOYW1lOiBzdHJpbmcsIHJlZmVycmVyOiBNb2R1bGVMb2NhdG9yKTogTW9kdWxlTG9jYXRvciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXBwPFQgZXh0ZW5kcyBUZXN0QXBwbGljYXRpb24+KG9wdGlvbnM6IEFwcEJ1aWxkZXJPcHRpb25zPFQ+ID0ge30pOiBBcHBCdWlsZGVyPFQ+IHtcbiAgb3B0aW9ucy5hcHBOYW1lID0gb3B0aW9ucy5hcHBOYW1lIHx8ICd0ZXN0LWFwcCc7XG4gIG9wdGlvbnMubG9hZGVyID0gb3B0aW9ucy5sb2FkZXIgfHwgJ3J1bnRpbWUtY29tcGlsZXInO1xuICBvcHRpb25zLkFwcGxpY2F0aW9uQ2xhc3MgPVxuICAgIG9wdGlvbnMuQXBwbGljYXRpb25DbGFzcyB8fCAoVGVzdEFwcGxpY2F0aW9uIGFzIEFwcGxpY2F0aW9uQ29uc3RydWN0b3I8VD4pO1xuXG4gIHJldHVybiBuZXcgQXBwQnVpbGRlcihvcHRpb25zLmFwcE5hbWUsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgeyBidWlsZEFwcCB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==