vasille 2.3.9 → 3.0.2

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 (91) hide show
  1. package/README.md +57 -155
  2. package/lib/binding/attribute.js +4 -5
  3. package/lib/binding/binding.js +4 -5
  4. package/lib/binding/class.js +2 -4
  5. package/lib/binding/style.js +12 -4
  6. package/lib/core/config.js +3 -0
  7. package/lib/core/core.js +39 -177
  8. package/lib/core/destroyable.js +1 -36
  9. package/lib/core/ivalue.js +6 -49
  10. package/lib/functional/safety.js +7 -0
  11. package/lib/index.js +7 -8
  12. package/lib/models/array-model.js +40 -107
  13. package/lib/models/listener.js +16 -80
  14. package/lib/models/map-model.js +6 -13
  15. package/lib/models/object-model.js +6 -6
  16. package/lib/models/set-model.js +5 -12
  17. package/lib/node/app.js +8 -27
  18. package/lib/node/node.js +294 -524
  19. package/lib/node/watch.js +10 -8
  20. package/lib/tsconfig-build.tsbuildinfo +1 -1
  21. package/lib/tsconfig.tsbuildinfo +1 -0
  22. package/lib/value/expression.js +16 -41
  23. package/lib/value/mirror.js +9 -23
  24. package/lib/value/pointer.js +64 -16
  25. package/lib/value/reference.js +24 -29
  26. package/lib/views/array-view.js +5 -6
  27. package/lib/views/base-view.js +14 -26
  28. package/lib/views/map-view.js +4 -5
  29. package/lib/views/repeat-node.js +17 -34
  30. package/lib/views/set-view.js +7 -5
  31. package/lib-node/binding/attribute.js +4 -5
  32. package/lib-node/binding/binding.js +4 -5
  33. package/lib-node/binding/class.js +2 -4
  34. package/lib-node/binding/style.js +13 -4
  35. package/lib-node/core/config.js +6 -0
  36. package/lib-node/core/core.js +39 -180
  37. package/lib-node/core/destroyable.js +1 -36
  38. package/lib-node/core/ivalue.js +7 -51
  39. package/lib-node/functional/safety.js +12 -0
  40. package/lib-node/index.js +7 -12
  41. package/lib-node/models/array-model.js +41 -107
  42. package/lib-node/models/listener.js +16 -80
  43. package/lib-node/models/map-model.js +6 -13
  44. package/lib-node/models/object-model.js +6 -6
  45. package/lib-node/models/set-model.js +5 -12
  46. package/lib-node/node/app.js +8 -28
  47. package/lib-node/node/node.js +294 -529
  48. package/lib-node/node/watch.js +10 -8
  49. package/lib-node/tsconfig-build-node.tsbuildinfo +1 -1
  50. package/lib-node/value/expression.js +16 -41
  51. package/lib-node/value/mirror.js +9 -23
  52. package/lib-node/value/pointer.js +66 -17
  53. package/lib-node/value/reference.js +24 -29
  54. package/lib-node/views/array-view.js +5 -6
  55. package/lib-node/views/base-view.js +14 -27
  56. package/lib-node/views/map-view.js +4 -5
  57. package/lib-node/views/repeat-node.js +17 -35
  58. package/lib-node/views/set-view.js +7 -5
  59. package/package.json +9 -6
  60. package/types/binding/attribute.d.ts +2 -2
  61. package/types/binding/binding.d.ts +1 -1
  62. package/types/binding/style.d.ts +3 -2
  63. package/types/core/config.d.ts +3 -0
  64. package/types/core/core.d.ts +18 -93
  65. package/types/core/destroyable.d.ts +11 -6
  66. package/types/core/ivalue.d.ts +7 -24
  67. package/types/functional/options.d.ts +7 -22
  68. package/types/functional/safety.d.ts +2 -0
  69. package/types/index.d.ts +8 -10
  70. package/types/models/array-model.d.ts +6 -55
  71. package/types/models/listener.d.ts +0 -26
  72. package/types/models/map-model.d.ts +3 -4
  73. package/types/models/model.d.ts +2 -9
  74. package/types/models/set-model.d.ts +1 -2
  75. package/types/node/app.d.ts +7 -25
  76. package/types/node/node.d.ts +105 -222
  77. package/types/node/watch.d.ts +4 -5
  78. package/types/spec/html.d.ts +231 -231
  79. package/types/spec/svg.d.ts +166 -166
  80. package/types/tsconfig-types.tsbuildinfo +1 -1
  81. package/types/value/expression.d.ts +5 -7
  82. package/types/value/mirror.d.ts +4 -6
  83. package/types/value/pointer.d.ts +26 -9
  84. package/types/value/reference.d.ts +6 -7
  85. package/types/views/array-view.d.ts +3 -3
  86. package/types/views/base-view.d.ts +15 -23
  87. package/types/views/map-view.d.ts +2 -2
  88. package/types/views/repeat-node.d.ts +9 -23
  89. package/types/views/set-view.d.ts +3 -2
  90. package/cdn/es2015.js +0 -2480
  91. package/flow-typed/vasille.js +0 -2613
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ArrayModel = void 0;
4
+ exports.proxyArrayModel = proxyArrayModel;
4
5
  const listener_1 = require("./listener");
