hadron-document 7.8.0 → 7.9.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.
package/.depcheckrc CHANGED
@@ -1,8 +1,6 @@
1
1
  ignores: [
2
2
  "debug",
3
3
  "lodash.foreach",
4
- "react",
5
- "react-dom",
6
4
  "@babel/register",
7
5
  "babel-loader"
8
6
  ]
package/index.d.ts ADDED
@@ -0,0 +1,192 @@
1
+ import type { TypeCastTypes, TypeCastMap } from 'hadron-type-checker';
2
+
3
+ declare class EventEmitter {
4
+ on(name: string, fn: Function): void;
5
+ off(name: string, fn: Function): void;
6
+ emit(name: string, ...args: unknown[]): void;
7
+ }
8
+
9
+ declare class LinkedList<T> {
10
+ size: number;
11
+ at(index: number): T | undefined;
12
+ get(key: string): T | undefined;
13
+ insertAfter(
14
+ el: T,
15
+ key: string,
16
+ value: unknown,
17
+ added?: boolean,
18
+ parent?: T
19
+ ): T;
20
+ updateKeys(el: T, add: 1 | -1): void;
21
+ handleEmptyKeys(el: T): void;
22
+ insertBefore(
23
+ el: T,
24
+ key: string,
25
+ value: unknown,
26
+ added?: boolean,
27
+ parent?: T
28
+ ): T;
29
+ insertBeginning(key: string, value: unknown, added?: boolean, parent?: T): T;
30
+ insertEnd(key: string, value: unknown, added?: boolean, parent?: T): T;
31
+ flush(): void;
32
+ [Symbol.iterator](): IterableIterator<T>;
33
+ remove(el: T): this;
34
+ }
35
+
36
+ declare const HadronElementEvents: {
37
+ Added: 'Element::Added';
38
+ Edited: 'Element::Edited';
39
+ Removed: 'Element::Removed';
40
+ Reverted: 'Element::Reverted';
41
+ Converted: 'Element::Converted';
42
+ Invalid: 'Element::Invalid';
43
+ Valid: 'Element::Valid';
44
+ };
45
+
46
+ declare class HadronElement extends EventEmitter {
47
+ constructor(
48
+ key: string,
49
+ value: unknown,
50
+ added: boolean,
51
+ parent: HadronDocument | HadronElement | null,
52
+ previousElement: HadronElement | null,
53
+ nextElement: HadronElement | null
54
+ );
55
+ uuid: string;
56
+ key: string;
57
+ currentKey: string;
58
+ parent: HadronDocument | HadronElement | null;
59
+ previousElement: HadronElement | null;
60
+ nextElement: HadronElement | null;
61
+ added: boolean;
62
+ removed: boolean;
63
+ type: TypeCastTypes;
64
+ currentType: TypeCastTypes;
65
+ currentTypeValid: boolean;
66
+ invalidTypeMessage?: string;
67
+ elements?: LinkedList<HadronElement>;
68
+ originalExpandableValue?: TypeCastMap[typeof this.type];
69
+ value?: TypeCastMap[typeof this.type];
70
+ currentValue: TypeCastMap[typeof this.type];
71
+ level: number;
72
+ bulkEdit(value: string): void;
73
+ cancel(): void;
74
+ edit(value: unknown): void;
75
+ changeType(newType: TypeCastTypes): void;
76
+ get(key: string): HadronElement | undefined;
77
+ at(i: number): HadronElement | undefined;
78
+ next(): HadronElement;
79
+ rename(key: string): void;
80
+ generateObject(): unknown;
81
+ generateOriginalObject(): unknown;
82
+ insertAfter(element: HadronElement, key: string, value: unknown): HadronElement;
83
+ insertEnd(key: string, value: unknown): HadronElement;
84
+ insertPlaceholder(): HadronElement;
85
+ insertSiblingPlaceholder(): HadronElement;
86
+ isAdded(): boolean;
87
+ isBlank(): boolean;
88
+ isCurrentTypeValid(): boolean;
89
+ setValid(): void;
90
+ setInvalid(value: unknown, newType: string, message: string): void;
91
+ isDuplicateKey(key: string): boolean;
92
+ isEdited(): boolean;
93
+ isLast(): boolean;
94
+ isRenamed(): boolean;
95
+ isRevertable(): boolean;
96
+ isRemovable(): boolean;
97
+ isNotActionable(): boolean;
98
+ isValueEditable(): boolean;
99
+ isParentEditable(): boolean;
100
+ isKeyEditable(): boolean;
101
+ isModified(): boolean;
102
+ isRemoved(): boolean;
103
+ isRoot(): false;
104
+ remove(): void;
105
+ revert(): void;
106
+ static Events: typeof HadronElementEvents;
107
+ }
108
+
109
+ declare const HadronDocumentEvents: {
110
+ Cancel: 'Document::Cancel';
111
+ };
112
+
113
+ declare class HadronDocument extends EventEmitter {
114
+ constructor(doc: unknown, cloned: boolean);
115
+ uuid: string;
116
+ type: 'Document';
117
+ currentType: 'Document';
118
+ elements: LinkedList<HadronElement>;
119
+ cancel(): void;
120
+ apply(doc: unknown): void;
121
+ generateObject(): unknown;
122
+ generateOriginalObject(): unknown;
123
+ generateUpdateUnlessChangedInBackgroundQuery(
124
+ alwaysIncludeKeys: null | unknown
125
+ ): { query: unknown; updateDoc: unknown };
126
+ get(key: string): HadronElement;
127
+ getChild(path: string[]): HadronElement;
128
+ getId(): unknown | null;
129
+ getOriginalKeysAndValuesForFieldsThatWereUpdated(
130
+ alwaysIncludeKeys: null | unknown
131
+ ): unknown;
132
+ getOriginalKeysAndValuesForSpecifiedKeys(keys: unknown): unknown;
133
+ getSetUpdateForDocumentChanges(): unknown;
134
+ getStringId(): string;
135
+ getUnsetUpdateForDocumentChanges(): unknown;
136
+ insertPlaceholder(): HadronElement;
137
+ insertEnd(key: string, value: unknown): HadronElement;
138
+ insertBeginning(key: string, value: unknown): HadronElement;
139
+ insertAfter(
140
+ element: HadronElement,
141
+ key: string,
142
+ value: unknown
143
+ ): HadronElement;
144
+ isAdded(): false;
145
+ isModified(): boolean;
146
+ isRemoved(): false;
147
+ isRoot(): true;
148
+ next(): void;
149
+ static Events: typeof HadronDocumentEvents;
150
+ }
151
+
152
+ export declare class Editor {
153
+ constructor(element: HadronElement);
154
+ element: HadronElement;
155
+ edit(value: unknown): void;
156
+ paste(value: string): void;
157
+ size(): number;
158
+ value(): unknown;
159
+ start(): void;
160
+ complete(): void;
161
+ }
162
+
163
+ declare const ElementEditor: {
164
+ (element: HadronElement): {
165
+ Standard: Editor;
166
+ String: Editor;
167
+ Decimal128: Editor;
168
+ Date: Editor;
169
+ Double: Editor;
170
+ Int32: Editor;
171
+ Int64: Editor;
172
+ Null: Editor;
173
+ Undefined: Editor;
174
+ ObjectId: Editor;
175
+ };
176
+ DateEditor: typeof Editor;
177
+ StandardEditor: typeof Editor;
178
+ StringEditor: typeof Editor;
179
+ Decimal128Editor: typeof Editor;
180
+ DoubleEditor: typeof Editor;
181
+ Int32Editor: typeof Editor;
182
+ Int64Editor: typeof Editor;
183
+ NullEditor: typeof Editor;
184
+ UndefinedEditor: typeof Editor;
185
+ ObjectIdEditor: typeof Editor;
186
+ };
187
+
188
+ export default HadronDocument;
189
+ export { HadronDocumentEvents as DocumentEvents };
190
+ export { HadronElement as Element };
191
+ export { HadronElementEvents as ElementEvents };
192
+ export { ElementEditor };
package/lib/document.js CHANGED
@@ -1,26 +1,42 @@
1
1
  'use strict';
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
4
 
