hadron-document 7.8.0 → 7.11.0

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.
Files changed (82) hide show
  1. package/README.md +5 -5
  2. package/dist/document.d.ts +54 -0
  3. package/dist/document.d.ts.map +1 -0
  4. package/dist/document.js +248 -0
  5. package/dist/document.js.map +1 -0
  6. package/dist/editor/date.d.ts +13 -0
  7. package/dist/editor/date.d.ts.map +1 -0
  8. package/dist/editor/date.js +65 -0
  9. package/dist/editor/date.js.map +1 -0
  10. package/dist/editor/decimal128.d.ts +9 -0
  11. package/dist/editor/decimal128.d.ts.map +1 -0
  12. package/dist/editor/decimal128.js +32 -0
  13. package/dist/editor/decimal128.js.map +1 -0
  14. package/dist/editor/double.d.ts +10 -0
  15. package/dist/editor/double.d.ts.map +1 -0
  16. package/dist/editor/double.js +44 -0
  17. package/dist/editor/double.js.map +1 -0
  18. package/dist/editor/index.d.ts +38 -0
  19. package/dist/editor/index.d.ts.map +1 -0
  20. package/dist/editor/index.js +51 -0
  21. package/dist/editor/index.js.map +1 -0
  22. package/dist/editor/int32.d.ts +7 -0
  23. package/dist/editor/int32.d.ts.map +1 -0
  24. package/dist/editor/int32.js +17 -0
  25. package/dist/editor/int32.js.map +1 -0
  26. package/dist/editor/int64.d.ts +9 -0
  27. package/dist/editor/int64.d.ts.map +1 -0
  28. package/dist/editor/int64.js +32 -0
  29. package/dist/editor/int64.js.map +1 -0
  30. package/dist/editor/null.d.ts +8 -0
  31. package/dist/editor/null.d.ts.map +1 -0
  32. package/dist/editor/null.js +20 -0
  33. package/dist/editor/null.js.map +1 -0
  34. package/dist/editor/objectid.d.ts +10 -0
  35. package/dist/editor/objectid.d.ts.map +1 -0
  36. package/dist/editor/objectid.js +38 -0
  37. package/dist/editor/objectid.js.map +1 -0
  38. package/dist/editor/standard.d.ts +16 -0
  39. package/dist/editor/standard.d.ts.map +1 -0
  40. package/dist/editor/standard.js +49 -0
  41. package/dist/editor/standard.js.map +1 -0
  42. package/dist/editor/string.d.ts +7 -0
  43. package/dist/editor/string.d.ts.map +1 -0
  44. package/dist/editor/string.js +15 -0
  45. package/dist/editor/string.js.map +1 -0
  46. package/dist/editor/undefined.d.ts +8 -0
  47. package/dist/editor/undefined.d.ts.map +1 -0
  48. package/dist/editor/undefined.js +20 -0
  49. package/dist/editor/undefined.js.map +1 -0
  50. package/dist/element-events.d.ts +11 -0
  51. package/dist/element-events.d.ts.map +1 -0
  52. package/dist/element-events.js +12 -0
  53. package/dist/element-events.js.map +1 -0
  54. package/dist/element.d.ts +115 -0
  55. package/dist/element.d.ts.map +1 -0
  56. package/dist/element.js +669 -0
  57. package/dist/element.js.map +1 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +36 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/object-generator.d.ts +12 -0
  63. package/dist/object-generator.d.ts.map +1 -0
  64. package/dist/object-generator.js +94 -0
  65. package/dist/object-generator.js.map +1 -0
  66. package/dist/utils.d.ts +11 -0
  67. package/dist/utils.d.ts.map +1 -0
  68. package/dist/utils.js +37 -0
  69. package/dist/utils.js.map +1 -0
  70. package/package.json +42 -29
  71. package/.babelrc.js +0 -14
  72. package/.depcheckrc +0 -8
  73. package/.eslintignore +0 -1
  74. package/index.js +0 -1
  75. package/lib/document.js +0 -557
  76. package/lib/element.js +0 -1236
  77. package/lib/index.js +0 -4
  78. package/lib/object-generator.js +0 -180
  79. package/src/document.js +0 -391
  80. package/src/element.js +0 -951
  81. package/src/index.js +0 -2
  82. package/src/object-generator.js +0 -96
