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