5
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
5
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
6
6
 
7
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
8
+
9
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
10
 
9
11
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
10
12
 
11
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
13
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
14
+
15
+ 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."); }
16
+
17
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
18
+
19
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
20
+
21
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
22
+
23
+ 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."); }
12
24
 
13
25
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
14
26
 
15
27
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
16
28
 
29
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
30
+
31
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
32
+
17
33
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
18
34
 
19
35
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
20
36
 
21
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
37
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
22
38
 
23
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
39
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
24
40
 
25
41
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
26
42
 
@@ -36,6 +52,8 @@ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.g
36
52
 
37
53
  var EventEmitter = require('eventemitter3');
38
54
 
55
+ var uuid = require('uuid');
56
+
39
57
  var Element = require('./element');
40
58
 
41
59
  var LinkedList = Element.LinkedList;
@@ -75,18 +93,15 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
75
93
  _classCallCheck(this, Document);
76
94
 
77
95
  _this = _super.call(this);
96
+ _this.uuid = uuid.v4();
78
97
  _this.doc = doc;
79
98
  _this.cloned = cloned || false;
80
99
  _this.isUpdatable = true;
81
100
  _this.elements = _this._generateElements();
101
+ _this.type = 'Document';
102
+ _this.currentType = 'Document';
82
103
  return _this;
