hadron-document 7.6.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 +0 -2
- package/index.d.ts +192 -0
- package/lib/document.js +122 -55
- package/lib/editor/date.js +151 -0
- package/lib/editor/decimal128.js +88 -0
- package/lib/editor/double.js +113 -0
- package/lib/editor/index.js +50 -0
- package/lib/editor/int32.js +68 -0
- package/lib/editor/int64.js +88 -0
- package/lib/editor/null.js +81 -0
- package/lib/editor/objectid.js +98 -0
- package/lib/editor/standard.js +108 -0
- package/lib/editor/string.js +48 -0
- package/lib/editor/undefined.js +81 -0
- package/lib/element-events.js +15 -0
- package/lib/element.js +156 -85
- package/lib/index.js +4 -1
- package/lib/object-generator.js +1 -1
- package/lib/utils.js +10 -0
- package/package.json +4 -5
- package/src/document.js +44 -3
- package/src/editor/date.js +95 -0
- package/src/editor/decimal128.js +46 -0
- package/src/editor/double.js +70 -0
- package/src/editor/index.js +40 -0
- package/src/editor/int32.js +29 -0
- package/src/editor/int64.js +46 -0
- package/src/editor/null.js +42 -0
- package/src/editor/objectid.js +54 -0
- package/src/editor/standard.js +78 -0
- package/src/editor/string.js +20 -0
- package/src/editor/undefined.js +42 -0
- package/src/element-events.js +14 -0
- package/src/element.js +90 -39
- package/src/index.js +3 -0
- package/src/utils.js +6 -0
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
|
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
|
|
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 ===
|
|
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.
|
|
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.
|
|
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