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/src/element.js CHANGED
@@ -9,22 +9,11 @@ const isString = require('lodash.isstring');
9
9
  const ObjectGenerator = require('./object-generator');
10
10
  const TypeChecker = require('hadron-type-checker');
11
11
  const uuid = require('uuid');
12
+ const DateEditor = require('./editor/date');
13
+ const Events = require('./element-events');
12
14
 
13
15
  const DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSS';
14
16
 
15
- /**
16
- * The event constant.
17
- */
18
- const Events = {
19
- 'Added': 'Element::Added',
20
- 'Edited': 'Element::Edited',
21
- 'Removed': 'Element::Removed',
22
- 'Reverted': 'Element::Reverted',
23
- 'Converted': 'Element::Converted',
24
- 'Invalid': 'Element::Invalid',
25
- 'Valid': 'Element::Valid'
26
- };
27
-
28
17
  /**
29
18
  * Id field constant.
30
19
  */
@@ -41,7 +30,8 @@ const UNEDITABLE_TYPES = [
41
30
  'Timestamp',
42
31
  'BSONRegExp',
43
32
  'Undefined',
44
- 'Null'
33
+ 'Null',
34
+ 'DBRef'
45
35
  ];
46
36
 
47
37
  /**
@@ -71,7 +61,7 @@ class Element extends EventEmitter {
71
61
  bulkEdit(value) {
72
62
  if (value.match(ARRAY_OR_OBJECT)) {
73
63
  this.edit(JSON.parse(value));
74
- this._bubbleUp(Events.Converted);
64
+ this._bubbleUp(Events.Converted, this);
75
65
  } else {
76
66
  this.edit(value);
77
67
  }
@@ -82,7 +72,9 @@ class Element extends EventEmitter {
82
72
  */