83
104
  }
84
- /**
85
- * Generate the javascript object for this document.
86
- *
87
- * @returns {Object} The javascript object.
88
- */
89
-
90
105
 
91
106
  _createClass(Document, [{
92
107
  key: "cancel",
@@ -95,22 +110,52 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
95
110
  * Send cancel event.
96
111
  */
97
112
  function cancel() {
98
- var _iterator = _createForOfIteratorHelper(this.elements),
99
- _step;
113
+ // Cancel will remove elements from iterator, clone it before iterating
114
+ // otherwise we will skip items
115
+ for (var _i = 0, _Array$from = Array.from(this.elements); _i < _Array$from.length; _i++) {
116
+ var element = _Array$from[_i];
117
+ element.cancel();
118
+ }
100
119
 
101
- try {
102
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
103
- var element = _step.value;
104
- element.cancel();
120
+ this.emit(Events.Cancel);
121
+ }
122
+ }, {
123
+ key: "apply",
124
+ value: function apply(doc) {
125
+ var updatedKeys = [];
126
+ var prevKey = null;
127
+
128
+ for (var _i2 = 0, _Object$entries = Object.entries(doc); _i2 < _Object$entries.length; _i2++) {
129
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
130
+ key = _Object$entries$_i[0],
131
+ value = _Object$entries$_i[1];
132
+
133
+ if (this.get(key)) {
134
+ this.get(key).edit(value);
135
+ } else if (prevKey) {
136
+ this.insertAfter(this.get(prevKey), key, value);
137
+ } else {
138
+ this.insertBeginning(key, value);
105
139
  }
106
- } catch (err) {
107
- _iterator.e(err);
108
- } finally {
109
- _iterator.f();
140
+
141
+ prevKey = key;
142
+ updatedKeys.push(key);
110
143
  }
111
144
 
112
- this.emit(Events.Cancel);
145
+ for (var _i3 = 0, _arr2 = _toConsumableArray(this.elements); _i3 < _arr2.length; _i3++) {
146
+ var el = _arr2[_i3];
147
+
148
+ if (!updatedKeys.includes(el.currentKey)) {
149
+ el.remove();
150
+ }
151
+ }
113
152
  }
153
+ /**
154
+ * Generate the javascript object for this document.
155
+ *
156
+ * @returns {Object} The javascript object.
157
+ */
158
+
114
159
  }, {
115
160
  key: "generateObject",
116
161
  value: function generateObject() {
@@ -245,12 +290,12 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
245
290
  var object = {};
246
291
 
247
292
  if (this.elements) {
248
- var _iterator2 = _createForOfIteratorHelper(this.elements),
249
- _step2;
293
+ var _iterator = _createForOfIteratorHelper(this.elements),
294
+ _step;
250
295
 
251
296
  try {
252
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
253
- var element = _step2.value;
297
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
298
+ var element = _step.value;
254
299
 
255
300
  if (element.isModified() && !element.isAdded() || alwaysIncludeKeys && element.key in alwaysIncludeKeys) {
256
301
  // Using `.key` instead of `.currentKey` to ensure we look at
@@ -267,9 +312,9 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
267
312
  }
268
313
  }
269
314
  } catch (err) {
270
- _iterator2.e(err);
315
+ _iterator.e(err);
271
316
  } finally {
272
- _iterator2.f();
317
+ _iterator.f();
273
318
  }
274
319
  }
275
320
 
@@ -293,12 +338,12 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
293
338
  var object = {};
294
339
 
295
340
  if (this.elements) {
296
- var _iterator3 = _createForOfIteratorHelper(this.elements),
297
- _step3;
341
+ var _iterator2 = _createForOfIteratorHelper(this.elements),
342
+ _step2;
298
343
 
299
344
  try {
300
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
301
- var element = _step3.value;
345
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
346
+ var element = _step2.value;
302
347
 
303
348
  if (element.key in keys) {
304
349
  // Using `.key` instead of `.currentKey` to ensure we look at
@@ -307,9 +352,9 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
307
352
  }
308
353
  }
309
354
  } catch (err) {
310
- _iterator3.e(err);
355
+ _iterator2.e(err);
311
356
  } finally {
312
- _iterator3.f();
357
+ _iterator2.f();
313
358
  }
314
359
  }
315
360
 
@@ -328,12 +373,12 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
328
373
  var object = {};
329
374
 
330
375
  if (this.elements) {
331
- var _iterator4 = _createForOfIteratorHelper(this.elements),
332
- _step4;
376
+ var _iterator3 = _createForOfIteratorHelper(this.elements),
377
+ _step3;
333
378
 
334
379
  try {
335
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
336
- var element = _step4.value;
380
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
381
+ var element = _step3.value;
337
382
 
338
383
  if (!element.isRemoved() && element.currentKey !== '' && element.isModified()) {
339
384
  // Include the full modified element.
@@ -347,9 +392,9 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
347
392
  }
348
393
  }
349
394
  } catch (err) {
350
- _iterator4.e(err);
395
+ _iterator3.e(err);
351
396
  } finally {
352
- _iterator4.f();
397
+ _iterator3.f();
353
398
  }
354
399
  }
355
400
 
@@ -387,12 +432,12 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
387
432
  var object = {};
388
433
 
389
434
  if (this.elements) {
390
- var _iterator5 = _createForOfIteratorHelper(this.elements),
391
- _step5;
435
+ var _iterator4 = _createForOfIteratorHelper(this.elements),
436
+ _step4;
392
437
 
393
438
  try {
394
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
395
- var element = _step5.value;
439
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
440
+ var element = _step4.value;
396
441
 
397
442
  if (!element.isAdded() && element.isRemoved() && element.key !== '') {
398
443
  object[element.key] = true;
@@ -404,9 +449,9 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
404
449
  }
405
450
  }
406
451
  } catch (err) {
407
- _iterator5.e(err);
452
+ _iterator4.e(err);
408
453
  } finally {
409
- _iterator5.f();
454
+ _iterator4.f();
410
455
  }
411
456
  }
412
457
 
@@ -432,11 +477,31 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
432
477
  * @returns {Element} The new element.
433
478
  */
434
479
 
480
+ }, {
481
+ key: "insertBeginning",
482
+ value: function insertBeginning(key, value) {
483
+ var newElement = this.elements.insertBeginning(key, value, true, this);
484
+
485
+ newElement._bubbleUp(Element.Events.Added, newElement, this);
486
+
487
+ return newElement;
488
+ }
489
+ /**
490
+ * Add a new element to this document.
491
+ *
492
+ * @param {String} key - The element key.
493
+ * @param {Object} value - The value.
494
+ *
495
+ * @returns {Element} The new element.
496
+ */
497
+
435
498
  }, {
436
499
  key: "insertEnd",
437
500
  value: function insertEnd(key, value) {
438
501
  var newElement = this.elements.insertEnd(key, value, true, this);
439
- this.emit(Element.Events.Added);
502
+
503
+ newElement._bubbleUp(Element.Events.Added, newElement, this);
504
+
440
505
  return newElement;
441
506
  }
442
507
  /**
@@ -453,7 +518,9 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
453
518
  key: "insertAfter",
454
519
  value: function insertAfter(element, key, value) {
455
520
  var newElement = this.elements.insertAfter(element, key, value, true, this);
456
- this.emit(Element.Events.Added);
521
+
522
+ newElement._bubbleUp(Element.Events.Added, newElement, this);
523
+
457
524
  return newElement;
458
525
  }
459
526
  /**
@@ -476,21 +543,21 @@ var Document = /*#__PURE__*/function (_EventEmitter) {
476
543
  }, {
477
544
  key: "isModified",
478
545
  value: function isModified() {
479
- var _iterator6 = _createForOfIteratorHelper(this.elements),
480
- _step6;
546
+ var _iterator5 = _createForOfIteratorHelper(this.elements),
547
+ _step5;
481
548
 
482
549
  try {
483
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
484
- var element = _step6.value;
550
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
551
+ var element = _step5.value;
485
552
 
486
553
  if (element.isModified()) {
487
554
  return true;
488
555
  }
489
556
  }
490
557
  } catch (err) {
491
- _iterator6.e(err);
558
+ _iterator5.e(err);
492
559
  } finally {
493
- _iterator6.f();
560
+ _iterator5.f();
494
561
  }
495
562
 
496
563
  return false;