UNPKG

41.8 kBJavaScriptView Raw
1"use strict";
2
3var _getIterator2 = require("babel-runtime/core-js/get-iterator");
4
5var _getIterator3 = _interopRequireDefault(_getIterator2);
6
7var _keys = require("babel-runtime/core-js/object/keys");
8
9var _keys2 = _interopRequireDefault(_keys);
10
11var _regenerator = require("babel-runtime/regenerator");
12
13var _regenerator2 = _interopRequireDefault(_regenerator);
14
15var _assign = require("babel-runtime/core-js/object/assign");
16
17var _assign2 = _interopRequireDefault(_assign);
18
19var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
20
21var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
22
23var _createClass2 = require("babel-runtime/helpers/createClass");
24
25var _createClass3 = _interopRequireDefault(_createClass2);
26
27var _promise = require("babel-runtime/core-js/promise");
28
29var _promise2 = _interopRequireDefault(_promise);
30
31function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
33var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
34 return new (P || (P = _promise2.default))(function (resolve, reject) {
35 function fulfilled(value) {
36 try {
37 step(generator.next(value));
38 } catch (e) {
39 reject(e);
40 }
41 }
42 function rejected(value) {
43 try {
44 step(generator.throw(value));
45 } catch (e) {
46 reject(e);
47 }
48 }
49 function step(result) {
50 result.done ? resolve(result.value) : new P(function (resolve) {
51 resolve(result.value);
52 }).then(fulfilled, rejected);
53 }
54 step((generator = generator.apply(thisArg, _arguments)).next());
55 });
56};
57var dexie_1 = require("dexie");
58var typestore_1 = require("typestore");
59var IndexedDBRepoPlugin_1 = require("./IndexedDBRepoPlugin");
60var log = typestore_1.Log.create(__filename);
61/**
62 * Default options
63 */
64exports.LocalStorageOptionDefaults = {
65 databaseName: 'typestore-db',
66 version: 1
67};
68/**
69 * Uses dexie under the covers - its a mature library - and i'm lazy
70 */
71
72var IndexedDBPlugin = function () {
73 function IndexedDBPlugin() {
74 var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
75 (0, _classCallCheck3.default)(this, IndexedDBPlugin);
76
77 this.opts = opts;
78 this.type = typestore_1.PluginType.Store;
79 this.repoPlugins = {};
80 this.opts = (0, _assign2.default)({}, exports.LocalStorageOptionDefaults, opts);
81
82 for (var _len = arguments.length, supportedModels = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
83 supportedModels[_key - 1] = arguments[_key];
84 }
85
86 this.supportedModels = supportedModels;
87 }
88
89 (0, _createClass3.default)(IndexedDBPlugin, [{
90 key: "newDexie",
91 value: function newDexie() {
92 return new dexie_1.default(this.opts.databaseName, this.opts.provider);
93 }
94 }, {
95 key: "open",
96 value: function open() {
97 this.internalDb = this.newDexie();
98 return this.internalDb;
99 }
100 }, {
101 key: "handle",
102 value: function handle(eventType) {
103 switch (eventType) {
104 case typestore_1.PluginEventType.RepoInit:
105 return typestore_1.repoAttachIfSupported(arguments.length <= 1 ? undefined : arguments[1], this);
106 }
107 return false;
108 }
109 }, {
110 key: "table",
111 value: function table(modelType) {
112 var table = this.tables[modelType.name];
113 if (!table) throw new Error("Unable to find a table definition for " + modelType.name);
114 return table;
115 }
116 }, {
117 key: "init",
118 value: function init(coordinator, opts) {
119 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee() {
120 return _regenerator2.default.wrap(function _callee$(_context) {
121 while (1) {
122 switch (_context.prev = _context.next) {
123 case 0:
124 this.coordinator = coordinator;
125 return _context.abrupt("return", coordinator);
126
127 case 2:
128 case "end":
129 return _context.stop();
130 }
131 }
132 }, _callee, this);
133 }));
134 }
135 }, {
136 key: "start",
137 value: function start() {
138 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee2() {
139 var _this = this;
140
141 var models, schemaAttrNameMap, schema, version;
142 return _regenerator2.default.wrap(function _callee2$(_context2) {
143 while (1) {
144 switch (_context2.prev = _context2.next) {
145 case 0:
146 models = this.coordinator.getModels();
147 // 1. Create the current schema config
148 // TODO: Should only use indexed attributes for schema
149
150 schemaAttrNameMap = {};
151 schema = models.reduce(function (newSchema, modelType) {
152 // Get all the known attributes for the table
153 var attrs = modelType.options.attrs.filter(function (attr) {
154 return !attr.transient;
155 });
156 schemaAttrNameMap[modelType.name] = attrs.map(function (attr) {
157 return attr.name;
158 });
159 var attrDescs = attrs.map(function (attr) {
160 var index = attr.index;
161 var name = attr.name;
162 var primaryKey = attr.primaryKey;
163 var isArray = attr.isArray;var unique = primaryKey || index && index.unique;var prefix = unique ? '&' : isArray ? '*' : '';
164 return "" + prefix + name;
165 });
166 // Added the attribute descriptor to the new schema
167 newSchema[modelType.name] = attrDescs.join(',');
168 log.debug("Created schema for " + modelType.name, newSchema[modelType.name]);
169 return newSchema;
170 }, {});
171 // Check for an existing database, version, schema
172
173 version = this.opts.version;
174 _context2.next = 6;
175 return new _promise2.default(function (resolve, reject) {
176 var db = _this.newDexie();
177 db.open().then(function () {
178 log.info('Opened existing database', db.name, ' with existing version ', db.verno);
179 var tables = db.tables,
180 tableNames = tables.map(function (table) {
181 return table.name;
182 }),
183 newTableNames = (0, _keys2.default)(schema),
184
185 // New table defined
186 newTable = !newTableNames.every(function (tableName) {
187 return tableNames.includes(tableName);
188 }),
189
190 // Table removed??
191 removedTable = !tableNames.every(function (tableName) {
192 return newTableNames.includes(tableName);
193 });
194 var attrChanged = false;
195 // If no new tables then check indexes
196 if (!newTable && !removedTable) {
197 var _iteratorNormalCompletion = true;
198 var _didIteratorError = false;
199 var _iteratorError = undefined;
200
201 try {
202 var _loop = function _loop() {
203 var table = _step.value;
204 var newAttrNames = schemaAttrNameMap[table.name];var _table$schema = table.schema;
205 var indexes = _table$schema.indexes;
206 var primKey = _table$schema.primKey;var oldAttrNames = indexes.map(function (index) {
207 return index.name;
208 }).concat([primKey.name]);
209 if (newAttrNames.length !== oldAttrNames.length || !oldAttrNames.every(function (attrName) {
210 return newAttrNames.includes(attrName);
211 })) {
212 log.info('Attributes have changed on table, bumping version. New attrs ', newAttrNames, ' old attr names ', oldAttrNames);
213 attrChanged = true;
214 return "break";
215 }
216 };
217
218 for (var _iterator = (0, _getIterator3.default)(tables), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
219 var _ret = _loop();
220
221 if (_ret === "break") break;
222 }
223 } catch (err) {
224 _didIteratorError = true;
225 _iteratorError = err;
226 } finally {
227 try {
228 if (!_iteratorNormalCompletion && _iterator.return) {
229 _iterator.return();
230 }
231 } finally {
232 if (_didIteratorError) {
233 throw _iteratorError;
234 }
235 }
236 }
237 }
238 if (attrChanged || newTable || removedTable) {
239 log.info('Schema changes detected, bumping version, everntually auto-upgrade', attrChanged, newTable, removedTable);
240 version = db.verno + 1;
241 }
242 log.debug('Closing db check');
243 db.close();
244 resolve(true);
245 }).catch('NoSuchDatabaseError', function (e) {
246 log.info('Database does not exist, creating: ', _this.opts.databaseName);
247 resolve(false);
248 }).catch(function (e) {
249 log.error("Unknown error", e);
250 reject(e);
251 });
252 });
253
254 case 6:
255 // Table needs to be created
256 log.debug("Creating schema", schema);
257 this.open().version(version).stores(schema);
258 _context2.next = 10;
259 return new _promise2.default(function (resolve, reject) {
260 _this.internalDb.open().then(resolve).catch(reject);
261 });
262
263 case 10:
264 this.tables = models.reduce(function (newTables, modelType) {
265 newTables[modelType.name] = _this.internalDb.table(modelType.name);
266 return newTables;
267 }, {});
268 log.debug('IndexedDB store is ready');
269 return _context2.abrupt("return", this.coordinator);
270
271 case 13:
272 case "end":
273 return _context2.stop();
274 }
275 }
276 }, _callee2, this);
277 }));
278 }
279 }, {
280 key: "stop",
281 value: function stop() {
282 return __awaiter(this, void 0, void 0, _regenerator2.default.mark(function _callee3() {
283 return _regenerator2.default.wrap(function _callee3$(_context3) {
284 while (1) {
285 switch (_context3.prev = _context3.next) {
286 case 0:
287 if (!this.internalDb) {
288 _context3.next = 3;
289 break;
290 }
291
292 _context3.next = 3;
293 return this.internalDb.close();
294
295 case 3:
296 return _context3.abrupt("return", this.coordinator);
297
298 case 4:
299 case "end":
300 return _context3.stop();
301 }
302 }
303 }, _callee3, this);
304 }));
305 }
306 }, {
307 key: "syncModels",
308 value: function syncModels() {
309 log.debug('Currently the localstorage plugin does not sync models');
310 return _promise2.default.resolve(this.coordinator);
311 }
312 /**
313 * Initialize a new repo
314 * TODO: verify this logic works - just reading it makes me think we could be
315 * asked to init a repo a second time with the same type and do nothing
316 *
317 * @param repo
318 * @returns {T}
319 */
320
321 }, {
322 key: "initRepo",
323 value: function initRepo(repo) {
324 var plugin = this.repoPlugins[repo.modelType.name];
325 if (plugin) return plugin.repo;
326 plugin = new IndexedDBRepoPlugin_1.IndexedDBRepoPlugin(this, repo);
327 return plugin.repo;
328 }
329 }, {
330 key: "db",
331 get: function get() {
332 return this.internalDb;
333 }
334 }]);
335 return IndexedDBPlugin;
336}();
337
338exports.IndexedDBPlugin = IndexedDBPlugin;
339//# sourceMappingURL=data:application/json;base64,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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxhQUFoQyxFQUFQO0FBS0g7OztxQ0FDWTtBQUNULGdCQUFJLEtBQUosQ0FBVSx3REFBVjtBQUNBLG1CQUFPLGtCQUFRLE9BQVIsQ0FBZ0IsS0FBSyxXQUFyQixDQUFQO0FBQ0g7QUFDRDs7Ozs7Ozs7Ozs7aUNBUVMsSSxFQUFNO0FBQ1gsZ0JBQUksU0FBUyxLQUFLLFdBQUwsQ0FBaUIsS0FBSyxTQUFMLENBQWUsSUFBaEMsQ0FBYjtBQUNBLGdCQUFJLE1BQUosRUFDSSxPQUFPLE9BQU8sSUFBZDtBQUNKLHFCQUFTLElBQUksc0JBQXNCLG1CQUExQixDQUE4QyxJQUE5QyxFQUFvRCxJQUFwRCxDQUFUO0FBQ0EsbUJBQU8sT0FBTyxJQUFkO0FBQ0g7Ozs0QkE1SFE7QUFDTCxtQkFBTyxLQUFLLFVBQVo7QUFDSDs7Ozs7QUE0SEwsUUFBUSxlQUFSLEdBQTBCLGVBQTFCIiwiZmlsZSI6IkluZGV4ZWREQlBsdWdpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IudGhyb3codmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cykpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuY29uc3QgZGV4aWVfMSA9IHJlcXVpcmUoXCJkZXhpZVwiKTtcbmNvbnN0IHR5cGVzdG9yZV8xID0gcmVxdWlyZShcInR5cGVzdG9yZVwiKTtcbmNvbnN0IEluZGV4ZWREQlJlcG9QbHVnaW5fMSA9IHJlcXVpcmUoXCIuL0luZGV4ZWREQlJlcG9QbHVnaW5cIik7XG5jb25zdCBsb2cgPSB0eXBlc3RvcmVfMS5Mb2cuY3JlYXRlKF9fZmlsZW5hbWUpO1xuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnNcbiAqL1xuZXhwb3J0cy5Mb2NhbFN0b3JhZ2VPcHRpb25EZWZhdWx0cyA9IHtcbiAgICBkYXRhYmFzZU5hbWU6ICd0eXBlc3RvcmUtZGInLFxuICAgIHZlcnNpb246IDFcbn07XG4vKipcbiAqIFVzZXMgZGV4aWUgdW5kZXIgdGhlIGNvdmVycyAtIGl0cyBhIG1hdHVyZSBsaWJyYXJ5IC0gYW5kIGknbSBsYXp5XG4gKi9cbmNsYXNzIEluZGV4ZWREQlBsdWdpbiB7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9LCAuLi5zdXBwb3J0ZWRNb2RlbHMpIHtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZXN0b3JlXzEuUGx1Z2luVHlwZS5TdG9yZTtcbiAgICAgICAgdGhpcy5yZXBvUGx1Z2lucyA9IHt9O1xuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkxvY2FsU3RvcmFnZU9wdGlvbkRlZmF1bHRzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRNb2RlbHMgPSBzdXBwb3J0ZWRNb2RlbHM7XG4gICAgfVxuICAgIG5ld0RleGllKCkge1xuICAgICAgICByZXR1cm4gbmV3IGRleGllXzEuZGVmYXVsdCh0aGlzLm9wdHMuZGF0YWJhc2VOYW1lLCB0aGlzLm9wdHMucHJvdmlkZXIpO1xuICAgIH1cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLmludGVybmFsRGIgPSB0aGlzLm5ld0RleGllKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsRGI7XG4gICAgfVxuICAgIGdldCBkYigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxEYjtcbiAgICB9XG4gICAgaGFuZGxlKGV2ZW50VHlwZSwgLi4uYXJncykge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSB0eXBlc3RvcmVfMS5QbHVnaW5FdmVudFR5cGUuUmVwb0luaXQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVzdG9yZV8xLnJlcG9BdHRhY2hJZlN1cHBvcnRlZChhcmdzWzBdLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRhYmxlKG1vZGVsVHlwZSkge1xuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLnRhYmxlc1ttb2RlbFR5cGUubmFtZV07XG4gICAgICAgIGlmICghdGFibGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGEgdGFibGUgZGVmaW5pdGlvbiBmb3IgJHttb2RlbFR5cGUubmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgICBpbml0KGNvb3JkaW5hdG9yLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLmNvb3JkaW5hdG9yID0gY29vcmRpbmF0b3I7XG4gICAgICAgICAgICByZXR1cm4gY29vcmRpbmF0b3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVscyA9IHRoaXMuY29vcmRpbmF0b3IuZ2V0TW9kZWxzKCk7XG4gICAgICAgICAgICAvLyAxLiBDcmVhdGUgdGhlIGN1cnJlbnQgc2NoZW1hIGNvbmZpZ1xuICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIG9ubHkgdXNlIGluZGV4ZWQgYXR0cmlidXRlcyBmb3Igc2NoZW1hXG4gICAgICAgICAgICBjb25zdCBzY2hlbWFBdHRyTmFtZU1hcCA9IHt9O1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gbW9kZWxzLnJlZHVjZSgobmV3U2NoZW1hLCBtb2RlbFR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBrbm93biBhdHRyaWJ1dGVzIGZvciB0aGUgdGFibGVcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRycyA9IG1vZGVsVHlwZS5vcHRpb25zLmF0dHJzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYXR0ciA9PiAhYXR0ci50cmFuc2llbnQpO1xuICAgICAgICAgICAgICAgIHNjaGVtYUF0dHJOYW1lTWFwW21vZGVsVHlwZS5uYW1lXSA9IGF0dHJzLm1hcChhdHRyID0+IGF0dHIubmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckRlc2NzID0gYXR0cnMubWFwKChhdHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIG5hbWUsIHByaW1hcnlLZXksIGlzQXJyYXkgfSA9IGF0dHIsIHVuaXF1ZSA9IHByaW1hcnlLZXkgfHwgKGluZGV4ICYmIGluZGV4LnVuaXF1ZSksIHByZWZpeCA9ICgodW5pcXVlKSA/ICcmJyA6IChpc0FycmF5KSA/ICcqJyA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke25hbWV9YDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBBZGRlZCB0aGUgYXR0cmlidXRlIGRlc2NyaXB0b3IgdG8gdGhlIG5ldyBzY2hlbWFcbiAgICAgICAgICAgICAgICBuZXdTY2hlbWFbbW9kZWxUeXBlLm5hbWVdID0gYXR0ckRlc2NzLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoYENyZWF0ZWQgc2NoZW1hIGZvciAke21vZGVsVHlwZS5uYW1lfWAsIG5ld1NjaGVtYVttb2RlbFR5cGUubmFtZV0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdTY2hlbWE7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgYW4gZXhpc3RpbmcgZGF0YWJhc2UsIHZlcnNpb24sIHNjaGVtYVxuICAgICAgICAgICAgbGV0IHsgdmVyc2lvbiB9ID0gdGhpcy5vcHRzO1xuICAgICAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRiID0gdGhpcy5uZXdEZXhpZSgpO1xuICAgICAgICAgICAgICAgIGRiLm9wZW4oKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdPcGVuZWQgZXhpc3RpbmcgZGF0YWJhc2UnLCBkYi5uYW1lLCAnIHdpdGggZXhpc3RpbmcgdmVyc2lvbiAnLCBkYi52ZXJubyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlcyA9IGRiLnRhYmxlcywgdGFibGVOYW1lcyA9IHRhYmxlcy5tYXAodGFibGUgPT4gdGFibGUubmFtZSksIG5ld1RhYmxlTmFtZXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLCBcbiAgICAgICAgICAgICAgICAgICAgLy8gTmV3IHRhYmxlIGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUgPSAhbmV3VGFibGVOYW1lcy5ldmVyeSh0YWJsZU5hbWUgPT4gdGFibGVOYW1lcy5pbmNsdWRlcyh0YWJsZU5hbWUpKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIFRhYmxlIHJlbW92ZWQ/P1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVkVGFibGUgPSAhdGFibGVOYW1lcy5ldmVyeSh0YWJsZU5hbWUgPT4gbmV3VGFibGVOYW1lcy5pbmNsdWRlcyh0YWJsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIG5ldyB0YWJsZXMgdGhlbiBjaGVjayBpbmRleGVzXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3VGFibGUgJiYgIXJlbW92ZWRUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QXR0ck5hbWVzID0gc2NoZW1hQXR0ck5hbWVNYXBbdGFibGUubmFtZV0sIHsgaW5kZXhlcywgcHJpbUtleSB9ID0gdGFibGUuc2NoZW1hLCBvbGRBdHRyTmFtZXMgPSBpbmRleGVzLm1hcChpbmRleCA9PiBpbmRleC5uYW1lKS5jb25jYXQoW3ByaW1LZXkubmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdBdHRyTmFtZXMubGVuZ3RoICE9PSBvbGRBdHRyTmFtZXMubGVuZ3RoIHx8ICFvbGRBdHRyTmFtZXMuZXZlcnkoYXR0ck5hbWUgPT4gbmV3QXR0ck5hbWVzLmluY2x1ZGVzKGF0dHJOYW1lKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oJ0F0dHJpYnV0ZXMgaGF2ZSBjaGFuZ2VkIG9uIHRhYmxlLCBidW1waW5nIHZlcnNpb24uICBOZXcgYXR0cnMgJywgbmV3QXR0ck5hbWVzLCAnIG9sZCBhdHRyIG5hbWVzICcsIG9sZEF0dHJOYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyQ2hhbmdlZCB8fCBuZXdUYWJsZSB8fCByZW1vdmVkVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdTY2hlbWEgY2hhbmdlcyBkZXRlY3RlZCwgYnVtcGluZyB2ZXJzaW9uLCBldmVybnR1YWxseSBhdXRvLXVwZ3JhZGUnLCBhdHRyQ2hhbmdlZCwgbmV3VGFibGUsIHJlbW92ZWRUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZGIudmVybm8gKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygnQ2xvc2luZyBkYiBjaGVjaycpO1xuICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgnTm9TdWNoRGF0YWJhc2VFcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdEYXRhYmFzZSBkb2VzIG5vdCBleGlzdCwgY3JlYXRpbmc6ICcsIHRoaXMub3B0cy5kYXRhYmFzZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKFwiVW5rbm93biBlcnJvclwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBUYWJsZSBuZWVkcyB0byBiZSBjcmVhdGVkXG4gICAgICAgICAgICBsb2cuZGVidWcoYENyZWF0aW5nIHNjaGVtYWAsIHNjaGVtYSk7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKVxuICAgICAgICAgICAgICAgIC52ZXJzaW9uKHZlcnNpb24pXG4gICAgICAgICAgICAgICAgLnN0b3JlcyhzY2hlbWEpO1xuICAgICAgICAgICAgeWllbGQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxEYi5vcGVuKCkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRhYmxlcyA9IG1vZGVscy5yZWR1Y2UoKG5ld1RhYmxlcywgbW9kZWxUeXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgbmV3VGFibGVzW21vZGVsVHlwZS5uYW1lXSA9IHRoaXMuaW50ZXJuYWxEYi50YWJsZShtb2RlbFR5cGUubmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1RhYmxlcztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZygnSW5kZXhlZERCIHN0b3JlIGlzIHJlYWR5Jyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbERiKVxuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuaW50ZXJuYWxEYi5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0b3I7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzeW5jTW9kZWxzKCkge1xuICAgICAgICBsb2cuZGVidWcoJ0N1cnJlbnRseSB0aGUgbG9jYWxzdG9yYWdlIHBsdWdpbiBkb2VzIG5vdCBzeW5jIG1vZGVscycpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29vcmRpbmF0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IHJlcG9cbiAgICAgKiBUT0RPOiB2ZXJpZnkgdGhpcyBsb2dpYyB3b3JrcyAtIGp1c3QgcmVhZGluZyBpdCBtYWtlcyBtZSB0aGluayB3ZSBjb3VsZCBiZVxuICAgICAqICBhc2tlZCB0byBpbml0IGEgcmVwbyBhIHNlY29uZCB0aW1lIHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgZG8gbm90aGluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHJlcG9cbiAgICAgKiBAcmV0dXJucyB7VH1cbiAgICAgKi9cbiAgICBpbml0UmVwbyhyZXBvKSB7XG4gICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLnJlcG9QbHVnaW5zW3JlcG8ubW9kZWxUeXBlLm5hbWVdO1xuICAgICAgICBpZiAocGx1Z2luKVxuICAgICAgICAgICAgcmV0dXJuIHBsdWdpbi5yZXBvO1xuICAgICAgICBwbHVnaW4gPSBuZXcgSW5kZXhlZERCUmVwb1BsdWdpbl8xLkluZGV4ZWREQlJlcG9QbHVnaW4odGhpcywgcmVwbyk7XG4gICAgICAgIHJldHVybiBwbHVnaW4ucmVwbztcbiAgICB9XG59XG5leHBvcnRzLkluZGV4ZWREQlBsdWdpbiA9IEluZGV4ZWREQlBsdWdpbjtcbiJdfQ==
340//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkluZGV4ZWREQlBsdWdpbi5qcyIsIkluZGV4ZWREQlBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFJLFlBQWEsYUFBUSxVQUFLLFNBQWQsSUFBNEIsVUFBVSxPQUFWLEVBQW1CLFVBQW5CLEVBQStCLENBQS9CLEVBQWtDLFNBQWxDLEVBQTZDO0FBQ3JGLFdBQU8sS0FBSyxNQUFNLHFCQUFOLENBQUwsRUFBeUIsVUFBVSxPQUFWLEVBQW1CLE1BQW5CLEVBQTJCO0FBQ3ZELGlCQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFBRSxnQkFBSTtBQUFFLHFCQUFLLFVBQVUsSUFBVixDQUFlLEtBQWYsQ0FBTDtBQUE4QixhQUFwQyxDQUFxQyxPQUFPLENBQVAsRUFBVTtBQUFFLHVCQUFPLENBQVA7QUFBWTtBQUFFO0FBQzNGLGlCQUFTLFFBQVQsQ0FBa0IsS0FBbEIsRUFBeUI7QUFBRSxnQkFBSTtBQUFFLHFCQUFLLFVBQVUsS0FBVixDQUFnQixLQUFoQixDQUFMO0FBQStCLGFBQXJDLENBQXNDLE9BQU8sQ0FBUCxFQUFVO0FBQUUsdUJBQU8sQ0FBUDtBQUFZO0FBQUU7QUFDM0YsaUJBQVMsSUFBVCxDQUFjLE1BQWQsRUFBc0I7QUFBRSxtQkFBTyxJQUFQLEdBQWMsUUFBUSxPQUFPLEtBQWYsQ0FBZCxHQUFzQyxJQUFJLENBQUosQ0FBTSxVQUFVLE9BQVYsRUFBbUI7QUFBRSx3QkFBUSxPQUFPLEtBQWY7QUFBd0IsYUFBbkQsRUFBcUQsSUFBckQsQ0FBMEQsU0FBMUQsRUFBcUUsUUFBckUsQ0FBdEM7QUFBdUg7QUFDL0ksYUFBSyxDQUFDLFlBQVksVUFBVSxLQUFWLENBQWdCLE9BQWhCLEVBQXlCLFVBQXpCLENBQWIsRUFBbUQsSUFBbkQsRUFBTDtBQUNILEtBTE0sQ0FBUDtBQU1ILENBUEQ7QUNDQSxJQUFBLFVBQUEsUUFBQSxPQUFBLENBQUE7QUFDQSxJQUFBLGNB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QixFRDNFc0M7O0FBQUE7QUFBQSxrRUM2RXRDLEtBQUssV0Q3RWlDOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGFBQWhDLEVBQVA7QUM4RU47OztxQ0FFUztBQUNULGdCQUFJLEtBQUosQ0FBVSx3REFBVjtBQUNBLG1CQUFPLGtCQUFRLE9BQVIsQ0FBZ0IsS0FBSyxXQUFyQixDQUFQO0FBQ0E7QUFFRDs7Ozs7Ozs7Ozs7aUNBUThDLEksRUFBTTtBQUNuRCxnQkFBSSxTQUFTLEtBQUssV0FBTCxDQUFpQixLQUFLLFNBQUwsQ0FBZSxJQUFoQyxDQUFiO0FBQ0EsZ0JBQUksTUFBSixFQUNDLE9BQU8sT0FBTyxJQUFkO0FBRUQscUJBQVMsSUFBSSxzQkFBQSxtQkFBSixDQUF3QixJQUF4QixFQUE2QixJQUE3QixDQUFUO0FBQ0EsbUJBQU8sT0FBTyxJQUFkO0FBQ0E7Ozs0QkF0S0s7QUFDTCxtQkFBTyxLQUFLLFVBQVo7QUFDQTs7Ozs7QUEzQkYsUUFBQSxlQUFBLEdBQUEsZUFBQSIsImZpbGUiOiJJbmRleGVkREJQbHVnaW4uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2pnbGFuei9EZXZlbG9wbWVudC9kZW5zZWJyYWluL2VwaWN0YXNrLXdvcmtzcGFjZS90eXBlc3RvcmUvcGFja2FnZXMvdHlwZXN0b3JlLXBsdWdpbi1pbmRleGVkZGIvc3JjIn0=