5
6
  /**
6
7
  * Model based on Array class
@@ -11,25 +12,17 @@ class ArrayModel extends Array {
11
12
  /**
12
13
  * @param data {Array} input data
13
14
  */
14
- constructor(data = []) {
15
+ constructor(data) {
15
16
  super();
16
- Object.defineProperty(this, 'listener', {
17
- value: new listener_1.Listener,
18
- writable: false,
19
- configurable: false
20
- });
21
- for (let i = 0; i < data.length; i++) {
22
- super.push(data[i]);
17
+ this.passive = false;
18
+ this.listener = new listener_1.Listener();
19
+ if (data instanceof Array) {
20
+ for (let i = 0; i < data.length; i++) {
21
+ super.push(data[i]);
22
+ }
23
23
  }
24
24
  }
25
25
  /* Array members */
26
- /**
27
- * Gets the last item of array
28
- * @return {*} the last item of array
29
- */
30
- get last() {
31
- return this.length ? this[this.length - 1] : null;
32
- }
33
26
  /**
34
27
  * Calls Array.fill and notify about changes
35
28
  * @param value {*} value to fill with
@@ -37,6 +30,7 @@ class ArrayModel extends Array {
37
30
  * @param end {?number} end index
38
31
  */
39
32
  fill(value, start, end) {
33
+ this.passive = true;
40
34
  if (!start) {
41
35
  start = 0;
42
36
  }
@@ -48,6 +42,7 @@ class ArrayModel extends Array {
48
42
  this[i] = value;
49
43
  this.listener.emitAdded(value, value);
50
44
  }
45
+ this.passive = false;
51
46
  return this;
52
47
  }
53
48
  /**
@@ -55,10 +50,12 @@ class ArrayModel extends Array {
55
50
  * @return {*} removed value
56
51
  */
57
52
  pop() {
53
+ this.passive = true;
58
54
  const v = super.pop();
59
55
  if (v !== undefined) {
60
56
  this.listener.emitRemoved(v, v);
61
57
  }
58
+ this.passive = false;
62
59
  return v;
63
60
  }
64
61
  /**
@@ -67,10 +64,12 @@ class ArrayModel extends Array {
67
64
  * @return {number} new length of array
68
65
  */
69
66
  push(...items) {
67
+ this.passive = true;
70
68
  items.forEach(item => {
71
69
  this.listener.emitAdded(item, item);
72
70
  super.push(item);
73
71
  });
72
+ this.passive = false;
74
73
  return this.length;
75
74
  }
76
75
  /**
@@ -78,10 +77,12 @@ class ArrayModel extends Array {
78
77
  * @return {*} the shifted value
79
78
  */
80
79
  shift() {
80
+ this.passive = true;
81
81
  const v = super.shift();
82
82
  if (v !== undefined) {
83
83
  this.listener.emitRemoved(v, v);
84
84
  }
85
+ this.passive = false;
85
86
  return v;
86
87
  }
87
88
  /**
@@ -92,8 +93,9 @@ class ArrayModel extends Array {
92
93
  * @return {ArrayModel} a pointer to this
93
94
  */
94
95
  splice(start, deleteCount, ...items) {
96
+ this.passive = true;
95
97
  start = Math.min(start, this.length);
96
- deleteCount = deleteCount || this.length - start;
98
+ deleteCount = typeof deleteCount === "number" ? deleteCount : this.length - start;
97
99
  const before = this[start + deleteCount];
98
100
  for (let i = 0; i < deleteCount; i++) {
99
101
  const index = start + deleteCount - i - 1;
@@ -104,6 +106,7 @@ class ArrayModel extends Array {
104
106
  for (let i = 0; i < items.length; i++) {
105
107
  this.listener.emitAdded(before, items[i]);
106
108
  }
109
+ this.passive = false;
107
110
  return new ArrayModel(super.splice(start, deleteCount, ...items));
108
111
  }
109
112
  /**
@@ -112,107 +115,38 @@ class ArrayModel extends Array {
112
115
  * @return {number} the length after prepend
113
116
  */
114
117
  unshift(...items) {
118
+ this.passive = true;
115
119
  for (let i = 0; i < items.length; i++) {
116
120
  this.listener.emitAdded(this[i], items[i]);
117
121
  }
118
- return super.unshift(...items);
119
- }
120
- /**
121
- * Inserts a value to the end of array
122
- * @param v {*} value to insert
123
- */
124
- append(v) {
125
- this.listener.emitAdded(null, v);
126
- super.push(v);
127
- return this;
128
- }
129
- /**
130
- * Clears array
131
- * @return {this} a pointer to this
132
- */
133
- clear() {
134
- this.forEach(v => {
135
- this.listener.emitRemoved(v, v);
136
- });
137
- super.splice(0);
138
- return this;
139
- }
140
- /**
141
- * Inserts a value to position `index`
142
- * @param index {number} index to insert value
143
- * @param v {*} value to insert
144
- * @return {this} a pointer to this
145
- */
146
- insert(index, v) {
147
- this.listener.emitAdded(this[index], v);
148
- super.splice(index, 0, v);
149
- return this;
150
- }
151
- /**
152
- * Inserts a value to the beginning of array
153
- * @param v {*} value to insert
154
- * @return {this} a pointer to this
155
- */
156
- prepend(v) {
157
- this.listener.emitAdded(this[0], v);
158
- super.unshift(v);
159
- return this;
160
- }
161
- /**
162
- * Removes a value from an index
163
- * @param index {number} index of value to remove
164
- * @return {this} a pointer to this
165
- */
166
- removeAt(index) {
167
- if (index > 0 && index < this.length) {
168
- this.listener.emitRemoved(this[index], this[index]);
169
- super.splice(index, 1);
170
- }
171
- return this;
172
- }
173
- /**
174
- * Removes the first value of array
175
- * @return {this} a pointer to this
176
- */
177
- removeFirst() {
178
- if (this.length) {
179
- this.listener.emitRemoved(this[0], this[0]);
180
- super.shift();
181
- }
182
- return this;
183
- }
184
- /**
185
- * Removes the ast value of array
186
- * @return {this} a pointer to this
187
- */
188
- removeLast() {
189
- const last = this.last;
190
- if (last != null) {
191
- this.listener.emitRemoved(this[this.length - 1], last);
192
- super.pop();
193
- }
194
- return this;
195
- }
196
- /**
197
- * Remove the first occurrence of value
198
- * @param v {*} value to remove
199
- * @return {this}
200
- */
201
- removeOne(v) {
202
- this.removeAt(this.indexOf(v));
203
- return this;
122
+ const r = super.unshift(...items);
123
+ this.passive = false;
124
+ return r;
204
125
  }
205
126
  replace(at, with_) {
127
+ this.passive = true;
206
128
  this.listener.emitAdded(this[at], with_);
207
129
  this.listener.emitRemoved(this[at], this[at]);
208
130
  this[at] = with_;
131
+ this.passive = false;
209
132
  return this;
210
133
  }
211
- enableReactivity() {
212
- this.listener.enableReactivity();
213
- }
214
- disableReactivity() {
215
- this.listener.disableReactivity();
134
+ destroy() {
135
+ this.splice(0);
216
136
  }
217
137
  }
218
138
  exports.ArrayModel = ArrayModel;
139
+ function proxyArrayModel(arr) {
140
+ return new Proxy(arr, {
141
+ set(target, p, newValue, receiver) {
142
+ if (!arr.passive && typeof p === "string") {
143
+ const index = parseInt(p);
144
+ if (Number.isFinite(index)) {
145
+ arr.replace(index, newValue);
146
+ return true;
147
+ }
148
+ }
149
+ return Reflect.set(target, p, newValue, receiver);
150
+ },
151
+ });
152
+ }
@@ -7,41 +7,16 @@ exports.Listener = void 0;
7
7
  */
8
8
  class Listener {
9
9
  constructor() {
10
- Object.defineProperties(this, {
11
- onAdded: {
12
- value: new Set,
13
- writable: false,
14
- configurable: false
15
- },
16
- onRemoved: {
17
- value: new Set,
18
- writable: false,
19
- configurable: false
20
- },
21
- frozen: {
22
- value: false,
23
- writable: true,
24
- configurable: false
25
- },
26
- queue: {
27
- value: [],
28
- writable: false,
29
- configurable: false
30
- }
31
- });
32
- }
33
- /**
34
- * Exclude the repeated operation in queue
35
- * @private
36
- */
37
- excludeRepeat(index) {
38
- this.queue.forEach((item, i) => {
39
- if (item.index === index) {
40
- this.queue.splice(i, 1);
41
- return true;
42
- }
43
- });
44
- return false;
10
+ /**
11
+ * Functions to run on adding new items
12
+ * @type Set
13
+ */
14
+ this.onAdded = new Set();
15
+ /**
16
+ * Functions to run on item removing
17
+ * @type Set
18
+ */
19
+ this.onRemoved = new Set();
45
20
  }
46
21
  /**
47
22
  * Emits added event to listeners
@@ -49,16 +24,9 @@ class Listener {
49
24
  * @param value {*} value of added item
50
25
  */
51
26
  emitAdded(index, value) {
52
- if (this.frozen) {
53
- if (!this.excludeRepeat(index)) {
54
- this.queue.push({ sign: true, index, value });
55
- }
56
- }
57
- else {
58
- this.onAdded.forEach(handler => {
59
- handler(index, value);
60
- });
61
- }
27
+ this.onAdded.forEach(handler => {
28
+ handler(index, value);
29
+ });
62
30
  }
63
31
  /**
64
32
  * Emits removed event to listeners
@@ -66,16 +34,9 @@ class Listener {
66
34
  * @param value {*} value of removed item
67
35
  */
68
36
  emitRemoved(index, value) {
69
- if (this.frozen) {
70
- if (!this.excludeRepeat(index)) {
71
- this.queue.push({ sign: false, index, value });
72
- }
73
- }
74
- else {
75
- this.onRemoved.forEach(handler => {
76
- handler(index, value);
77
- });
78
- }
37
+ this.onRemoved.forEach(handler => {
38
+ handler(index, value);
39
+ });
79
40
  }
80
41
  /**
81
42
  * Adds a handler to added event
@@ -105,30 +66,5 @@ class Listener {
105
66
  offRemove(handler) {
106
67
  this.onRemoved.delete(handler);
107
68
  }
108
- /**
109
- * Run all queued operation and enable reactivity
110
- */
111
- enableReactivity() {
112
- this.queue.forEach(item => {
113
- if (item.sign) {
114
- this.onAdded.forEach(handler => {
115
- handler(item.index, item.value);
116
- });
117
- }
118
- else {
119
- this.onRemoved.forEach(handler => {
120
- handler(item.index, item.value);
121
- });
122
- }
123
- });
124
- this.queue.splice(0);
125
- this.frozen = false;
126
- }
127
- /**
128
- * Disable the reactivity and enable the queue
129
- */
130
- disableReactivity() {
131
- this.frozen = true;
132
- }
133
69
  }
134
70
  exports.Listener = Listener;
@@ -13,19 +13,15 @@ class MapModel extends Map {
13
13
  * Constructs a map model
14
14
  * @param map {[*, *][]} input data
15
15
  */
16
- constructor(map = []) {
16
+ constructor(map) {
17
17
  super();
18
- Object.defineProperty(this, 'listener', {
19
- value: new listener_1.Listener,
20
- writable: false,
21
- configurable: false
22
- });
23
- map.forEach(([key, value]) => {
18
+ this.listener = new listener_1.Listener();
19
+ map === null || map === void 0 ? void 0 : map.forEach(([key, value]) => {
24
20
  super.set(key, value);
25
21
  });
26
22
  }
27
23
  /**
28
- * Calls Map.clear and notify abut changes
24
+ * Calls Map.clear and notify about changes
29
25
  */
30
26
  clear() {
31
27
  this.forEach((value, key) => {
@@ -60,11 +56,8 @@ class MapModel extends Map {
60
56
  this.listener.emitAdded(key, value);
61
57
  return this;
62
58
  }
63
- enableReactivity() {
64
- this.listener.enableReactivity();
65
- }
66
- disableReactivity() {
67
- this.listener.disableReactivity();
59
+ destroy() {
60
+ this.clear();
68
61
  }
69
62
  }
70
63
  exports.MapModel = MapModel;
@@ -14,17 +14,17 @@ class ObjectModel extends Object {
14
14
  constructor(obj = {}) {
15
15
  super();
16
16
  this.container = Object.create(null);
17
- Object.defineProperty(this, 'listener', {
18
- value: new listener_1.Listener,
17
+ Object.defineProperty(this, "listener", {
18
+ value: new listener_1.Listener(),
19
19
  writable: false,
20
- configurable: false
20
+ configurable: false,
21
21
  });
22
22
  for (const i in obj) {
23
23
  Object.defineProperty(this.container, i, {
24
24
  value: obj[i],
25
25
  configurable: true,
26
26
  writable: true,
27
- enumerable: true
27
+ enumerable: true,
28
28
  });
29
29
  this.listener.emitAdded(i, obj[i]);
30
30
  }
@@ -44,7 +44,7 @@ class ObjectModel extends Object {
44
44
  * @return {ObjectModel} a pointer to this
45
45
  */
46
46
  set(key, v) {
47
- if (Reflect.has(this.container, key)) {
47
+ if (key in this.container) {
48
48
  this.listener.emitRemoved(key, this.container[key]);
49
49
  this.container[key] = v;
50
50
  }
@@ -53,7 +53,7 @@ class ObjectModel extends Object {
53
53
  value: v,
54
54
  configurable: true,
55
55
  writable: true,
56
- enumerable: true
56
+ enumerable: true,
57
57
  });
58
58
  }
59
59
  this.listener.emitAdded(key, this.container[key]);
@@ -13,14 +13,10 @@ class SetModel extends Set {
13
13
  * Constructs a set model based on a set
14
14
  * @param set {Set} input data
15
15
  */
16
- constructor(set = []) {
16
+ constructor(set) {
17
17
  super();
18
- Object.defineProperty(this, 'listener', {
19
- value: new listener_1.Listener,
20
- writable: false,
21
- configurable: false
22
- });
23
- set.forEach(item => {
18
+ this.listener = new listener_1.Listener();
19
+ set === null || set === void 0 ? void 0 : set.forEach(item => {
24
20
  super.add(item);
25
21
  });
26
22
  }
@@ -56,11 +52,8 @@ class SetModel extends Set {
56
52
  }
57
53
  return super.delete(value);
58
54
  }
59
- enableReactivity() {
60
- this.listener.enableReactivity();
61
- }
62
- disableReactivity() {
63
- this.listener.disableReactivity();
55
+ destroy() {
56
+ this.clear();
64
57
  }
65
58
  }
66
59
  exports.SetModel = SetModel;
@@ -1,29 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Portal = exports.App = exports.AppNode = void 0;
3
+ exports.Portal = exports.App = void 0;
4
4
  const node_1 = require("./node");
5
- /**
6
- * Application Node
7
- * @class AppNode
8
- * @extends INode
9
- */
10
- class AppNode extends node_1.INode {
11
- /**
12
- * @param input
13
- */
14
- constructor(input) {
15
- super(input);
16
- this.debugUi = input.debugUi || false;
17
- this.$seal();
18
- }
19
- }
20
- exports.AppNode = AppNode;
21
5
  /**
22
6
  * Represents a Vasille.js application
23
7
  * @class App
24
8
  * @extends AppNode
25
9
  */
26
- class App extends AppNode {
10
+ class App extends node_1.Root {
27
11
  /**
28
12
  * Constructs an app node
29
13
  * @param node {Element} The root of application
@@ -31,24 +15,20 @@ class App extends AppNode {
31
15
  */
32
16
  constructor(node, input) {
33
17
  super(input);
34
- this.$.node = node;
35
- this.preinit(this, this);
36
- this.init();
37
- this.$seal();
18
+ this.node = node;
38
19
  }
39
20
  appendNode(node) {
40
- this.$.node.appendChild(node);
21
+ this.node.appendChild(node);
41
22
  }
42
23
  }
43
24
  exports.App = App;
44
- class Portal extends AppNode {
25
+ class Portal extends node_1.Fragment {
45
26
  constructor(input) {
46
- super(input);
47
- this.$.node = input.node;
48
- this.$seal();
27
+ super(input, ":portal");
28
+ this.node = input.node;
49
29
  }
50
30
  appendNode(node) {
51
- this.$.node.appendChild(node);
31
+ this.node.appendChild(node);
52
32
  }
53
33
  }
54
34
  exports.Portal = Portal;