83
73
  cancel() {
84
74
  if (this.elements) {
85
- for (let element of this.elements) {
75
+ // Cancel will remove elements from iterator, clone it before iterating
76
+ // otherwise we will skip items
77
+ for (let element of Array.from(this.elements)) {
86
78
  element.cancel();
87
79
  }
88
80
  }
@@ -113,6 +105,7 @@ class Element extends EventEmitter {
113
105
  this.removed = false;
114
106
  this.type = TypeChecker.type(value);
115
107
  this.currentType = this.type;
108
+ this.level = this._getLevel();
116
109
  this.setValid();
117
110
 
118
111
  if (this._isExpandable(value)) {
@@ -124,6 +117,16 @@ class Element extends EventEmitter {
124
117
  }
125
118
  }
126
119
 
120
+ _getLevel() {
121
+ let level = -1;
122
+ let parent = this.parent;
123
+ while (parent) {
124
+ level++;
125
+ parent = parent.parent;
126
+ }
127
+ return level;
128
+ }
129
+
127
130
  /**
128
131
  * Edit the element.
129
132
  *
@@ -141,7 +144,40 @@ class Element extends EventEmitter {
141
144
  this.currentValue = value;
142
145
  }
143
146
  this.setValid();
144
- this._bubbleUp(Events.Edited);
147
+ this._bubbleUp(Events.Edited, this);
148
+ }
149
+
150
+ /**
151
+ * @param {import('hadron-type-checker').TypeCastTypes} newType
152
+ */
153
+ changeType(newType) {
154
+ if (newType === 'Object') {
155
+ this.edit('{');
156
+ this.next();
157
+ } else if (newType === 'Array') {
158
+ this.edit('[');
159
+ this.next();
160
+ } else {
161
+ try {
162
+ if (newType === 'Date') {
163
+ const editor = new DateEditor(this);
164
+ editor.edit(this.generateObject());
165
+ editor.complete();
166
+ } else {
167
+ this.edit(TypeChecker.cast(this.generateObject(), newType));
168
+ }
169
+ } catch (e) {
170
+ this.setInvalid(this.currentValue, newType, e.message);
171
+ }
172
+ }
173
+ }
174
+
175
+ getRoot() {
176
+ let parent = this.parent;
177
+ while (parent.parent) {
178
+ parent = parent.parent;
179
+ }
180
+ return parent;
145
181
  }
146
182
 
147
183
  /**
@@ -195,7 +231,7 @@ class Element extends EventEmitter {
195
231
  }
196
232
 
197
233
  this.currentKey = key;
198
- this._bubbleUp(Events.Edited);
234
+ this._bubbleUp(Events.Edited, this);
199
235
  }
200
236
 
201
237
  /**
@@ -207,7 +243,7 @@ class Element extends EventEmitter {
207
243
  if (this.currentType === 'Array') {
208
244
  return ObjectGenerator.generateArray(this.elements);
209
245
  }
210
- if (this.elements) {
246
+ if (this.currentType === 'Object') {
211
247
  return ObjectGenerator.generate(this.elements);
212
248
  }
213
249
  return this.currentValue;
@@ -254,7 +290,7 @@ class Element extends EventEmitter {
254
290
  if (this.currentType === 'Array') {
255
291
  this.elements.updateKeys(newElement, 1);
256
292
  }
257
- this._bubbleUp(Events.Added);
293
+ newElement._bubbleUp(Events.Added, newElement, this);
258
294
  return newElement;
259
295
  }
260
296
 
@@ -278,7 +314,7 @@ class Element extends EventEmitter {
278
314
  }
279
315
  }
280
316
  var newElement = this.elements.insertEnd(key, value, true, this);
281
- this._bubbleUp(Events.Added);
317
+ this._bubbleUp(Events.Adde, newElement);
282
318
  return newElement;
283
319
  }
284
320
 
@@ -288,9 +324,11 @@ class Element extends EventEmitter {
288
324
  * @returns {Element} The placeholder element.
289
325
  */
290
326
  insertPlaceholder() {
291
- var newElement = this.elements.insertEnd('', '', true, this);
292
- this._bubbleUp(Events.Added);
293
- return newElement;
327
+ return this.insertEnd('', '');
328
+ }
329
+
330
+ insertSiblingPlaceholder() {
331
+ return this.parent.insertAfter(this, '', '');
294
332
  }
295
333
 
296
334
  /**
@@ -326,7 +364,7 @@ class Element extends EventEmitter {
326
364
  setValid() {
327
365
  this.currentTypeValid = true;
328
366
  this.invalidTypeMessage = undefined;
329
- this._bubbleUp(Events.Valid, this.uuid);
367
+ this._bubbleUp(Events.Valid, this);
330
368
  }
331
369
 
332
370
  /**
@@ -341,7 +379,7 @@ class Element extends EventEmitter {
341
379
  this.currentType = newType;
342
380
  this.currentTypeValid = false;
343
381
  this.invalidTypeMessage = message;
344
- this._bubbleUp(Events.Invalid, this.uuid);
382
+ this._bubbleUp(Events.Invalid, this);
345
383
  }
346
384
 
347
385
  /**
@@ -352,11 +390,11 @@ class Element extends EventEmitter {
352
390
  * @returns {Boolean} If the key is a duplicate.
353
391
  */
354
392
  isDuplicateKey(value) {
355
- if (value === this.currentKey) {
393
+ if (value === '') {
356
394
  return false;
357
395
  }
358
396
  for (let element of this.parent.elements) {
359
- if (element.currentKey === value) {
397
+ if (element.uuid !== this.uuid && element.currentKey === value) {
360
398
  return true;
361
399
  }
362
400
  }
@@ -418,7 +456,6 @@ class Element extends EventEmitter {
418
456
  if (!this.parent || this.parent.isRoot() || this.parent.currentType === 'Object') {
419
457
  keyChanged = (this.key !== this.currentKey);
420
458
  }
421
-
422
459
  return keyChanged;
423
460
  }
424
461
 
@@ -519,7 +556,9 @@ class Element extends EventEmitter {
519
556
  remove() {
520
557
  this.revert();
521
558
  this.removed = true;
522
- this._bubbleUp(Events.Removed);
559
+ if (this.parent) {
560
+ this._bubbleUp(Events.Removed, this, this.parent);
561
+ }
523
562
  }
524
563
 
525
564
  /**
@@ -531,7 +570,7 @@ class Element extends EventEmitter {
531
570
  this.parent.elements.updateKeys(this, -1);
532
571
  }
533
572
  this.parent.elements.remove(this);
534
- this.parent.emit(Events.Removed);
573
+ this._bubbleUp(Events.Removed, this, this.parent);
535
574
  this.parent = null;
536
575
  } else {
537
576
  if (this.originalExpandableValue) {
@@ -550,7 +589,7 @@ class Element extends EventEmitter {
550
589
  this.removed = false;
551
590
  }
552
591
  this.setValid();
553
- this._bubbleUp(Events.Reverted);
592
+ this._bubbleUp(Events.Reverted, this);
554
593
  }
555
594
 
556
595
  /**
@@ -559,14 +598,14 @@ class Element extends EventEmitter {
559
598
  * @param {Event} evt - The event.
560
599
  * @param {*} data - Optional.
561
600
  */
562
- _bubbleUp(evt, data) {
563
- this.emit(evt, data);
601
+ _bubbleUp(evt, ...data) {
602
+ this.emit(evt, ...data);
564
603
  var element = this.parent;
565
604
  if (element) {
566
605
  if (element.isRoot()) {
567
- element.emit(evt, data);
606
+ element.emit(evt, ...data);
568
607
  } else {
569
- element._bubbleUp(evt, data);
608
+ element._bubbleUp(evt, ...data);
570
609
  }
571
610
  }
572
611
  }
@@ -943,9 +982,21 @@ class LinkedList {
943
982
  this.loaded -= 1;
944
983
  return this;
945
984
  }
985
+
986
+ findIndex(el) {
987
+ let idx = 0;
988
+ for (const item of this) {
989
+ if (item === el) {
990
+ return idx;
991
+ }
992
+ idx++;
993
+ }
994
+ return -1;
995
+ }
946
996
  }
947
997
 
998
+ Element.LinkedList = LinkedList;
999
+ Element.Events = Events;
1000
+ Element.DATE_FORMAT = DATE_FORMAT;
1001
+
948
1002
  module.exports = Element;
949
- module.exports.LinkedList = LinkedList;
950
- module.exports.Events = Events;
951
- module.exports.DATE_FORMAT = DATE_FORMAT;
package/src/index.js CHANGED
@@ -1,2 +1,5 @@
1
1
  module.exports = require('./document');
2
+ module.exports.DocumentEvents = module.exports.Events;
2
3
  module.exports.Element = require('./element');
4
+ module.exports.ElementEvents = module.exports.Element.Events;
5
+ module.exports.ElementEditor = require('./editor');
package/src/utils.js ADDED
@@ -0,0 +1,6 @@
1
+ const fieldStringLen = (value) => {
2
+ const length = String(value).length;
3
+ return length === 0 ? 1 : length;
4
+ };
5
+
6
+ module.exports = { fieldStringLen };