@hyperbook/markdown 0.43.5 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3497 +1,15 @@
1
- /* ==========================================================================
2
- * dexie-export-import.js
3
- * ==========================================================================
4
- *
5
- * Dexie addon for exporting and importing databases to / from Blobs.
6
- *
7
- * By David Fahlander, david.fahlander@gmail.com,
8
- *
9
- * ==========================================================================
10
- *
11
- * Version 4.1.4, Fri Nov 15 2024
12
- *
13
- * https://dexie.org
14
- *
15
- * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/
16
- *
17
- */
18
-
19
- (function (global, factory) {
20
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('dexie')) :
21
- typeof define === 'function' && define.amd ? define(['exports', 'dexie'], factory) :
22
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.DexieExportImport = {}, global.Dexie));
23
- })(this, (function (exports, Dexie) { 'use strict';
24
-
25
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
26
-
27
- var Dexie__default = /*#__PURE__*/_interopDefaultLegacy(Dexie);
28
-
29
- /*! *****************************************************************************
30
- Copyright (c) Microsoft Corporation.
31
-
32
- Permission to use, copy, modify, and/or distribute this software for any
33
- purpose with or without fee is hereby granted.
34
-
35
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
36
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
37
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
38
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
39
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
40
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
41
- PERFORMANCE OF THIS SOFTWARE.
42
- ***************************************************************************** */
43
-
44
- var __assign = function() {
45
- __assign = Object.assign || function __assign(t) {
46
- for (var s, i = 1, n = arguments.length; i < n; i++) {
47
- s = arguments[i];
48
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
49
- }
50
- return t;
51
- };
52
- return __assign.apply(this, arguments);
53
- };
54
-
55
- function __awaiter(thisArg, _arguments, P, generator) {
56
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
57
- return new (P || (P = Promise))(function (resolve, reject) {
58
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
59
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
60
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
61
- step((generator = generator.apply(thisArg, _arguments || [])).next());
62
- });
63
- }
64
-
65
- function __generator(thisArg, body) {
66
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
67
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
68
- function verb(n) { return function (v) { return step([n, v]); }; }
69
- function step(op) {
70
- if (f) throw new TypeError("Generator is already executing.");
71
- while (_) try {
72
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
73
- if (y = 0, t) op = [op[0] & 2, t.value];
74
- switch (op[0]) {
75
- case 0: case 1: t = op; break;
76
- case 4: _.label++; return { value: op[1], done: false };
77
- case 5: _.label++; y = op[1]; op = [0]; continue;
78
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
79
- default:
80
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
81
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
82
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
83
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
84
- if (t[2]) _.ops.pop();
85
- _.trys.pop(); continue;
86
- }
87
- op = body.call(thisArg, _);
88
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
89
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
90
- }
91
- }
92
-
93
- function getSchemaString(table) {
94
- var primKeyAndIndexes = [table.schema.primKey].concat(table.schema.indexes);
95
- return primKeyAndIndexes.map(function (index) { return index.src; }).join(',');
96
- }
97
- function extractDbSchema(exportedDb) {
98
- var schema = {};
99
- for (var _i = 0, _a = exportedDb.tables; _i < _a.length; _i++) {
100
- var table = _a[_i];
101
- schema[table.name] = table.schema;
102
- }
103
- return schema;
104
- }
105
- function readBlobAsync(blob, type) {
106
- return new Promise(function (resolve, reject) {
107
- var reader = new FileReader();
108
- reader.onabort = function (ev) { return reject(new Error("file read aborted")); };
109
- reader.onerror = function (ev) { return reject(ev.target.error); };
110
- reader.onload = function (ev) { return resolve(ev.target.result); };
111
- if (type === 'binary')
112
- reader.readAsArrayBuffer(blob);
113
- else
114
- reader.readAsText(blob);
115
- });
116
- }
117
- function readBlobSync(blob, type) {
118
- if (typeof FileReaderSync === 'undefined') {
119
- throw new Error('FileReaderSync missing. Reading blobs synchronously requires code to run from within a web worker. Use TSON.encapsulateAsync() to do it from the main thread.');
120
- }
121
- var reader = new FileReaderSync(); // Requires worker environment
122
- var data = type === 'binary' ?
123
- reader.readAsArrayBuffer(blob) :
124
- reader.readAsText(blob);
125
- return data;
126
- }
127
-
128
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
129
-
130
- function createCommonjsModule(fn, module) {
131
- return module = { exports: {} }, fn(module, module.exports), module.exports;
132
- }
133
-
134
- var typeson = createCommonjsModule(function (module, exports) {
135
- (function (global, factory) {
136
- module.exports = factory() ;
137
- }(commonjsGlobal, (function () {
138
- function _typeof(obj) {
139
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
140
- _typeof = function (obj) {
141
- return typeof obj;
142
- };
143
- } else {
144
- _typeof = function (obj) {
145
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
146
- };
147
- }
148
-
149
- return _typeof(obj);
150
- }
151
-
152
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
153
- try {
154
- var info = gen[key](arg);
155
- var value = info.value;
156
- } catch (error) {
157
- reject(error);
158
- return;
159
- }
160
-
161
- if (info.done) {
162
- resolve(value);
163
- } else {
164
- Promise.resolve(value).then(_next, _throw);
165
- }
166
- }
167
-
168
- function _asyncToGenerator(fn) {
169
- return function () {
170
- var self = this,
171
- args = arguments;
172
- return new Promise(function (resolve, reject) {
173
- var gen = fn.apply(self, args);
174
-
175
- function _next(value) {
176
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
177
- }
178
-
179
- function _throw(err) {
180
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
181
- }
182
-
183
- _next(undefined);
184
- });
185
- };
186
- }
187
-
188
- function _classCallCheck(instance, Constructor) {
189
- if (!(instance instanceof Constructor)) {
190
- throw new TypeError("Cannot call a class as a function");
191
- }
192
- }
193
-
194
- function _defineProperties(target, props) {
195
- for (var i = 0; i < props.length; i++) {
196
- var descriptor = props[i];
197
- descriptor.enumerable = descriptor.enumerable || false;
198
- descriptor.configurable = true;
199
- if ("value" in descriptor) descriptor.writable = true;
200
- Object.defineProperty(target, descriptor.key, descriptor);
201
- }
202
- }
203
-
204
- function _createClass(Constructor, protoProps, staticProps) {
205
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
206
- if (staticProps) _defineProperties(Constructor, staticProps);
207
- return Constructor;
208
- }
209
-
210
- function _defineProperty(obj, key, value) {
211
- if (key in obj) {
212
- Object.defineProperty(obj, key, {
213
- value: value,
214
- enumerable: true,
215
- configurable: true,
216
- writable: true
217
- });
218
- } else {
219
- obj[key] = value;
220
- }
221
-
222
- return obj;
223
- }
224
-
225
- function ownKeys(object, enumerableOnly) {
226
- var keys = Object.keys(object);
227
-
228
- if (Object.getOwnPropertySymbols) {
229
- var symbols = Object.getOwnPropertySymbols(object);
230
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
231
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
232
- });
233
- keys.push.apply(keys, symbols);
234
- }
235
-
236
- return keys;
237
- }
238
-
239
- function _objectSpread2(target) {
240
- for (var i = 1; i < arguments.length; i++) {
241
- var source = arguments[i] != null ? arguments[i] : {};
242
-
243
- if (i % 2) {
244
- ownKeys(Object(source), true).forEach(function (key) {
245
- _defineProperty(target, key, source[key]);
246
- });
247
- } else if (Object.getOwnPropertyDescriptors) {
248
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
249
- } else {
250
- ownKeys(Object(source)).forEach(function (key) {
251
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
252
- });
253
- }
254
- }
255
-
256
- return target;
257
- }
258
-
259
- function _slicedToArray(arr, i) {
260
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
261
- }
262
-
263
- function _toConsumableArray(arr) {
264
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
265
- }
266
-
267
- function _arrayWithoutHoles(arr) {
268
- if (Array.isArray(arr)) {
269
- for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
270
-
271
- return arr2;
272
- }
273
- }
274
-
275
- function _arrayWithHoles(arr) {
276
- if (Array.isArray(arr)) return arr;
277
- }
278
-
279
- function _iterableToArray(iter) {
280
- if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
281
- }
282
-
283
- function _iterableToArrayLimit(arr, i) {
284
- if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
285
- return;
286
- }
287
-
288
- var _arr = [];
289
- var _n = true;
290
- var _d = false;
291
- var _e = undefined;
292
-
293
- try {
294
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
295
- _arr.push(_s.value);
296
-
297
- if (i && _arr.length === i) break;
298
- }
299
- } catch (err) {
300
- _d = true;
301
- _e = err;
302
- } finally {
303
- try {
304
- if (!_n && _i["return"] != null) _i["return"]();
305
- } finally {
306
- if (_d) throw _e;
307
- }
308
- }
309
-
310
- return _arr;
311
- }
312
-
313
- function _nonIterableSpread() {
314
- throw new TypeError("Invalid attempt to spread non-iterable instance");
315
- }
316
-
317
- function _nonIterableRest() {
318
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
319
- }
320
-
321
- /**
322
- * We keep this function minimized so if using two instances of this
323
- * library, where one is minimized and one is not, it will still work
324
- * with `hasConstructorOf`.
325
- * With ES6 classes, we may be able to simply use `class TypesonPromise
326
- * extends Promise` and add a string tag for detection.
327
- * @param {function} f
328
- */
329
- // eslint-disable-next-line max-len
330
- // eslint-disable-next-line block-spacing, space-before-function-paren, space-before-blocks, space-infix-ops, semi, promise/avoid-new
331
- var TypesonPromise = function TypesonPromise(f) {
332
- _classCallCheck(this, TypesonPromise);
333
-
334
- this.p = new Promise(f);
335
- }; // eslint-disable-next-line max-len
336
- // class TypesonPromise extends Promise {get[Symbol.toStringTag](){return 'TypesonPromise'};} // eslint-disable-line keyword-spacing, space-before-function-paren, space-before-blocks, block-spacing, semi
337
-
338
-
339
- TypesonPromise.__typeson__type__ = 'TypesonPromise'; // Note: core-js-bundle provides a `Symbol` polyfill
340
-
341
- /* istanbul ignore else */
342
-
343
- if (typeof Symbol !== 'undefined') {
344
- // Ensure `isUserObject` will return `false` for `TypesonPromise`
345
- TypesonPromise.prototype[Symbol.toStringTag] = 'TypesonPromise';
346
- }
347
- /**
348
- *
349
- * @param {function} [onFulfilled]
350
- * @param {function} [onRejected]
351
- * @returns {TypesonPromise}
352
- */
353
-
354
-
355
- TypesonPromise.prototype.then = function (onFulfilled, onRejected) {
356
- var _this = this;
357
-
358
- return new TypesonPromise(function (typesonResolve, typesonReject) {
359
- // eslint-disable-next-line promise/catch-or-return
360
- _this.p.then(function (res) {
361
- // eslint-disable-next-line promise/always-return
362
- typesonResolve(onFulfilled ? onFulfilled(res) : res);
363
- })["catch"](function (res) {
364
- return onRejected ? onRejected(res) : Promise.reject(res);
365
- }).then(typesonResolve, typesonReject);
366
- });
367
- };
368
- /**
369
- *
370
- * @param {function} onRejected
371
- * @returns {TypesonPromise}
372
- */
373
-
374
-
375
- TypesonPromise.prototype["catch"] = function (onRejected) {
376
- return this.then(null, onRejected);
377
- };
378
- /**
379
- *
380
- * @param {Any} v
381
- * @returns {TypesonPromise}
382
- */
383
-
384
-
385
- TypesonPromise.resolve = function (v) {
386
- return new TypesonPromise(function (typesonResolve) {
387
- typesonResolve(v);
388
- });
389
- };
390
- /**
391
- *
392
- * @param {Any} v
393
- * @returns {TypesonPromise}
394
- */
395
-
396
-
397
- TypesonPromise.reject = function (v) {
398
- return new TypesonPromise(function (typesonResolve, typesonReject) {
399
- typesonReject(v);
400
- });
401
- };
402
-
403
- ['all', 'race'].forEach(function (meth) {
404
- /**
405
- *
406
- * @param {Promise[]} promArr
407
- * @returns {TypesonPromise}
408
- */
409
- TypesonPromise[meth] = function (promArr) {
410
- return new TypesonPromise(function (typesonResolve, typesonReject) {
411
- // eslint-disable-next-line promise/catch-or-return
412
- Promise[meth](promArr.map(function (prom) {
413
- return prom && prom.constructor && prom.constructor.__typeson__type__ === 'TypesonPromise' ? prom.p : prom;
414
- })).then(typesonResolve, typesonReject);
415
- });
416
- };
417
- });
418
-
419
- var _ref = {},
420
- toStr = _ref.toString,
421
- hasOwn = {}.hasOwnProperty,
422
- getProto = Object.getPrototypeOf,
423
- fnToString = hasOwn.toString;
424
- /**
425
- * Second argument not in use internally, but provided for utility.
426
- * @param {Any} v
427
- * @param {boolean} catchCheck
428
- * @returns {boolean}
429
- */
430
-
431
- function isThenable(v, catchCheck) {
432
- return isObject(v) && typeof v.then === 'function' && (!catchCheck || typeof v["catch"] === 'function');
433
- }
434
- /**
435
- *
436
- * @param {Any} val
437
- * @returns {string}
438
- */
439
-
440
-
441
- function toStringTag(val) {
442
- return toStr.call(val).slice(8, -1);
443
- }
444
- /**
445
- * This function is dependent on both constructors
446
- * being identical so any minimization is expected of both.
447
- * @param {Any} a
448
- * @param {function} b
449
- * @returns {boolean}
450
- */
451
-
452
-
453
- function hasConstructorOf(a, b) {
454
- if (!a || _typeof(a) !== 'object') {
455
- return false;
456
- }
457
-
458
- var proto = getProto(a);
459
-
460
- if (!proto) {
461
- return b === null;
462
- }
463
-
464
- var Ctor = hasOwn.call(proto, 'constructor') && proto.constructor;
465
-
466
- if (typeof Ctor !== 'function') {
467
- return b === null;
468
- }
469
-
470
- if (b === Ctor) {
471
- return true;
472
- }
473
-
474
- if (b !== null && fnToString.call(Ctor) === fnToString.call(b)) {
475
- return true;
476
- }
477
-
478
- if (typeof b === 'function' && typeof Ctor.__typeson__type__ === 'string' && Ctor.__typeson__type__ === b.__typeson__type__) {
479
- return true;
480
- }
481
-
482
- return false;
483
- }
484
- /**
485
- *
486
- * @param {Any} val
487
- * @returns {boolean}
488
- */
489
-
490
-
491
- function isPlainObject(val) {
492
- // Mirrors jQuery's
493
- if (!val || toStringTag(val) !== 'Object') {
494
- return false;
495
- }
496
-
497
- var proto = getProto(val);
498
-
499
- if (!proto) {
500
- // `Object.create(null)`
501
- return true;
502
- }
503
-
504
- return hasConstructorOf(val, Object);
505
- }
506
- /**
507
- *
508
- * @param {Any} val
509
- * @returns {boolean}
510
- */
511
-
512
-
513
- function isUserObject(val) {
514
- if (!val || toStringTag(val) !== 'Object') {
515
- return false;
516
- }
517
-
518
- var proto = getProto(val);
519
-
520
- if (!proto) {
521
- // `Object.create(null)`
522
- return true;
523
- }
524
-
525
- return hasConstructorOf(val, Object) || isUserObject(proto);
526
- }
527
- /**
528
- *
529
- * @param {Any} v
530
- * @returns {boolean}
531
- */
532
-
533
-
534
- function isObject(v) {
535
- return v && _typeof(v) === 'object';
536
- }
537
- /**
538
- *
539
- * @param {string} keyPathComponent
540
- * @returns {string}
541
- */
542
-
543
-
544
- function escapeKeyPathComponent(keyPathComponent) {
545
- return keyPathComponent.replace(/~/g, '~0').replace(/\./g, '~1');
546
- }
547
- /**
548
- *
549
- * @param {string} keyPathComponent
550
- * @returns {string}
551
- */
552
-
553
-
554
- function unescapeKeyPathComponent(keyPathComponent) {
555
- return keyPathComponent.replace(/~1/g, '.').replace(/~0/g, '~');
556
- }
557
- /**
558
- * @param {PlainObject|GenericArray} obj
559
- * @param {string} keyPath
560
- * @returns {Any}
561
- */
562
-
563
-
564
- function getByKeyPath(obj, keyPath) {
565
- if (keyPath === '') {
566
- return obj;
567
- }
568
-
569
- var period = keyPath.indexOf('.');
570
-
571
- if (period > -1) {
572
- var innerObj = obj[unescapeKeyPathComponent(keyPath.slice(0, period))];
573
- return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.slice(period + 1));
574
- }
575
-
576
- return obj[unescapeKeyPathComponent(keyPath)];
577
- }
578
- /**
579
- *
580
- * @param {PlainObject} obj
581
- * @param {string} keyPath
582
- * @param {Any} value
583
- * @returns {Any}
584
- */
585
-
586
-
587
- function setAtKeyPath(obj, keyPath, value) {
588
- if (keyPath === '') {
589
- return value;
590
- }
591
-
592
- var period = keyPath.indexOf('.');
593
-
594
- if (period > -1) {
595
- var innerObj = obj[unescapeKeyPathComponent(keyPath.slice(0, period))];
596
- return setAtKeyPath(innerObj, keyPath.slice(period + 1), value);
597
- }
598
-
599
- obj[unescapeKeyPathComponent(keyPath)] = value;
600
- return obj;
601
- }
602
- /**
603
- *
604
- * @param {external:JSON} value
605
- * @returns {"null"|"array"|"undefined"|"boolean"|"number"|"string"|
606
- * "object"|"symbol"}
607
- */
608
-
609
-
610
- function getJSONType(value) {
611
- return value === null ? 'null' : Array.isArray(value) ? 'array' : _typeof(value);
612
- }
613
-
614
- var keys = Object.keys,
615
- isArray = Array.isArray,
616
- hasOwn$1 = {}.hasOwnProperty,
617
- internalStateObjPropsToIgnore = ['type', 'replaced', 'iterateIn', 'iterateUnsetNumeric'];
618
- /**
619
- * Handle plain object revivers first so reference setting can use
620
- * revived type (e.g., array instead of object); assumes revived
621
- * has same structure or will otherwise break subsequent references.
622
- * @param {PlainObjectType} a
623
- * @param {PlainObjectType} b
624
- * @returns {1|-1|boolean}
625
- */
626
-
627
- function nestedPathsFirst(a, b) {
628
- if (a.keypath === '') {
629
- return -1;
630
- }
631
-
632
- var as = a.keypath.match(/\./g) || 0;
633
- var bs = b.keypath.match(/\./g) || 0;
634
-
635
- if (as) {
636
- as = as.length;
637
- }
638
-
639
- if (bs) {
640
- bs = bs.length;
641
- }
642
-
643
- return as > bs ? -1 : as < bs ? 1 : a.keypath < b.keypath ? -1 : a.keypath > b.keypath;
644
- }
645
- /**
646
- * An instance of this class can be used to call `stringify()` and `parse()`.
647
- * Typeson resolves cyclic references by default. Can also be extended to
648
- * support custom types using the register() method.
649
- *
650
- * @class
651
- * @param {{cyclic: boolean}} [options] - if cyclic (default true),
652
- * cyclic references will be handled gracefully.
653
- */
654
-
655
-
656
- var Typeson =
657
- /*#__PURE__*/
658
- function () {
659
- function Typeson(options) {
660
- _classCallCheck(this, Typeson);
661
-
662
- this.options = options; // Replacers signature: replace (value). Returns falsy if not
663
- // replacing. Otherwise ['Date', value.getTime()]
664
-
665
- this.plainObjectReplacers = [];
666
- this.nonplainObjectReplacers = []; // Revivers: [{type => reviver}, {plain: boolean}].
667
- // Sample: [{'Date': value => new Date(value)}, {plain: false}]
668
-
669
- this.revivers = {};
670
- /** Types registered via `register()`. */
671
-
672
- this.types = {};
673
- }
674
- /**
675
- * @typedef {null|boolean|number|string|GenericArray|PlainObject} JSON
676
- */
677
-
678
- /**
679
- * @callback JSONReplacer
680
- * @param {""|string} key
681
- * @param {JSON} value
682
- * @returns {number|string|boolean|null|PlainObject|undefined}
683
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The%20replacer%20parameter
684
- */
685
-
686
- /**
687
- * Serialize given object to Typeson.
688
- * Initial arguments work identical to those of `JSON.stringify`.
689
- * The `replacer` argument has nothing to do with our replacers.
690
- * @param {Any} obj
691
- * @param {JSONReplacer|string[]} replacer
692
- * @param {number|string} space
693
- * @param {object} opts
694
- * @returns {string|Promise} Promise resolves to a string
695
- */
696
-
697
-
698
- _createClass(Typeson, [{
699
- key: "stringify",
700
- value: function stringify(obj, replacer, space, opts) {
701
- opts = _objectSpread2({}, this.options, {}, opts, {
702
- stringification: true
703
- });
704
- var encapsulated = this.encapsulate(obj, null, opts);
705
-
706
- if (isArray(encapsulated)) {
707
- return JSON.stringify(encapsulated[0], replacer, space);
708
- }
709
-
710
- return encapsulated.then(function (res) {
711
- return JSON.stringify(res, replacer, space);
712
- });
713
- }
714
- /**
715
- * Also sync but throws on non-sync result.
716
- * @param {Any} obj
717
- * @param {JSONReplacer|string[]} replacer
718
- * @param {number|string} space
719
- * @param {object} opts
720
- * @returns {string}
721
- */
722
-
723
- }, {
724
- key: "stringifySync",
725
- value: function stringifySync(obj, replacer, space, opts) {
726
- return this.stringify(obj, replacer, space, _objectSpread2({
727
- throwOnBadSyncType: true
728
- }, opts, {
729
- sync: true
730
- }));
731
- }
732
- /**
733
- *
734
- * @param {Any} obj
735
- * @param {JSONReplacer|string[]} replacer
736
- * @param {number|string} space
737
- * @param {object} opts
738
- * @returns {Promise<string>}
739
- */
740
-
741
- }, {
742
- key: "stringifyAsync",
743
- value: function stringifyAsync(obj, replacer, space, opts) {
744
- return this.stringify(obj, replacer, space, _objectSpread2({
745
- throwOnBadSyncType: true
746
- }, opts, {
747
- sync: false
748
- }));
749
- }
750
- /**
751
- * Parse Typeson back into an obejct.
752
- * Initial arguments works identical to those of `JSON.parse()`.
753
- * @param {string} text
754
- * @param {function} reviver This JSON reviver has nothing to do with
755
- * our revivers.
756
- * @param {object} opts
757
- * @returns {external:JSON}
758
- */
759
-
760
- }, {
761
- key: "parse",
762
- value: function parse(text, reviver, opts) {
763
- opts = _objectSpread2({}, this.options, {}, opts, {
764
- parse: true
765
- });
766
- return this.revive(JSON.parse(text, reviver), opts);
767
- }
768
- /**
769
- * Also sync but throws on non-sync result.
770
- * @param {string} text
771
- * @param {function} reviver This JSON reviver has nothing to do with
772
- * our revivers.
773
- * @param {object} opts
774
- * @returns {external:JSON}
775
- */
776
-
777
- }, {
778
- key: "parseSync",
779
- value: function parseSync(text, reviver, opts) {
780
- return this.parse(text, reviver, _objectSpread2({
781
- throwOnBadSyncType: true
782
- }, opts, {
783
- sync: true
784
- }));
785
- }
786
- /**
787
- * @param {string} text
788
- * @param {function} reviver This JSON reviver has nothing to do with
789
- * our revivers.
790
- * @param {object} opts
791
- * @returns {Promise} Resolves to `external:JSON`
792
- */
793
-
794
- }, {
795
- key: "parseAsync",
796
- value: function parseAsync(text, reviver, opts) {
797
- return this.parse(text, reviver, _objectSpread2({
798
- throwOnBadSyncType: true
799
- }, opts, {
800
- sync: false
801
- }));
802
- }
803
- /**
804
- *
805
- * @param {Any} obj
806
- * @param {object} stateObj
807
- * @param {object} [opts={}]
808
- * @returns {string[]|false}
809
- */
810
-
811
- }, {
812
- key: "specialTypeNames",
813
- value: function specialTypeNames(obj, stateObj) {
814
- var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
815
- opts.returnTypeNames = true;
816
- return this.encapsulate(obj, stateObj, opts);
817
- }
818
- /**
819
- *
820
- * @param {Any} obj
821
- * @param {PlainObject} stateObj
822
- * @param {PlainObject} [opts={}]
823
- * @returns {Promise|GenericArray|PlainObject|string|false}
824
- */
825
-
826
- }, {
827
- key: "rootTypeName",
828
- value: function rootTypeName(obj, stateObj) {
829
- var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
830
- opts.iterateNone = true;
831
- return this.encapsulate(obj, stateObj, opts);
832
- }
833
- /**
834
- * Encapsulate a complex object into a plain Object by replacing
835
- * registered types with plain objects representing the types data.
836
- *
837
- * This method is used internally by `Typeson.stringify()`.
838
- * @param {Any} obj - Object to encapsulate.
839
- * @param {PlainObject} stateObj
840
- * @param {PlainObject} opts
841
- * @returns {Promise|GenericArray|PlainObject|string|false}
842
- */
843
-
844
- }, {
845
- key: "encapsulate",
846
- value: function encapsulate(obj, stateObj, opts) {
847
- opts = _objectSpread2({
848
- sync: true
849
- }, this.options, {}, opts);
850
- var _opts = opts,
851
- sync = _opts.sync;
852
- var that = this,
853
- types = {},
854
- refObjs = [],
855
- // For checking cyclic references
856
- refKeys = [],
857
- // For checking cyclic references
858
- promisesDataRoot = []; // Clone the object deeply while at the same time replacing any
859
- // special types or cyclic reference:
860
-
861
- var cyclic = 'cyclic' in opts ? opts.cyclic : true;
862
- var _opts2 = opts,
863
- encapsulateObserver = _opts2.encapsulateObserver;
864
-
865
- var ret = _encapsulate('', obj, cyclic, stateObj || {}, promisesDataRoot);
866
- /**
867
- *
868
- * @param {Any} ret
869
- * @returns {GenericArray|PlainObject|string|false}
870
- */
871
-
872
-
873
- function finish(ret) {
874
- // Add `$types` to result only if we ever bumped into a
875
- // special type (or special case where object has own `$types`)
876
- var typeNames = Object.values(types);
877
-
878
- if (opts.iterateNone) {
879
- if (typeNames.length) {
880
- return typeNames[0];
881
- }
882
-
883
- return Typeson.getJSONType(ret);
884
- }
885
-
886
- if (typeNames.length) {
887
- if (opts.returnTypeNames) {
888
- return _toConsumableArray(new Set(typeNames));
889
- } // Special if array (or a primitive) was serialized
890
- // because JSON would ignore custom `$types` prop on it
891
-
892
-
893
- if (!ret || !isPlainObject(ret) || // Also need to handle if this is an object with its
894
- // own `$types` property (to avoid ambiguity)
895
- hasOwn$1.call(ret, '$types')) {
896
- ret = {
897
- $: ret,
898
- $types: {
899
- $: types
900
- }
901
- };
902
- } else {
903
- ret.$types = types;
904
- } // No special types
905
-
906
- } else if (isObject(ret) && hasOwn$1.call(ret, '$types')) {
907
- ret = {
908
- $: ret,
909
- $types: true
910
- };
911
- }
912
-
913
- if (opts.returnTypeNames) {
914
- return false;
915
- }
916
-
917
- return ret;
918
- }
919
- /**
920
- *
921
- * @param {Any} ret
922
- * @param {GenericArray} promisesData
923
- * @returns {Promise<Any>}
924
- */
925
-
926
-
927
- function checkPromises(_x, _x2) {
928
- return _checkPromises.apply(this, arguments);
929
- }
930
- /**
931
- *
932
- * @param {object} stateObj
933
- * @param {object} ownKeysObj
934
- * @param {function} cb
935
- * @returns {undefined}
936
- */
937
-
938
-
939
- function _checkPromises() {
940
- _checkPromises = _asyncToGenerator(
941
- /*#__PURE__*/
942
- regeneratorRuntime.mark(function _callee2(ret, promisesData) {
943
- var promResults;
944
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
945
- while (1) {
946
- switch (_context2.prev = _context2.next) {
947
- case 0:
948
- _context2.next = 2;
949
- return Promise.all(promisesData.map(function (pd) {
950
- return pd[1].p;
951
- }));
952
-
953
- case 2:
954
- promResults = _context2.sent;
955
- _context2.next = 5;
956
- return Promise.all(promResults.map(
957
- /*#__PURE__*/
958
- function () {
959
- var _ref = _asyncToGenerator(
960
- /*#__PURE__*/
961
- regeneratorRuntime.mark(function _callee(promResult) {
962
- var newPromisesData, _promisesData$splice, _promisesData$splice2, prData, _prData, keyPath, cyclic, stateObj, parentObj, key, detectedType, encaps, isTypesonPromise, encaps2;
963
-
964
- return regeneratorRuntime.wrap(function _callee$(_context) {
965
- while (1) {
966
- switch (_context.prev = _context.next) {
967
- case 0:
968
- newPromisesData = [];
969
- _promisesData$splice = promisesData.splice(0, 1), _promisesData$splice2 = _slicedToArray(_promisesData$splice, 1), prData = _promisesData$splice2[0];
970
- _prData = _slicedToArray(prData, 7), keyPath = _prData[0], cyclic = _prData[2], stateObj = _prData[3], parentObj = _prData[4], key = _prData[5], detectedType = _prData[6];
971
- encaps = _encapsulate(keyPath, promResult, cyclic, stateObj, newPromisesData, true, detectedType);
972
- isTypesonPromise = hasConstructorOf(encaps, TypesonPromise); // Handle case where an embedded custom type itself
973
- // returns a `Typeson.Promise`
974
-
975
- if (!(keyPath && isTypesonPromise)) {
976
- _context.next = 11;
977
- break;
978
- }
979
-
980
- _context.next = 8;
981
- return encaps.p;
982
-
983
- case 8:
984
- encaps2 = _context.sent;
985
- parentObj[key] = encaps2;
986
- return _context.abrupt("return", checkPromises(ret, newPromisesData));
987
-
988
- case 11:
989
- if (keyPath) {
990
- parentObj[key] = encaps;
991
- } else if (isTypesonPromise) {
992
- ret = encaps.p;
993
- } else {
994
- // If this is itself a `Typeson.Promise` (because the
995
- // original value supplied was a `Promise` or
996
- // because the supplied custom type value resolved
997
- // to one), returning it below will be fine since
998
- // a `Promise` is expected anyways given current
999
- // config (and if not a `Promise`, it will be ready
1000
- // as the resolve value)
1001
- ret = encaps;
1002
- }
1003
-
1004
- return _context.abrupt("return", checkPromises(ret, newPromisesData));
1005
-
1006
- case 13:
1007
- case "end":
1008
- return _context.stop();
1009
- }
1010
- }
1011
- }, _callee);
1012
- }));
1013
-
1014
- return function (_x3) {
1015
- return _ref.apply(this, arguments);
1016
- };
1017
- }()));
1018
-
1019
- case 5:
1020
- return _context2.abrupt("return", ret);
1021
-
1022
- case 6:
1023
- case "end":
1024
- return _context2.stop();
1025
- }
1026
- }
1027
- }, _callee2);
1028
- }));
1029
- return _checkPromises.apply(this, arguments);
1030
- }
1031
-
1032
- function _adaptBuiltinStateObjectProperties(stateObj, ownKeysObj, cb) {
1033
- Object.assign(stateObj, ownKeysObj);
1034
- var vals = internalStateObjPropsToIgnore.map(function (prop) {
1035
- var tmp = stateObj[prop];
1036
- delete stateObj[prop];
1037
- return tmp;
1038
- }); // eslint-disable-next-line callback-return
1039
-
1040
- cb();
1041
- internalStateObjPropsToIgnore.forEach(function (prop, i) {
1042
- stateObj[prop] = vals[i];
1043
- });
1044
- }
1045
- /**
1046
- *
1047
- * @param {string} keypath
1048
- * @param {Any} value
1049
- * @param {boolean} cyclic
1050
- * @param {PlainObject} stateObj
1051
- * @param {boolean} promisesData
1052
- * @param {boolean} resolvingTypesonPromise
1053
- * @param {string} detectedType
1054
- * @returns {Any}
1055
- */
1056
-
1057
-
1058
- function _encapsulate(keypath, value, cyclic, stateObj, promisesData, resolvingTypesonPromise, detectedType) {
1059
- var ret;
1060
- var observerData = {};
1061
-
1062
- var $typeof = _typeof(value);
1063
-
1064
- var runObserver = encapsulateObserver ? function (obj) {
1065
- var type = detectedType || stateObj.type || Typeson.getJSONType(value);
1066
- encapsulateObserver(Object.assign(obj || observerData, {
1067
- keypath: keypath,
1068
- value: value,
1069
- cyclic: cyclic,
1070
- stateObj: stateObj,
1071
- promisesData: promisesData,
1072
- resolvingTypesonPromise: resolvingTypesonPromise,
1073
- awaitingTypesonPromise: hasConstructorOf(value, TypesonPromise)
1074
- }, {
1075
- type: type
1076
- }));
1077
- } : null;
1078
-
1079
- if (['string', 'boolean', 'number', 'undefined'].includes($typeof)) {
1080
- if (value === undefined || $typeof === 'number' && (isNaN(value) || value === -Infinity || value === Infinity)) {
1081
- if (stateObj.replaced) {
1082
- ret = value;
1083
- } else {
1084
- ret = replace(keypath, value, stateObj, promisesData, false, resolvingTypesonPromise, runObserver);
1085
- }
1086
-
1087
- if (ret !== value) {
1088
- observerData = {
1089
- replaced: ret
1090
- };
1091
- }
1092
- } else {
1093
- ret = value;
1094
- }
1095
-
1096
- if (runObserver) {
1097
- runObserver();
1098
- }
1099
-
1100
- return ret;
1101
- }
1102
-
1103
- if (value === null) {
1104
- if (runObserver) {
1105
- runObserver();
1106
- }
1107
-
1108
- return value;
1109
- }
1110
-
1111
- if (cyclic && !stateObj.iterateIn && !stateObj.iterateUnsetNumeric && value && _typeof(value) === 'object') {
1112
- // Options set to detect cyclic references and be able
1113
- // to rewrite them.
1114
- var refIndex = refObjs.indexOf(value);
1115
-
1116
- if (refIndex < 0) {
1117
- if (cyclic === true) {
1118
- refObjs.push(value);
1119
- refKeys.push(keypath);
1120
- }
1121
- } else {
1122
- types[keypath] = '#';
1123
-
1124
- if (runObserver) {
1125
- runObserver({
1126
- cyclicKeypath: refKeys[refIndex]
1127
- });
1128
- }
1129
-
1130
- return '#' + refKeys[refIndex];
1131
- }
1132
- }
1133
-
1134
- var isPlainObj = isPlainObject(value);
1135
- var isArr = isArray(value);
1136
- var replaced = // Running replace will cause infinite loop as will test
1137
- // positive again
1138
- (isPlainObj || isArr) && (!that.plainObjectReplacers.length || stateObj.replaced) || stateObj.iterateIn ? // Optimization: if plain object and no plain-object
1139
- // replacers, don't try finding a replacer
1140
- value : replace(keypath, value, stateObj, promisesData, isPlainObj || isArr, null, runObserver);
1141
- var clone;
1142
-
1143
- if (replaced !== value) {
1144
- ret = replaced;
1145
- observerData = {
1146
- replaced: replaced
1147
- };
1148
- } else {
1149
- // eslint-disable-next-line no-lonely-if
1150
- if (keypath === '' && hasConstructorOf(value, TypesonPromise)) {
1151
- promisesData.push([keypath, value, cyclic, stateObj, undefined, undefined, stateObj.type]);
1152
- ret = value;
1153
- } else if (isArr && stateObj.iterateIn !== 'object' || stateObj.iterateIn === 'array') {
1154
- clone = new Array(value.length);
1155
- observerData = {
1156
- clone: clone
1157
- };
1158
- } else if (!['function', 'symbol'].includes(_typeof(value)) && !('toJSON' in value) && !hasConstructorOf(value, TypesonPromise) && !hasConstructorOf(value, Promise) && !hasConstructorOf(value, ArrayBuffer) || isPlainObj || stateObj.iterateIn === 'object') {
1159
- clone = {};
1160
-
1161
- if (stateObj.addLength) {
1162
- clone.length = value.length;
1163
- }
1164
-
1165
- observerData = {
1166
- clone: clone
1167
- };
1168
- } else {
1169
- ret = value; // Only clone vanilla objects and arrays
1170
- }
1171
- }
1172
-
1173
- if (runObserver) {
1174
- runObserver();
1175
- }
1176
-
1177
- if (opts.iterateNone) {
1178
- return clone || ret;
1179
- }
1180
-
1181
- if (!clone) {
1182
- return ret;
1183
- } // Iterate object or array
1184
-
1185
-
1186
- if (stateObj.iterateIn) {
1187
- var _loop = function _loop(key) {
1188
- var ownKeysObj = {
1189
- ownKeys: hasOwn$1.call(value, key)
1190
- };
1191
-
1192
- _adaptBuiltinStateObjectProperties(stateObj, ownKeysObj, function () {
1193
- var kp = keypath + (keypath ? '.' : '') + escapeKeyPathComponent(key);
1194
-
1195
- var val = _encapsulate(kp, value[key], Boolean(cyclic), stateObj, promisesData, resolvingTypesonPromise);
1196
-
1197
- if (hasConstructorOf(val, TypesonPromise)) {
1198
- promisesData.push([kp, val, Boolean(cyclic), stateObj, clone, key, stateObj.type]);
1199
- } else if (val !== undefined) {
1200
- clone[key] = val;
1201
- }
1202
- });
1203
- };
1204
-
1205
- // eslint-disable-next-line guard-for-in
1206
- for (var key in value) {
1207
- _loop(key);
1208
- }
1209
-
1210
- if (runObserver) {
1211
- runObserver({
1212
- endIterateIn: true,
1213
- end: true
1214
- });
1215
- }
1216
- } else {
1217
- // Note: Non-indexes on arrays won't survive stringify so
1218
- // somewhat wasteful for arrays, but so too is iterating
1219
- // all numeric indexes on sparse arrays when not wanted
1220
- // or filtering own keys for positive integers
1221
- keys(value).forEach(function (key) {
1222
- var kp = keypath + (keypath ? '.' : '') + escapeKeyPathComponent(key);
1223
- var ownKeysObj = {
1224
- ownKeys: true
1225
- };
1226
-
1227
- _adaptBuiltinStateObjectProperties(stateObj, ownKeysObj, function () {
1228
- var val = _encapsulate(kp, value[key], Boolean(cyclic), stateObj, promisesData, resolvingTypesonPromise);
1229
-
1230
- if (hasConstructorOf(val, TypesonPromise)) {
1231
- promisesData.push([kp, val, Boolean(cyclic), stateObj, clone, key, stateObj.type]);
1232
- } else if (val !== undefined) {
1233
- clone[key] = val;
1234
- }
1235
- });
1236
- });
1237
-
1238
- if (runObserver) {
1239
- runObserver({
1240
- endIterateOwn: true,
1241
- end: true
1242
- });
1243
- }
1244
- } // Iterate array for non-own numeric properties (we can't
1245
- // replace the prior loop though as it iterates non-integer
1246
- // keys)
1247
-
1248
-
1249
- if (stateObj.iterateUnsetNumeric) {
1250
- var vl = value.length;
1251
-
1252
- var _loop2 = function _loop2(i) {
1253
- if (!(i in value)) {
1254
- // No need to escape numeric
1255
- var kp = keypath + (keypath ? '.' : '') + i;
1256
- var ownKeysObj = {
1257
- ownKeys: false
1258
- };
1259
-
1260
- _adaptBuiltinStateObjectProperties(stateObj, ownKeysObj, function () {
1261
- var val = _encapsulate(kp, undefined, Boolean(cyclic), stateObj, promisesData, resolvingTypesonPromise);
1262
-
1263
- if (hasConstructorOf(val, TypesonPromise)) {
1264
- promisesData.push([kp, val, Boolean(cyclic), stateObj, clone, i, stateObj.type]);
1265
- } else if (val !== undefined) {
1266
- clone[i] = val;
1267
- }
1268
- });
1269
- }
1270
- };
1271
-
1272
- for (var i = 0; i < vl; i++) {
1273
- _loop2(i);
1274
- }
1275
-
1276
- if (runObserver) {
1277
- runObserver({
1278
- endIterateUnsetNumeric: true,
1279
- end: true
1280
- });
1281
- }
1282
- }
1283
-
1284
- return clone;
1285
- }
1286
- /**
1287
- *
1288
- * @param {string} keypath
1289
- * @param {Any} value
1290
- * @param {PlainObject} stateObj
1291
- * @param {GenericArray} promisesData
1292
- * @param {boolean} plainObject
1293
- * @param {boolean} resolvingTypesonPromise
1294
- * @param {function} [runObserver]
1295
- * @returns {*}
1296
- */
1297
-
1298
-
1299
- function replace(keypath, value, stateObj, promisesData, plainObject, resolvingTypesonPromise, runObserver) {
1300
- // Encapsulate registered types
1301
- var replacers = plainObject ? that.plainObjectReplacers : that.nonplainObjectReplacers;
1302
- var i = replacers.length;
1303
-
1304
- while (i--) {
1305
- var replacer = replacers[i];
1306
-
1307
- if (replacer.test(value, stateObj)) {
1308
- var type = replacer.type;
1309
-
1310
- if (that.revivers[type]) {
1311
- // Record the type only if a corresponding reviver
1312
- // exists. This is to support specs where only
1313
- // replacement is done.
1314
- // For example, ensuring deep cloning of the object,
1315
- // or replacing a type to its equivalent without
1316
- // the need to revive it.
1317
- var existing = types[keypath]; // type can comprise an array of types (see test
1318
- // "should support intermediate types")
1319
-
1320
- types[keypath] = existing ? [type].concat(existing) : type;
1321
- }
1322
-
1323
- Object.assign(stateObj, {
1324
- type: type,
1325
- replaced: true
1326
- });
1327
-
1328
- if ((sync || !replacer.replaceAsync) && !replacer.replace) {
1329
- if (runObserver) {
1330
- runObserver({
1331
- typeDetected: true
1332
- });
1333
- }
1334
-
1335
- return _encapsulate(keypath, value, cyclic && 'readonly', stateObj, promisesData, resolvingTypesonPromise, type);
1336
- }
1337
-
1338
- if (runObserver) {
1339
- runObserver({
1340
- replacing: true
1341
- });
1342
- } // Now, also traverse the result in case it contains its
1343
- // own types to replace
1344
-
1345
-
1346
- var replaceMethod = sync || !replacer.replaceAsync ? 'replace' : 'replaceAsync';
1347
- return _encapsulate(keypath, replacer[replaceMethod](value, stateObj), cyclic && 'readonly', stateObj, promisesData, resolvingTypesonPromise, type);
1348
- }
1349
- }
1350
-
1351
- return value;
1352
- }
1353
-
1354
- return promisesDataRoot.length ? sync && opts.throwOnBadSyncType ? function () {
1355
- throw new TypeError('Sync method requested but async result obtained');
1356
- }() : Promise.resolve(checkPromises(ret, promisesDataRoot)).then(finish) : !sync && opts.throwOnBadSyncType ? function () {
1357
- throw new TypeError('Async method requested but sync result obtained');
1358
- }() // If this is a synchronous request for stringification, yet
1359
- // a promise is the result, we don't want to resolve leading
1360
- // to an async result, so we return an array to avoid
1361
- // ambiguity
1362
- : opts.stringification && sync ? [finish(ret)] : sync ? finish(ret) : Promise.resolve(finish(ret));
1363
- }
1364
- /**
1365
- * Also sync but throws on non-sync result.
1366
- * @param {*} obj
1367
- * @param {object} stateObj
1368
- * @param {object} opts
1369
- * @returns {*}
1370
- */
1371
-
1372
- }, {
1373
- key: "encapsulateSync",
1374
- value: function encapsulateSync(obj, stateObj, opts) {
1375
- return this.encapsulate(obj, stateObj, _objectSpread2({
1376
- throwOnBadSyncType: true
1377
- }, opts, {
1378
- sync: true
1379
- }));
1380
- }
1381
- /**
1382
- * @param {*} obj
1383
- * @param {object} stateObj
1384
- * @param {object} opts
1385
- * @returns {*}
1386
- */
1387
-
1388
- }, {
1389
- key: "encapsulateAsync",
1390
- value: function encapsulateAsync(obj, stateObj, opts) {
1391
- return this.encapsulate(obj, stateObj, _objectSpread2({
1392
- throwOnBadSyncType: true
1393
- }, opts, {
1394
- sync: false
1395
- }));
1396
- }
1397
- /**
1398
- * Revive an encapsulated object.
1399
- * This method is used internally by `Typeson.parse()`.
1400
- * @param {object} obj - Object to revive. If it has `$types` member, the
1401
- * properties that are listed there will be replaced with its true type
1402
- * instead of just plain objects.
1403
- * @param {object} opts
1404
- * @throws TypeError If mismatch between sync/async type and result
1405
- * @returns {Promise|*} If async, returns a Promise that resolves to `*`
1406
- */
1407
-
1408
- }, {
1409
- key: "revive",
1410
- value: function revive(obj, opts) {
1411
- var types = obj && obj.$types; // No type info added. Revival not needed.
1412
-
1413
- if (!types) {
1414
- return obj;
1415
- } // Object happened to have own `$types` property but with
1416
- // no actual types, so we unescape and return that object
1417
-
1418
-
1419
- if (types === true) {
1420
- return obj.$;
1421
- }
1422
-
1423
- opts = _objectSpread2({
1424
- sync: true
1425
- }, this.options, {}, opts);
1426
- var _opts3 = opts,
1427
- sync = _opts3.sync;
1428
- var keyPathResolutions = [];
1429
- var stateObj = {};
1430
- var ignore$Types = true; // Special when root object is not a trivial Object, it will
1431
- // be encapsulated in `$`. It will also be encapsulated in
1432
- // `$` if it has its own `$` property to avoid ambiguity
1433
-
1434
- if (types.$ && isPlainObject(types.$)) {
1435
- obj = obj.$;
1436
- types = types.$;
1437
- ignore$Types = false;
1438
- }
1439
-
1440
- var that = this;
1441
- /**
1442
- * @callback RevivalReducer
1443
- * @param {Any} value
1444
- * @param {string} type
1445
- * @returns {Any}
1446
- */
1447
-
1448
- /**
1449
- *
1450
- * @param {string} type
1451
- * @param {Any} val
1452
- * @returns {[type]} [description]
1453
- */
1454
-
1455
- function executeReviver(type, val) {
1456
- var _ref2 = that.revivers[type] || [],
1457
- _ref3 = _slicedToArray(_ref2, 1),
1458
- reviver = _ref3[0];
1459
-
1460
- if (!reviver) {
1461
- throw new Error('Unregistered type: ' + type);
1462
- } // Only `sync` expected here, as problematic async would
1463
- // be missing both `reviver` and `reviverAsync`, and
1464
- // encapsulation shouldn't have added types, so
1465
- // should have made an early exit
1466
-
1467
-
1468
- if (sync && !('revive' in reviver)) {
1469
- // Just return value as is
1470
- return val;
1471
- }
1472
-
1473
- return reviver[sync && reviver.revive ? 'revive' : !sync && reviver.reviveAsync ? 'reviveAsync' : 'revive'](val, stateObj);
1474
- }
1475
- /**
1476
- *
1477
- * @returns {void|TypesonPromise<void>}
1478
- */
1479
-
1480
-
1481
- function revivePlainObjects() {
1482
- // const references = [];
1483
- // const reviveTypes = [];
1484
- var plainObjectTypes = [];
1485
- Object.entries(types).forEach(function (_ref4) {
1486
- var _ref5 = _slicedToArray(_ref4, 2),
1487
- keypath = _ref5[0],
1488
- type = _ref5[1];
1489
-
1490
- if (type === '#') {
1491
- /*
1492
- references.push({
1493
- keypath,
1494
- reference: getByKeyPath(obj, keypath)
1495
- });
1496
- */
1497
- return;
1498
- }
1499
-
1500
- [].concat(type).forEach(function (type) {
1501
- var _ref6 = that.revivers[type] || [null, {}],
1502
- _ref7 = _slicedToArray(_ref6, 2),
1503
- plain = _ref7[1].plain;
1504
-
1505
- if (!plain) {
1506
- // reviveTypes.push({keypath, type});
1507
- return;
1508
- }
1509
-
1510
- plainObjectTypes.push({
1511
- keypath: keypath,
1512
- type: type
1513
- });
1514
- delete types[keypath]; // Avoid repeating
1515
- });
1516
- });
1517
-
1518
- if (!plainObjectTypes.length) {
1519
- return undefined;
1520
- } // console.log(plainObjectTypes.sort(nestedPathsFirst));
1521
-
1522
- /**
1523
- * @typedef {PlainObject} PlainObjectType
1524
- * @property {string} keypath
1525
- * @property {string} type
1526
- */
1527
-
1528
-
1529
- return plainObjectTypes.sort(nestedPathsFirst).reduce(function reducer(possibleTypesonPromise, _ref8) {
1530
- var keypath = _ref8.keypath,
1531
- type = _ref8.type;
1532
-
1533
- if (isThenable(possibleTypesonPromise)) {
1534
- return possibleTypesonPromise.then(function (val) {
1535
- return reducer(val, {
1536
- keypath: keypath,
1537
- type: type
1538
- });
1539
- });
1540
- } // console.log('obj', JSON.stringify(keypath), obj);
1541
-
1542
-
1543
- var val = getByKeyPath(obj, keypath);
1544
- val = executeReviver(type, val);
1545
-
1546
- if (hasConstructorOf(val, TypesonPromise)) {
1547
- return val.then(function (v) {
1548
- var newVal = setAtKeyPath(obj, keypath, v);
1549
-
1550
- if (newVal === v) {
1551
- obj = newVal;
1552
- }
1553
-
1554
- return undefined;
1555
- });
1556
- }
1557
-
1558
- var newVal = setAtKeyPath(obj, keypath, val);
1559
-
1560
- if (newVal === val) {
1561
- obj = newVal;
1562
- }
1563
-
1564
- return undefined;
1565
- }, undefined // This argument must be explicit
1566
- ); // references.forEach(({keypath, reference}) => {});
1567
- // reviveTypes.sort(nestedPathsFirst).forEach(() => {});
1568
- }
1569
-
1570
- var revivalPromises = [];
1571
- /**
1572
- *
1573
- * @param {string} keypath
1574
- * @param {Any} value
1575
- * @param {?(Array|object)} target
1576
- * @param {Array|object} [clone]
1577
- * @param {string} [key]
1578
- * @returns {Any}
1579
- */
1580
-
1581
- function _revive(keypath, value, target, clone, key) {
1582
- if (ignore$Types && keypath === '$types') {
1583
- return undefined;
1584
- }
1585
-
1586
- var type = types[keypath];
1587
- var isArr = isArray(value);
1588
-
1589
- if (isArr || isPlainObject(value)) {
1590
- var _clone = isArr ? new Array(value.length) : {}; // Iterate object or array
1591
-
1592
-
1593
- keys(value).forEach(function (k) {
1594
- var val = _revive(keypath + (keypath ? '.' : '') + escapeKeyPathComponent(k), value[k], target || _clone, _clone, k);
1595
-
1596
- var set = function set(v) {
1597
- if (hasConstructorOf(v, Undefined)) {
1598
- _clone[k] = undefined;
1599
- } else if (v !== undefined) {
1600
- _clone[k] = v;
1601
- }
1602
-
1603
- return v;
1604
- };
1605
-
1606
- if (hasConstructorOf(val, TypesonPromise)) {
1607
- revivalPromises.push(val.then(function (ret) {
1608
- return set(ret);
1609
- }));
1610
- } else {
1611
- set(val);
1612
- }
1613
- });
1614
- value = _clone; // Try to resolve cyclic reference as soon as available
1615
-
1616
- while (keyPathResolutions.length) {
1617
- var _keyPathResolutions$ = _slicedToArray(keyPathResolutions[0], 4),
1618
- _target = _keyPathResolutions$[0],
1619
- keyPath = _keyPathResolutions$[1],
1620
- _clone2 = _keyPathResolutions$[2],
1621
- k = _keyPathResolutions$[3];
1622
-
1623
- var val = getByKeyPath(_target, keyPath); // Typeson.Undefined not expected here as not cyclic or
1624
- // `undefined`
1625
-
1626
- if (val !== undefined) {
1627
- _clone2[k] = val;
1628
- } else {
1629
- break;
1630
- }
1631
-
1632
- keyPathResolutions.splice(0, 1);
1633
- }
1634
- }
1635
-
1636
- if (!type) {
1637
- return value;
1638
- }
1639
-
1640
- if (type === '#') {
1641
- var _ret = getByKeyPath(target, value.slice(1));
1642
-
1643
- if (_ret === undefined) {
1644
- // Cyclic reference not yet available
1645
- keyPathResolutions.push([target, value.slice(1), clone, key]);
1646
- }
1647
-
1648
- return _ret;
1649
- } // `type` can be an array here
1650
-
1651
-
1652
- return [].concat(type).reduce(function reducer(val, typ) {
1653
- if (hasConstructorOf(val, TypesonPromise)) {
1654
- return val.then(function (v) {
1655
- // TypesonPromise here too
1656
- return reducer(v, typ);
1657
- });
1658
- }
1659
-
1660
- return executeReviver(typ, val);
1661
- }, value);
1662
- }
1663
- /**
1664
- *
1665
- * @param {Any} retrn
1666
- * @returns {undefined|Any}
1667
- */
1668
-
1669
-
1670
- function checkUndefined(retrn) {
1671
- return hasConstructorOf(retrn, Undefined) ? undefined : retrn;
1672
- }
1673
-
1674
- var possibleTypesonPromise = revivePlainObjects();
1675
- var ret;
1676
-
1677
- if (hasConstructorOf(possibleTypesonPromise, TypesonPromise)) {
1678
- ret = possibleTypesonPromise.then(function () {
1679
- return obj;
1680
- });
1681
- } else {
1682
- ret = _revive('', obj, null);
1683
-
1684
- if (revivalPromises.length) {
1685
- // Ensure children resolved
1686
- ret = TypesonPromise.resolve(ret).then(function (r) {
1687
- return TypesonPromise.all([// May be a TypesonPromise or not
1688
- r].concat(revivalPromises));
1689
- }).then(function (_ref9) {
1690
- var _ref10 = _slicedToArray(_ref9, 1),
1691
- r = _ref10[0];
1692
-
1693
- return r;
1694
- });
1695
- }
1696
- }
1697
-
1698
- return isThenable(ret) ? sync && opts.throwOnBadSyncType ? function () {
1699
- throw new TypeError('Sync method requested but async result obtained');
1700
- }() : hasConstructorOf(ret, TypesonPromise) ? ret.p.then(checkUndefined) : ret : !sync && opts.throwOnBadSyncType ? function () {
1701
- throw new TypeError('Async method requested but sync result obtained');
1702
- }() : sync ? checkUndefined(ret) : Promise.resolve(checkUndefined(ret));
1703
- }
1704
- /**
1705
- * Also sync but throws on non-sync result.
1706
- * @param {Any} obj
1707
- * @param {object} opts
1708
- * @returns {Any}
1709
- */
1710
-
1711
- }, {
1712
- key: "reviveSync",
1713
- value: function reviveSync(obj, opts) {
1714
- return this.revive(obj, _objectSpread2({
1715
- throwOnBadSyncType: true
1716
- }, opts, {
1717
- sync: true
1718
- }));
1719
- }
1720
- /**
1721
- * @param {Any} obj
1722
- * @param {object} opts
1723
- * @returns {Promise} Resolves to `*`
1724
- */
1725
-
1726
- }, {
1727
- key: "reviveAsync",
1728
- value: function reviveAsync(obj, opts) {
1729
- return this.revive(obj, _objectSpread2({
1730
- throwOnBadSyncType: true
1731
- }, opts, {
1732
- sync: false
1733
- }));
1734
- }
1735
- /**
1736
- * Register types.
1737
- * For examples on how to use this method, see
1738
- * {@link https://github.com/dfahlander/typeson-registry/tree/master/types}.
1739
- * @param {object.<string,Function[]>[]} typeSpecSets - Types and
1740
- * their functions [test, encapsulate, revive];
1741
- * @param {object} opts
1742
- * @returns {Typeson}
1743
- */
1744
-
1745
- }, {
1746
- key: "register",
1747
- value: function register(typeSpecSets, opts) {
1748
- opts = opts || {};
1749
- [].concat(typeSpecSets).forEach(function R(typeSpec) {
1750
- var _this = this;
1751
-
1752
- // Allow arrays of arrays of arrays...
1753
- if (isArray(typeSpec)) {
1754
- return typeSpec.map(function (typSpec) {
1755
- return R.call(_this, typSpec);
1756
- });
1757
- }
1758
-
1759
- typeSpec && keys(typeSpec).forEach(function (typeId) {
1760
- if (typeId === '#') {
1761
- throw new TypeError('# cannot be used as a type name as it is reserved ' + 'for cyclic objects');
1762
- } else if (Typeson.JSON_TYPES.includes(typeId)) {
1763
- throw new TypeError('Plain JSON object types are reserved as type names');
1764
- }
1765
-
1766
- var spec = typeSpec[typeId];
1767
- var replacers = spec && spec.testPlainObjects ? this.plainObjectReplacers : this.nonplainObjectReplacers;
1768
- var existingReplacer = replacers.filter(function (r) {
1769
- return r.type === typeId;
1770
- });
1771
-
1772
- if (existingReplacer.length) {
1773
- // Remove existing spec and replace with this one.
1774
- replacers.splice(replacers.indexOf(existingReplacer[0]), 1);
1775
- delete this.revivers[typeId];
1776
- delete this.types[typeId];
1777
- }
1778
-
1779
- if (typeof spec === 'function') {
1780
- // Support registering just a class without replacer/reviver
1781
- var Class = spec;
1782
- spec = {
1783
- test: function test(x) {
1784
- return x && x.constructor === Class;
1785
- },
1786
- replace: function replace(x) {
1787
- return _objectSpread2({}, x);
1788
- },
1789
- revive: function revive(x) {
1790
- return Object.assign(Object.create(Class.prototype), x);
1791
- }
1792
- };
1793
- } else if (isArray(spec)) {
1794
- var _spec = spec,
1795
- _spec2 = _slicedToArray(_spec, 3),
1796
- test = _spec2[0],
1797
- replace = _spec2[1],
1798
- revive = _spec2[2];
1799
-
1800
- spec = {
1801
- test: test,
1802
- replace: replace,
1803
- revive: revive
1804
- };
1805
- }
1806
-
1807
- if (!spec || !spec.test) {
1808
- return;
1809
- }
1810
-
1811
- var replacerObj = {
1812
- type: typeId,
1813
- test: spec.test.bind(spec)
1814
- };
1815
-
1816
- if (spec.replace) {
1817
- replacerObj.replace = spec.replace.bind(spec);
1818
- }
1819
-
1820
- if (spec.replaceAsync) {
1821
- replacerObj.replaceAsync = spec.replaceAsync.bind(spec);
1822
- }
1823
-
1824
- var start = typeof opts.fallback === 'number' ? opts.fallback : opts.fallback ? 0 : Infinity;
1825
-
1826
- if (spec.testPlainObjects) {
1827
- this.plainObjectReplacers.splice(start, 0, replacerObj);
1828
- } else {
1829
- this.nonplainObjectReplacers.splice(start, 0, replacerObj);
1830
- } // Todo: We might consider a testAsync type
1831
-
1832
-
1833
- if (spec.revive || spec.reviveAsync) {
1834
- var reviverObj = {};
1835
-
1836
- if (spec.revive) {
1837
- reviverObj.revive = spec.revive.bind(spec);
1838
- }
1839
-
1840
- if (spec.reviveAsync) {
1841
- reviverObj.reviveAsync = spec.reviveAsync.bind(spec);
1842
- }
1843
-
1844
- this.revivers[typeId] = [reviverObj, {
1845
- plain: spec.testPlainObjects
1846
- }];
1847
- } // Record to be retrieved via public types property.
1848
-
1849
-
1850
- this.types[typeId] = spec;
1851
- }, this);
1852
- }, this);
1853
- return this;
1854
- }
1855
- }]);
1856
-
1857
- return Typeson;
1858
- }();
1859
- /**
1860
- * We keep this function minimized so if using two instances of this
1861
- * library, where one is minimized and one is not, it will still work
1862
- * with `hasConstructorOf`.
1863
- * @class
1864
- */
1865
-
1866
-
1867
- var Undefined = function Undefined() {
1868
- _classCallCheck(this, Undefined);
1869
- }; // eslint-disable-line space-before-blocks
1870
-
1871
-
1872
- Undefined.__typeson__type__ = 'TypesonUndefined'; // The following provide classes meant to avoid clashes with other values
1873
- // To insist `undefined` should be added
1874
-
1875
- Typeson.Undefined = Undefined; // To support async encapsulation/stringification
1876
-
1877
- Typeson.Promise = TypesonPromise; // Some fundamental type-checking utilities
1878
-
1879
- Typeson.isThenable = isThenable;
1880
- Typeson.toStringTag = toStringTag;
1881
- Typeson.hasConstructorOf = hasConstructorOf;
1882
- Typeson.isObject = isObject;
1883
- Typeson.isPlainObject = isPlainObject;
1884
- Typeson.isUserObject = isUserObject;
1885
- Typeson.escapeKeyPathComponent = escapeKeyPathComponent;
1886
- Typeson.unescapeKeyPathComponent = unescapeKeyPathComponent;
1887
- Typeson.getByKeyPath = getByKeyPath;
1888
- Typeson.getJSONType = getJSONType;
1889
- Typeson.JSON_TYPES = ['null', 'boolean', 'number', 'string', 'array', 'object'];
1890
-
1891
- return Typeson;
1892
-
1893
- })));
1894
- });
1895
-
1896
- var structuredCloning = createCommonjsModule(function (module, exports) {
1897
- !function(e,t){module.exports=t();}(commonjsGlobal,(function(){function _typeof$1(e){return (_typeof$1="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck$1(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$1(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n);}}function _defineProperty$1(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ownKeys$1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n);}return r}function _toConsumableArray$1(e){return function _arrayWithoutHoles$1(e){if(Array.isArray(e))return _arrayLikeToArray$1(e)}(e)||function _iterableToArray$1(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function _unsupportedIterableToArray$1(e,t){if(!e)return;if("string"==typeof e)return _arrayLikeToArray$1(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return _arrayLikeToArray$1(e,t)}(e)||function _nonIterableSpread$1(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray$1(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function _typeof(e){return (_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function _typeof(e){return typeof e}:function _typeof(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n);}}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n);}return r}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(r),!0).forEach((function(t){_defineProperty(e,t,r[t]);})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t));}));}return e}function _slicedToArray(e,t){return function _arrayWithHoles(e){if(Array.isArray(e))return e}(e)||function _iterableToArrayLimit(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var r=[],n=!0,i=!1,o=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,o=e;}finally{try{n||null==c.return||c.return();}finally{if(i)throw o}}return r}(e,t)||_unsupportedIterableToArray(e,t)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _toConsumableArray(e){return function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}(e)||function _iterableToArray(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||_unsupportedIterableToArray(e)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return "Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var e=function TypesonPromise(e){_classCallCheck(this,TypesonPromise),this.p=new Promise(e);};e.__typeson__type__="TypesonPromise","undefined"!=typeof Symbol&&(e.prototype[Symbol.toStringTag]="TypesonPromise"),e.prototype.then=function(t,r){var n=this;return new e((function(e,i){n.p.then((function(r){e(t?t(r):r);})).catch((function(e){return r?r(e):Promise.reject(e)})).then(e,i);}))},e.prototype.catch=function(e){return this.then(null,e)},e.resolve=function(t){return new e((function(e){e(t);}))},e.reject=function(t){return new e((function(e,r){r(t);}))},["all","race"].forEach((function(t){e[t]=function(r){return new e((function(e,n){Promise[t](r.map((function(e){return e&&e.constructor&&"TypesonPromise"===e.constructor.__typeson__type__?e.p:e}))).then(e,n);}))};}));var t={}.toString,r={}.hasOwnProperty,n=Object.getPrototypeOf,i=r.toString;function isThenable(e,t){return isObject(e)&&"function"==typeof e.then&&(!t||"function"==typeof e.catch)}function toStringTag(e){return t.call(e).slice(8,-1)}function hasConstructorOf(e,t){if(!e||"object"!==_typeof(e))return !1;var o=n(e);if(!o)return null===t;var a=r.call(o,"constructor")&&o.constructor;return "function"!=typeof a?null===t:t===a||(null!==t&&i.call(a)===i.call(t)||"function"==typeof t&&"string"==typeof a.__typeson__type__&&a.__typeson__type__===t.__typeson__type__)}function isPlainObject(e){return !(!e||"Object"!==toStringTag(e))&&(!n(e)||hasConstructorOf(e,Object))}function isObject(e){return e&&"object"===_typeof(e)}function escapeKeyPathComponent(e){return e.replace(/~/g,"~0").replace(/\./g,"~1")}function unescapeKeyPathComponent(e){return e.replace(/~1/g,".").replace(/~0/g,"~")}function getByKeyPath(e,t){if(""===t)return e;var r=t.indexOf(".");if(r>-1){var n=e[unescapeKeyPathComponent(t.slice(0,r))];return void 0===n?void 0:getByKeyPath(n,t.slice(r+1))}return e[unescapeKeyPathComponent(t)]}function setAtKeyPath(e,t,r){if(""===t)return r;var n=t.indexOf(".");return n>-1?setAtKeyPath(e[unescapeKeyPathComponent(t.slice(0,n))],t.slice(n+1),r):(e[unescapeKeyPathComponent(t)]=r,e)}function _await(e,t,r){return r?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}var o=Object.keys,a=Array.isArray,c={}.hasOwnProperty,u=["type","replaced","iterateIn","iterateUnsetNumeric"];function _async(e){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];try{return Promise.resolve(e.apply(this,t))}catch(e){return Promise.reject(e)}}}function nestedPathsFirst(e,t){if(""===e.keypath)return -1;var r=e.keypath.match(/\./g)||0,n=t.keypath.match(/\./g)||0;return r&&(r=r.length),n&&(n=n.length),r>n?-1:r<n?1:e.keypath<t.keypath?-1:e.keypath>t.keypath}var s=function(){function Typeson(e){_classCallCheck(this,Typeson),this.options=e,this.plainObjectReplacers=[],this.nonplainObjectReplacers=[],this.revivers={},this.types={};}return function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}(Typeson,[{key:"stringify",value:function stringify(e,t,r,n){n=_objectSpread2(_objectSpread2(_objectSpread2({},this.options),n),{},{stringification:!0});var i=this.encapsulate(e,null,n);return a(i)?JSON.stringify(i[0],t,r):i.then((function(e){return JSON.stringify(e,t,r)}))}},{key:"stringifySync",value:function stringifySync(e,t,r,n){return this.stringify(e,t,r,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"stringifyAsync",value:function stringifyAsync(e,t,r,n){return this.stringify(e,t,r,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"parse",value:function parse(e,t,r){return r=_objectSpread2(_objectSpread2(_objectSpread2({},this.options),r),{},{parse:!0}),this.revive(JSON.parse(e,t),r)}},{key:"parseSync",value:function parseSync(e,t,r){return this.parse(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"parseAsync",value:function parseAsync(e,t,r){return this.parse(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!1}))}},{key:"specialTypeNames",value:function specialTypeNames(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return r.returnTypeNames=!0,this.encapsulate(e,t,r)}},{key:"rootTypeName",value:function rootTypeName(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return r.iterateNone=!0,this.encapsulate(e,t,r)}},{key:"encapsulate",value:function encapsulate(t,r,n){var i=_async((function(t,r){return _await(Promise.all(r.map((function(e){return e[1].p}))),(function(n){return _await(Promise.all(n.map(_async((function(n){var o=!1,a=[],c=_slicedToArray(r.splice(0,1),1),u=_slicedToArray(c[0],7),s=u[0],f=u[2],l=u[3],p=u[4],y=u[5],v=u[6],b=_encapsulate(s,n,f,l,a,!0,v),d=hasConstructorOf(b,e);return function _invoke(e,t){var r=e();return r&&r.then?r.then(t):t(r)}((function(){if(s&&d)return _await(b.p,(function(e){return p[y]=e,o=!0,i(t,a)}))}),(function(e){return o?e:(s?p[y]=b:t=d?b.p:b,i(t,a))}))})))),(function(){return t}))}))})),s=(n=_objectSpread2(_objectSpread2({sync:!0},this.options),n)).sync,f=this,l={},p=[],y=[],v=[],b=!("cyclic"in n)||n.cyclic,d=n.encapsulateObserver,h=_encapsulate("",t,b,r||{},v);function finish(e){var t=Object.values(l);if(n.iterateNone)return t.length?t[0]:Typeson.getJSONType(e);if(t.length){if(n.returnTypeNames)return _toConsumableArray(new Set(t));e&&isPlainObject(e)&&!c.call(e,"$types")?e.$types=l:e={$:e,$types:{$:l}};}else isObject(e)&&c.call(e,"$types")&&(e={$:e,$types:!0});return !n.returnTypeNames&&e}function _adaptBuiltinStateObjectProperties(e,t,r){Object.assign(e,t);var n=u.map((function(t){var r=e[t];return delete e[t],r}));r(),u.forEach((function(t,r){e[t]=n[r];}));}function _encapsulate(t,r,i,u,s,v,b){var h,g={},m=_typeof(r),O=d?function(n){var o=b||u.type||Typeson.getJSONType(r);d(Object.assign(n||g,{keypath:t,value:r,cyclic:i,stateObj:u,promisesData:s,resolvingTypesonPromise:v,awaitingTypesonPromise:hasConstructorOf(r,e)},{type:o}));}:null;if(["string","boolean","number","undefined"].includes(m))return void 0===r||Number.isNaN(r)||r===Number.NEGATIVE_INFINITY||r===Number.POSITIVE_INFINITY?(h=u.replaced?r:replace(t,r,u,s,!1,v,O))!==r&&(g={replaced:h}):h=r,O&&O(),h;if(null===r)return O&&O(),r;if(i&&!u.iterateIn&&!u.iterateUnsetNumeric&&r&&"object"===_typeof(r)){var _=p.indexOf(r);if(!(_<0))return l[t]="#",O&&O({cyclicKeypath:y[_]}),"#"+y[_];!0===i&&(p.push(r),y.push(t));}var j,S=isPlainObject(r),T=a(r),w=(S||T)&&(!f.plainObjectReplacers.length||u.replaced)||u.iterateIn?r:replace(t,r,u,s,S||T,null,O);if(w!==r?(h=w,g={replaced:w}):""===t&&hasConstructorOf(r,e)?(s.push([t,r,i,u,void 0,void 0,u.type]),h=r):T&&"object"!==u.iterateIn||"array"===u.iterateIn?(j=new Array(r.length),g={clone:j}):(["function","symbol"].includes(_typeof(r))||"toJSON"in r||hasConstructorOf(r,e)||hasConstructorOf(r,Promise)||hasConstructorOf(r,ArrayBuffer))&&!S&&"object"!==u.iterateIn?h=r:(j={},u.addLength&&(j.length=r.length),g={clone:j}),O&&O(),n.iterateNone)return j||h;if(!j)return h;if(u.iterateIn){var A=function _loop(n){var o={ownKeys:c.call(r,n)};_adaptBuiltinStateObjectProperties(u,o,(function(){var o=t+(t?".":"")+escapeKeyPathComponent(n),a=_encapsulate(o,r[n],Boolean(i),u,s,v);hasConstructorOf(a,e)?s.push([o,a,Boolean(i),u,j,n,u.type]):void 0!==a&&(j[n]=a);}));};for(var P in r)A(P);O&&O({endIterateIn:!0,end:!0});}else o(r).forEach((function(n){var o=t+(t?".":"")+escapeKeyPathComponent(n);_adaptBuiltinStateObjectProperties(u,{ownKeys:!0},(function(){var t=_encapsulate(o,r[n],Boolean(i),u,s,v);hasConstructorOf(t,e)?s.push([o,t,Boolean(i),u,j,n,u.type]):void 0!==t&&(j[n]=t);}));})),O&&O({endIterateOwn:!0,end:!0});if(u.iterateUnsetNumeric){for(var I=r.length,C=function _loop2(n){if(!(n in r)){var o=t+(t?".":"")+n;_adaptBuiltinStateObjectProperties(u,{ownKeys:!1},(function(){var t=_encapsulate(o,void 0,Boolean(i),u,s,v);hasConstructorOf(t,e)?s.push([o,t,Boolean(i),u,j,n,u.type]):void 0!==t&&(j[n]=t);}));}},N=0;N<I;N++)C(N);O&&O({endIterateUnsetNumeric:!0,end:!0});}return j}function replace(e,t,r,n,i,o,a){for(var c=i?f.plainObjectReplacers:f.nonplainObjectReplacers,u=c.length;u--;){var p=c[u];if(p.test(t,r)){var y=p.type;if(f.revivers[y]){var v=l[e];l[e]=v?[y].concat(v):y;}return Object.assign(r,{type:y,replaced:!0}),!s&&p.replaceAsync||p.replace?(a&&a({replacing:!0}),_encapsulate(e,p[s||!p.replaceAsync?"replace":"replaceAsync"](t,r),b&&"readonly",r,n,o,y)):(a&&a({typeDetected:!0}),_encapsulate(e,t,b&&"readonly",r,n,o,y))}}return t}return v.length?s&&n.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(i(h,v)).then(finish):!s&&n.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():n.stringification&&s?[finish(h)]:s?finish(h):Promise.resolve(finish(h))}},{key:"encapsulateSync",value:function encapsulateSync(e,t,r){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"encapsulateAsync",value:function encapsulateAsync(e,t,r){return this.encapsulate(e,t,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},r),{},{sync:!1}))}},{key:"revive",value:function revive(t,r){var n=t&&t.$types;if(!n)return t;if(!0===n)return t.$;var i=(r=_objectSpread2(_objectSpread2({sync:!0},this.options),r)).sync,c=[],u={},s=!0;n.$&&isPlainObject(n.$)&&(t=t.$,n=n.$,s=!1);var l=this;function executeReviver(e,t){var r=_slicedToArray(l.revivers[e]||[],1)[0];if(!r)throw new Error("Unregistered type: "+e);return i&&!("revive"in r)?t:r[i&&r.revive?"revive":!i&&r.reviveAsync?"reviveAsync":"revive"](t,u)}var p=[];function checkUndefined(e){return hasConstructorOf(e,f)?void 0:e}var y,v=function revivePlainObjects(){var r=[];if(Object.entries(n).forEach((function(e){var t=_slicedToArray(e,2),i=t[0],o=t[1];"#"!==o&&[].concat(o).forEach((function(e){_slicedToArray(l.revivers[e]||[null,{}],2)[1].plain&&(r.push({keypath:i,type:e}),delete n[i]);}));})),r.length)return r.sort(nestedPathsFirst).reduce((function reducer(r,n){var i=n.keypath,o=n.type;if(isThenable(r))return r.then((function(e){return reducer(e,{keypath:i,type:o})}));var a=getByKeyPath(t,i);if(hasConstructorOf(a=executeReviver(o,a),e))return a.then((function(e){var r=setAtKeyPath(t,i,e);r===e&&(t=r);}));var c=setAtKeyPath(t,i,a);c===a&&(t=c);}),void 0)}();return hasConstructorOf(v,e)?y=v.then((function(){return t})):(y=function _revive(t,r,i,u,l){if(!s||"$types"!==t){var y=n[t],v=a(r);if(v||isPlainObject(r)){var b=v?new Array(r.length):{};for(o(r).forEach((function(n){var o=_revive(t+(t?".":"")+escapeKeyPathComponent(n),r[n],i||b,b,n),a=function set(e){return hasConstructorOf(e,f)?b[n]=void 0:void 0!==e&&(b[n]=e),e};hasConstructorOf(o,e)?p.push(o.then((function(e){return a(e)}))):a(o);})),r=b;c.length;){var d=_slicedToArray(c[0],4),h=d[0],g=d[1],m=d[2],O=d[3],_=getByKeyPath(h,g);if(void 0===_)break;m[O]=_,c.splice(0,1);}}if(!y)return r;if("#"===y){var j=getByKeyPath(i,r.slice(1));return void 0===j&&c.push([i,r.slice(1),u,l]),j}return [].concat(y).reduce((function reducer(t,r){return hasConstructorOf(t,e)?t.then((function(e){return reducer(e,r)})):executeReviver(r,t)}),r)}}("",t,null),p.length&&(y=e.resolve(y).then((function(t){return e.all([t].concat(p))})).then((function(e){return _slicedToArray(e,1)[0]})))),isThenable(y)?i&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():hasConstructorOf(y,e)?y.p.then(checkUndefined):y:!i&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():i?checkUndefined(y):Promise.resolve(checkUndefined(y))}},{key:"reviveSync",value:function reviveSync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},t),{},{sync:!0}))}},{key:"reviveAsync",value:function reviveAsync(e,t){return this.revive(e,_objectSpread2(_objectSpread2({throwOnBadSyncType:!0},t),{},{sync:!1}))}},{key:"register",value:function register(e,t){return t=t||{},[].concat(e).forEach((function R(e){var r=this;if(a(e))return e.map((function(e){return R.call(r,e)}));e&&o(e).forEach((function(r){if("#"===r)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(Typeson.JSON_TYPES.includes(r))throw new TypeError("Plain JSON object types are reserved as type names");var n=e[r],i=n&&n.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,o=i.filter((function(e){return e.type===r}));if(o.length&&(i.splice(i.indexOf(o[0]),1),delete this.revivers[r],delete this.types[r]),"function"==typeof n){var c=n;n={test:function test(e){return e&&e.constructor===c},replace:function replace(e){return _objectSpread2({},e)},revive:function revive(e){return Object.assign(Object.create(c.prototype),e)}};}else if(a(n)){var u=_slicedToArray(n,3);n={test:u[0],replace:u[1],revive:u[2]};}if(n&&n.test){var s={type:r,test:n.test.bind(n)};n.replace&&(s.replace=n.replace.bind(n)),n.replaceAsync&&(s.replaceAsync=n.replaceAsync.bind(n));var f="number"==typeof t.fallback?t.fallback:t.fallback?0:Number.POSITIVE_INFINITY;if(n.testPlainObjects?this.plainObjectReplacers.splice(f,0,s):this.nonplainObjectReplacers.splice(f,0,s),n.revive||n.reviveAsync){var l={};n.revive&&(l.revive=n.revive.bind(n)),n.reviveAsync&&(l.reviveAsync=n.reviveAsync.bind(n)),this.revivers[r]=[l,{plain:n.testPlainObjects}];}this.types[r]=n;}}),this);}),this),this}}]),Typeson}(),f=function Undefined(){_classCallCheck(this,Undefined);};f.__typeson__type__="TypesonUndefined",s.Undefined=f,s.Promise=e,s.isThenable=isThenable,s.toStringTag=toStringTag,s.hasConstructorOf=hasConstructorOf,s.isObject=isObject,s.isPlainObject=isPlainObject,s.isUserObject=function isUserObject(e){if(!e||"Object"!==toStringTag(e))return !1;var t=n(e);return !t||(hasConstructorOf(e,Object)||isUserObject(t))},s.escapeKeyPathComponent=escapeKeyPathComponent,s.unescapeKeyPathComponent=unescapeKeyPathComponent,s.getByKeyPath=getByKeyPath,s.getJSONType=function getJSONType(e){return null===e?"null":Array.isArray(e)?"array":_typeof(e)},s.JSON_TYPES=["null","boolean","number","string","array","object"];for(var l={userObject:{test:function test(e,t){return s.isUserObject(e)},replace:function replace(e){return function _objectSpread2$1(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$1(Object(r),!0).forEach((function(t){_defineProperty$1(e,t,r[t]);})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys$1(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t));}));}return e}({},e)},revive:function revive(e){return e}}},p=[{arrayNonindexKeys:{testPlainObjects:!0,test:function test(e,t){return !!Array.isArray(e)&&(Object.keys(e).some((function(e){return String(Number.parseInt(e))!==e}))&&(t.iterateIn="object",t.addLength=!0),!0)},replace:function replace(e,t){return t.iterateUnsetNumeric=!0,e},revive:function revive(e){if(Array.isArray(e))return e;var t=[];return Object.keys(e).forEach((function(r){var n=e[r];t[r]=n;})),t}}},{sparseUndefined:{test:function test(e,t){return void 0===e&&!1===t.ownKeys},replace:function replace(e){return 0},revive:function revive(e){}}}],y={undef:{test:function test(e,t){return void 0===e&&(t.ownKeys||!("ownKeys"in t))},replace:function replace(e){return 0},revive:function revive(e){return new s.Undefined}}},v={StringObject:{test:function test(e){return "String"===s.toStringTag(e)&&"object"===_typeof$1(e)},replace:function replace(e){return String(e)},revive:function revive(e){return new String(e)}},BooleanObject:{test:function test(e){return "Boolean"===s.toStringTag(e)&&"object"===_typeof$1(e)},replace:function replace(e){return Boolean(e)},revive:function revive(e){return new Boolean(e)}},NumberObject:{test:function test(e){return "Number"===s.toStringTag(e)&&"object"===_typeof$1(e)},replace:function replace(e){return Number(e)},revive:function revive(e){return new Number(e)}}},b=[{nan:{test:function test(e){return Number.isNaN(e)},replace:function replace(e){return "NaN"},revive:function revive(e){return Number.NaN}}},{infinity:{test:function test(e){return e===Number.POSITIVE_INFINITY},replace:function replace(e){return "Infinity"},revive:function revive(e){return Number.POSITIVE_INFINITY}}},{negativeInfinity:{test:function test(e){return e===Number.NEGATIVE_INFINITY},replace:function replace(e){return "-Infinity"},revive:function revive(e){return Number.NEGATIVE_INFINITY}}}],d={date:{test:function test(e){return "Date"===s.toStringTag(e)},replace:function replace(e){var t=e.getTime();return Number.isNaN(t)?"NaN":t},revive:function revive(e){return "NaN"===e?new Date(Number.NaN):new Date(e)}}},h={regexp:{test:function test(e){return "RegExp"===s.toStringTag(e)},replace:function replace(e){return {source:e.source,flags:(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":"")}},revive:function revive(e){var t=e.source,r=e.flags;return new RegExp(t,r)}}},g={map:{test:function test(e){return "Map"===s.toStringTag(e)},replace:function replace(e){return _toConsumableArray$1(e.entries())},revive:function revive(e){return new Map(e)}}},m={set:{test:function test(e){return "Set"===s.toStringTag(e)},replace:function replace(e){return _toConsumableArray$1(e.values())},revive:function revive(e){return new Set(e)}}},O="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_=new Uint8Array(256),j=0;j<O.length;j++)_[O.charCodeAt(j)]=j;var S=function encode(e,t,r){null==r&&(r=e.byteLength);for(var n=new Uint8Array(e,t||0,r),i=n.length,o="",a=0;a<i;a+=3)o+=O[n[a]>>2],o+=O[(3&n[a])<<4|n[a+1]>>4],o+=O[(15&n[a+1])<<2|n[a+2]>>6],o+=O[63&n[a+2]];return i%3==2?o=o.slice(0,-1)+"=":i%3==1&&(o=o.slice(0,-2)+"=="),o},T=function decode(e){var t,r,n,i,o=e.length,a=.75*e.length,c=0;"="===e[e.length-1]&&(a--,"="===e[e.length-2]&&a--);for(var u=new ArrayBuffer(a),s=new Uint8Array(u),f=0;f<o;f+=4)t=_[e.charCodeAt(f)],r=_[e.charCodeAt(f+1)],n=_[e.charCodeAt(f+2)],i=_[e.charCodeAt(f+3)],s[c++]=t<<2|r>>4,s[c++]=(15&r)<<4|n>>2,s[c++]=(3&n)<<6|63&i;return u},w={arraybuffer:{test:function test(e){return "ArrayBuffer"===s.toStringTag(e)},replace:function replace(e,t){t.buffers||(t.buffers=[]);var r=t.buffers.indexOf(e);return r>-1?{index:r}:(t.buffers.push(e),S(e))},revive:function revive(e,t){if(t.buffers||(t.buffers=[]),"object"===_typeof$1(e))return t.buffers[e.index];var r=T(e);return t.buffers.push(r),r}}},A="undefined"==typeof self?commonjsGlobal:self,P={};["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"].forEach((function(e){var t=e,r=A[t];r&&(P[e.toLowerCase()]={test:function test(e){return s.toStringTag(e)===t},replace:function replace(e,t){var r=e.buffer,n=e.byteOffset,i=e.length;t.buffers||(t.buffers=[]);var o=t.buffers.indexOf(r);return o>-1?{index:o,byteOffset:n,length:i}:(t.buffers.push(r),{encoded:S(r),byteOffset:n,length:i})},revive:function revive(e,t){t.buffers||(t.buffers=[]);var n,i=e.byteOffset,o=e.length,a=e.encoded,c=e.index;return "index"in e?n=t.buffers[c]:(n=T(a),t.buffers.push(n)),new r(n,i,o)}});}));var I={dataview:{test:function test(e){return "DataView"===s.toStringTag(e)},replace:function replace(e,t){var r=e.buffer,n=e.byteOffset,i=e.byteLength;t.buffers||(t.buffers=[]);var o=t.buffers.indexOf(r);return o>-1?{index:o,byteOffset:n,byteLength:i}:(t.buffers.push(r),{encoded:S(r),byteOffset:n,byteLength:i})},revive:function revive(e,t){t.buffers||(t.buffers=[]);var r,n=e.byteOffset,i=e.byteLength,o=e.encoded,a=e.index;return "index"in e?r=t.buffers[a]:(r=T(o),t.buffers.push(r)),new DataView(r,n,i)}}},C={IntlCollator:{test:function test(e){return s.hasConstructorOf(e,Intl.Collator)},replace:function replace(e){return e.resolvedOptions()},revive:function revive(e){return new Intl.Collator(e.locale,e)}},IntlDateTimeFormat:{test:function test(e){return s.hasConstructorOf(e,Intl.DateTimeFormat)},replace:function replace(e){return e.resolvedOptions()},revive:function revive(e){return new Intl.DateTimeFormat(e.locale,e)}},IntlNumberFormat:{test:function test(e){return s.hasConstructorOf(e,Intl.NumberFormat)},replace:function replace(e){return e.resolvedOptions()},revive:function revive(e){return new Intl.NumberFormat(e.locale,e)}}};function string2arraybuffer(e){for(var t=new Uint8Array(e.length),r=0;r<e.length;r++)t[r]=e.charCodeAt(r);return t.buffer}var N={file:{test:function test(e){return "File"===s.toStringTag(e)},replace:function replace(e){var t=new XMLHttpRequest;if(t.overrideMimeType("text/plain; charset=x-user-defined"),t.open("GET",URL.createObjectURL(e),!1),t.send(),200!==t.status&&0!==t.status)throw new Error("Bad File access: "+t.status);return {type:e.type,stringContents:t.responseText,name:e.name,lastModified:e.lastModified}},revive:function revive(e){var t=e.name,r=e.type,n=e.stringContents,i=e.lastModified;return new File([string2arraybuffer(n)],t,{type:r,lastModified:i})},replaceAsync:function replaceAsync(e){return new s.Promise((function(t,r){var n=new FileReader;n.addEventListener("load",(function(){t({type:e.type,stringContents:n.result,name:e.name,lastModified:e.lastModified});})),n.addEventListener("error",(function(){r(n.error);})),n.readAsBinaryString(e);}))}}},k={bigint:{test:function test(e){return "bigint"==typeof e},replace:function replace(e){return String(e)},revive:function revive(e){return BigInt(e)}}},E={bigintObject:{test:function test(e){return "object"===_typeof$1(e)&&s.hasConstructorOf(e,BigInt)},replace:function replace(e){return String(e)},revive:function revive(e){return new Object(BigInt(e))}}},B={cryptokey:{test:function test(e){return "CryptoKey"===s.toStringTag(e)&&e.extractable},replaceAsync:function replaceAsync(e){return new s.Promise((function(t,r){crypto.subtle.exportKey("jwk",e).catch((function(e){r(e);})).then((function(r){t({jwk:r,algorithm:e.algorithm,usages:e.usages});}));}))},revive:function revive(e){var t=e.jwk,r=e.algorithm,n=e.usages;return crypto.subtle.importKey("jwk",t,r,!0,n)}}};return [l,y,p,v,b,d,h,{imagedata:{test:function test(e){return "ImageData"===s.toStringTag(e)},replace:function replace(e){return {array:_toConsumableArray$1(e.data),width:e.width,height:e.height}},revive:function revive(e){return new ImageData(new Uint8ClampedArray(e.array),e.width,e.height)}}},{imagebitmap:{test:function test(e){return "ImageBitmap"===s.toStringTag(e)||e&&e.dataset&&"ImageBitmap"===e.dataset.toStringTag},replace:function replace(e){var t=document.createElement("canvas");return t.getContext("2d").drawImage(e,0,0),t.toDataURL()},revive:function revive(e){var t=document.createElement("canvas"),r=t.getContext("2d"),n=document.createElement("img");return n.addEventListener("load",(function(){r.drawImage(n,0,0);})),n.src=e,t},reviveAsync:function reviveAsync(e){var t=document.createElement("canvas"),r=t.getContext("2d"),n=document.createElement("img");return n.addEventListener("load",(function(){r.drawImage(n,0,0);})),n.src=e,createImageBitmap(t)}}},N,{file:N.file,filelist:{test:function test(e){return "FileList"===s.toStringTag(e)},replace:function replace(e){for(var t=[],r=0;r<e.length;r++)t[r]=e.item(r);return t},revive:function revive(e){return new(function(){function FileList(){_classCallCheck$1(this,FileList),this._files=arguments[0],this.length=this._files.length;}return function _createClass$1(e,t,r){return t&&_defineProperties$1(e.prototype,t),r&&_defineProperties$1(e,r),e}(FileList,[{key:"item",value:function item(e){return this._files[e]}},{key:Symbol.toStringTag,get:function get(){return "FileList"}}]),FileList}())(e)}}},{blob:{test:function test(e){return "Blob"===s.toStringTag(e)},replace:function replace(e){var t=new XMLHttpRequest;if(t.overrideMimeType("text/plain; charset=x-user-defined"),t.open("GET",URL.createObjectURL(e),!1),t.send(),200!==t.status&&0!==t.status)throw new Error("Bad Blob access: "+t.status);return {type:e.type,stringContents:t.responseText}},revive:function revive(e){var t=e.type,r=e.stringContents;return new Blob([string2arraybuffer(r)],{type:t})},replaceAsync:function replaceAsync(e){return new s.Promise((function(t,r){var n=new FileReader;n.addEventListener("load",(function(){t({type:e.type,stringContents:n.result});})),n.addEventListener("error",(function(){r(n.error);})),n.readAsBinaryString(e);}))}}}].concat("function"==typeof Map?g:[],"function"==typeof Set?m:[],"function"==typeof ArrayBuffer?w:[],"function"==typeof Uint8Array?P:[],"function"==typeof DataView?I:[],"undefined"!=typeof Intl?C:[],"undefined"!=typeof crypto?B:[],"undefined"!=typeof BigInt?[k,E]:[])}));
1898
-
1899
- });
1900
-
1901
- /*
1902
- * base64-arraybuffer
1903
- * https://github.com/niklasvh/base64-arraybuffer
1904
- *
1905
- * Copyright (c) 2017 Brett Zamir, 2012 Niklas von Hertzen
1906
- * Licensed under the MIT license.
1907
- */
1908
- var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; // Use a lookup table to find the index.
1909
-
1910
- var lookup = new Uint8Array(256);
1911
-
1912
- for (var i = 0; i < chars.length; i++) {
1913
- lookup[chars.codePointAt(i)] = i;
1914
- }
1915
- /**
1916
- * @param {ArrayBuffer} arraybuffer
1917
- * @param {Integer} byteOffset
1918
- * @param {Integer} lngth
1919
- * @returns {string}
1920
- */
1921
-
1922
-
1923
- var encode = function encode(arraybuffer, byteOffset, lngth) {
1924
- if (lngth === null || lngth === undefined) {
1925
- lngth = arraybuffer.byteLength; // Needed for Safari
1926
- }
1927
-
1928
- var bytes = new Uint8Array(arraybuffer, byteOffset || 0, // Default needed for Safari
1929
- lngth);
1930
- var len = bytes.length;
1931
- var base64 = '';
1932
-
1933
- for (var _i = 0; _i < len; _i += 3) {
1934
- base64 += chars[bytes[_i] >> 2];
1935
- base64 += chars[(bytes[_i] & 3) << 4 | bytes[_i + 1] >> 4];
1936
- base64 += chars[(bytes[_i + 1] & 15) << 2 | bytes[_i + 2] >> 6];
1937
- base64 += chars[bytes[_i + 2] & 63];
1938
- }
1939
-
1940
- if (len % 3 === 2) {
1941
- base64 = base64.slice(0, -1) + '=';
1942
- } else if (len % 3 === 1) {
1943
- base64 = base64.slice(0, -2) + '==';
1944
- }
1945
-
1946
- return base64;
1947
- };
1948
- /**
1949
- * @param {string} base64
1950
- * @returns {ArrayBuffer}
1951
- */
1952
-
1953
- var decode = function decode(base64) {
1954
- var len = base64.length;
1955
- var bufferLength = base64.length * 0.75;
1956
- var p = 0;
1957
- var encoded1, encoded2, encoded3, encoded4;
1958
-
1959
- if (base64[base64.length - 1] === '=') {
1960
- bufferLength--;
1961
-
1962
- if (base64[base64.length - 2] === '=') {
1963
- bufferLength--;
1964
- }
1965
- }
1966
-
1967
- var arraybuffer = new ArrayBuffer(bufferLength),
1968
- bytes = new Uint8Array(arraybuffer);
1969
-
1970
- for (var _i2 = 0; _i2 < len; _i2 += 4) {
1971
- encoded1 = lookup[base64.codePointAt(_i2)];
1972
- encoded2 = lookup[base64.codePointAt(_i2 + 1)];
1973
- encoded3 = lookup[base64.codePointAt(_i2 + 2)];
1974
- encoded4 = lookup[base64.codePointAt(_i2 + 3)];
1975
- bytes[p++] = encoded1 << 2 | encoded2 >> 4;
1976
- bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;
1977
- bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
1978
- }
1979
-
1980
- return arraybuffer;
1981
- };
1982
-
1983
- /* eslint-env browser, node */
1984
- var _global = typeof self === 'undefined' ? global : self;
1985
- var exportObj = {};
1986
- [
1987
- 'Int8Array',
1988
- 'Uint8Array',
1989
- 'Uint8ClampedArray',
1990
- 'Int16Array',
1991
- 'Uint16Array',
1992
- 'Int32Array',
1993
- 'Uint32Array',
1994
- 'Float32Array',
1995
- 'Float64Array'
1996
- ].forEach(function (typeName) {
1997
- var arrType = typeName;
1998
- var TypedArray = _global[arrType];
1999
- if (TypedArray) {
2000
- exportObj[typeName.toLowerCase() + "2"] = {
2001
- test: function (x) { return typeson.toStringTag(x) === arrType; },
2002
- replace: function (_a) {
2003
- var buffer = _a.buffer, byteOffset = _a.byteOffset, length = _a.length;
2004
- return {
2005
- buffer: buffer,
2006
- byteOffset: byteOffset,
2007
- length: length
2008
- };
2009
- },
2010
- revive: function (b64Obj) {
2011
- var buffer = b64Obj.buffer, byteOffset = b64Obj.byteOffset, length = b64Obj.length;
2012
- return new TypedArray(buffer, byteOffset, length);
2013
- }
2014
- };
2015
- }
2016
- });
2017
-
2018
- var arrayBuffer = {
2019
- arraybuffer: {
2020
- test: function (x) { return typeson.toStringTag(x) === 'ArrayBuffer'; },
2021
- replace: function (b) {
2022
- return encode(b, 0, b.byteLength);
2023
- },
2024
- revive: function (b64) {
2025
- var buffer = decode(b64);
2026
- return buffer;
2027
- }
2028
- }
2029
- };
2030
- // See also typed-arrays!
2031
-
2032
- var TSON = new typeson().register(structuredCloning);
2033
- var readBlobsSynchronously = 'FileReaderSync' in self; // true in workers only.
2034
- var blobsToAwait = [];
2035
- var blobsToAwaitPos = 0;
2036
- // Need to patch encapsulateAsync as it does not work as of typeson 5.8.2
2037
- // Also, current version of typespn-registry-1.0.0-alpha.21 does not
2038
- // encapsulate/revive Blobs correctly (fails one of the unit tests in
2039
- // this library (test 'export-format'))
2040
- TSON.register([
2041
- arrayBuffer,
2042
- exportObj, {
2043
- blob2: {
2044
- test: function (x) { return typeson.toStringTag(x) === 'Blob'; },
2045
- replace: function (b) {
2046
- if (b.isClosed) { // On MDN, but not in https://w3c.github.io/FileAPI/#dfn-Blob
2047
- throw new Error('The Blob is closed');
2048
- }
2049
- if (readBlobsSynchronously) {
2050
- var data = readBlobSync(b, 'binary');
2051
- var base64 = encode(data, 0, data.byteLength);
2052
- return {
2053
- type: b.type,
2054
- data: base64
2055
- };
2056
- }
2057
- else {
2058
- blobsToAwait.push(b); // This will also make TSON.mustFinalize() return true.
2059
- var result = {
2060
- type: b.type,
2061
- data: { start: blobsToAwaitPos, end: blobsToAwaitPos + b.size }
2062
- };
2063
- blobsToAwaitPos += b.size;
2064
- return result;
2065
- }
2066
- },
2067
- finalize: function (b, ba) {
2068
- b.data = encode(ba, 0, ba.byteLength);
2069
- },
2070
- revive: function (_a) {
2071
- var type = _a.type, data = _a.data;
2072
- return new Blob([decode(data)], { type: type });
2073
- }
2074
- }
2075
- }
2076
- ]);
2077
- TSON.mustFinalize = function () { return blobsToAwait.length > 0; };
2078
- TSON.finalize = function (items) { return __awaiter(void 0, void 0, void 0, function () {
2079
- var allChunks, _i, items_1, item, types, arrayType, keyPath, typeName, typeSpec, b;
2080
- var _a, _b;
2081
- return __generator(this, function (_c) {
2082
- switch (_c.label) {
2083
- case 0: return [4 /*yield*/, readBlobAsync(new Blob(blobsToAwait), 'binary')];
2084
- case 1:
2085
- allChunks = _c.sent();
2086
- if (items) {
2087
- for (_i = 0, items_1 = items; _i < items_1.length; _i++) {
2088
- item = items_1[_i];
2089
- // Manually go through all "blob" types in the result
2090
- // and lookup the data slice they point at.
2091
- if (item.$types) {
2092
- types = item.$types;
2093
- arrayType = types.$;
2094
- if (arrayType)
2095
- types = types.$;
2096
- for (keyPath in types) {
2097
- typeName = types[keyPath];
2098
- typeSpec = TSON.types[typeName];
2099
- if (typeSpec && typeSpec.finalize) {
2100
- b = Dexie__default["default"].getByKeyPath(item, arrayType ? "$." + keyPath : keyPath);
2101
- typeSpec.finalize(b, allChunks.slice((_a = b.data) === null || _a === void 0 ? void 0 : _a.start, (_b = b.data) === null || _b === void 0 ? void 0 : _b.end));
2102
- }
2103
- }
2104
- }
2105
- }
2106
- }
2107
- // Free up memory
2108
- blobsToAwait = [];
2109
- blobsToAwaitPos = 0;
2110
- return [2 /*return*/];
2111
- }
2112
- });
2113
- }); };
2114
-
2115
- var DEFAULT_ROWS_PER_CHUNK = 2000;
2116
- function exportDB(db, options) {
2117
- return __awaiter(this, void 0, void 0, function () {
2118
- function exportAll() {
2119
- return __awaiter(this, void 0, void 0, function () {
2120
- var tablesRowCounts, emptyExportJson, posEndDataArray, firstJsonSlice, filter, transform, _loop_1, _i, tables_1, tableName;
2121
- return __generator(this, function (_a) {
2122
- switch (_a.label) {
2123
- case 0: return [4 /*yield*/, Promise.all(targetTables.map(function (table) { return table.count(); }))];
2124
- case 1:
2125
- tablesRowCounts = _a.sent();
2126
- tablesRowCounts.forEach(function (rowCount, i) { return tables[i].rowCount = rowCount; });
2127
- progress.totalRows = tablesRowCounts.reduce(function (p, c) { return p + c; });
2128
- emptyExportJson = JSON.stringify(emptyExport, undefined, prettyJson ? 2 : undefined);
2129
- posEndDataArray = emptyExportJson.lastIndexOf(']');
2130
- firstJsonSlice = emptyExportJson.substring(0, posEndDataArray);
2131
- slices.push(firstJsonSlice);
2132
- filter = options.filter;
2133
- transform = options.transform;
2134
- _loop_1 = function (tableName) {
2135
- var table, primKey, inbound, LIMIT, emptyTableExport, emptyTableExportJson, posEndRowsArray, lastKey, lastNumRows, mayHaveMoreRows, _loop_2, state_1;
2136
- return __generator(this, function (_b) {
2137
- switch (_b.label) {
2138
- case 0:
2139
- table = db.table(tableName);
2140
- primKey = table.schema.primKey;
2141
- inbound = !!primKey.keyPath;
2142
- LIMIT = options.numRowsPerChunk || DEFAULT_ROWS_PER_CHUNK;
2143
- emptyTableExport = inbound ? {
2144
- tableName: table.name,
2145
- inbound: true,
2146
- rows: []
2147
- } : {
2148
- tableName: table.name,
2149
- inbound: false,
2150
- rows: []
2151
- };
2152
- emptyTableExportJson = JSON.stringify(emptyTableExport, undefined, prettyJson ? 2 : undefined);
2153
- if (prettyJson) {
2154
- // Increase indentation according to this:
2155
- // {
2156
- // ...
2157
- // data: [
2158
- // ...
2159
- // data: [
2160
- // 123456<---- here
2161
- // ]
2162
- // ]
2163
- // }
2164
- emptyTableExportJson = emptyTableExportJson.split('\n').join('\n ');
2165
- }
2166
- posEndRowsArray = emptyTableExportJson.lastIndexOf(']');
2167
- slices.push(emptyTableExportJson.substring(0, posEndRowsArray));
2168
- lastKey = null;
2169
- lastNumRows = 0;
2170
- mayHaveMoreRows = true;
2171
- _loop_2 = function () {
2172
- var chunkedCollection, values, filteredValues, transformedValues, tsonValues, json, keys, keyvals, tsonTuples, json;
2173
- return __generator(this, function (_c) {
2174
- switch (_c.label) {
2175
- case 0:
2176
- if (progressCallback) {
2177
- // Keep ongoing transaction private
2178
- Dexie__default["default"].ignoreTransaction(function () { return progressCallback(progress); });
2179
- }
2180
- chunkedCollection = lastKey == null ?
2181
- table.limit(LIMIT) :
2182
- table.where(':id').above(lastKey).limit(LIMIT);
2183
- return [4 /*yield*/, chunkedCollection.toArray()];
2184
- case 1:
2185
- values = _c.sent();
2186
- if (values.length === 0)
2187
- return [2 /*return*/, "break"];
2188
- if (lastKey != null && lastNumRows > 0) {
2189
- // Not initial chunk. Must add a comma:
2190
- slices.push(",");
2191
- if (prettyJson) {
2192
- slices.push("\n ");
2193
- }
2194
- }
2195
- mayHaveMoreRows = values.length === LIMIT;
2196
- if (!inbound) return [3 /*break*/, 4];
2197
- filteredValues = filter ?
2198
- values.filter(function (value) { return filter(tableName, value); }) :
2199
- values;
2200
- transformedValues = transform ?
2201
- filteredValues.map(function (value) { return transform(tableName, value).value; }) :
2202
- filteredValues;
2203
- tsonValues = transformedValues.map(function (value) { return TSON.encapsulate(value); });
2204
- if (!TSON.mustFinalize()) return [3 /*break*/, 3];
2205
- return [4 /*yield*/, Dexie__default["default"].waitFor(TSON.finalize(tsonValues))];
2206
- case 2:
2207
- _c.sent();
2208
- _c.label = 3;
2209
- case 3:
2210
- json = JSON.stringify(tsonValues, undefined, prettyJson ? 2 : undefined);
2211
- if (prettyJson)
2212
- json = json.split('\n').join('\n ');
2213
- // By generating a blob here, we give web platform the opportunity to store the contents
2214
- // on disk and release RAM.
2215
- slices.push(new Blob([json.substring(1, json.length - 1)]));
2216
- lastNumRows = transformedValues.length;
2217
- lastKey = values.length > 0 ?
2218
- Dexie__default["default"].getByKeyPath(values[values.length - 1], primKey.keyPath) :
2219
- null;
2220
- return [3 /*break*/, 8];
2221
- case 4: return [4 /*yield*/, chunkedCollection.primaryKeys()];
2222
- case 5:
2223
- keys = _c.sent();
2224
- keyvals = keys.map(function (key, i) { return [key, values[i]]; });
2225
- if (filter)
2226
- keyvals = keyvals.filter(function (_a) {
2227
- var key = _a[0], value = _a[1];
2228
- return filter(tableName, value, key);
2229
- });
2230
- if (transform)
2231
- keyvals = keyvals.map(function (_a) {
2232
- var key = _a[0], value = _a[1];
2233
- var transformResult = transform(tableName, value, key);
2234
- return [transformResult.key, transformResult.value];
2235
- });
2236
- tsonTuples = keyvals.map(function (tuple) { return TSON.encapsulate(tuple); });
2237
- if (!TSON.mustFinalize()) return [3 /*break*/, 7];
2238
- return [4 /*yield*/, Dexie__default["default"].waitFor(TSON.finalize(tsonTuples))];
2239
- case 6:
2240
- _c.sent();
2241
- _c.label = 7;
2242
- case 7:
2243
- json = JSON.stringify(tsonTuples, undefined, prettyJson ? 2 : undefined);
2244
- if (prettyJson)
2245
- json = json.split('\n').join('\n ');
2246
- // By generating a blob here, we give web platform the opportunity to store the contents
2247
- // on disk and release RAM.
2248
- slices.push(new Blob([json.substring(1, json.length - 1)]));
2249
- lastNumRows = keyvals.length;
2250
- lastKey = keys.length > 0 ?
2251
- keys[keys.length - 1] :
2252
- null;
2253
- _c.label = 8;
2254
- case 8:
2255
- progress.completedRows += values.length;
2256
- return [2 /*return*/];
2257
- }
2258
- });
2259
- };
2260
- _b.label = 1;
2261
- case 1:
2262
- if (!mayHaveMoreRows) return [3 /*break*/, 3];
2263
- return [5 /*yield**/, _loop_2()];
2264
- case 2:
2265
- state_1 = _b.sent();
2266
- if (state_1 === "break")
2267
- return [3 /*break*/, 3];
2268
- return [3 /*break*/, 1];
2269
- case 3:
2270
- slices.push(emptyTableExportJson.substr(posEndRowsArray)); // "]}"
2271
- progress.completedTables += 1;
2272
- if (progress.completedTables < progress.totalTables) {
2273
- slices.push(",");
2274
- }
2275
- return [2 /*return*/];
2276
- }
2277
- });
2278
- };
2279
- _i = 0, tables_1 = tables;
2280
- _a.label = 2;
2281
- case 2:
2282
- if (!(_i < tables_1.length)) return [3 /*break*/, 5];
2283
- tableName = tables_1[_i].name;
2284
- return [5 /*yield**/, _loop_1(tableName)];
2285
- case 3:
2286
- _a.sent();
2287
- _a.label = 4;
2288
- case 4:
2289
- _i++;
2290
- return [3 /*break*/, 2];
2291
- case 5:
2292
- slices.push(emptyExportJson.substr(posEndDataArray));
2293
- progress.done = true;
2294
- if (progressCallback) {
2295
- // Keep ongoing transaction private
2296
- Dexie__default["default"].ignoreTransaction(function () { return progressCallback(progress); });
2297
- }
2298
- return [2 /*return*/];
2299
- }
2300
- });
2301
- });
2302
- }
2303
- var skipTables, targetTables, slices, tables, prettyJson, emptyExport, progressCallback, progress;
2304
- return __generator(this, function (_a) {
2305
- switch (_a.label) {
2306
- case 0:
2307
- options = options || {};
2308
- skipTables = options.skipTables ? options.skipTables : [];
2309
- targetTables = db.tables.filter(function (x) { return !skipTables.includes(x.name); });
2310
- slices = [];
2311
- tables = targetTables.map(function (table) { return ({
2312
- name: table.name,
2313
- schema: getSchemaString(table),
2314
- rowCount: 0
2315
- }); });
2316
- prettyJson = options.prettyJson;
2317
- emptyExport = {
2318
- formatName: "dexie",
2319
- formatVersion: 1,
2320
- data: {
2321
- databaseName: db.name,
2322
- databaseVersion: db.verno,
2323
- tables: tables,
2324
- data: []
2325
- }
2326
- };
2327
- progressCallback = options.progressCallback;
2328
- progress = {
2329
- done: false,
2330
- completedRows: 0,
2331
- completedTables: 0,
2332
- totalRows: NaN,
2333
- totalTables: tables.length
2334
- };
2335
- _a.label = 1;
2336
- case 1:
2337
- _a.trys.push([1, , 6, 7]);
2338
- if (!options.noTransaction) return [3 /*break*/, 3];
2339
- return [4 /*yield*/, exportAll()];
2340
- case 2:
2341
- _a.sent();
2342
- return [3 /*break*/, 5];
2343
- case 3: return [4 /*yield*/, db.transaction('r', db.tables, exportAll)];
2344
- case 4:
2345
- _a.sent();
2346
- _a.label = 5;
2347
- case 5: return [3 /*break*/, 7];
2348
- case 6:
2349
- TSON.finalize(); // Free up mem if error has occurred
2350
- return [7 /*endfinally*/];
2351
- case 7: return [2 /*return*/, new Blob(slices, { type: "text/json" })];
2352
- }
2353
- });
2354
- });
2355
- }
2356
-
2357
- var VERSION = 1;
2358
-
2359
- var fakeStream = {Stream: function(){}};
2360
-
2361
- var clarinet_1 = createCommonjsModule(function (module, exports) {
2362
- (function (clarinet) {
2363
-
2364
- // non node-js needs to set clarinet debug on root
2365
- var env =(typeof process === 'object' && process.env)
2366
- ? process.env
2367
- : self;
2368
-
2369
- clarinet.parser = function (opt) { return new CParser(opt);};
2370
- clarinet.CParser = CParser;
2371
- clarinet.CStream = CStream;
2372
- clarinet.createStream = createStream;
2373
- clarinet.MAX_BUFFER_LENGTH = 10 * 1024 * 1024;
2374
- clarinet.DEBUG = (env.CDEBUG==='debug');
2375
- clarinet.INFO = (env.CDEBUG==='debug' || env.CDEBUG==='info');
2376
- clarinet.EVENTS =
2377
- [ "value"
2378
- , "string"
2379
- , "key"
2380
- , "openobject"
2381
- , "closeobject"
2382
- , "openarray"
2383
- , "closearray"
2384
- , "error"
2385
- , "end"
2386
- , "ready"
2387
- ];
2388
-
2389
- var buffers = {
2390
- textNode: undefined,
2391
- numberNode: ""
2392
- }
2393
- , streamWraps = clarinet.EVENTS.filter(function (ev) {
2394
- return ev !== "error" && ev !== "end";
2395
- })
2396
- , S = 0
2397
- , Stream
2398
- ;
2399
-
2400
- clarinet.STATE =
2401
- { BEGIN : S++
2402
- , VALUE : S++ // general stuff
2403
- , OPEN_OBJECT : S++ // {
2404
- , CLOSE_OBJECT : S++ // }
2405
- , OPEN_ARRAY : S++ // [
2406
- , CLOSE_ARRAY : S++ // ]
2407
- , TEXT_ESCAPE : S++ // \ stuff
2408
- , STRING : S++ // ""
2409
- , BACKSLASH : S++
2410
- , END : S++ // No more stack
2411
- , OPEN_KEY : S++ // , "a"
2412
- , CLOSE_KEY : S++ // :
2413
- , TRUE : S++ // r
2414
- , TRUE2 : S++ // u
2415
- , TRUE3 : S++ // e
2416
- , FALSE : S++ // a
2417
- , FALSE2 : S++ // l
2418
- , FALSE3 : S++ // s
2419
- , FALSE4 : S++ // e
2420
- , NULL : S++ // u
2421
- , NULL2 : S++ // l
2422
- , NULL3 : S++ // l
2423
- , NUMBER_DECIMAL_POINT : S++ // .
2424
- , NUMBER_DIGIT : S++ // [0-9]
2425
- };
2426
-
2427
- for (var s_ in clarinet.STATE) clarinet.STATE[clarinet.STATE[s_]] = s_;
2428
-
2429
- // switcharoo
2430
- S = clarinet.STATE;
2431
-
2432
- const Char = {
2433
- tab : 0x09, // \t
2434
- lineFeed : 0x0A, // \n
2435
- carriageReturn : 0x0D, // \r
2436
- space : 0x20, // " "
2437
-
2438
- doubleQuote : 0x22, // "
2439
- plus : 0x2B, // +
2440
- comma : 0x2C, // ,
2441
- minus : 0x2D, // -
2442
- period : 0x2E, // .
2443
-
2444
- _0 : 0x30, // 0
2445
- _9 : 0x39, // 9
2446
-
2447
- colon : 0x3A, // :
2448
-
2449
- E : 0x45, // E
2450
-
2451
- openBracket : 0x5B, // [
2452
- backslash : 0x5C, // \
2453
- closeBracket : 0x5D, // ]
2454
-
2455
- a : 0x61, // a
2456
- b : 0x62, // b
2457
- e : 0x65, // e
2458
- f : 0x66, // f
2459
- l : 0x6C, // l
2460
- n : 0x6E, // n
2461
- r : 0x72, // r
2462
- s : 0x73, // s
2463
- t : 0x74, // t
2464
- u : 0x75, // u
2465
-
2466
- openBrace : 0x7B, // {
2467
- closeBrace : 0x7D, // }
2468
- };
2469
-
2470
- if (!Object.create) {
2471
- Object.create = function (o) {
2472
- function f () { this["__proto__"] = o; }
2473
- f.prototype = o;
2474
- return new f;
2475
- };
2476
- }
2477
-
2478
- if (!Object.getPrototypeOf) {
2479
- Object.getPrototypeOf = function (o) {
2480
- return o["__proto__"];
2481
- };
2482
- }
2483
-
2484
- if (!Object.keys) {
2485
- Object.keys = function (o) {
2486
- var a = [];
2487
- for (var i in o) if (o.hasOwnProperty(i)) a.push(i);
2488
- return a;
2489
- };
2490
- }
2491
-
2492
- function checkBufferLength (parser) {
2493
- var maxAllowed = Math.max(clarinet.MAX_BUFFER_LENGTH, 10)
2494
- , maxActual = 0
2495
- ;
2496
- for (var buffer in buffers) {
2497
- var len = parser[buffer] === undefined ? 0 : parser[buffer].length;
2498
- if (len > maxAllowed) {
2499
- switch (buffer) {
2500
- case "text":
2501
- closeText(parser);
2502
- break;
2503
-
2504
- default:
2505
- error(parser, "Max buffer length exceeded: "+ buffer);
2506
- }
2507
- }
2508
- maxActual = Math.max(maxActual, len);
2509
- }
2510
- parser.bufferCheckPosition = (clarinet.MAX_BUFFER_LENGTH - maxActual)
2511
- + parser.position;
2512
- }
2513
-
2514
- function clearBuffers (parser) {
2515
- for (var buffer in buffers) {
2516
- parser[buffer] = buffers[buffer];
2517
- }
2518
- }
2519
-
2520
- var stringTokenPattern = /[\\"\n]/g;
2521
-
2522
- function CParser (opt) {
2523
- if (!(this instanceof CParser)) return new CParser (opt);
2524
-
2525
- var parser = this;
2526
- clearBuffers(parser);
2527
- parser.bufferCheckPosition = clarinet.MAX_BUFFER_LENGTH;
2528
- parser.q = parser.c = parser.p = "";
2529
- parser.opt = opt || {};
2530
- parser.closed = parser.closedRoot = parser.sawRoot = false;
2531
- parser.tag = parser.error = null;
2532
- parser.state = S.BEGIN;
2533
- parser.stack = new Array();
2534
- // mostly just for error reporting
2535
- parser.position = parser.column = 0;
2536
- parser.line = 1;
2537
- parser.slashed = false;
2538
- parser.unicodeI = 0;
2539
- parser.unicodeS = null;
2540
- parser.depth = 0;
2541
- emit(parser, "onready");
2542
- }
2543
-
2544
- CParser.prototype =
2545
- { end : function () { end(this); }
2546
- , write : write
2547
- , resume : function () { this.error = null; return this; }
2548
- , close : function () { return this.write(null); }
2549
- };
2550
-
2551
- try { Stream = fakeStream.Stream; }
2552
- catch (ex) { Stream = function () {}; }
2553
-
2554
- function createStream (opt) { return new CStream(opt); }
2555
-
2556
- function CStream (opt) {
2557
- if (!(this instanceof CStream)) return new CStream(opt);
2558
-
2559
- this._parser = new CParser(opt);
2560
- this.writable = true;
2561
- this.readable = true;
2562
-
2563
- //var Buffer = this.Buffer || function Buffer () {}; // if we don't have Buffers, fake it so we can do `var instanceof Buffer` and not throw an error
2564
- this.bytes_remaining = 0; // number of bytes remaining in multi byte utf8 char to read after split boundary
2565
- this.bytes_in_sequence = 0; // bytes in multi byte utf8 char to read
2566
- this.temp_buffs = { "2": new Buffer(2), "3": new Buffer(3), "4": new Buffer(4) }; // for rebuilding chars split before boundary is reached
2567
- this.string = '';
2568
-
2569
- var me = this;
2570
- Stream.apply(me);
2571
-
2572
- this._parser.onend = function () { me.emit("end"); };
2573
- this._parser.onerror = function (er) {
2574
- me.emit("error", er);
2575
- me._parser.error = null;
2576
- };
2577
-
2578
- streamWraps.forEach(function (ev) {
2579
- Object.defineProperty(me, "on" + ev,
2580
- { get : function () { return me._parser["on" + ev]; }
2581
- , set : function (h) {
2582
- if (!h) {
2583
- me.removeAllListeners(ev);
2584
- me._parser["on"+ev] = h;
2585
- return h;
2586
- }
2587
- me.on(ev, h);
2588
- }
2589
- , enumerable : true
2590
- , configurable : false
2591
- });
2592
- });
2593
- }
2594
-
2595
- CStream.prototype = Object.create(Stream.prototype,
2596
- { constructor: { value: CStream } });
2597
-
2598
- CStream.prototype.write = function (data) {
2599
- data = new Buffer(data);
2600
- for (var i = 0; i < data.length; i++) {
2601
- var n = data[i];
2602
-
2603
- // check for carry over of a multi byte char split between data chunks
2604
- // & fill temp buffer it with start of this data chunk up to the boundary limit set in the last iteration
2605
- if (this.bytes_remaining > 0) {
2606
- for (var j = 0; j < this.bytes_remaining; j++) {
2607
- this.temp_buffs[this.bytes_in_sequence][this.bytes_in_sequence - this.bytes_remaining + j] = data[j];
2608
- }
2609
- this.string = this.temp_buffs[this.bytes_in_sequence].toString();
2610
- this.bytes_in_sequence = this.bytes_remaining = 0;
2611
-
2612
- // move iterator forward by number of byte read during sequencing
2613
- i = i + j - 1;
2614
-
2615
- // pass data to parser and move forward to parse rest of data
2616
- this._parser.write(this.string);
2617
- this.emit("data", this.string);
2618
- continue;
2619
- }
2620
-
2621
- // if no remainder bytes carried over, parse multi byte (>=128) chars one at a time
2622
- if (this.bytes_remaining === 0 && n >= 128) {
2623
- if ((n >= 194) && (n <= 223)) this.bytes_in_sequence = 2;
2624
- if ((n >= 224) && (n <= 239)) this.bytes_in_sequence = 3;
2625
- if ((n >= 240) && (n <= 244)) this.bytes_in_sequence = 4;
2626
- if ((this.bytes_in_sequence + i) > data.length) { // if bytes needed to complete char fall outside data length, we have a boundary split
2627
-
2628
- for (var k = 0; k <= (data.length - 1 - i); k++) {
2629
- this.temp_buffs[this.bytes_in_sequence][k] = data[i + k]; // fill temp data of correct size with bytes available in this chunk
2630
- }
2631
- this.bytes_remaining = (i + this.bytes_in_sequence) - data.length;
2632
-
2633
- // immediately return as we need another chunk to sequence the character
2634
- return true;
2635
- } else {
2636
- this.string = data.slice(i, (i + this.bytes_in_sequence)).toString();
2637
- i = i + this.bytes_in_sequence - 1;
2638
-
2639
- this._parser.write(this.string);
2640
- this.emit("data", this.string);
2641
- continue;
2642
- }
2643
- }
2644
-
2645
- // is there a range of characters that are immediately parsable?
2646
- for (var p = i; p < data.length; p++) {
2647
- if (data[p] >= 128) break;
2648
- }
2649
- this.string = data.slice(i, p).toString();
2650
- this._parser.write(this.string);
2651
- this.emit("data", this.string);
2652
- i = p - 1;
2653
-
2654
- // handle any remaining characters using multibyte logic
2655
- continue;
2656
- }
2657
- };
2658
-
2659
- CStream.prototype.end = function (chunk) {
2660
- if (chunk && chunk.length) this._parser.write(chunk.toString());
2661
- this._parser.end();
2662
- return true;
2663
- };
2664
-
2665
- CStream.prototype.on = function (ev, handler) {
2666
- var me = this;
2667
- if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
2668
- me._parser["on"+ev] = function () {
2669
- var args = arguments.length === 1 ? [arguments[0]]
2670
- : Array.apply(null, arguments);
2671
- args.splice(0, 0, ev);
2672
- me.emit.apply(me, args);
2673
- };
2674
- }
2675
- return Stream.prototype.on.call(me, ev, handler);
2676
- };
2677
-
2678
- CStream.prototype.destroy = function () {
2679
- clearBuffers(this._parser);
2680
- this.emit("close");
2681
- };
2682
-
2683
- function emit(parser, event, data) {
2684
- if(clarinet.INFO) console.log('-- emit', event, data);
2685
- if (parser[event]) parser[event](data);
2686
- }
2687
-
2688
- function emitNode(parser, event, data) {
2689
- closeValue(parser);
2690
- emit(parser, event, data);
2691
- }
2692
-
2693
- function closeValue(parser, event) {
2694
- parser.textNode = textopts(parser.opt, parser.textNode);
2695
- if (parser.textNode !== undefined) {
2696
- emit(parser, (event ? event : "onvalue"), parser.textNode);
2697
- }
2698
- parser.textNode = undefined;
2699
- }
2700
-
2701
- function closeNumber(parser) {
2702
- if (parser.numberNode)
2703
- emit(parser, "onvalue", parseFloat(parser.numberNode));
2704
- parser.numberNode = "";
2705
- }
2706
-
2707
- function textopts (opt, text) {
2708
- if (text === undefined) {
2709
- return text;
2710
- }
2711
- if (opt.trim) text = text.trim();
2712
- if (opt.normalize) text = text.replace(/\s+/g, " ");
2713
- return text;
2714
- }
2715
-
2716
- function error (parser, er) {
2717
- closeValue(parser);
2718
- er += "\nLine: "+parser.line+
2719
- "\nColumn: "+parser.column+
2720
- "\nChar: "+parser.c;
2721
- er = new Error(er);
2722
- parser.error = er;
2723
- emit(parser, "onerror", er);
2724
- return parser;
2725
- }
2726
-
2727
- function end(parser) {
2728
- if (parser.state !== S.VALUE || parser.depth !== 0)
2729
- error(parser, "Unexpected end");
2730
-
2731
- closeValue(parser);
2732
- parser.c = "";
2733
- parser.closed = true;
2734
- emit(parser, "onend");
2735
- CParser.call(parser, parser.opt);
2736
- return parser;
2737
- }
2738
-
2739
- function isWhitespace(c) {
2740
- return c === Char.carriageReturn || c === Char.lineFeed || c === Char.space || c === Char.tab;
2741
- }
2742
-
2743
- function write (chunk) {
2744
- var parser = this;
2745
- if (this.error) throw this.error;
2746
- if (parser.closed) return error(parser,
2747
- "Cannot write after close. Assign an onready handler.");
2748
- if (chunk === null) return end(parser);
2749
- var i = 0, c = chunk.charCodeAt(0), p = parser.p;
2750
- if (clarinet.DEBUG) console.log('write -> [' + chunk + ']');
2751
- while (c) {
2752
- p = c;
2753
- parser.c = c = chunk.charCodeAt(i++);
2754
- // if chunk doesnt have next, like streaming char by char
2755
- // this way we need to check if previous is really previous
2756
- // if not we need to reset to what the parser says is the previous
2757
- // from buffer
2758
- if(p !== c ) parser.p = p;
2759
- else p = parser.p;
2760
-
2761
- if(!c) break;
2762
-
2763
- if (clarinet.DEBUG) console.log(i,c,clarinet.STATE[parser.state]);
2764
- parser.position ++;
2765
- if (c === Char.lineFeed) {
2766
- parser.line ++;
2767
- parser.column = 0;
2768
- } else parser.column ++;
2769
- switch (parser.state) {
2770
-
2771
- case S.BEGIN:
2772
- if (c === Char.openBrace) parser.state = S.OPEN_OBJECT;
2773
- else if (c === Char.openBracket) parser.state = S.OPEN_ARRAY;
2774
- else if (!isWhitespace(c))
2775
- error(parser, "Non-whitespace before {[.");
2776
- continue;
2777
-
2778
- case S.OPEN_KEY:
2779
- case S.OPEN_OBJECT:
2780
- if (isWhitespace(c)) continue;
2781
- if(parser.state === S.OPEN_KEY) parser.stack.push(S.CLOSE_KEY);
2782
- else {
2783
- if(c === Char.closeBrace) {
2784
- emit(parser, 'onopenobject');
2785
- this.depth++;
2786
- emit(parser, 'oncloseobject');
2787
- this.depth--;
2788
- parser.state = parser.stack.pop() || S.VALUE;
2789
- continue;
2790
- } else parser.stack.push(S.CLOSE_OBJECT);
2791
- }
2792
- if(c === Char.doubleQuote) parser.state = S.STRING;
2793
- else error(parser, "Malformed object key should start with \"");
2794
- continue;
2795
-
2796
- case S.CLOSE_KEY:
2797
- case S.CLOSE_OBJECT:
2798
- if (isWhitespace(c)) continue;
2799
- (parser.state === S.CLOSE_KEY) ? 'key' : 'object';
2800
- if(c === Char.colon) {
2801
- if(parser.state === S.CLOSE_OBJECT) {
2802
- parser.stack.push(S.CLOSE_OBJECT);
2803
- closeValue(parser, 'onopenobject');
2804
- this.depth++;
2805
- } else closeValue(parser, 'onkey');
2806
- parser.state = S.VALUE;
2807
- } else if (c === Char.closeBrace) {
2808
- emitNode(parser, 'oncloseobject');
2809
- this.depth--;
2810
- parser.state = parser.stack.pop() || S.VALUE;
2811
- } else if(c === Char.comma) {
2812
- if(parser.state === S.CLOSE_OBJECT)
2813
- parser.stack.push(S.CLOSE_OBJECT);
2814
- closeValue(parser);
2815
- parser.state = S.OPEN_KEY;
2816
- } else error(parser, 'Bad object');
2817
- continue;
2818
-
2819
- case S.OPEN_ARRAY: // after an array there always a value
2820
- case S.VALUE:
2821
- if (isWhitespace(c)) continue;
2822
- if(parser.state===S.OPEN_ARRAY) {
2823
- emit(parser, 'onopenarray');
2824
- this.depth++;
2825
- parser.state = S.VALUE;
2826
- if(c === Char.closeBracket) {
2827
- emit(parser, 'onclosearray');
2828
- this.depth--;
2829
- parser.state = parser.stack.pop() || S.VALUE;
2830
- continue;
2831
- } else {
2832
- parser.stack.push(S.CLOSE_ARRAY);
2833
- }
2834
- }
2835
- if(c === Char.doubleQuote) parser.state = S.STRING;
2836
- else if(c === Char.openBrace) parser.state = S.OPEN_OBJECT;
2837
- else if(c === Char.openBracket) parser.state = S.OPEN_ARRAY;
2838
- else if(c === Char.t) parser.state = S.TRUE;
2839
- else if(c === Char.f) parser.state = S.FALSE;
2840
- else if(c === Char.n) parser.state = S.NULL;
2841
- else if(c === Char.minus) { // keep and continue
2842
- parser.numberNode += "-";
2843
- } else if(Char._0 <= c && c <= Char._9) {
2844
- parser.numberNode += String.fromCharCode(c);
2845
- parser.state = S.NUMBER_DIGIT;
2846
- } else error(parser, "Bad value");
2847
- continue;
2848
-
2849
- case S.CLOSE_ARRAY:
2850
- if(c === Char.comma) {
2851
- parser.stack.push(S.CLOSE_ARRAY);
2852
- closeValue(parser, 'onvalue');
2853
- parser.state = S.VALUE;
2854
- } else if (c === Char.closeBracket) {
2855
- emitNode(parser, 'onclosearray');
2856
- this.depth--;
2857
- parser.state = parser.stack.pop() || S.VALUE;
2858
- } else if (isWhitespace(c))
2859
- continue;
2860
- else error(parser, 'Bad array');
2861
- continue;
2862
-
2863
- case S.STRING:
2864
- if (parser.textNode === undefined) {
2865
- parser.textNode = "";
2866
- }
2867
-
2868
- // thanks thejh, this is an about 50% performance improvement.
2869
- var starti = i-1
2870
- , slashed = parser.slashed
2871
- , unicodeI = parser.unicodeI
2872
- ;
2873
- STRING_BIGLOOP: while (true) {
2874
- if (clarinet.DEBUG)
2875
- console.log(i,c,clarinet.STATE[parser.state]
2876
- ,slashed);
2877
- // zero means "no unicode active". 1-4 mean "parse some more". end after 4.
2878
- while (unicodeI > 0) {
2879
- parser.unicodeS += String.fromCharCode(c);
2880
- c = chunk.charCodeAt(i++);
2881
- parser.position++;
2882
- if (unicodeI === 4) {
2883
- // TODO this might be slow? well, probably not used too often anyway
2884
- parser.textNode += String.fromCharCode(parseInt(parser.unicodeS, 16));
2885
- unicodeI = 0;
2886
- starti = i-1;
2887
- } else {
2888
- unicodeI++;
2889
- }
2890
- // we can just break here: no stuff we skipped that still has to be sliced out or so
2891
- if (!c) break STRING_BIGLOOP;
2892
- }
2893
- if (c === Char.doubleQuote && !slashed) {
2894
- parser.state = parser.stack.pop() || S.VALUE;
2895
- parser.textNode += chunk.substring(starti, i-1);
2896
- parser.position += i - 1 - starti;
2897
- break;
2898
- }
2899
- if (c === Char.backslash && !slashed) {
2900
- slashed = true;
2901
- parser.textNode += chunk.substring(starti, i-1);
2902
- parser.position += i - 1 - starti;
2903
- c = chunk.charCodeAt(i++);
2904
- parser.position++;
2905
- if (!c) break;
2906
- }
2907
- if (slashed) {
2908
- slashed = false;
2909
- if (c === Char.n) { parser.textNode += '\n'; }
2910
- else if (c === Char.r) { parser.textNode += '\r'; }
2911
- else if (c === Char.t) { parser.textNode += '\t'; }
2912
- else if (c === Char.f) { parser.textNode += '\f'; }
2913
- else if (c === Char.b) { parser.textNode += '\b'; }
2914
- else if (c === Char.u) {
2915
- // \uxxxx. meh!
2916
- unicodeI = 1;
2917
- parser.unicodeS = '';
2918
- } else {
2919
- parser.textNode += String.fromCharCode(c);
2920
- }
2921
- c = chunk.charCodeAt(i++);
2922
- parser.position++;
2923
- starti = i-1;
2924
- if (!c) break;
2925
- else continue;
2926
- }
2927
-
2928
- stringTokenPattern.lastIndex = i;
2929
- var reResult = stringTokenPattern.exec(chunk);
2930
- if (reResult === null) {
2931
- i = chunk.length+1;
2932
- parser.textNode += chunk.substring(starti, i-1);
2933
- parser.position += i - 1 - starti;
2934
- break;
2935
- }
2936
- i = reResult.index+1;
2937
- c = chunk.charCodeAt(reResult.index);
2938
- if (!c) {
2939
- parser.textNode += chunk.substring(starti, i-1);
2940
- parser.position += i - 1 - starti;
2941
- break;
2942
- }
2943
- }
2944
- parser.slashed = slashed;
2945
- parser.unicodeI = unicodeI;
2946
- continue;
2947
-
2948
- case S.TRUE:
2949
- if (c === Char.r) parser.state = S.TRUE2;
2950
- else error(parser, 'Invalid true started with t'+ c);
2951
- continue;
2952
-
2953
- case S.TRUE2:
2954
- if (c === Char.u) parser.state = S.TRUE3;
2955
- else error(parser, 'Invalid true started with tr'+ c);
2956
- continue;
2957
-
2958
- case S.TRUE3:
2959
- if(c === Char.e) {
2960
- emit(parser, "onvalue", true);
2961
- parser.state = parser.stack.pop() || S.VALUE;
2962
- } else error(parser, 'Invalid true started with tru'+ c);
2963
- continue;
2964
-
2965
- case S.FALSE:
2966
- if (c === Char.a) parser.state = S.FALSE2;
2967
- else error(parser, 'Invalid false started with f'+ c);
2968
- continue;
2969
-
2970
- case S.FALSE2:
2971
- if (c === Char.l) parser.state = S.FALSE3;
2972
- else error(parser, 'Invalid false started with fa'+ c);
2973
- continue;
2974
-
2975
- case S.FALSE3:
2976
- if (c === Char.s) parser.state = S.FALSE4;
2977
- else error(parser, 'Invalid false started with fal'+ c);
2978
- continue;
2979
-
2980
- case S.FALSE4:
2981
- if (c === Char.e) {
2982
- emit(parser, "onvalue", false);
2983
- parser.state = parser.stack.pop() || S.VALUE;
2984
- } else error(parser, 'Invalid false started with fals'+ c);
2985
- continue;
2986
-
2987
- case S.NULL:
2988
- if (c === Char.u) parser.state = S.NULL2;
2989
- else error(parser, 'Invalid null started with n'+ c);
2990
- continue;
2991
-
2992
- case S.NULL2:
2993
- if (c === Char.l) parser.state = S.NULL3;
2994
- else error(parser, 'Invalid null started with nu'+ c);
2995
- continue;
2996
-
2997
- case S.NULL3:
2998
- if(c === Char.l) {
2999
- emit(parser, "onvalue", null);
3000
- parser.state = parser.stack.pop() || S.VALUE;
3001
- } else error(parser, 'Invalid null started with nul'+ c);
3002
- continue;
3003
-
3004
- case S.NUMBER_DECIMAL_POINT:
3005
- if(c === Char.period) {
3006
- parser.numberNode += ".";
3007
- parser.state = S.NUMBER_DIGIT;
3008
- } else error(parser, 'Leading zero not followed by .');
3009
- continue;
3010
-
3011
- case S.NUMBER_DIGIT:
3012
- if(Char._0 <= c && c <= Char._9) parser.numberNode += String.fromCharCode(c);
3013
- else if (c === Char.period) {
3014
- if(parser.numberNode.indexOf('.')!==-1)
3015
- error(parser, 'Invalid number has two dots');
3016
- parser.numberNode += ".";
3017
- } else if (c === Char.e || c === Char.E) {
3018
- if(parser.numberNode.indexOf('e')!==-1 ||
3019
- parser.numberNode.indexOf('E')!==-1 )
3020
- error(parser, 'Invalid number has two exponential');
3021
- parser.numberNode += "e";
3022
- } else if (c === Char.plus || c === Char.minus) {
3023
- if(!(p === Char.e || p === Char.E))
3024
- error(parser, 'Invalid symbol in number');
3025
- parser.numberNode += String.fromCharCode(c);
3026
- } else {
3027
- closeNumber(parser);
3028
- i--; // go back one
3029
- parser.state = parser.stack.pop() || S.VALUE;
3030
- }
3031
- continue;
3032
-
3033
- default:
3034
- error(parser, "Unknown state: " + parser.state);
3035
- }
3036
- }
3037
- if (parser.position >= parser.bufferCheckPosition)
3038
- checkBufferLength(parser);
3039
- return parser;
3040
- }
3041
-
3042
- })(exports);
3043
- });
3044
-
3045
- function JsonStream(blob) {
3046
- var pos = 0;
3047
- var parser = JsonParser(true);
3048
- var rv = {
3049
- pullAsync: function (numBytes) {
3050
- return __awaiter(this, void 0, void 0, function () {
3051
- var slize, jsonPart, result;
3052
- return __generator(this, function (_a) {
3053
- switch (_a.label) {
3054
- case 0:
3055
- slize = blob.slice(pos, pos + numBytes);
3056
- pos += numBytes;
3057
- return [4 /*yield*/, readBlobAsync(slize, 'text')];
3058
- case 1:
3059
- jsonPart = _a.sent();
3060
- result = parser.write(jsonPart);
3061
- rv.result = result || {};
3062
- return [2 /*return*/, result];
3063
- }
3064
- });
3065
- });
3066
- },
3067
- pullSync: function (numBytes) {
3068
- var slize = blob.slice(pos, pos + numBytes);
3069
- pos += numBytes;
3070
- var jsonPart = readBlobSync(slize, 'text');
3071
- var result = parser.write(jsonPart);
3072
- rv.result = result || {};
3073
- return result;
3074
- },
3075
- done: function () {
3076
- return parser.done();
3077
- },
3078
- eof: function () {
3079
- return pos >= blob.size;
3080
- },
3081
- result: {}
3082
- };
3083
- return rv;
3084
- }
3085
- function JsonParser(allowPartial) {
3086
- var parser = clarinet_1.parser();
3087
- var level = 0;
3088
- var result;
3089
- var stack = [];
3090
- var obj;
3091
- var key;
3092
- var done = false;
3093
- var array = false;
3094
- parser.onopenobject = function (newKey) {
3095
- var newObj = {};
3096
- newObj.incomplete = true;
3097
- if (!result)
3098
- result = newObj;
3099
- if (obj) {
3100
- stack.push([key, obj, array]);
3101
- if (allowPartial) {
3102
- if (array) {
3103
- obj.push(newObj);
3104
- }
3105
- else {
3106
- obj[key] = newObj;
3107
- }
3108
- }
3109
- }
3110
- obj = newObj;
3111
- key = newKey;
3112
- array = false;
3113
- ++level;
3114
- };
3115
- parser.onkey = function (newKey) { return key = newKey; };
3116
- parser.onvalue = function (value) { return array ? obj.push(value) : obj[key] = value; };
3117
- parser.oncloseobject = function () {
3118
- var _a;
3119
- delete obj.incomplete;
3120
- key = null;
3121
- if (--level === 0) {
3122
- done = true;
3123
- }
3124
- else {
3125
- var completedObj = obj;
3126
- _a = stack.pop(), key = _a[0], obj = _a[1], array = _a[2];
3127
- if (!allowPartial) {
3128
- if (array) {
3129
- obj.push(completedObj);
3130
- }
3131
- else {
3132
- obj[key] = completedObj;
3133
- }
3134
- }
3135
- }
3136
- };
3137
- parser.onopenarray = function () {
3138
- var newObj = [];
3139
- newObj.incomplete = true;
3140
- if (!result)
3141
- result = newObj;
3142
- if (obj) {
3143
- stack.push([key, obj, array]);
3144
- if (allowPartial) {
3145
- if (array) {
3146
- obj.push(newObj);
3147
- }
3148
- else {
3149
- obj[key] = newObj;
3150
- }
3151
- }
3152
- }
3153
- obj = newObj;
3154
- array = true;
3155
- key = null;
3156
- ++level;
3157
- };
3158
- parser.onclosearray = function () {
3159
- var _a;
3160
- delete obj.incomplete;
3161
- key = null;
3162
- if (--level === 0) {
3163
- done = true;
3164
- }
3165
- else {
3166
- var completedObj = obj;
3167
- _a = stack.pop(), key = _a[0], obj = _a[1], array = _a[2];
3168
- if (!allowPartial) {
3169
- if (array) {
3170
- obj.push(completedObj);
3171
- }
3172
- else {
3173
- obj[key] = completedObj;
3174
- }
3175
- }
3176
- }
3177
- };
3178
- return {
3179
- write: function (jsonPart) {
3180
- parser.write(jsonPart);
3181
- return result;
3182
- },
3183
- done: function () {
3184
- return done;
3185
- }
3186
- };
3187
- }
3188
-
3189
- var DEFAULT_KILOBYTES_PER_CHUNK = 1024;
3190
- function importDB(exportedData, options) {
3191
- return __awaiter(this, void 0, void 0, function () {
3192
- var CHUNK_SIZE, stream, dbExport, db;
3193
- return __generator(this, function (_a) {
3194
- switch (_a.label) {
3195
- case 0:
3196
- options = options || {}; // All booleans defaults to false.
3197
- CHUNK_SIZE = options.chunkSizeBytes || (DEFAULT_KILOBYTES_PER_CHUNK * 1024);
3198
- return [4 /*yield*/, loadUntilWeGotEnoughData(exportedData, CHUNK_SIZE)];
3199
- case 1:
3200
- stream = _a.sent();
3201
- dbExport = stream.result.data;
3202
- db = new Dexie__default["default"](options.name !== undefined ? options.name : dbExport.databaseName);
3203
- db.version(dbExport.databaseVersion).stores(extractDbSchema(dbExport));
3204
- return [4 /*yield*/, importInto(db, stream, options.name !== undefined ? __assign(__assign({}, options), { acceptNameDiff: true }) : options)];
3205
- case 2:
3206
- _a.sent();
3207
- return [2 /*return*/, db];
3208
- }
3209
- });
3210
- });
3211
- }
3212
- function peakImportFile(exportedData) {
3213
- return __awaiter(this, void 0, void 0, function () {
3214
- var stream;
3215
- return __generator(this, function (_a) {
3216
- switch (_a.label) {
3217
- case 0:
3218
- stream = JsonStream(exportedData);
3219
- _a.label = 1;
3220
- case 1:
3221
- if (!!stream.eof()) return [3 /*break*/, 3];
3222
- return [4 /*yield*/, stream.pullAsync(5 * 1024)];
3223
- case 2:
3224
- _a.sent(); // 5 k is normally enough for the headers. If not, it will just do another go.
3225
- if (stream.result.data && stream.result.data.data) {
3226
- // @ts-ignore - TS won't allow us to delete a required property - but we are going to cast it.
3227
- delete stream.result.data.data; // Don't return half-baked data array.
3228
- return [3 /*break*/, 3];
3229
- }
3230
- return [3 /*break*/, 1];
3231
- case 3: return [2 /*return*/, stream.result];
3232
- }
3233
- });
3234
- });
3235
- }
3236
- function importInto(db, exportedData, options) {
3237
- return __awaiter(this, void 0, void 0, function () {
3238
- function importAll() {
3239
- return __awaiter(this, void 0, void 0, function () {
3240
- var _loop_1, _i, _a, tableExport, state_1;
3241
- return __generator(this, function (_b) {
3242
- switch (_b.label) {
3243
- case 0:
3244
- _loop_1 = function (tableExport) {
3245
- var tableName, table, tableSchemaStr, sourceRows, rows, i, obj, filter, transform, filteredRows, _c, keys, values;
3246
- return __generator(this, function (_d) {
3247
- switch (_d.label) {
3248
- case 0:
3249
- if (skipTables.includes(tableExport.tableName))
3250
- return [2 /*return*/, "continue"];
3251
- if (!tableExport.rows)
3252
- return [2 /*return*/, "break"]; // Need to pull more!
3253
- if (!tableExport.rows.incomplete && tableExport.rows.length === 0)
3254
- return [2 /*return*/, "continue"];
3255
- if (progressCallback) {
3256
- // Keep ongoing transaction private
3257
- Dexie__default["default"].ignoreTransaction(function () { return progressCallback(progress); });
3258
- }
3259
- tableName = tableExport.tableName;
3260
- table = db.table(tableName);
3261
- tableSchemaStr = dbExport.tables.filter(function (t) { return t.name === tableName; })[0].schema;
3262
- if (!table) {
3263
- if (!options.acceptMissingTables)
3264
- throw new Error("Exported table ".concat(tableExport.tableName, " is missing in installed database"));
3265
- else
3266
- return [2 /*return*/, "continue"];
3267
- }
3268
- if (!options.acceptChangedPrimaryKey &&
3269
- tableSchemaStr.split(',')[0] != table.schema.primKey.src) {
3270
- throw new Error("Primary key differs for table ".concat(tableExport.tableName, ". "));
3271
- }
3272
- sourceRows = tableExport.rows;
3273
- rows = [];
3274
- for (i = 0; i < sourceRows.length; i++) {
3275
- obj = sourceRows[i];
3276
- if (!obj.incomplete) {
3277
- rows.push(TSON.revive(obj));
3278
- }
3279
- else {
3280
- break;
3281
- }
3282
- }
3283
- filter = options.filter;
3284
- transform = options.transform;
3285
- filteredRows = filter ?
3286
- tableExport.inbound ?
3287
- rows.filter(function (value) { return filter(tableName, value); }) :
3288
- rows.filter(function (_a) {
3289
- var key = _a[0], value = _a[1];
3290
- return filter(tableName, value, key);
3291
- }) :
3292
- rows;
3293
- if (transform) {
3294
- filteredRows = filteredRows.map(tableExport.inbound ?
3295
- function (value) { return transform(tableName, value).value; } :
3296
- function (_a) {
3297
- var key = _a[0], value = _a[1];
3298
- var res = transform(tableName, value, key);
3299
- return [res.key, res.value];
3300
- });
3301
- }
3302
- _c = tableExport.inbound ?
3303
- [undefined, filteredRows] :
3304
- [filteredRows.map(function (row) { return row[0]; }), rows.map(function (row) { return row[1]; })], keys = _c[0], values = _c[1];
3305
- if (!options.overwriteValues) return [3 /*break*/, 2];
3306
- return [4 /*yield*/, table.bulkPut(values, keys)];
3307
- case 1:
3308
- _d.sent();
3309
- return [3 /*break*/, 4];
3310
- case 2: return [4 /*yield*/, table.bulkAdd(values, keys)];
3311
- case 3:
3312
- _d.sent();
3313
- _d.label = 4;
3314
- case 4:
3315
- progress.completedRows += rows.length;
3316
- if (!rows.incomplete) {
3317
- progress.completedTables += 1;
3318
- }
3319
- sourceRows.splice(0, rows.length); // Free up RAM, keep existing array instance.
3320
- return [2 /*return*/];
3321
- }
3322
- });
3323
- };
3324
- _i = 0, _a = dbExport.data;
3325
- _b.label = 1;
3326
- case 1:
3327
- if (!(_i < _a.length)) return [3 /*break*/, 4];
3328
- tableExport = _a[_i];
3329
- return [5 /*yield**/, _loop_1(tableExport)];
3330
- case 2:
3331
- state_1 = _b.sent();
3332
- if (state_1 === "break")
3333
- return [3 /*break*/, 4];
3334
- _b.label = 3;
3335
- case 3:
3336
- _i++;
3337
- return [3 /*break*/, 1];
3338
- case 4:
3339
- // Avoid unnescessary loops in "for (const tableExport of dbExport.data)"
3340
- while (dbExport.data.length > 0 && dbExport.data[0].rows && !dbExport.data[0].rows.incomplete) {
3341
- // We've already imported all rows from the first table. Delete its occurrence
3342
- dbExport.data.splice(0, 1);
3343
- }
3344
- if (!(!jsonStream.done() && !jsonStream.eof())) return [3 /*break*/, 8];
3345
- if (!readBlobsSynchronously) return [3 /*break*/, 5];
3346
- // If we can pull from blob synchronically, we don't have to
3347
- // keep transaction alive using Dexie.waitFor().
3348
- // This will only be possible in workers.
3349
- jsonStream.pullSync(CHUNK_SIZE);
3350
- return [3 /*break*/, 7];
3351
- case 5: return [4 /*yield*/, Dexie__default["default"].waitFor(jsonStream.pullAsync(CHUNK_SIZE))];
3352
- case 6:
3353
- _b.sent();
3354
- _b.label = 7;
3355
- case 7: return [3 /*break*/, 9];
3356
- case 8: return [3 /*break*/, 10];
3357
- case 9:
3358
- return [3 /*break*/, 0];
3359
- case 10: return [2 /*return*/];
3360
- }
3361
- });
3362
- });
3363
- }
3364
- var CHUNK_SIZE, jsonStream, dbExportFile, readBlobsSynchronously, dbExport, skipTables, progressCallback, progress, _i, _a, table;
3365
- return __generator(this, function (_b) {
3366
- switch (_b.label) {
3367
- case 0:
3368
- options = options || {}; // All booleans defaults to false.
3369
- CHUNK_SIZE = options.chunkSizeBytes || (DEFAULT_KILOBYTES_PER_CHUNK * 1024);
3370
- return [4 /*yield*/, loadUntilWeGotEnoughData(exportedData, CHUNK_SIZE)];
3371
- case 1:
3372
- jsonStream = _b.sent();
3373
- dbExportFile = jsonStream.result;
3374
- readBlobsSynchronously = 'FileReaderSync' in self;
3375
- dbExport = dbExportFile.data;
3376
- skipTables = options.skipTables ? options.skipTables : [];
3377
- if (!options.acceptNameDiff && db.name !== dbExport.databaseName)
3378
- throw new Error("Name differs. Current database name is ".concat(db.name, " but export is ").concat(dbExport.databaseName));
3379
- if (!options.acceptVersionDiff && db.verno !== dbExport.databaseVersion) {
3380
- // Possible feature: Call upgraders in some isolated way if this happens... ?
3381
- throw new Error("Database version differs. Current database is in version ".concat(db.verno, " but export is ").concat(dbExport.databaseVersion));
3382
- }
3383
- progressCallback = options.progressCallback;
3384
- progress = {
3385
- done: false,
3386
- completedRows: 0,
3387
- completedTables: 0,
3388
- totalRows: dbExport.tables.reduce(function (p, c) { return p + c.rowCount; }, 0),
3389
- totalTables: dbExport.tables.length
3390
- };
3391
- if (progressCallback) {
3392
- // Keep ongoing transaction private
3393
- Dexie__default["default"].ignoreTransaction(function () { return progressCallback(progress); });
3394
- }
3395
- if (!options.clearTablesBeforeImport) return [3 /*break*/, 5];
3396
- _i = 0, _a = db.tables;
3397
- _b.label = 2;
3398
- case 2:
3399
- if (!(_i < _a.length)) return [3 /*break*/, 5];
3400
- table = _a[_i];
3401
- if (skipTables.includes(table.name))
3402
- return [3 /*break*/, 4];
3403
- return [4 /*yield*/, table.clear()];
3404
- case 3:
3405
- _b.sent();
3406
- _b.label = 4;
3407
- case 4:
3408
- _i++;
3409
- return [3 /*break*/, 2];
3410
- case 5:
3411
- if (!options.noTransaction) return [3 /*break*/, 7];
3412
- return [4 /*yield*/, importAll()];
3413
- case 6:
3414
- _b.sent();
3415
- return [3 /*break*/, 9];
3416
- case 7: return [4 /*yield*/, db.transaction('rw', db.tables, importAll)];
3417
- case 8:
3418
- _b.sent();
3419
- _b.label = 9;
3420
- case 9:
3421
- progress.done = true;
3422
- if (progressCallback) {
3423
- // Keep ongoing transaction private
3424
- Dexie__default["default"].ignoreTransaction(function () { return progressCallback(progress); });
3425
- }
3426
- return [2 /*return*/];
3427
- }
3428
- });
3429
- });
3430
- }
3431
- function loadUntilWeGotEnoughData(exportedData, CHUNK_SIZE) {
3432
- return __awaiter(this, void 0, void 0, function () {
3433
- var stream, dbExportFile;
3434
- return __generator(this, function (_a) {
3435
- switch (_a.label) {
3436
- case 0:
3437
- stream = ('slice' in exportedData ?
3438
- JsonStream(exportedData) :
3439
- exportedData);
3440
- _a.label = 1;
3441
- case 1:
3442
- if (!!stream.eof()) return [3 /*break*/, 3];
3443
- return [4 /*yield*/, stream.pullAsync(CHUNK_SIZE)];
3444
- case 2:
3445
- _a.sent();
3446
- if (stream.result.data && stream.result.data.data)
3447
- return [3 /*break*/, 3];
3448
- return [3 /*break*/, 1];
3449
- case 3:
3450
- dbExportFile = stream.result;
3451
- if (!dbExportFile || dbExportFile.formatName != "dexie")
3452
- throw new Error("Given file is not a dexie export");
3453
- if (dbExportFile.formatVersion > VERSION) {
3454
- throw new Error("Format version ".concat(dbExportFile.formatVersion, " not supported"));
3455
- }
3456
- if (!dbExportFile.data) {
3457
- throw new Error("No data in export file");
3458
- }
3459
- if (!dbExportFile.data.databaseName) {
3460
- throw new Error("Missing databaseName in export file");
3461
- }
3462
- if (!dbExportFile.data.databaseVersion) {
3463
- throw new Error("Missing databaseVersion in export file");
3464
- }
3465
- if (!dbExportFile.data.tables) {
3466
- throw new Error("Missing tables in export file");
3467
- }
3468
- return [2 /*return*/, stream];
3469
- }
3470
- });
3471
- });
3472
- }
3473
-
3474
- //
3475
- // Extend Dexie interface (runtime wise)
3476
- //
3477
- Dexie__default["default"].prototype.export = function (options) {
3478
- return exportDB(this, options);
3479
- };
3480
- Dexie__default["default"].prototype.import = function (blob, options) {
3481
- return importInto(this, blob, options);
3482
- };
3483
- Dexie__default["default"].import = function (blob, options) { return importDB(blob, options); };
3484
- var dexieExportImport = (function () {
3485
- throw new Error("This addon extends Dexie.prototype globally and does not have be included in Dexie constructor's addons options.");
3486
- });
3487
-
3488
- exports["default"] = dexieExportImport;
3489
- exports.exportDB = exportDB;
3490
- exports.importDB = importDB;
3491
- exports.importInto = importInto;
3492
- exports.peakImportFile = peakImportFile;
3493
-
3494
- Object.defineProperty(exports, '__esModule', { value: true });
3495
-
3496
- }));
3497
- //# sourceMappingURL=dexie-export-import.js.map
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("dexie")):"function"==typeof define&&define.amd?define(["exports","dexie"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DexieExportImport={},e.Dexie)}(this,function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=n(t),i=function(){return i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},i.apply(this,arguments)};
2
+ /*! *****************************************************************************
3
+ Copyright (c) Microsoft Corporation.
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
15
+ ***************************************************************************** */function o(e,t,n,r){return new(n||(n=Promise))(function(i,o){function a(e){try{c(r.next(e))}catch(e){o(e)}}function u(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(a,u)}c((r=r.apply(e,t||[])).next())})}function a(e,t){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function u(o){return function(u){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){a.label=o[1];break}if(6===o[0]&&a.label<i[1]){a.label=i[1],i=o;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(o);break}i[2]&&a.ops.pop(),a.trys.pop();continue}o=t.call(e,a)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,u])}}}function u(e){return[e.schema.primKey].concat(e.schema.indexes).map(function(e){return e.src}).join(",")}function c(e,t){return new Promise(function(n,r){var i=new FileReader;i.onabort=function(e){return r(new Error("file read aborted"))},i.onerror=function(e){return r(e.target.error)},i.onload=function(e){return n(e.target.result)},"binary"===t?i.readAsArrayBuffer(e):i.readAsText(e)})}function s(e,t){if("undefined"==typeof FileReaderSync)throw new Error("FileReaderSync missing. Reading blobs synchronously requires code to run from within a web worker. Use TSON.encapsulateAsync() to do it from the main thread.");var n=new FileReaderSync;return"binary"===t?n.readAsArrayBuffer(e):n.readAsText(e)}var f="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function l(e,t){return e(t={exports:{}},t.exports),t.exports}for(var p=l(function(e,t){e.exports=function(){function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t,n,r,i,o,a){try{var u=e[o](a),c=u.value}catch(e){return void n(e)}u.done?t(c):Promise.resolve(c).then(r,i)}function n(e){return function(){var n=this,r=arguments;return new Promise(function(i,o){var a=e.apply(n,r);function u(e){t(a,i,o,u,c,"next",e)}function c(e){t(a,i,o,u,c,"throw",e)}u(void 0)})}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function o(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function u(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?u(Object(n),!0).forEach(function(t){a(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):u(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function s(e,t){return p(e)||h(e,t)||v()}function f(e){return l(e)||y(e)||d()}function l(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function p(e){if(Array.isArray(e))return e}function y(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function h(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var n=[],r=!0,i=!1,o=void 0;try{for(var a,u=e[Symbol.iterator]();!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(i)throw o}}return n}}function d(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function v(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}var b=function e(t){r(this,e),this.p=new Promise(t)};b.__typeson__type__="TypesonPromise","undefined"!=typeof Symbol&&(b.prototype[Symbol.toStringTag]="TypesonPromise"),b.prototype.then=function(e,t){var n=this;return new b(function(r,i){n.p.then(function(t){r(e?e(t):t)}).catch(function(e){return t?t(e):Promise.reject(e)}).then(r,i)})},b.prototype.catch=function(e){return this.then(null,e)},b.resolve=function(e){return new b(function(t){t(e)})},b.reject=function(e){return new b(function(t,n){n(e)})},["all","race"].forEach(function(e){b[e]=function(t){return new b(function(n,r){Promise[e](t.map(function(e){return e&&e.constructor&&"TypesonPromise"===e.constructor.__typeson__type__?e.p:e})).then(n,r)})}});var m={}.toString,g={}.hasOwnProperty,w=Object.getPrototypeOf,O=g.toString;function S(e,t){return _(e)&&"function"==typeof e.then&&(!t||"function"==typeof e.catch)}function E(e){return m.call(e).slice(8,-1)}function A(t,n){if(!t||"object"!==e(t))return!1;var r=w(t);if(!r)return null===n;var i=g.call(r,"constructor")&&r.constructor;return"function"!=typeof i?null===n:n===i||null!==n&&O.call(i)===O.call(n)||"function"==typeof n&&"string"==typeof i.__typeson__type__&&i.__typeson__type__===n.__typeson__type__}function T(e){return!(!e||"Object"!==E(e))&&(!w(e)||A(e,Object))}function N(e){if(!e||"Object"!==E(e))return!1;var t=w(e);return!t||A(e,Object)||N(t)}function _(t){return t&&"object"===e(t)}function j(e){return e.replace(/~/g,"~0").replace(/\./g,"~1")}function I(e){return e.replace(/~1/g,".").replace(/~0/g,"~")}function P(e,t){if(""===t)return e;var n=t.indexOf(".");if(n>-1){var r=e[I(t.slice(0,n))];return void 0===r?void 0:P(r,t.slice(n+1))}return e[I(t)]}function k(e,t,n){if(""===t)return n;var r=t.indexOf(".");return r>-1?k(e[I(t.slice(0,r))],t.slice(r+1),n):(e[I(t)]=n,e)}function x(t){return null===t?"null":Array.isArray(t)?"array":e(t)}var B=Object.keys,C=Array.isArray,L={}.hasOwnProperty,U=["type","replaced","iterateIn","iterateUnsetNumeric"];function R(e,t){if(""===e.keypath)return-1;var n=e.keypath.match(/\./g)||0,r=t.keypath.match(/\./g)||0;return n&&(n=n.length),r&&(r=r.length),n>r?-1:n<r?1:e.keypath<t.keypath?-1:e.keypath>t.keypath}var F=function(){function t(e){r(this,t),this.options=e,this.plainObjectReplacers=[],this.nonplainObjectReplacers=[],this.revivers={},this.types={}}return o(t,[{key:"stringify",value:function(e,t,n,r){r=c({},this.options,{},r,{stringification:!0});var i=this.encapsulate(e,null,r);return C(i)?JSON.stringify(i[0],t,n):i.then(function(e){return JSON.stringify(e,t,n)})}},{key:"stringifySync",value:function(e,t,n,r){return this.stringify(e,t,n,c({throwOnBadSyncType:!0},r,{sync:!0}))}},{key:"stringifyAsync",value:function(e,t,n,r){return this.stringify(e,t,n,c({throwOnBadSyncType:!0},r,{sync:!1}))}},{key:"parse",value:function(e,t,n){return n=c({},this.options,{},n,{parse:!0}),this.revive(JSON.parse(e,t),n)}},{key:"parseSync",value:function(e,t,n){return this.parse(e,t,c({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"parseAsync",value:function(e,t,n){return this.parse(e,t,c({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"specialTypeNames",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.returnTypeNames=!0,this.encapsulate(e,t,n)}},{key:"rootTypeName",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.iterateNone=!0,this.encapsulate(e,t,n)}},{key:"encapsulate",value:function(r,i,o){var a=(o=c({sync:!0},this.options,{},o)).sync,u=this,l={},p=[],y=[],h=[],d=!("cyclic"in o)||o.cyclic,v=o.encapsulateObserver,m=E("",r,d,i||{},h);function g(e){var n=Object.values(l);if(o.iterateNone)return n.length?n[0]:t.getJSONType(e);if(n.length){if(o.returnTypeNames)return f(new Set(n));e&&T(e)&&!L.call(e,"$types")?e.$types=l:e={$:e,$types:{$:l}}}else _(e)&&L.call(e,"$types")&&(e={$:e,$types:!0});return!o.returnTypeNames&&e}function w(e,t){return O.apply(this,arguments)}function O(){return O=n(regeneratorRuntime.mark(function e(t,r){var i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all(r.map(function(e){return e[1].p}));case 2:return i=e.sent,e.next=5,Promise.all(i.map(function(){var e=n(regeneratorRuntime.mark(function e(n){var i,o,a,u,c,f,l,p,y,h,d,v,m,g;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(i=[],o=r.splice(0,1),a=s(o,1),u=a[0],c=s(u,7),f=c[0],l=c[2],p=c[3],y=c[4],h=c[5],d=c[6],v=E(f,n,l,p,i,!0,d),m=A(v,b),!f||!m){e.next=11;break}return e.next=8,v.p;case 8:return g=e.sent,y[h]=g,e.abrupt("return",w(t,i));case 11:return f?y[h]=v:t=m?v.p:v,e.abrupt("return",w(t,i));case 13:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()));case 5:return e.abrupt("return",t);case 6:case"end":return e.stop()}},e)})),O.apply(this,arguments)}function S(e,t,n){Object.assign(e,t);var r=U.map(function(t){var n=e[t];return delete e[t],n});n(),U.forEach(function(t,n){e[t]=r[n]})}function E(n,r,i,a,c,s,f){var h,d={},m=e(r),g=v?function(e){var o=f||a.type||t.getJSONType(r);v(Object.assign(e||d,{keypath:n,value:r,cyclic:i,stateObj:a,promisesData:c,resolvingTypesonPromise:s,awaitingTypesonPromise:A(r,b)},{type:o}))}:null;if(["string","boolean","number","undefined"].includes(m))return void 0===r||"number"===m&&(isNaN(r)||r===-1/0||r===1/0)?(h=a.replaced?r:N(n,r,a,c,!1,s,g))!==r&&(d={replaced:h}):h=r,g&&g(),h;if(null===r)return g&&g(),r;if(i&&!a.iterateIn&&!a.iterateUnsetNumeric&&r&&"object"===e(r)){var w=p.indexOf(r);if(!(w<0))return l[n]="#",g&&g({cyclicKeypath:y[w]}),"#"+y[w];!0===i&&(p.push(r),y.push(n))}var O,_=T(r),I=C(r),P=(_||I)&&(!u.plainObjectReplacers.length||a.replaced)||a.iterateIn?r:N(n,r,a,c,_||I,null,g);if(P!==r?(h=P,d={replaced:P}):""===n&&A(r,b)?(c.push([n,r,i,a,void 0,void 0,a.type]),h=r):I&&"object"!==a.iterateIn||"array"===a.iterateIn?(O=new Array(r.length),d={clone:O}):(["function","symbol"].includes(e(r))||"toJSON"in r||A(r,b)||A(r,Promise)||A(r,ArrayBuffer))&&!_&&"object"!==a.iterateIn?h=r:(O={},a.addLength&&(O.length=r.length),d={clone:O}),g&&g(),o.iterateNone)return O||h;if(!O)return h;if(a.iterateIn){var k=function(e){var t={ownKeys:L.call(r,e)};S(a,t,function(){var t=n+(n?".":"")+j(e),o=E(t,r[e],Boolean(i),a,c,s);A(o,b)?c.push([t,o,Boolean(i),a,O,e,a.type]):void 0!==o&&(O[e]=o)})};for(var x in r)k(x);g&&g({endIterateIn:!0,end:!0})}else B(r).forEach(function(e){var t=n+(n?".":"")+j(e);S(a,{ownKeys:!0},function(){var n=E(t,r[e],Boolean(i),a,c,s);A(n,b)?c.push([t,n,Boolean(i),a,O,e,a.type]):void 0!==n&&(O[e]=n)})}),g&&g({endIterateOwn:!0,end:!0});if(a.iterateUnsetNumeric){for(var U=r.length,R=function(e){if(!(e in r)){var t=n+(n?".":"")+e;S(a,{ownKeys:!1},function(){var n=E(t,void 0,Boolean(i),a,c,s);A(n,b)?c.push([t,n,Boolean(i),a,O,e,a.type]):void 0!==n&&(O[e]=n)})}},F=0;F<U;F++)R(F);g&&g({endIterateUnsetNumeric:!0,end:!0})}return O}function N(e,t,n,r,i,o,c){for(var s=i?u.plainObjectReplacers:u.nonplainObjectReplacers,f=s.length;f--;){var p=s[f];if(p.test(t,n)){var y=p.type;if(u.revivers[y]){var h=l[e];l[e]=h?[y].concat(h):y}return Object.assign(n,{type:y,replaced:!0}),!a&&p.replaceAsync||p.replace?(c&&c({replacing:!0}),E(e,p[a||!p.replaceAsync?"replace":"replaceAsync"](t,n),d&&"readonly",n,r,o,y)):(c&&c({typeDetected:!0}),E(e,t,d&&"readonly",n,r,o,y))}}return t}return h.length?a&&o.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(w(m,h)).then(g):!a&&o.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():o.stringification&&a?[g(m)]:a?g(m):Promise.resolve(g(m))}},{key:"encapsulateSync",value:function(e,t,n){return this.encapsulate(e,t,c({throwOnBadSyncType:!0},n,{sync:!0}))}},{key:"encapsulateAsync",value:function(e,t,n){return this.encapsulate(e,t,c({throwOnBadSyncType:!0},n,{sync:!1}))}},{key:"revive",value:function(e,t){var n=e&&e.$types;if(!n)return e;if(!0===n)return e.$;var r=(t=c({sync:!0},this.options,{},t)).sync,i=[],o={},a=!0;n.$&&T(n.$)&&(e=e.$,n=n.$,a=!1);var u=this;function f(e,t){var n=s(u.revivers[e]||[],1)[0];if(!n)throw new Error("Unregistered type: "+e);return r&&!("revive"in n)?t:n[r&&n.revive?"revive":!r&&n.reviveAsync?"reviveAsync":"revive"](t,o)}function l(){var t=[];if(Object.entries(n).forEach(function(e){var r=s(e,2),i=r[0],o=r[1];"#"!==o&&[].concat(o).forEach(function(e){s(u.revivers[e]||[null,{}],2)[1].plain&&(t.push({keypath:i,type:e}),delete n[i])})}),t.length)return t.sort(R).reduce(function t(n,r){var i=r.keypath,o=r.type;if(S(n))return n.then(function(e){return t(e,{keypath:i,type:o})});var a=P(e,i);if(A(a=f(o,a),b))return a.then(function(t){var n=k(e,i,t);n===t&&(e=n)});var u=k(e,i,a);u===a&&(e=u)},void 0)}var p=[];function y(e,t,r,o,u){if(!a||"$types"!==e){var c=n[e],l=C(t);if(l||T(t)){var h=l?new Array(t.length):{};for(B(t).forEach(function(n){var i=y(e+(e?".":"")+j(n),t[n],r||h,h,n),o=function(e){return A(e,D)?h[n]=void 0:void 0!==e&&(h[n]=e),e};A(i,b)?p.push(i.then(function(e){return o(e)})):o(i)}),t=h;i.length;){var d=s(i[0],4),v=d[0],m=d[1],g=d[2],w=d[3],O=P(v,m);if(void 0===O)break;g[w]=O,i.splice(0,1)}}if(!c)return t;if("#"===c){var S=P(r,t.slice(1));return void 0===S&&i.push([r,t.slice(1),o,u]),S}return[].concat(c).reduce(function e(t,n){return A(t,b)?t.then(function(t){return e(t,n)}):f(n,t)},t)}}function h(e){return A(e,D)?void 0:e}var d,v=l();return A(v,b)?d=v.then(function(){return e}):(d=y("",e,null),p.length&&(d=b.resolve(d).then(function(e){return b.all([e].concat(p))}).then(function(e){return s(e,1)[0]}))),S(d)?r&&t.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():A(d,b)?d.p.then(h):d:!r&&t.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r?h(d):Promise.resolve(h(d))}},{key:"reviveSync",value:function(e,t){return this.revive(e,c({throwOnBadSyncType:!0},t,{sync:!0}))}},{key:"reviveAsync",value:function(e,t){return this.revive(e,c({throwOnBadSyncType:!0},t,{sync:!1}))}},{key:"register",value:function(e,n){return n=n||{},[].concat(e).forEach(function e(r){var i=this;if(C(r))return r.map(function(t){return e.call(i,t)});r&&B(r).forEach(function(e){if("#"===e)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(t.JSON_TYPES.includes(e))throw new TypeError("Plain JSON object types are reserved as type names");var i=r[e],o=i&&i.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter(function(t){return t.type===e});if(a.length&&(o.splice(o.indexOf(a[0]),1),delete this.revivers[e],delete this.types[e]),"function"==typeof i){var u=i;i={test:function(e){return e&&e.constructor===u},replace:function(e){return c({},e)},revive:function(e){return Object.assign(Object.create(u.prototype),e)}}}else if(C(i)){var f=s(i,3);i={test:f[0],replace:f[1],revive:f[2]}}if(i&&i.test){var l={type:e,test:i.test.bind(i)};i.replace&&(l.replace=i.replace.bind(i)),i.replaceAsync&&(l.replaceAsync=i.replaceAsync.bind(i));var p="number"==typeof n.fallback?n.fallback:n.fallback?0:1/0;if(i.testPlainObjects?this.plainObjectReplacers.splice(p,0,l):this.nonplainObjectReplacers.splice(p,0,l),i.revive||i.reviveAsync){var y={};i.revive&&(y.revive=i.revive.bind(i)),i.reviveAsync&&(y.reviveAsync=i.reviveAsync.bind(i)),this.revivers[e]=[y,{plain:i.testPlainObjects}]}this.types[e]=i}},this)},this),this}}]),t}(),D=function e(){r(this,e)};return D.__typeson__type__="TypesonUndefined",F.Undefined=D,F.Promise=b,F.isThenable=S,F.toStringTag=E,F.hasConstructorOf=A,F.isObject=_,F.isPlainObject=T,F.isUserObject=N,F.escapeKeyPathComponent=j,F.unescapeKeyPathComponent=I,F.getByKeyPath=P,F.getJSONType=x,F.JSON_TYPES=["null","boolean","number","string","array","object"],F}()}),y=l(function(e,t){e.exports=function(){function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function o(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function u(e){return(u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function y(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?p(Object(n),!0).forEach(function(t){l(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):p(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function h(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,i=!1,o=void 0;try{for(var a,u=e[Symbol.iterator]();!(r=(a=u.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(i)throw o}}return n}}(e,t)||v(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(e){return function(e){if(Array.isArray(e))return b(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||v(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){if(e){if("string"==typeof e)return b(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var m=function e(t){c(this,e),this.p=new Promise(t)};m.__typeson__type__="TypesonPromise","undefined"!=typeof Symbol&&(m.prototype[Symbol.toStringTag]="TypesonPromise"),m.prototype.then=function(e,t){var n=this;return new m(function(r,i){n.p.then(function(t){r(e?e(t):t)}).catch(function(e){return t?t(e):Promise.reject(e)}).then(r,i)})},m.prototype.catch=function(e){return this.then(null,e)},m.resolve=function(e){return new m(function(t){t(e)})},m.reject=function(e){return new m(function(t,n){n(e)})},["all","race"].forEach(function(e){m[e]=function(t){return new m(function(n,r){Promise[e](t.map(function(e){return e&&e.constructor&&"TypesonPromise"===e.constructor.__typeson__type__?e.p:e})).then(n,r)})}});var g={}.toString,w={}.hasOwnProperty,O=Object.getPrototypeOf,S=w.toString;function E(e,t){return _(e)&&"function"==typeof e.then&&(!t||"function"==typeof e.catch)}function A(e){return g.call(e).slice(8,-1)}function T(e,t){if(!e||"object"!==u(e))return!1;var n=O(e);if(!n)return null===t;var r=w.call(n,"constructor")&&n.constructor;return"function"!=typeof r?null===t:t===r||null!==t&&S.call(r)===S.call(t)||"function"==typeof t&&"string"==typeof r.__typeson__type__&&r.__typeson__type__===t.__typeson__type__}function N(e){return!(!e||"Object"!==A(e))&&(!O(e)||T(e,Object))}function _(e){return e&&"object"===u(e)}function j(e){return e.replace(/~/g,"~0").replace(/\./g,"~1")}function I(e){return e.replace(/~1/g,".").replace(/~0/g,"~")}function P(e,t){if(""===t)return e;var n=t.indexOf(".");if(n>-1){var r=e[I(t.slice(0,n))];return void 0===r?void 0:P(r,t.slice(n+1))}return e[I(t)]}function k(e,t,n){if(""===t)return n;var r=t.indexOf(".");return r>-1?k(e[I(t.slice(0,r))],t.slice(r+1),n):(e[I(t)]=n,e)}function x(e,t,n){return n?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}var B=Object.keys,C=Array.isArray,L={}.hasOwnProperty,U=["type","replaced","iterateIn","iterateUnsetNumeric"];function R(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];try{return Promise.resolve(e.apply(this,t))}catch(e){return Promise.reject(e)}}}function F(e,t){if(""===e.keypath)return-1;var n=e.keypath.match(/\./g)||0,r=t.keypath.match(/\./g)||0;return n&&(n=n.length),r&&(r=r.length),n>r?-1:n<r?1:e.keypath<t.keypath?-1:e.keypath>t.keypath}var D=function(){function e(t){c(this,e),this.options=t,this.plainObjectReplacers=[],this.nonplainObjectReplacers=[],this.revivers={},this.types={}}return function(e,t,n){t&&s(e.prototype,t),n&&s(e,n)}(e,[{key:"stringify",value:function(e,t,n,r){r=y(y(y({},this.options),r),{},{stringification:!0});var i=this.encapsulate(e,null,r);return C(i)?JSON.stringify(i[0],t,n):i.then(function(e){return JSON.stringify(e,t,n)})}},{key:"stringifySync",value:function(e,t,n,r){return this.stringify(e,t,n,y(y({throwOnBadSyncType:!0},r),{},{sync:!0}))}},{key:"stringifyAsync",value:function(e,t,n,r){return this.stringify(e,t,n,y(y({throwOnBadSyncType:!0},r),{},{sync:!1}))}},{key:"parse",value:function(e,t,n){return n=y(y(y({},this.options),n),{},{parse:!0}),this.revive(JSON.parse(e,t),n)}},{key:"parseSync",value:function(e,t,n){return this.parse(e,t,y(y({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"parseAsync",value:function(e,t,n){return this.parse(e,t,y(y({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"specialTypeNames",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.returnTypeNames=!0,this.encapsulate(e,t,n)}},{key:"rootTypeName",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return n.iterateNone=!0,this.encapsulate(e,t,n)}},{key:"encapsulate",value:function(t,n,r){var i=R(function(e,t){return x(Promise.all(t.map(function(e){return e[1].p})),function(n){return x(Promise.all(n.map(R(function(n){var r=!1,o=[],a=h(t.splice(0,1),1),u=h(a[0],7),c=u[0],s=u[2],f=u[3],l=u[4],p=u[5],y=u[6],d=O(c,n,s,f,o,!0,y),v=T(d,m);return function(e,t){var n=e();return n&&n.then?n.then(t):t(n)}(function(){if(c&&v)return x(d.p,function(t){return l[p]=t,r=!0,i(e,o)})},function(t){return r?t:(c?l[p]=d:e=v?d.p:d,i(e,o))})}))),function(){return e})})}),o=(r=y(y({sync:!0},this.options),r)).sync,a=this,c={},s=[],f=[],l=[],p=!("cyclic"in r)||r.cyclic,v=r.encapsulateObserver,b=O("",t,p,n||{},l);function g(t){var n=Object.values(c);if(r.iterateNone)return n.length?n[0]:e.getJSONType(t);if(n.length){if(r.returnTypeNames)return d(new Set(n));t&&N(t)&&!L.call(t,"$types")?t.$types=c:t={$:t,$types:{$:c}}}else _(t)&&L.call(t,"$types")&&(t={$:t,$types:!0});return!r.returnTypeNames&&t}function w(e,t,n){Object.assign(e,t);var r=U.map(function(t){var n=e[t];return delete e[t],n});n(),U.forEach(function(t,n){e[t]=r[n]})}function O(t,n,i,o,l,p,y){var h,d={},b=u(n),g=v?function(r){var a=y||o.type||e.getJSONType(n);v(Object.assign(r||d,{keypath:t,value:n,cyclic:i,stateObj:o,promisesData:l,resolvingTypesonPromise:p,awaitingTypesonPromise:T(n,m)},{type:a}))}:null;if(["string","boolean","number","undefined"].includes(b))return void 0===n||Number.isNaN(n)||n===Number.NEGATIVE_INFINITY||n===Number.POSITIVE_INFINITY?(h=o.replaced?n:S(t,n,o,l,!1,p,g))!==n&&(d={replaced:h}):h=n,g&&g(),h;if(null===n)return g&&g(),n;if(i&&!o.iterateIn&&!o.iterateUnsetNumeric&&n&&"object"===u(n)){var E=s.indexOf(n);if(!(E<0))return c[t]="#",g&&g({cyclicKeypath:f[E]}),"#"+f[E];!0===i&&(s.push(n),f.push(t))}var A,_=N(n),I=C(n),P=(_||I)&&(!a.plainObjectReplacers.length||o.replaced)||o.iterateIn?n:S(t,n,o,l,_||I,null,g);if(P!==n?(h=P,d={replaced:P}):""===t&&T(n,m)?(l.push([t,n,i,o,void 0,void 0,o.type]),h=n):I&&"object"!==o.iterateIn||"array"===o.iterateIn?(A=new Array(n.length),d={clone:A}):(["function","symbol"].includes(u(n))||"toJSON"in n||T(n,m)||T(n,Promise)||T(n,ArrayBuffer))&&!_&&"object"!==o.iterateIn?h=n:(A={},o.addLength&&(A.length=n.length),d={clone:A}),g&&g(),r.iterateNone)return A||h;if(!A)return h;if(o.iterateIn){var k=function(e){var r={ownKeys:L.call(n,e)};w(o,r,function(){var r=t+(t?".":"")+j(e),a=O(r,n[e],Boolean(i),o,l,p);T(a,m)?l.push([r,a,Boolean(i),o,A,e,o.type]):void 0!==a&&(A[e]=a)})};for(var x in n)k(x);g&&g({endIterateIn:!0,end:!0})}else B(n).forEach(function(e){var r=t+(t?".":"")+j(e);w(o,{ownKeys:!0},function(){var t=O(r,n[e],Boolean(i),o,l,p);T(t,m)?l.push([r,t,Boolean(i),o,A,e,o.type]):void 0!==t&&(A[e]=t)})}),g&&g({endIterateOwn:!0,end:!0});if(o.iterateUnsetNumeric){for(var U=n.length,R=function(e){if(!(e in n)){var r=t+(t?".":"")+e;w(o,{ownKeys:!1},function(){var t=O(r,void 0,Boolean(i),o,l,p);T(t,m)?l.push([r,t,Boolean(i),o,A,e,o.type]):void 0!==t&&(A[e]=t)})}},F=0;F<U;F++)R(F);g&&g({endIterateUnsetNumeric:!0,end:!0})}return A}function S(e,t,n,r,i,u,s){for(var f=i?a.plainObjectReplacers:a.nonplainObjectReplacers,l=f.length;l--;){var y=f[l];if(y.test(t,n)){var h=y.type;if(a.revivers[h]){var d=c[e];c[e]=d?[h].concat(d):h}return Object.assign(n,{type:h,replaced:!0}),!o&&y.replaceAsync||y.replace?(s&&s({replacing:!0}),O(e,y[o||!y.replaceAsync?"replace":"replaceAsync"](t,n),p&&"readonly",n,r,u,h)):(s&&s({typeDetected:!0}),O(e,t,p&&"readonly",n,r,u,h))}}return t}return l.length?o&&r.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():Promise.resolve(i(b,l)).then(g):!o&&r.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r.stringification&&o?[g(b)]:o?g(b):Promise.resolve(g(b))}},{key:"encapsulateSync",value:function(e,t,n){return this.encapsulate(e,t,y(y({throwOnBadSyncType:!0},n),{},{sync:!0}))}},{key:"encapsulateAsync",value:function(e,t,n){return this.encapsulate(e,t,y(y({throwOnBadSyncType:!0},n),{},{sync:!1}))}},{key:"revive",value:function(e,t){var n=e&&e.$types;if(!n)return e;if(!0===n)return e.$;var r=(t=y(y({sync:!0},this.options),t)).sync,i=[],o={},a=!0;n.$&&N(n.$)&&(e=e.$,n=n.$,a=!1);var u=this;function c(e,t){var n=h(u.revivers[e]||[],1)[0];if(!n)throw new Error("Unregistered type: "+e);return r&&!("revive"in n)?t:n[r&&n.revive?"revive":!r&&n.reviveAsync?"reviveAsync":"revive"](t,o)}var s=[];function f(e){return T(e,V)?void 0:e}var l,p=function(){var t=[];if(Object.entries(n).forEach(function(e){var r=h(e,2),i=r[0],o=r[1];"#"!==o&&[].concat(o).forEach(function(e){h(u.revivers[e]||[null,{}],2)[1].plain&&(t.push({keypath:i,type:e}),delete n[i])})}),t.length)return t.sort(F).reduce(function t(n,r){var i=r.keypath,o=r.type;if(E(n))return n.then(function(e){return t(e,{keypath:i,type:o})});var a=P(e,i);if(T(a=c(o,a),m))return a.then(function(t){var n=k(e,i,t);n===t&&(e=n)});var u=k(e,i,a);u===a&&(e=u)},void 0)}();return T(p,m)?l=p.then(function(){return e}):(l=function e(t,r,o,u,f){if(!a||"$types"!==t){var l=n[t],p=C(r);if(p||N(r)){var y=p?new Array(r.length):{};for(B(r).forEach(function(n){var i=e(t+(t?".":"")+j(n),r[n],o||y,y,n),a=function(e){return T(e,V)?y[n]=void 0:void 0!==e&&(y[n]=e),e};T(i,m)?s.push(i.then(function(e){return a(e)})):a(i)}),r=y;i.length;){var d=h(i[0],4),v=d[0],b=d[1],g=d[2],w=d[3],O=P(v,b);if(void 0===O)break;g[w]=O,i.splice(0,1)}}if(!l)return r;if("#"===l){var S=P(o,r.slice(1));return void 0===S&&i.push([o,r.slice(1),u,f]),S}return[].concat(l).reduce(function e(t,n){return T(t,m)?t.then(function(t){return e(t,n)}):c(n,t)},r)}}("",e,null),s.length&&(l=m.resolve(l).then(function(e){return m.all([e].concat(s))}).then(function(e){return h(e,1)[0]}))),E(l)?r&&t.throwOnBadSyncType?function(){throw new TypeError("Sync method requested but async result obtained")}():T(l,m)?l.p.then(f):l:!r&&t.throwOnBadSyncType?function(){throw new TypeError("Async method requested but sync result obtained")}():r?f(l):Promise.resolve(f(l))}},{key:"reviveSync",value:function(e,t){return this.revive(e,y(y({throwOnBadSyncType:!0},t),{},{sync:!0}))}},{key:"reviveAsync",value:function(e,t){return this.revive(e,y(y({throwOnBadSyncType:!0},t),{},{sync:!1}))}},{key:"register",value:function(t,n){return n=n||{},[].concat(t).forEach(function t(r){var i=this;if(C(r))return r.map(function(e){return t.call(i,e)});r&&B(r).forEach(function(t){if("#"===t)throw new TypeError("# cannot be used as a type name as it is reserved for cyclic objects");if(e.JSON_TYPES.includes(t))throw new TypeError("Plain JSON object types are reserved as type names");var i=r[t],o=i&&i.testPlainObjects?this.plainObjectReplacers:this.nonplainObjectReplacers,a=o.filter(function(e){return e.type===t});if(a.length&&(o.splice(o.indexOf(a[0]),1),delete this.revivers[t],delete this.types[t]),"function"==typeof i){var u=i;i={test:function(e){return e&&e.constructor===u},replace:function(e){return y({},e)},revive:function(e){return Object.assign(Object.create(u.prototype),e)}}}else if(C(i)){var c=h(i,3);i={test:c[0],replace:c[1],revive:c[2]}}if(i&&i.test){var s={type:t,test:i.test.bind(i)};i.replace&&(s.replace=i.replace.bind(i)),i.replaceAsync&&(s.replaceAsync=i.replaceAsync.bind(i));var f="number"==typeof n.fallback?n.fallback:n.fallback?0:Number.POSITIVE_INFINITY;if(i.testPlainObjects?this.plainObjectReplacers.splice(f,0,s):this.nonplainObjectReplacers.splice(f,0,s),i.revive||i.reviveAsync){var l={};i.revive&&(l.revive=i.revive.bind(i)),i.reviveAsync&&(l.reviveAsync=i.reviveAsync.bind(i)),this.revivers[t]=[l,{plain:i.testPlainObjects}]}this.types[t]=i}},this)},this),this}}]),e}(),V=function e(){c(this,e)};V.__typeson__type__="TypesonUndefined",D.Undefined=V,D.Promise=m,D.isThenable=E,D.toStringTag=A,D.hasConstructorOf=T,D.isObject=_,D.isPlainObject=N,D.isUserObject=function e(t){if(!t||"Object"!==A(t))return!1;var n=O(t);return!n||T(t,Object)||e(n)},D.escapeKeyPathComponent=j,D.unescapeKeyPathComponent=I,D.getByKeyPath=P,D.getJSONType=function(e){return null===e?"null":Array.isArray(e)?"array":u(e)},D.JSON_TYPES=["null","boolean","number","string","array","object"];for(var K={userObject:{test:function(e,t){return D.isUserObject(e)},replace:function(e){return function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach(function(t){r(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}({},e)},revive:function(e){return e}}},J=[{arrayNonindexKeys:{testPlainObjects:!0,test:function(e,t){return!!Array.isArray(e)&&(Object.keys(e).some(function(e){return String(Number.parseInt(e))!==e})&&(t.iterateIn="object",t.addLength=!0),!0)},replace:function(e,t){return t.iterateUnsetNumeric=!0,e},revive:function(e){if(Array.isArray(e))return e;var t=[];return Object.keys(e).forEach(function(n){var r=e[n];t[n]=r}),t}}},{sparseUndefined:{test:function(e,t){return void 0===e&&!1===t.ownKeys},replace:function(e){return 0},revive:function(e){}}}],M={undef:{test:function(e,t){return void 0===e&&(t.ownKeys||!("ownKeys"in t))},replace:function(e){return 0},revive:function(e){return new D.Undefined}}},$={StringObject:{test:function(t){return"String"===D.toStringTag(t)&&"object"===e(t)},replace:function(e){return String(e)},revive:function(e){return new String(e)}},BooleanObject:{test:function(t){return"Boolean"===D.toStringTag(t)&&"object"===e(t)},replace:function(e){return Boolean(e)},revive:function(e){return new Boolean(e)}},NumberObject:{test:function(t){return"Number"===D.toStringTag(t)&&"object"===e(t)},replace:function(e){return Number(e)},revive:function(e){return new Number(e)}}},G=[{nan:{test:function(e){return Number.isNaN(e)},replace:function(e){return"NaN"},revive:function(e){return Number.NaN}}},{infinity:{test:function(e){return e===Number.POSITIVE_INFINITY},replace:function(e){return"Infinity"},revive:function(e){return Number.POSITIVE_INFINITY}}},{negativeInfinity:{test:function(e){return e===Number.NEGATIVE_INFINITY},replace:function(e){return"-Infinity"},revive:function(e){return Number.NEGATIVE_INFINITY}}}],Y={date:{test:function(e){return"Date"===D.toStringTag(e)},replace:function(e){var t=e.getTime();return Number.isNaN(t)?"NaN":t},revive:function(e){return"NaN"===e?new Date(Number.NaN):new Date(e)}}},q={regexp:{test:function(e){return"RegExp"===D.toStringTag(e)},replace:function(e){return{source:e.source,flags:(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":"")}},revive:function(e){var t=e.source,n=e.flags;return new RegExp(t,n)}}},z={map:{test:function(e){return"Map"===D.toStringTag(e)},replace:function(e){return o(e.entries())},revive:function(e){return new Map(e)}}},H={set:{test:function(e){return"Set"===D.toStringTag(e)},replace:function(e){return o(e.values())},revive:function(e){return new Set(e)}}},X="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Q=new Uint8Array(256),W=0;W<X.length;W++)Q[X.charCodeAt(W)]=W;var Z=function(e,t,n){null==n&&(n=e.byteLength);for(var r=new Uint8Array(e,t||0,n),i=r.length,o="",a=0;a<i;a+=3)o+=X[r[a]>>2],o+=X[(3&r[a])<<4|r[a+1]>>4],o+=X[(15&r[a+1])<<2|r[a+2]>>6],o+=X[63&r[a+2]];return i%3==2?o=o.slice(0,-1)+"=":i%3==1&&(o=o.slice(0,-2)+"=="),o},ee=function(e){var t,n,r,i,o=e.length,a=.75*e.length,u=0;"="===e[e.length-1]&&(a--,"="===e[e.length-2]&&a--);for(var c=new ArrayBuffer(a),s=new Uint8Array(c),f=0;f<o;f+=4)t=Q[e.charCodeAt(f)],n=Q[e.charCodeAt(f+1)],r=Q[e.charCodeAt(f+2)],i=Q[e.charCodeAt(f+3)],s[u++]=t<<2|n>>4,s[u++]=(15&n)<<4|r>>2,s[u++]=(3&r)<<6|63&i;return c},te={arraybuffer:{test:function(e){return"ArrayBuffer"===D.toStringTag(e)},replace:function(e,t){t.buffers||(t.buffers=[]);var n=t.buffers.indexOf(e);return n>-1?{index:n}:(t.buffers.push(e),Z(e))},revive:function(t,n){if(n.buffers||(n.buffers=[]),"object"===e(t))return n.buffers[t.index];var r=ee(t);return n.buffers.push(r),r}}},ne="undefined"==typeof self?f:self,re={};["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"].forEach(function(e){var t=e,n=ne[t];n&&(re[e.toLowerCase()]={test:function(e){return D.toStringTag(e)===t},replace:function(e,t){var n=e.buffer,r=e.byteOffset,i=e.length;t.buffers||(t.buffers=[]);var o=t.buffers.indexOf(n);return o>-1?{index:o,byteOffset:r,length:i}:(t.buffers.push(n),{encoded:Z(n),byteOffset:r,length:i})},revive:function(e,t){t.buffers||(t.buffers=[]);var r,i=e.byteOffset,o=e.length,a=e.encoded,u=e.index;return"index"in e?r=t.buffers[u]:(r=ee(a),t.buffers.push(r)),new n(r,i,o)}})});var ie={dataview:{test:function(e){return"DataView"===D.toStringTag(e)},replace:function(e,t){var n=e.buffer,r=e.byteOffset,i=e.byteLength;t.buffers||(t.buffers=[]);var o=t.buffers.indexOf(n);return o>-1?{index:o,byteOffset:r,byteLength:i}:(t.buffers.push(n),{encoded:Z(n),byteOffset:r,byteLength:i})},revive:function(e,t){t.buffers||(t.buffers=[]);var n,r=e.byteOffset,i=e.byteLength,o=e.encoded,a=e.index;return"index"in e?n=t.buffers[a]:(n=ee(o),t.buffers.push(n)),new DataView(n,r,i)}}},oe={IntlCollator:{test:function(e){return D.hasConstructorOf(e,Intl.Collator)},replace:function(e){return e.resolvedOptions()},revive:function(e){return new Intl.Collator(e.locale,e)}},IntlDateTimeFormat:{test:function(e){return D.hasConstructorOf(e,Intl.DateTimeFormat)},replace:function(e){return e.resolvedOptions()},revive:function(e){return new Intl.DateTimeFormat(e.locale,e)}},IntlNumberFormat:{test:function(e){return D.hasConstructorOf(e,Intl.NumberFormat)},replace:function(e){return e.resolvedOptions()},revive:function(e){return new Intl.NumberFormat(e.locale,e)}}};function ae(e){for(var t=new Uint8Array(e.length),n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t.buffer}var ue={file:{test:function(e){return"File"===D.toStringTag(e)},replace:function(e){var t=new XMLHttpRequest;if(t.overrideMimeType("text/plain; charset=x-user-defined"),t.open("GET",URL.createObjectURL(e),!1),t.send(),200!==t.status&&0!==t.status)throw new Error("Bad File access: "+t.status);return{type:e.type,stringContents:t.responseText,name:e.name,lastModified:e.lastModified}},revive:function(e){var t=e.name,n=e.type,r=e.stringContents,i=e.lastModified;return new File([ae(r)],t,{type:n,lastModified:i})},replaceAsync:function(e){return new D.Promise(function(t,n){var r=new FileReader;r.addEventListener("load",function(){t({type:e.type,stringContents:r.result,name:e.name,lastModified:e.lastModified})}),r.addEventListener("error",function(){n(r.error)}),r.readAsBinaryString(e)})}}},ce={bigint:{test:function(e){return"bigint"==typeof e},replace:function(e){return String(e)},revive:function(e){return BigInt(e)}}},se={bigintObject:{test:function(t){return"object"===e(t)&&D.hasConstructorOf(t,BigInt)},replace:function(e){return String(e)},revive:function(e){return new Object(BigInt(e))}}},fe={cryptokey:{test:function(e){return"CryptoKey"===D.toStringTag(e)&&e.extractable},replaceAsync:function(e){return new D.Promise(function(t,n){crypto.subtle.exportKey("jwk",e).catch(function(e){n(e)}).then(function(n){t({jwk:n,algorithm:e.algorithm,usages:e.usages})})})},revive:function(e){var t=e.jwk,n=e.algorithm,r=e.usages;return crypto.subtle.importKey("jwk",t,n,!0,r)}}};return[K,M,J,$,G,Y,q,{imagedata:{test:function(e){return"ImageData"===D.toStringTag(e)},replace:function(e){return{array:o(e.data),width:e.width,height:e.height}},revive:function(e){return new ImageData(new Uint8ClampedArray(e.array),e.width,e.height)}}},{imagebitmap:{test:function(e){return"ImageBitmap"===D.toStringTag(e)||e&&e.dataset&&"ImageBitmap"===e.dataset.toStringTag},replace:function(e){var t=document.createElement("canvas");return t.getContext("2d").drawImage(e,0,0),t.toDataURL()},revive:function(e){var t=document.createElement("canvas"),n=t.getContext("2d"),r=document.createElement("img");return r.addEventListener("load",function(){n.drawImage(r,0,0)}),r.src=e,t},reviveAsync:function(e){var t=document.createElement("canvas"),n=t.getContext("2d"),r=document.createElement("img");return r.addEventListener("load",function(){n.drawImage(r,0,0)}),r.src=e,createImageBitmap(t)}}},ue,{file:ue.file,filelist:{test:function(e){return"FileList"===D.toStringTag(e)},replace:function(e){for(var t=[],n=0;n<e.length;n++)t[n]=e.item(n);return t},revive:function(e){return new(function(){function e(){t(this,e),this._files=arguments[0],this.length=this._files.length}return function(e,t,r){t&&n(e.prototype,t),r&&n(e,r)}(e,[{key:"item",value:function(e){return this._files[e]}},{key:Symbol.toStringTag,get:function(){return"FileList"}}]),e}())(e)}}},{blob:{test:function(e){return"Blob"===D.toStringTag(e)},replace:function(e){var t=new XMLHttpRequest;if(t.overrideMimeType("text/plain; charset=x-user-defined"),t.open("GET",URL.createObjectURL(e),!1),t.send(),200!==t.status&&0!==t.status)throw new Error("Bad Blob access: "+t.status);return{type:e.type,stringContents:t.responseText}},revive:function(e){var t=e.type,n=e.stringContents;return new Blob([ae(n)],{type:t})},replaceAsync:function(e){return new D.Promise(function(t,n){var r=new FileReader;r.addEventListener("load",function(){t({type:e.type,stringContents:r.result})}),r.addEventListener("error",function(){n(r.error)}),r.readAsBinaryString(e)})}}}].concat("function"==typeof Map?z:[],"function"==typeof Set?H:[],"function"==typeof ArrayBuffer?te:[],"function"==typeof Uint8Array?re:[],"function"==typeof DataView?ie:[],"undefined"!=typeof Intl?oe:[],"undefined"!=typeof crypto?fe:[],"undefined"!=typeof BigInt?[ce,se]:[])}()}),h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=new Uint8Array(256),v=0;v<64;v++)d[h.codePointAt(v)]=v;var b=function(e,t,n){null==n&&(n=e.byteLength);for(var r=new Uint8Array(e,t||0,n),i=r.length,o="",a=0;a<i;a+=3)o+=h[r[a]>>2],o+=h[(3&r[a])<<4|r[a+1]>>4],o+=h[(15&r[a+1])<<2|r[a+2]>>6],o+=h[63&r[a+2]];return i%3==2?o=o.slice(0,-1)+"=":i%3==1&&(o=o.slice(0,-2)+"=="),o},m=function(e){var t,n,r,i,o=e.length,a=.75*e.length,u=0;"="===e[e.length-1]&&(a--,"="===e[e.length-2]&&a--);for(var c=new ArrayBuffer(a),s=new Uint8Array(c),f=0;f<o;f+=4)t=d[e.codePointAt(f)],n=d[e.codePointAt(f+1)],r=d[e.codePointAt(f+2)],i=d[e.codePointAt(f+3)],s[u++]=t<<2|n>>4,s[u++]=(15&n)<<4|r>>2,s[u++]=(3&r)<<6|63&i;return c},g="undefined"==typeof self?global:self,w={};["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"].forEach(function(e){var t=e,n=g[t];n&&(w[e.toLowerCase()+"2"]={test:function(e){return p.toStringTag(e)===t},replace:function(e){return{buffer:e.buffer,byteOffset:e.byteOffset,length:e.length}},revive:function(e){var t=e.buffer,r=e.byteOffset,i=e.length;return new n(t,r,i)}})});var O={arraybuffer:{test:function(e){return"ArrayBuffer"===p.toStringTag(e)},replace:function(e){return b(e,0,e.byteLength)},revive:function(e){return m(e)}}},S=(new p).register(y),E="FileReaderSync"in self,A=[],T=0;S.register([O,w,{blob2:{test:function(e){return"Blob"===p.toStringTag(e)},replace:function(e){if(e.isClosed)throw new Error("The Blob is closed");if(E){var t=s(e,"binary"),n=b(t,0,t.byteLength);return{type:e.type,data:n}}A.push(e);var r={type:e.type,data:{start:T,end:T+e.size}};return T+=e.size,r},finalize:function(e,t){e.data=b(t,0,t.byteLength)},revive:function(e){var t=e.type,n=e.data;return new Blob([m(n)],{type:t})}}}]),S.mustFinalize=function(){return A.length>0},S.finalize=function(e){return o(void 0,void 0,void 0,function(){var t,n,i,o,u,s,f,l,p,y,h,d;return a(this,function(a){switch(a.label){case 0:return[4,c(new Blob(A),"binary")];case 1:if(t=a.sent(),e)for(n=0,i=e;n<i.length;n++)if((o=i[n]).$types)for(f in u=o.$types,(s=u.$)&&(u=u.$),u)l=u[f],(p=S.types[l])&&p.finalize&&(y=r.default.getByKeyPath(o,s?"$."+f:f),p.finalize(y,t.slice(null===(h=y.data)||void 0===h?void 0:h.start,null===(d=y.data)||void 0===d?void 0:d.end)));return A=[],T=0,[2]}})})};function N(e,t){return o(this,void 0,void 0,function(){function n(){return o(this,void 0,void 0,function(){var n,i,o,u,d,v,b,m,g,w;return a(this,function(O){switch(O.label){case 0:return[4,Promise.all(c.map(function(e){return e.count()}))];case 1:(n=O.sent()).forEach(function(e,t){return f[t].rowCount=e}),h.totalRows=n.reduce(function(e,t){return e+t}),i=JSON.stringify(p,void 0,l?2:void 0),o=i.lastIndexOf("]"),u=i.substring(0,o),s.push(u),d=t.filter,v=t.transform,b=function(n){var i,o,u,c,f,p,b,m,g,w,O;return a(this,function(E){switch(E.label){case 0:i=e.table(n),o=i.schema.primKey,u=!!o.keyPath,c=t.numRowsPerChunk||2e3,f=u?{tableName:i.name,inbound:!0,rows:[]}:{tableName:i.name,inbound:!1,rows:[]},p=JSON.stringify(f,void 0,l?2:void 0),l&&(p=p.split("\n").join("\n ")),b=p.lastIndexOf("]"),s.push(p.substring(0,b)),m=null,g=0,w=!0,O=function(){var e,t,f,p,b,O,E,A,T;return a(this,function(a){switch(a.label){case 0:return y&&r.default.ignoreTransaction(function(){return y(h)}),[4,(e=null==m?i.limit(c):i.where(":id").above(m).limit(c)).toArray()];case 1:return 0===(t=a.sent()).length?[2,"break"]:(null!=m&&g>0&&(s.push(","),l&&s.push("\n ")),w=t.length===c,u?(f=d?t.filter(function(e){return d(n,e)}):t,p=v?f.map(function(e){return v(n,e).value}):f,b=p.map(function(e){return S.encapsulate(e)}),S.mustFinalize()?[4,r.default.waitFor(S.finalize(b))]:[3,3]):[3,4]);case 2:a.sent(),a.label=3;case 3:return T=JSON.stringify(b,void 0,l?2:void 0),l&&(T=T.split("\n").join("\n ")),s.push(new Blob([T.substring(1,T.length-1)])),g=p.length,m=t.length>0?r.default.getByKeyPath(t[t.length-1],o.keyPath):null,[3,8];case 4:return[4,e.primaryKeys()];case 5:return O=a.sent(),E=O.map(function(e,n){return[e,t[n]]}),d&&(E=E.filter(function(e){var t=e[0],r=e[1];return d(n,r,t)})),v&&(E=E.map(function(e){var t=e[0],r=e[1],i=v(n,r,t);return[i.key,i.value]})),A=E.map(function(e){return S.encapsulate(e)}),S.mustFinalize()?[4,r.default.waitFor(S.finalize(A))]:[3,7];case 6:a.sent(),a.label=7;case 7:T=JSON.stringify(A,void 0,l?2:void 0),l&&(T=T.split("\n").join("\n ")),s.push(new Blob([T.substring(1,T.length-1)])),g=E.length,m=O.length>0?O[O.length-1]:null,a.label=8;case 8:return h.completedRows+=t.length,[2]}})},E.label=1;case 1:return w?[5,O()]:[3,3];case 2:return"break"===E.sent()?[3,3]:[3,1];case 3:return s.push(p.substr(b)),h.completedTables+=1,h.completedTables<h.totalTables&&s.push(","),[2]}})},m=0,g=f,O.label=2;case 2:return m<g.length?(w=g[m].name,[5,b(w)]):[3,5];case 3:O.sent(),O.label=4;case 4:return m++,[3,2];case 5:return s.push(i.substr(o)),h.done=!0,y&&r.default.ignoreTransaction(function(){return y(h)}),[2]}})})}var i,c,s,f,l,p,y,h;return a(this,function(r){switch(r.label){case 0:i=(t=t||{}).skipTables?t.skipTables:[],c=e.tables.filter(function(e){return!i.includes(e.name)}),s=[],f=c.map(function(e){return{name:e.name,schema:u(e),rowCount:0}}),l=t.prettyJson,p={formatName:"dexie",formatVersion:1,data:{databaseName:e.name,databaseVersion:e.verno,tables:f,data:[]}},y=t.progressCallback,h={done:!1,completedRows:0,completedTables:0,totalRows:NaN,totalTables:f.length},r.label=1;case 1:return r.trys.push([1,,6,7]),t.noTransaction?[4,n()]:[3,3];case 2:return r.sent(),[3,5];case 3:return[4,e.transaction("r",e.tables,n)];case 4:r.sent(),r.label=5;case 5:return[3,7];case 6:return S.finalize(),[7];case 7:return[2,new Blob(s,{type:"text/json"})]}})})}var _=function(){},j=l(function(e,t){!function(e){var t="object"==typeof process&&process.env?process.env:self;e.parser=function(e){return new F(e)},e.CParser=F,e.CStream=D,e.createStream=function(e){return new D(e)},e.MAX_BUFFER_LENGTH=10485760,e.DEBUG="debug"===t.CDEBUG,e.INFO="debug"===t.CDEBUG||"info"===t.CDEBUG,e.EVENTS=["value","string","key","openobject","closeobject","openarray","closearray","error","end","ready"];var n,r={textNode:void 0,numberNode:""},i=e.EVENTS.filter(function(e){return"error"!==e&&"end"!==e}),o=0;for(var a in e.STATE={BEGIN:o++,VALUE:o++,OPEN_OBJECT:o++,CLOSE_OBJECT:o++,OPEN_ARRAY:o++,CLOSE_ARRAY:o++,TEXT_ESCAPE:o++,STRING:o++,BACKSLASH:o++,END:o++,OPEN_KEY:o++,CLOSE_KEY:o++,TRUE:o++,TRUE2:o++,TRUE3:o++,FALSE:o++,FALSE2:o++,FALSE3:o++,FALSE4:o++,NULL:o++,NULL2:o++,NULL3:o++,NUMBER_DECIMAL_POINT:o++,NUMBER_DIGIT:o++},e.STATE)e.STATE[e.STATE[a]]=a;o=e.STATE;const u=9,c=10,s=13,f=32,l=34,p=43,y=44,h=45,d=46,v=48,b=57,m=58,g=69,w=91,O=92,S=93,E=97,A=98,T=101,N=102,j=108,I=110,P=114,k=115,x=116,B=117,C=123,L=125;function U(e){for(var t in r)e[t]=r[t]}Object.create||(Object.create=function(e){function t(){this.__proto__=e}return t.prototype=e,new t}),Object.getPrototypeOf||(Object.getPrototypeOf=function(e){return e.__proto__}),Object.keys||(Object.keys=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t});var R=/[\\"\n]/g;function F(t){if(!(this instanceof F))return new F(t);var n=this;U(n),n.bufferCheckPosition=e.MAX_BUFFER_LENGTH,n.q=n.c=n.p="",n.opt=t||{},n.closed=n.closedRoot=n.sawRoot=!1,n.tag=n.error=null,n.state=o.BEGIN,n.stack=new Array,n.position=n.column=0,n.line=1,n.slashed=!1,n.unicodeI=0,n.unicodeS=null,n.depth=0,V(n,"onready")}F.prototype={end:function(){G(this)},write:function(t){var n=this;if(this.error)throw this.error;if(n.closed)return $(n,"Cannot write after close. Assign an onready handler.");if(null===t)return G(n);var i=0,a=t.charCodeAt(0),u=n.p;e.DEBUG&&console.log("write -> ["+t+"]");for(;a&&(u=a,n.c=a=t.charCodeAt(i++),u!==a?n.p=u:u=n.p,a);)switch(e.DEBUG&&console.log(i,a,e.STATE[n.state]),n.position++,a===c?(n.line++,n.column=0):n.column++,n.state){case o.BEGIN:a===C?n.state=o.OPEN_OBJECT:a===w?n.state=o.OPEN_ARRAY:Y(a)||$(n,"Non-whitespace before {[.");continue;case o.OPEN_KEY:case o.OPEN_OBJECT:if(Y(a))continue;if(n.state===o.OPEN_KEY)n.stack.push(o.CLOSE_KEY);else{if(a===L){V(n,"onopenobject"),this.depth++,V(n,"oncloseobject"),this.depth--,n.state=n.stack.pop()||o.VALUE;continue}n.stack.push(o.CLOSE_OBJECT)}a===l?n.state=o.STRING:$(n,'Malformed object key should start with "');continue;case o.CLOSE_KEY:case o.CLOSE_OBJECT:if(Y(a))continue;n.state,o.CLOSE_KEY,a===m?(n.state===o.CLOSE_OBJECT?(n.stack.push(o.CLOSE_OBJECT),J(n,"onopenobject"),this.depth++):J(n,"onkey"),n.state=o.VALUE):a===L?(K(n,"oncloseobject"),this.depth--,n.state=n.stack.pop()||o.VALUE):a===y?(n.state===o.CLOSE_OBJECT&&n.stack.push(o.CLOSE_OBJECT),J(n),n.state=o.OPEN_KEY):$(n,"Bad object");continue;case o.OPEN_ARRAY:case o.VALUE:if(Y(a))continue;if(n.state===o.OPEN_ARRAY){if(V(n,"onopenarray"),this.depth++,n.state=o.VALUE,a===S){V(n,"onclosearray"),this.depth--,n.state=n.stack.pop()||o.VALUE;continue}n.stack.push(o.CLOSE_ARRAY)}a===l?n.state=o.STRING:a===C?n.state=o.OPEN_OBJECT:a===w?n.state=o.OPEN_ARRAY:a===x?n.state=o.TRUE:a===N?n.state=o.FALSE:a===I?n.state=o.NULL:a===h?n.numberNode+="-":v<=a&&a<=b?(n.numberNode+=String.fromCharCode(a),n.state=o.NUMBER_DIGIT):$(n,"Bad value");continue;case o.CLOSE_ARRAY:if(a===y)n.stack.push(o.CLOSE_ARRAY),J(n,"onvalue"),n.state=o.VALUE;else if(a===S)K(n,"onclosearray"),this.depth--,n.state=n.stack.pop()||o.VALUE;else{if(Y(a))continue;$(n,"Bad array")}continue;case o.STRING:void 0===n.textNode&&(n.textNode="");var s=i-1,f=n.slashed,_=n.unicodeI;e:for(;;){for(e.DEBUG&&console.log(i,a,e.STATE[n.state],f);_>0;)if(n.unicodeS+=String.fromCharCode(a),a=t.charCodeAt(i++),n.position++,4===_?(n.textNode+=String.fromCharCode(parseInt(n.unicodeS,16)),_=0,s=i-1):_++,!a)break e;if(a===l&&!f){n.state=n.stack.pop()||o.VALUE,n.textNode+=t.substring(s,i-1),n.position+=i-1-s;break}if(a===O&&!f&&(f=!0,n.textNode+=t.substring(s,i-1),n.position+=i-1-s,a=t.charCodeAt(i++),n.position++,!a))break;if(f){if(f=!1,a===I?n.textNode+="\n":a===P?n.textNode+="\r":a===x?n.textNode+="\t":a===N?n.textNode+="\f":a===A?n.textNode+="\b":a===B?(_=1,n.unicodeS=""):n.textNode+=String.fromCharCode(a),a=t.charCodeAt(i++),n.position++,s=i-1,a)continue;break}R.lastIndex=i;var U=R.exec(t);if(null===U){i=t.length+1,n.textNode+=t.substring(s,i-1),n.position+=i-1-s;break}if(i=U.index+1,!(a=t.charCodeAt(U.index))){n.textNode+=t.substring(s,i-1),n.position+=i-1-s;break}}n.slashed=f,n.unicodeI=_;continue;case o.TRUE:a===P?n.state=o.TRUE2:$(n,"Invalid true started with t"+a);continue;case o.TRUE2:a===B?n.state=o.TRUE3:$(n,"Invalid true started with tr"+a);continue;case o.TRUE3:a===T?(V(n,"onvalue",!0),n.state=n.stack.pop()||o.VALUE):$(n,"Invalid true started with tru"+a);continue;case o.FALSE:a===E?n.state=o.FALSE2:$(n,"Invalid false started with f"+a);continue;case o.FALSE2:a===j?n.state=o.FALSE3:$(n,"Invalid false started with fa"+a);continue;case o.FALSE3:a===k?n.state=o.FALSE4:$(n,"Invalid false started with fal"+a);continue;case o.FALSE4:a===T?(V(n,"onvalue",!1),n.state=n.stack.pop()||o.VALUE):$(n,"Invalid false started with fals"+a);continue;case o.NULL:a===B?n.state=o.NULL2:$(n,"Invalid null started with n"+a);continue;case o.NULL2:a===j?n.state=o.NULL3:$(n,"Invalid null started with nu"+a);continue;case o.NULL3:a===j?(V(n,"onvalue",null),n.state=n.stack.pop()||o.VALUE):$(n,"Invalid null started with nul"+a);continue;case o.NUMBER_DECIMAL_POINT:a===d?(n.numberNode+=".",n.state=o.NUMBER_DIGIT):$(n,"Leading zero not followed by .");continue;case o.NUMBER_DIGIT:v<=a&&a<=b?n.numberNode+=String.fromCharCode(a):a===d?(-1!==n.numberNode.indexOf(".")&&$(n,"Invalid number has two dots"),n.numberNode+="."):a===T||a===g?(-1===n.numberNode.indexOf("e")&&-1===n.numberNode.indexOf("E")||$(n,"Invalid number has two exponential"),n.numberNode+="e"):a===p||a===h?(u!==T&&u!==g&&$(n,"Invalid symbol in number"),n.numberNode+=String.fromCharCode(a)):(M(n),i--,n.state=n.stack.pop()||o.VALUE);continue;default:$(n,"Unknown state: "+n.state)}n.position>=n.bufferCheckPosition&&function(t){var n=Math.max(e.MAX_BUFFER_LENGTH,10),i=0;for(var o in r){var a=void 0===t[o]?0:t[o].length;a>n&&("text"===o?closeText(t):$(t,"Max buffer length exceeded: "+o)),i=Math.max(i,a)}t.bufferCheckPosition=e.MAX_BUFFER_LENGTH-i+t.position}(n);return n},resume:function(){return this.error=null,this},close:function(){return this.write(null)}};try{n=_}catch(e){n=function(){}}function D(e){if(!(this instanceof D))return new D(e);this._parser=new F(e),this.writable=!0,this.readable=!0,this.bytes_remaining=0,this.bytes_in_sequence=0,this.temp_buffs={2:new Buffer(2),3:new Buffer(3),4:new Buffer(4)},this.string="";var t=this;n.apply(t),this._parser.onend=function(){t.emit("end")},this._parser.onerror=function(e){t.emit("error",e),t._parser.error=null},i.forEach(function(e){Object.defineProperty(t,"on"+e,{get:function(){return t._parser["on"+e]},set:function(n){if(!n)return t.removeAllListeners(e),t._parser["on"+e]=n,n;t.on(e,n)},enumerable:!0,configurable:!1})})}function V(t,n,r){e.INFO&&console.log("-- emit",n,r),t[n]&&t[n](r)}function K(e,t,n){J(e),V(e,t,n)}function J(e,t){e.textNode=function(e,t){if(void 0===t)return t;e.trim&&(t=t.trim());e.normalize&&(t=t.replace(/\s+/g," "));return t}(e.opt,e.textNode),void 0!==e.textNode&&V(e,t||"onvalue",e.textNode),e.textNode=void 0}function M(e){e.numberNode&&V(e,"onvalue",parseFloat(e.numberNode)),e.numberNode=""}function $(e,t){return J(e),t+="\nLine: "+e.line+"\nColumn: "+e.column+"\nChar: "+e.c,t=new Error(t),e.error=t,V(e,"onerror",t),e}function G(e){return e.state===o.VALUE&&0===e.depth||$(e,"Unexpected end"),J(e),e.c="",e.closed=!0,V(e,"onend"),F.call(e,e.opt),e}function Y(e){return e===s||e===c||e===f||e===u}D.prototype=Object.create(n.prototype,{constructor:{value:D}}),D.prototype.write=function(e){e=new Buffer(e);for(var t=0;t<e.length;t++){var n=e[t];if(this.bytes_remaining>0){for(var r=0;r<this.bytes_remaining;r++)this.temp_buffs[this.bytes_in_sequence][this.bytes_in_sequence-this.bytes_remaining+r]=e[r];this.string=this.temp_buffs[this.bytes_in_sequence].toString(),this.bytes_in_sequence=this.bytes_remaining=0,t=t+r-1,this._parser.write(this.string),this.emit("data",this.string)}else if(0===this.bytes_remaining&&n>=128){if(n>=194&&n<=223&&(this.bytes_in_sequence=2),n>=224&&n<=239&&(this.bytes_in_sequence=3),n>=240&&n<=244&&(this.bytes_in_sequence=4),this.bytes_in_sequence+t>e.length){for(var i=0;i<=e.length-1-t;i++)this.temp_buffs[this.bytes_in_sequence][i]=e[t+i];return this.bytes_remaining=t+this.bytes_in_sequence-e.length,!0}this.string=e.slice(t,t+this.bytes_in_sequence).toString(),t=t+this.bytes_in_sequence-1,this._parser.write(this.string),this.emit("data",this.string)}else{for(var o=t;o<e.length&&!(e[o]>=128);o++);this.string=e.slice(t,o).toString(),this._parser.write(this.string),this.emit("data",this.string),t=o-1}}},D.prototype.end=function(e){return e&&e.length&&this._parser.write(e.toString()),this._parser.end(),!0},D.prototype.on=function(e,t){var r=this;return r._parser["on"+e]||-1===i.indexOf(e)||(r._parser["on"+e]=function(){var t=1===arguments.length?[arguments[0]]:Array.apply(null,arguments);t.splice(0,0,e),r.emit.apply(r,t)}),n.prototype.on.call(r,e,t)},D.prototype.destroy=function(){U(this._parser),this.emit("close")}}(t)});function I(e){var t=0,n=function(e){var t,n,r,i=j.parser(),o=0,a=[],u=!1,c=!1;return i.onopenobject=function(i){var u={incomplete:!0};t||(t=u),n&&(a.push([r,n,c]),e&&(c?n.push(u):n[r]=u)),n=u,r=i,c=!1,++o},i.onkey=function(e){return r=e},i.onvalue=function(e){return c?n.push(e):n[r]=e},i.oncloseobject=function(){var t;if(delete n.incomplete,r=null,0===--o)u=!0;else{var i=n;t=a.pop(),r=t[0],n=t[1],c=t[2],e||(c?n.push(i):n[r]=i)}},i.onopenarray=function(){var i=[];i.incomplete=!0,t||(t=i),n&&(a.push([r,n,c]),e&&(c?n.push(i):n[r]=i)),n=i,c=!0,r=null,++o},i.onclosearray=function(){var t;if(delete n.incomplete,r=null,0===--o)u=!0;else{var i=n;t=a.pop(),r=t[0],n=t[1],c=t[2],e||(c?n.push(i):n[r]=i)}},{write:function(e){return i.write(e),t},done:function(){return u}}}(!0),r={pullAsync:function(i){return o(this,void 0,void 0,function(){var o,u,s;return a(this,function(a){switch(a.label){case 0:return o=e.slice(t,t+i),t+=i,[4,c(o,"text")];case 1:return u=a.sent(),s=n.write(u),r.result=s||{},[2,s]}})})},pullSync:function(i){var o=e.slice(t,t+i);t+=i;var a=s(o,"text"),u=n.write(a);return r.result=u||{},u},done:function(){return n.done()},eof:function(){return t>=e.size},result:{}};return r}function P(e,t){return o(this,void 0,void 0,function(){var n,o,u,c;return a(this,function(a){switch(a.label){case 0:return n=(t=t||{}).chunkSizeBytes||1048576,[4,x(e,n)];case 1:return o=a.sent(),u=o.result.data,(c=new r.default(void 0!==t.name?t.name:u.databaseName)).version(u.databaseVersion).stores(function(e){for(var t={},n=0,r=e.tables;n<r.length;n++){var i=r[n];t[i.name]=i.schema}return t}(u)),[4,k(c,o,void 0!==t.name?i(i({},t),{acceptNameDiff:!0}):t)];case 2:return a.sent(),[2,c]}})})}function k(e,t,n){return o(this,void 0,void 0,function(){function i(){return o(this,void 0,void 0,function(){var t,i,o,s;return a(this,function(d){switch(d.label){case 0:t=function(t){var i,o,u,c,s,f,d,v,b,m,g,w,O;return a(this,function(a){switch(a.label){case 0:if(p.includes(t.tableName))return[2,"continue"];if(!t.rows)return[2,"break"];if(!t.rows.incomplete&&0===t.rows.length)return[2,"continue"];if(y&&r.default.ignoreTransaction(function(){return y(h)}),i=t.tableName,o=e.table(i),u=l.tables.filter(function(e){return e.name===i})[0].schema,!o){if(n.acceptMissingTables)return[2,"continue"];throw new Error("Exported table ".concat(t.tableName," is missing in installed database"))}if(!n.acceptChangedPrimaryKey&&u.split(",")[0]!=o.schema.primKey.src)throw new Error("Primary key differs for table ".concat(t.tableName,". "));for(c=t.rows,s=[],f=0;f<c.length&&!(d=c[f]).incomplete;f++)s.push(S.revive(d));return v=n.filter,b=n.transform,m=v?t.inbound?s.filter(function(e){return v(i,e)}):s.filter(function(e){var t=e[0],n=e[1];return v(i,n,t)}):s,b&&(m=m.map(t.inbound?function(e){return b(i,e).value}:function(e){var t=e[0],n=e[1],r=b(i,n,t);return[r.key,r.value]})),g=t.inbound?[void 0,m]:[m.map(function(e){return e[0]}),s.map(function(e){return e[1]})],w=g[0],O=g[1],n.overwriteValues?[4,o.bulkPut(O,w)]:[3,2];case 1:return a.sent(),[3,4];case 2:return[4,o.bulkAdd(O,w)];case 3:a.sent(),a.label=4;case 4:return h.completedRows+=s.length,s.incomplete||(h.completedTables+=1),c.splice(0,s.length),[2]}})},i=0,o=l.data,d.label=1;case 1:return i<o.length?(s=o[i],[5,t(s)]):[3,4];case 2:if("break"===d.sent())return[3,4];d.label=3;case 3:return i++,[3,1];case 4:for(;l.data.length>0&&l.data[0].rows&&!l.data[0].rows.incomplete;)l.data.splice(0,1);return c.done()||c.eof()?[3,8]:f?(c.pullSync(u),[3,7]):[3,5];case 5:return[4,r.default.waitFor(c.pullAsync(u))];case 6:d.sent(),d.label=7;case 7:return[3,9];case 8:return[3,10];case 9:return[3,0];case 10:return[2]}})})}var u,c,s,f,l,p,y,h,d,v,b;return a(this,function(o){switch(o.label){case 0:return u=(n=n||{}).chunkSizeBytes||1048576,[4,x(t,u)];case 1:if(c=o.sent(),s=c.result,f="FileReaderSync"in self,l=s.data,p=n.skipTables?n.skipTables:[],!n.acceptNameDiff&&e.name!==l.databaseName)throw new Error("Name differs. Current database name is ".concat(e.name," but export is ").concat(l.databaseName));if(!n.acceptVersionDiff&&e.verno!==l.databaseVersion)throw new Error("Database version differs. Current database is in version ".concat(e.verno," but export is ").concat(l.databaseVersion));if(y=n.progressCallback,h={done:!1,completedRows:0,completedTables:0,totalRows:l.tables.reduce(function(e,t){return e+t.rowCount},0),totalTables:l.tables.length},y&&r.default.ignoreTransaction(function(){return y(h)}),!n.clearTablesBeforeImport)return[3,5];d=0,v=e.tables,o.label=2;case 2:return d<v.length?(b=v[d],p.includes(b.name)?[3,4]:[4,b.clear()]):[3,5];case 3:o.sent(),o.label=4;case 4:return d++,[3,2];case 5:return n.noTransaction?[4,i()]:[3,7];case 6:return o.sent(),[3,9];case 7:return[4,e.transaction("rw",e.tables,i)];case 8:o.sent(),o.label=9;case 9:return h.done=!0,y&&r.default.ignoreTransaction(function(){return y(h)}),[2]}})})}function x(e,t){return o(this,void 0,void 0,function(){var n,r;return a(this,function(i){switch(i.label){case 0:n="slice"in e?I(e):e,i.label=1;case 1:return n.eof()?[3,3]:[4,n.pullAsync(t)];case 2:return i.sent(),n.result.data&&n.result.data.data?[3,3]:[3,1];case 3:if(!(r=n.result)||"dexie"!=r.formatName)throw new Error("Given file is not a dexie export");if(r.formatVersion>1)throw new Error("Format version ".concat(r.formatVersion," not supported"));if(!r.data)throw new Error("No data in export file");if(!r.data.databaseName)throw new Error("Missing databaseName in export file");if(!r.data.databaseVersion)throw new Error("Missing databaseVersion in export file");if(!r.data.tables)throw new Error("Missing tables in export file");return[2,n]}})})}r.default.prototype.export=function(e){return N(this,e)},r.default.prototype.import=function(e,t){return k(this,e,t)},r.default.import=function(e,t){return P(e,t)};e.default=function(){throw new Error("This addon extends Dexie.prototype globally and does not have be included in Dexie constructor's addons options.")},e.exportDB=N,e.importDB=P,e.importInto=k,e.peakImportFile=function(e){return o(this,void 0,void 0,function(){var t;return a(this,function(n){switch(n.label){case 0:t=I(e),n.label=1;case 1:return t.eof()?[3,3]:[4,t.pullAsync(5120)];case 2:return n.sent(),t.result.data&&t.result.data.data?(delete t.result.data.data,[3,3]):[3,1];case 3:return[2,t.result]}})})},Object.defineProperty(e,"__esModule",{value:!0})});