1 | ;
|
2 |
|
3 | var _getIterator2 = require("babel-runtime/core-js/get-iterator");
|
4 |
|
5 | var _getIterator3 = _interopRequireDefault(_getIterator2);
|
6 |
|
7 | var _keys = require("babel-runtime/core-js/object/keys");
|
8 |
|
9 | var _keys2 = _interopRequireDefault(_keys);
|
10 |
|
11 | var _regenerator = require("babel-runtime/regenerator");
|
12 |
|
13 | var _regenerator2 = _interopRequireDefault(_regenerator);
|
14 |
|
15 | var _assign = require("babel-runtime/core-js/object/assign");
|
16 |
|
17 | var _assign2 = _interopRequireDefault(_assign);
|
18 |
|
19 | var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
|
20 |
|
21 | var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
22 |
|
23 | var _createClass2 = require("babel-runtime/helpers/createClass");
|
24 |
|
25 | var _createClass3 = _interopRequireDefault(_createClass2);
|
26 |
|
27 | var _promise = require("babel-runtime/core-js/promise");
|
28 |
|
29 | var _promise2 = _interopRequireDefault(_promise);
|
30 |
|
31 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
32 |
|
33 | var __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 | };
|
57 | var dexie_1 = require("dexie");
|
58 | var typestore_1 = require("typestore");
|
59 | var IndexedDBRepoPlugin_1 = require("./IndexedDBRepoPlugin");
|
60 | var log = typestore_1.Log.create(__filename);
|
61 | /**
|
62 | * Default options
|
63 | */
|
64 | exports.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 |
|
72 | var 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 |
|
338 | exports.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=
|