@@ -0,0 +1,669 @@
1
+ 'use strict';
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LinkedList = exports.Element = exports.isInternalFieldPath = exports.Events = exports.DATE_FORMAT = void 0;
7
+ const eventemitter3_1 = __importDefault(require("eventemitter3"));
8
+ const lodash_keys_1 = __importDefault(require("lodash.keys"));
9
+ const lodash_isplainobject_1 = __importDefault(require("lodash.isplainobject"));
10
+ const lodash_isarray_1 = __importDefault(require("lodash.isarray"));
11
+ const lodash_isequal_1 = __importDefault(require("lodash.isequal"));
12
+ const lodash_isstring_1 = __importDefault(require("lodash.isstring"));
13
+ const object_generator_1 = __importDefault(require("./object-generator"));
14
+ const hadron_type_checker_1 = __importDefault(require("hadron-type-checker"));
15
+ const bson_1 = require("bson");
16
+ const date_1 = __importDefault(require("./editor/date"));
17
+ const element_events_1 = __importDefault(require("./element-events"));
18
+ exports.Events = element_events_1.default;
19
+ const _1 = require(".");
20
+ exports.DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSS';
21
+ const ID = '_id';
22
+ function isInternalFieldPath(path) {
23
+ return typeof path === 'string' && /^__safeContent__($|\.)/.test(path);
24
+ }
25
+ exports.isInternalFieldPath = isInternalFieldPath;
26
+ const UNEDITABLE_TYPES = [
27
+ 'Binary',
28
+ 'Code',
29
+ 'MinKey',
30
+ 'MaxKey',
31
+ 'Timestamp',
32
+ 'BSONRegExp',
33
+ 'Undefined',
34
+ 'Null',
35
+ 'DBRef',
36
+ ];
37
+ const CURLY = '{';
38
+ const BRACKET = '[';
39
+ const ARRAY_OR_OBJECT = /^(\[|\{)(.+)(\]|\})$/;
40
+ class Element extends eventemitter3_1.default {
41
+ constructor(key, value, added = false, parent = null, previousElement = null, nextElement = null) {
42
+ super();
43
+ this.uuid = new bson_1.UUID().toHexString();
44
+ this.key = key;
45
+ this.currentKey = key;
46
+ this.parent = parent;
47
+ this.previousElement = previousElement;
48
+ this.nextElement = nextElement;
49
+ this.added = added;
50
+ this.removed = false;
51
+ this.type = hadron_type_checker_1.default.type(value);
52
+ this.currentType = this.type;
53
+ this.level = this._getLevel();
54
+ this.setValid();
55
+ if (this._isExpandable(value)) {
56
+ this.elements = this._generateElements(value);
57
+ this.originalExpandableValue = value;
58
+ }
59
+ else {
60
+ this.value = value;
61
+ this.currentValue = value;
62
+ }
63
+ let parentValue;
64
+ if (this.parent) {
65
+ parentValue = this.parent.isRoot()
66
+ ? this.parent.doc
67
+ : this.parent.originalExpandableValue;
68
+ }
69
+ const parentDecryptedKeys = parentValue && parentValue[Symbol.for('@@mdb.decryptedKeys')];
70
+ this.decrypted = (parentDecryptedKeys || [])
71
+ .map(String)
72
+ .includes(String(key));
73
+ }
74
+ bulkEdit(value) {
75
+ if (ARRAY_OR_OBJECT.exec(value)) {
76
+ this.edit(JSON.parse(value));
77
+ this._bubbleUp(element_events_1.default.Converted, this);
78
+ }
79
+ else {
80
+ this.edit(value);
81
+ }
82
+ }
83
+ cancel() {
84
+ if (this.elements) {
85
+ for (const element of Array.from(this.elements)) {
86
+ element.cancel();
87
+ }
88
+ }
89
+ if (this.isModified()) {
90
+ this.revert();
91
+ }
92
+ }
93
+ _getLevel() {
94
+ let level = -1;
95
+ let parent = this.parent;
96
+ while (parent) {
97
+ level++;
98
+ parent = parent.parent;
99
+ }
100
+ return level;
101
+ }
102
+ edit(value) {
103
+ this.currentType = hadron_type_checker_1.default.type(value);
104
+ if (this._isExpandable(value) && !this._isExpandable(this.currentValue)) {
105
+ this.currentValue = null;
106
+ this.elements = this._generateElements(value);
107
+ }
108
+ else if (!this._isExpandable(value) && this.elements) {
109
+ this.currentValue = value;
110
+ this.elements = undefined;
111
+ }
112
+ else {
113
+ this.currentValue = value;
114
+ }
115
+ this.setValid();
116
+ this._bubbleUp(element_events_1.default.Edited, this);
117
+ }
118
+ changeType(newType) {
119
+ if (newType === 'Object') {
120
+ this.edit('{');
121
+ this.next();
122
+ }
123
+ else if (newType === 'Array') {
124
+ this.edit('[');
125
+ this.next();
126
+ }
127
+ else {
128
+ try {
129
+ if (newType === 'Date') {
130
+ const editor = new date_1.default(this);
131
+ editor.edit(this.generateObject());
132
+ editor.complete();
133
+ }
134
+ else {
135
+ this.edit(hadron_type_checker_1.default.cast(this.generateObject(), newType));
136
+ }
137
+ }
138
+ catch (e) {
139
+ this.setInvalid(this.currentValue, newType, e.message);
140
+ }
141
+ }
142
+ }
143
+ getRoot() {
144
+ var _a;
145
+ let parent = this.parent;
146
+ while ((_a = parent) === null || _a === void 0 ? void 0 : _a.parent) {
147
+ parent = parent.parent;
148
+ }
149
+ return parent;
150
+ }
151
+ get(key) {
152
+ return this.elements ? this.elements.get(key) : undefined;
153
+ }
154
+ at(i) {
155
+ return this.elements ? this.elements.at(i) : undefined;
156
+ }
157
+ next() {
158
+ if (this.currentValue === CURLY) {
159
+ return this._convertToEmptyObject();
160
+ }
161
+ else if (this.currentValue === BRACKET) {
162
+ return this._convertToEmptyArray();
163
+ }
164
+ return this._next();
165
+ }
166
+ rename(key) {
167
+ if (this.parent) {
168
+ const elm = this.parent.elements._map[this.currentKey];
169
+ delete this.parent.elements._map[this.currentKey];
170
+ this.parent.elements._map[key] = elm;
171
+ }
172
+ this.currentKey = key;
173
+ this._bubbleUp(element_events_1.default.Edited, this);
174
+ }
175
+ generateObject(options) {
176
+ if (this.currentType === 'Array') {
177
+ return object_generator_1.default.generateArray(this.elements, options);
178
+ }
179
+ if (this.currentType === 'Object') {
180
+ return object_generator_1.default.generate(this.elements, options);
181
+ }
182
+ return this.currentValue;
183
+ }
184
+ generateOriginalObject(options) {
185
+ if (this.type === 'Array') {
186
+ const originalElements = this._generateElements(this.originalExpandableValue);
187
+ return object_generator_1.default.generateOriginalArray(originalElements, options);
188
+ }
189
+ if (this.type === 'Object') {
190
+ const originalElements = this._generateElements(this.originalExpandableValue);
191
+ return object_generator_1.default.generateOriginal(originalElements, options);
192
+ }
193
+ return this.value;
194
+ }
195
+ insertAfter(element, key, value) {
196
+ if (!this.elements) {
197
+ throw new Error('Cannot insert values on non-array/non-object elements');
198
+ }
199
+ if (this.currentType === 'Array') {
200
+ if (element.currentKey === '') {
201
+ this.elements.handleEmptyKeys(element);
202
+ }
203
+ key = element.currentKey + 1;
204
+ }
205
+ const newElement = this.elements.insertAfter(element, key, value, true, this);
206
+ if (this.currentType === 'Array') {
207
+ this.elements.updateKeys(newElement, 1);
208
+ }
209
+ newElement._bubbleUp(element_events_1.default.Added, newElement, this);
210
+ return newElement;
211
+ }
212
+ insertEnd(key, value) {
213
+ if (!this.elements) {
214
+ throw new Error('Cannot insert values on non-array/non-object elements');
215
+ }
216
+ if (this.currentType === 'Array') {
217
+ this.elements.flush();
218
+ key = 0;
219
+ if (this.elements.lastElement) {
220
+ if (this.elements.lastElement.currentKey === '') {
221
+ this.elements.handleEmptyKeys(this.elements.lastElement);
222
+ }
223
+ key = this.elements.lastElement.currentKey + 1;
224
+ }
225
+ }
226
+ const newElement = this.elements.insertEnd(key, value, true, this);
227
+ this._bubbleUp(element_events_1.default.Added, newElement);
228
+ return newElement;
229
+ }
230
+ insertPlaceholder() {
231
+ return this.insertEnd('', '');
232
+ }
233
+ insertSiblingPlaceholder() {
234
+ return this.parent.insertAfter(this, '', '');
235
+ }
236
+ isAdded() {
237
+ var _a;
238
+ return this.added || !!((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isAdded());
239
+ }
240
+ isBlank() {
241
+ return this.currentKey === '' && this.currentValue === '';
242
+ }
243
+ isCurrentTypeValid() {
244
+ return !!this.currentTypeValid;
245
+ }
246
+ setValid() {
247
+ this.currentTypeValid = true;
248
+ this.invalidTypeMessage = undefined;
249
+ this._bubbleUp(element_events_1.default.Valid, this);
250
+ }
251
+ setInvalid(value, newType, message) {
252
+ this.currentValue = value;
253
+ this.currentType = newType;
254
+ this.currentTypeValid = false;
255
+ this.invalidTypeMessage = message;
256
+ this._bubbleUp(element_events_1.default.Invalid, this);
257
+ }
258
+ isDuplicateKey(value) {
259
+ var _a, _b;
260
+ if (value === '') {
261
+ return false;
262
+ }
263
+ for (const element of (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.elements) !== null && _b !== void 0 ? _b : []) {
264
+ if (element.uuid !== this.uuid && element.currentKey === value) {
265
+ return true;
266
+ }
267
+ }
268
+ return false;
269
+ }
270
+ isEdited() {
271
+ return ((this.isRenamed() ||
272
+ !this._valuesEqual() ||
273
+ this.type !== this.currentType) &&
274
+ !this.isAdded());
275
+ }
276
+ _valuesEqual() {
277
+ if (this.currentType === 'Date' && (0, lodash_isstring_1.default)(this.currentValue)) {
278
+ return (0, lodash_isequal_1.default)(this.value, new Date(this.currentValue));
279
+ }
280
+ else if (this.currentType === 'ObjectId' && (0, lodash_isstring_1.default)(this.currentValue)) {
281
+ return this._isObjectIdEqual();
282
+ }
283
+ return (0, lodash_isequal_1.default)(this.value, this.currentValue);
284
+ }
285
+ _isObjectIdEqual() {
286
+ try {
287
+ return this.value.toHexString() === this.currentValue;
288
+ }
289
+ catch (_) {
290
+ return false;
291
+ }
292
+ }
293
+ isLast() {
294
+ var _a, _b;
295
+ return ((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.elements) === null || _b === void 0 ? void 0 : _b.lastElement) === this;
296
+ }
297
+ isRenamed() {
298
+ let keyChanged = false;
299
+ if (!this.parent ||
300
+ this.parent.isRoot() ||
301
+ this.parent.currentType === 'Object') {
302
+ keyChanged = this.key !== this.currentKey;
303
+ }
304
+ return keyChanged;
305
+ }
306
+ isRevertable() {
307
+ return this.isEdited() || this.isRemoved();
308
+ }
309
+ isRemovable() {
310
+ return !this.parent.isRemoved();
311
+ }
312
+ isNotActionable() {
313
+ return (((this.key === ID || this.isInternalField()) && !this.isAdded()) ||
314
+ !this.isRemovable());
315
+ }
316
+ isValueDecrypted() {
317
+ return this.decrypted;
318
+ }
319
+ containsDecryptedChildren() {
320
+ if (this.isValueDecrypted()) {
321
+ return true;
322
+ }
323
+ for (const element of this.elements || []) {
324
+ if (element.containsDecryptedChildren()) {
325
+ return true;
326
+ }
327
+ }
328
+ return false;
329
+ }
330
+ isValueEditable() {
331
+ return (this._isKeyLegallyEditable() &&
332
+ !UNEDITABLE_TYPES.includes(this.currentType));
333
+ }
334
+ isParentEditable() {
335
+ if (this.parent && !this.parent.isRoot()) {
336
+ return this.parent._isKeyLegallyEditable();
337
+ }
338
+ return true;
339
+ }
340
+ _isKeyLegallyEditable() {
341
+ return (this.isParentEditable() &&
342
+ (this.isAdded() || (this.currentKey !== ID && !this.isInternalField())));
343
+ }
344
+ isKeyEditable() {
345
+ return this._isKeyLegallyEditable() && !this.containsDecryptedChildren();
346
+ }
347
+ isInternalField() {
348
+ if (!this.parent)
349
+ return false;
350
+ if (!this.parent.isRoot() && this.parent.isInternalField()) {
351
+ return true;
352
+ }
353
+ if (this.parent.isRoot() && isInternalFieldPath(this.currentKey)) {
354
+ return true;
355
+ }
356
+ return false;
357
+ }
358
+ isModified() {
359
+ if (this.elements) {
360
+ for (const element of this.elements) {
361
+ if (element.isModified()) {
362
+ return true;
363
+ }
364
+ }
365
+ }
366
+ return this.isAdded() || this.isEdited() || this.isRemoved();
367
+ }
368
+ isRemoved() {
369
+ return this.removed;
370
+ }
371
+ isRoot() {
372
+ return false;
373
+ }
374
+ remove() {
375
+ this.revert();
376
+ this.removed = true;
377
+ if (this.parent) {
378
+ this._bubbleUp(element_events_1.default.Removed, this, this.parent);
379
+ }
380
+ }
381
+ revert() {
382
+ var _a;
383
+ if (this.isAdded()) {
384
+ if (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.currentType) === 'Array') {
385
+ this.parent.elements.updateKeys(this, -1);
386
+ }
387
+ this.parent.elements.remove(this);
388
+ this._bubbleUp(element_events_1.default.Removed, this, this.parent);
389
+ this.parent = null;
390
+ }
391
+ else {
392
+ if (this.originalExpandableValue) {
393
+ this.elements = this._generateElements(this.originalExpandableValue);
394
+ this.currentValue = undefined;
395
+ }
396
+ else {
397
+ if (this.currentValue === null && this.value !== null) {
398
+ this.elements = null;
399
+ }
400
+ else {
401
+ this._removeAddedElements();
402
+ }
403
+ this.currentValue = this.value;
404
+ }
405
+ this.currentKey = this.key;
406
+ this.currentType = this.type;
407
+ this.removed = false;
408
+ }
409
+ this.setValid();
410
+ this._bubbleUp(element_events_1.default.Reverted, this);
411
+ }
412
+ _bubbleUp(evt, ...data) {
413
+ this.emit(evt, ...data);
414
+ const element = this.parent;
415
+ if (element) {
416
+ if (element.isRoot()) {
417
+ element.emit(evt, ...data);
418
+ }
419
+ else {
420
+ element._bubbleUp(evt, ...data);
421
+ }
422
+ }
423
+ }
424
+ _convertToEmptyObject() {
425
+ this.edit({});
426
+ this.insertPlaceholder();
427
+ }
428
+ _convertToEmptyArray() {
429
+ this.edit([]);
430
+ this.insertPlaceholder();
431
+ }
432
+ _isElementEmpty(element) {
433
+ return !!element && element.isAdded() && element.isBlank();
434
+ }
435
+ _isExpandable(value) {
436
+ return (0, lodash_isplainobject_1.default)(value) || (0, lodash_isarray_1.default)(value);
437
+ }
438
+ _generateElements(object) {
439
+ return new LinkedList(this, object);
440
+ }
441
+ _key(key, index) {
442
+ return this.currentType === 'Array' ? index : key;
443
+ }
444
+ _next() {
445
+ if (!this._isElementEmpty(this.nextElement) &&
446
+ !this._isElementEmpty(this)) {
447
+ this.parent.insertAfter(this, '', '');
448
+ }
449
+ }
450
+ _removeAddedElements() {
451
+ if (this.elements) {
452
+ for (const element of this.elements) {
453
+ if (element.isAdded()) {
454
+ this.elements.remove(element);
455
+ }
456
+ }
457
+ }
458
+ }
459
+ static get Events() {
460
+ return _1.ElementEvents;
461
+ }
462
+ }
463
+ exports.Element = Element;
464
+ class LinkedList {
465
+ constructor(doc, originalDoc) {
466
+ this.firstElement = null;
467
+ this.lastElement = null;
468
+ this.doc = doc;
469
+ this.originalDoc = originalDoc;
470
+ this.keys = (0, lodash_keys_1.default)(this.originalDoc);
471
+ if (this.doc.currentType === 'Array') {
472
+ this.keys = this.keys.map((k) => parseInt(k, 10));
473
+ }
474
+ this.size = this.keys.length;
475
+ this.loaded = 0;
476
+ this._map = {};
477
+ }
478
+ at(index) {
479
+ this.flush();
480
+ if (!Number.isInteger(index)) {
481
+ return undefined;
482
+ }
483
+ let element = this.firstElement;
484
+ for (let i = 0; i < index; i++) {
485
+ if (!element) {
486
+ return undefined;
487
+ }
488
+ element = element.nextElement;
489
+ }
490
+ return element === null ? undefined : element;
491
+ }
492
+ get(key) {
493
+ this.flush();
494
+ return this._map[key];
495
+ }
496
+ insertAfter(element, key, value, added, parent) {
497
+ this.flush();
498
+ return this._insertAfter(element, key, value, added, parent);
499
+ }
500
+ updateKeys(element, add) {
501
+ this.flush();
502
+ while (element.nextElement) {
503
+ element.nextElement.currentKey += add;
504
+ element = element.nextElement;
505
+ }
506
+ }
507
+ handleEmptyKeys(element) {
508
+ if (element.currentKey === '') {
509
+ let e = element;
510
+ while (e.currentKey === '') {
511
+ if (!e.previousElement) {
512
+ e.currentKey = 0;
513
+ break;
514
+ }
515
+ else {
516
+ e = e.previousElement;
517
+ }
518
+ }
519
+ while (e.nextElement) {
520
+ e.nextElement.currentKey = e.currentKey + 1;
521
+ e = e.nextElement;
522
+ }
523
+ }
524
+ }
525
+ insertBefore(element, key, value, added, parent) {
526
+ this.flush();
527
+ return this._insertBefore(element, key, value, added, parent);
528
+ }
529
+ insertBeginning(key, value, added, parent) {
530
+ this.flush();
531
+ return this._insertBeginning(key, value, added, parent);
532
+ }
533
+ insertEnd(key, value, added, parent) {
534
+ this.flush();
535
+ if (!this.lastElement) {
536
+ return this.insertBeginning(key, value, added, parent);
537
+ }
538
+ return this.insertAfter(this.lastElement, key, value, added, parent);
539
+ }
540
+ flush() {
541
+ var _a;
542
+ if (this.loaded < this.size) {
543
+ for (const element of this) {
544
+ (_a = element === null || element === void 0 ? void 0 : element.elements) === null || _a === void 0 ? void 0 : _a.flush();
545
+ }
546
+ }
547
+ }
548
+ *[Symbol.iterator]() {
549
+ let currentElement;
550
+ let index = 0;
551
+ while (true) {
552
+ if (this._needsLazyLoad(index)) {
553
+ const key = this.keys[index];
554
+ index += 1;
555
+ currentElement = this._lazyInsertEnd(key);
556
+ yield currentElement;
557
+ }
558
+ else if (this._needsStandardIteration(index)) {
559
+ if (currentElement) {
560
+ currentElement = currentElement.nextElement;
561
+ }
562
+ else {
563
+ currentElement = this.firstElement;
564
+ }
565
+ if (currentElement) {
566
+ index += 1;
567
+ yield currentElement;
568
+ }
569
+ else {
570
+ break;
571
+ }
572
+ }
573
+ else {
574
+ break;
575
+ }
576
+ }
577
+ }
578
+ _needsLazyLoad(index) {
579
+ return ((index === 0 && this.loaded === 0 && this.size > 0) ||
580
+ (this.loaded <= index && index < this.size));
581
+ }
582
+ _needsStandardIteration(index) {
583
+ return this.loaded > 0 && index < this.loaded && index < this.size;
584
+ }
585
+ _lazyInsertEnd(key) {
586
+ this.size -= 1;
587
+ return this._insertEnd(key, this.originalDoc[key], this.doc.cloned, this.doc);
588
+ }
589
+ _insertEnd(key, value, added, parent) {
590
+ if (!this.lastElement) {
591
+ return this._insertBeginning(key, value, added, parent);
592
+ }
593
+ return this._insertAfter(this.lastElement, key, value, added, parent);
594
+ }
595
+ _insertBefore(element, key, value, added, parent) {
596
+ const newElement = new Element(key, value, added, parent, element.previousElement, element);
597
+ if (element.previousElement) {
598
+ element.previousElement.nextElement = newElement;
599
+ }
600
+ else {
601
+ this.firstElement = newElement;
602
+ }
603
+ element.previousElement = newElement;
604
+ this._map[newElement.key] = newElement;
605
+ this.size += 1;
606
+ this.loaded += 1;
607
+ return newElement;
608
+ }
609
+ _insertBeginning(key, value, added, parent) {
610
+ if (!this.firstElement) {
611
+ const element = new Element(key, value, added, parent, null, null);
612
+ this.firstElement = this.lastElement = element;
613
+ this.size += 1;
614
+ this.loaded += 1;
615
+ this._map[element.key] = element;
616
+ return element;
617
+ }
618
+ const newElement = this.insertBefore(this.firstElement, key, value, added, parent);
619
+ this._map[newElement.key] = newElement;
620
+ return newElement;
621
+ }
622
+ _insertAfter(element, key, value, added, parent) {
623
+ const newElement = new Element(key, value, added, parent, element, element.nextElement);
624
+ if (element.nextElement) {
625
+ element.nextElement.previousElement = newElement;
626
+ }
627
+ else {
628
+ this.lastElement = newElement;
629
+ }
630
+ element.nextElement = newElement;
631
+ this._map[newElement.key] = newElement;
632
+ this.size += 1;
633
+ this.loaded += 1;
634
+ return newElement;
635
+ }
636
+ remove(element) {
637
+ this.flush();
638
+ if (element.previousElement) {
639
+ element.previousElement.nextElement = element.nextElement;
640
+ }
641
+ else {
642
+ this.firstElement = element.nextElement;
643
+ }
644
+ if (element.nextElement) {
645
+ element.nextElement.previousElement = element.previousElement;
646
+ }
647
+ else {
648
+ this.lastElement = element.previousElement;
649
+ }
650
+ element.nextElement = element.previousElement = null;
651
+ delete this._map[element.currentKey];
652
+ this.size -= 1;
653
+ this.loaded -= 1;
654
+ return this;
655
+ }
656
+ findIndex(el) {
657
+ let idx = 0;
658
+ for (const item of this) {
659
+ if (item === el) {
660
+ return idx;
661
+ }
662
+ idx++;
663
+ }
664
+ return -1;
665
+ }
666
+ }
667
+ exports.LinkedList = LinkedList;
668
+ exports.default = Element;
669
+ //# sourceMappingURL=element.js.map