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,134 +1,66 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Reactive = exports.ReactivePrivate = exports.current = void 0;
4
- exports.stack = stack;
5
- exports.unstack = unstack;
3
+ exports.Reactive = void 0;
6
4
  const destroyable_js_1 = require("./destroyable.js");
7
- const errors_1 = require("./errors");
8
5
  const expression_1 = require("../value/expression");
9
6
  const reference_1 = require("../value/reference");
10
7
  const pointer_1 = require("../value/pointer");
11
- const mirror_1 = require("../value/mirror");
12
- exports.current = null;
13
- const currentStack = [];
14
- function stack(node) {
15
- currentStack.push(exports.current);
16
- exports.current = node;
17
- }
18
- function unstack() {
19
- exports.current = currentStack.pop();
20
- }
21
8
  /**
22
- * Private stuff of a reactive object
23
- * @class ReactivePrivate
9
+ * A reactive object
10
+ * @class Reactive
24
11
  * @extends Destroyable
25
12
  */
26
- class ReactivePrivate extends destroyable_js_1.Destroyable {
27
- constructor() {
13
+ class Reactive extends destroyable_js_1.Destroyable {
14
+ constructor(input) {
28
15
  super();
29
16
  /**
30
17
  * A list of user-defined values
31
18
  * @type {Set}
32
19
  */
33
- this.watch = new Set;
20
+ this._watch = new Set();
34
21
  /**
35
22
  * A list of user-defined bindings
36
23
  * @type {Set}
37
24
  */
38
- this.bindings = new Set;
39
- /**
40
- * A list of user defined models
41
- */
42
- this.models = new Set;
43
- /**
44
- * Reactivity switch state
45
- * @type {boolean}
46
- */
47
- this.enabled = true;
48
- /**
49
- * The frozen state of object
50
- * @type {boolean}
51
- */
52
- this.frozen = false;
53
- this.$seal();
54
- }
55
- $destroy() {
56
- this.watch.forEach(value => value.$destroy());
57
- this.watch.clear();
58
- this.bindings.forEach(binding => binding.$destroy());
59
- this.bindings.clear();
60
- this.models.forEach(model => model.disableReactivity());
61
- this.models.clear();
62
- this.freezeExpr && this.freezeExpr.$destroy();
63
- this.onDestroy && this.onDestroy();
64
- super.$destroy();
65
- }
66
- }
67
- exports.ReactivePrivate = ReactivePrivate;
68
- /**
69
- * A reactive object
70
- * @class Reactive
71
- * @extends Destroyable
72
- */
73
- class Reactive extends destroyable_js_1.Destroyable {
74
- constructor(input, $) {
75
- super();
25
+ this.bindings = new Set();
76
26
  this.input = input;
77
- this.$ = $ || new ReactivePrivate;
78
- this.$seal();
79
- }
80
- /**
81
- * Get parent node
82
- */
83
- get parent() {
84
- return this.$.parent;
85
27
  }
86
28
  /**
87
29
  * Create a reference
88
30
  * @param value {*} value to reference
89
31
  */
90
32
  ref(value) {
91
- const $ = this.$;
92
33
  const ref = new reference_1.Reference(value);
93
- $.watch.add(ref);
34
+ this._watch.add(ref);
94
35
  return ref;
95
36
  }
96
37
  /**
97
- * Create a mirror
98
- * @param value {IValue} value to mirror
99
- */
100
- mirror(value) {
101
- const mirror = new mirror_1.Mirror(value, false);
102
- this.$.watch.add(mirror);
103
- return mirror;
104
- }
105
- /**
106
- * Create a forward-only mirror
107
- * @param value {IValue} value to mirror
38
+ * Create a forward-only pointer
39
+ * @param value {IValue} value to point
108
40
  */
109
41
  forward(value) {
110
- const mirror = new mirror_1.Mirror(value, true);
111
- this.$.watch.add(mirror);
42
+ const mirror = new pointer_1.Pointer(value);
43
+ this._watch.add(mirror);
112
44
  return mirror;
113
45
  }
114
46
  /**
115
47
  * Creates a pointer
116
48
  * @param value {*} default value to point
117
- * @param forwardOnly {boolean} forward only sync
118
49
  */
119
- point(value, forwardOnly = false) {
120
- const $ = this.$;
121
- const pointer = new pointer_1.Pointer(value, forwardOnly);
122
- $.watch.add(pointer);
50
+ own(value) {
51
+ const pointer = new pointer_1.OwningPointer(value);
52
+ this._watch.add(pointer);
123
53
  return pointer;
124
54
  }
125
55
  /**
126
- * Register a model
127
- * @param model
56
+ * Register a model/dependency
128
57
  */
129
- register(model) {
130
- this.$.models.add(model);
131
- return model;
58
+ register(data) {
59
+ this.bindings.add(data);
60
+ return data;
61
+ }
62
+ release(data) {
63
+ this.bindings.delete(data);
132
64
  }
133
65
  /**
134
66
  * Creates a watcher
@@ -136,8 +68,7 @@ class Reactive extends destroyable_js_1.Destroyable {
136
68
  * @param values
137
69
  */
138
70
  watch(func, ...values) {
139
- const $ = this.$;
140
- $.watch.add(new expression_1.Expression(func, !this.$.frozen, ...values));
71
+ this._watch.add(new expression_1.Expression(func, ...values));
141
72
  }
142
73
  /**
143
74
  * Creates a computed value
@@ -146,97 +77,25 @@ class Reactive extends destroyable_js_1.Destroyable {
146
77
  * @return {IValue} the created ivalue
147
78
  */
148
79
  expr(func, ...values) {
149
- const res = new expression_1.Expression(func, !this.$.frozen, ...values);
150
- const $ = this.$;
151
- $.watch.add(res);
80
+ const res = new expression_1.Expression(func, ...values);
81
+ this._watch.add(res);
152
82
  return res;
153
83
  }
154
- /**
155
- * Enable reactivity of fields
156
- */
157
- enable() {
158
- const $ = this.$;
159
- if (!$.enabled) {
160
- $.watch.forEach(watcher => {
161
- watcher.$enable();
162
- });
163
- $.models.forEach(model => {
164
- model.enableReactivity();
165
- });
166
- $.enabled = true;
167
- }
168
- }
169
- /**
170
- * Disable reactivity of fields
171
- */
172
- disable() {
173
- const $ = this.$;
174
- if ($.enabled) {
175
- $.watch.forEach(watcher => {
176
- watcher.$disable();
177
- });
178
- $.models.forEach(model => {
179
- model.disableReactivity();
180
- });
181
- $.enabled = false;
182
- }
183
- }
184
- /**
185
- * Disable/Enable reactivity of object fields with feedback
186
- * @param cond {IValue} show condition
187
- * @param onOff {function} on show feedback
188
- * @param onOn {function} on hide feedback
189
- */
190
- bindAlive(cond, onOff, onOn) {
191
- const $ = this.$;
192
- if ($.freezeExpr) {
193
- throw (0, errors_1.wrongBinding)("this component already have a freeze state");
194
- }
195
- if ($.watch.has(cond)) {
196
- throw (0, errors_1.wrongBinding)("freeze state must be bound to an external component");
197
- }
198
- $.freezeExpr = new expression_1.Expression((cond) => {
199
- $.frozen = !cond;
200
- if (cond) {
201
- onOn === null || onOn === void 0 ? void 0 : onOn();
202
- this.enable();
203
- }
204
- else {
205
- onOff === null || onOff === void 0 ? void 0 : onOff();
206
- this.disable();
207
- }
208
- }, true, cond);
209
- return this;
210
- }
211
- init() {
212
- this.applyOptions(this.input);
213
- return this.compose(this.input);
214
- }
215
- applyOptions(input) {
216
- // empty
217
- }
218
- applyOptionsNow() {
219
- this.applyOptions(this.input);
220
- }
221
- compose(input) {
222
- throw (0, errors_1.notOverwritten)();
223
- }
224
- composeNow() {
225
- return this.compose(this.input);
226
- }
227
- runFunctional(f, ...args) {
228
- stack(this);
229
- const result = f(...args);
230
- unstack();
231
- return result;
232
- }
233
84
  runOnDestroy(func) {
234
- this.$.onDestroy = func;
235
- }
236
- $destroy() {
237
- super.$destroy();
238
- this.$.$destroy();
239
- this.$ = null;
85
+ if (this.onDestroy) {
86
+ console.warn(new Error("You rewrite onDestroy existing handler"));
87
+ console.log(this.onDestroy);
88
+ }
89
+ this.onDestroy = func;
90
+ }
91
+ destroy() {
92
+ var _a;
93
+ super.destroy();
94
+ this._watch.forEach(value => value.destroy());
95
+ this._watch.clear();
96
+ this.bindings.forEach(binding => binding.destroy());
97
+ this.bindings.clear();
98
+ (_a = this.onDestroy) === null || _a === void 0 ? void 0 : _a.call(this);
240
99
  }
241
100
  }
242
101
  exports.Reactive = Reactive;
@@ -6,44 +6,9 @@ exports.Destroyable = void 0;
6
6
  * @class Destroyable
7
7
  */
8
8
  class Destroyable {
9
- /**
10
- * Make object fields non configurable
11
- * @protected
12
- */
13
- $seal() {
14
- const $ = this;
15
- Object.keys($).forEach(i => {
16
- // eslint-disable-next-line no-prototype-builtins
17
- if (this.hasOwnProperty(i)) {
18
- const config = Object.getOwnPropertyDescriptor($, i);
19
- if (config.configurable) {
20
- let descriptor;
21
- if (config.set || config.get) {
22
- descriptor = {
23
- configurable: false,
24
- get: config.get,
25
- set: config.set,
26
- enumerable: config.enumerable
27
- };
28
- }
29
- else {
30
- descriptor = {
31
- value: $[i],
32
- configurable: false,
33
- writable: config.writable,
34
- enumerable: config.enumerable
35
- };
36
- }
37
- Object.defineProperty($, i, descriptor);
38
- }
39
- }
40
- });
41
- }
42
9
  /**
43
10
  * Garbage collector method
44
11
  */
45
- $destroy() {
46
- // nothing here
47
- }
12
+ destroy() { }
48
13
  }
49
14
  exports.Destroyable = Destroyable;
@@ -1,63 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IValue = exports.Switchable = void 0;
3
+ exports.IValue = void 0;
4
4
  const destroyable_js_1 = require("./destroyable.js");
5
- const errors_1 = require("./errors");
6
- class Switchable extends destroyable_js_1.Destroyable {
7
- /**
8
- * Enable update handlers triggering
9
- */
10
- $enable() {
11
- throw (0, errors_1.notOverwritten)();
12
- }
13
- /**
14
- * disable update handlers triggering
15
- */
16
- $disable() {
17
- throw (0, errors_1.notOverwritten)();
18
- }
19
- }
20
- exports.Switchable = Switchable;
21
5
  /**
22
6
  * Interface which describes a value
23
7
  * @class IValue
24
8
  * @extends Destroyable
25
9
  */
26
- class IValue extends Switchable {
27
- /**
28
- * @param isEnabled {boolean} initial is enabled state
29
- */
30
- constructor(isEnabled) {
31
- super();
32
- this.isEnabled = isEnabled;
33
- }
34
- /**
35
- * Get the encapsulated value
36
- * @return {*} the encapsulated value
37
- */
38
- get $() {
39
- throw (0, errors_1.notOverwritten)();
40
- }
41
- /**
42
- * Sets the encapsulated value
43
- * @param value {*} value to encapsulate
44
- */
45
- set $(value) {
46
- throw (0, errors_1.notOverwritten)();
47
- }
48
- /**
49
- * Add a new handler to value change
50
- * @param handler {function(value : *)} the handler to add
51
- */
52
- $on(handler) {
53
- throw (0, errors_1.notOverwritten)();
10
+ class IValue extends destroyable_js_1.Destroyable {
11
+ toJSON() {
12
+ return this.$;
54
13
  }
55
- /**
56
- * Removes a handler of value change
57
- * @param handler {function(value : *)} the handler to remove
58
- */
59
- $off(handler) {
60
- throw (0, errors_1.notOverwritten)();
14
+ toString() {
15
+ var _a, _b;
16
+ return (_b = (_a = this.$) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : "iValue<void>";
61
17
  }
62
18
  }
63
19
  exports.IValue = IValue;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reportError = void 0;
4
+ exports.setErrorHandler = setErrorHandler;
5
+ let reportError = (e) => {
6
+ console.error(e);
7
+ console.log("Docs Link /");
8
+ };
9
+ exports.reportError = reportError;
10
+ function setErrorHandler(handler) {
11
+ exports.reportError = handler;
12
+ }
package/lib-node/index.js CHANGED
@@ -1,39 +1,36 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.current = exports.userError = exports.unstack = exports.stack = exports.Watch = exports.Reactive = exports.Binding = exports.Expression = exports.Portal = exports.App = exports.AppNode = exports.Extension = exports.Component = exports.Tag = exports.INode = exports.Fragment = exports.SetView = exports.ObjectView = exports.MapView = exports.ArrayView = exports.Listener = exports.BaseView = exports.SetModel = exports.ObjectModel = exports.MapModel = exports.ArrayModel = exports.Pointer = exports.Mirror = exports.Reference = exports.IValue = exports.Destroyable = void 0;
3
+ exports.reportError = exports.setErrorHandler = exports.config = exports.userError = exports.Watch = exports.Reactive = exports.Binding = exports.Expression = exports.Portal = exports.App = exports.Extension = exports.Tag = exports.INode = exports.Fragment = exports.SetView = exports.MapView = exports.ArrayView = exports.Listener = exports.BaseView = exports.SetModel = exports.MapModel = exports.proxyArrayModel = exports.ArrayModel = exports.Pointer = exports.Reference = exports.IValue = exports.Destroyable = void 0;
4
+ const config_1 = require("./core/config");
5
+ Object.defineProperty(exports, "config", { enumerable: true, get: function () { return config_1.config; } });
4
6
  const destroyable_1 = require("./core/destroyable");
5
7
  Object.defineProperty(exports, "Destroyable", { enumerable: true, get: function () { return destroyable_1.Destroyable; } });
6
8
  const core_1 = require("./core/core");
7
- Object.defineProperty(exports, "current", { enumerable: true, get: function () { return core_1.current; } });
8
9
  Object.defineProperty(exports, "Reactive", { enumerable: true, get: function () { return core_1.Reactive; } });
9
- Object.defineProperty(exports, "stack", { enumerable: true, get: function () { return core_1.stack; } });
10
- Object.defineProperty(exports, "unstack", { enumerable: true, get: function () { return core_1.unstack; } });
11
10
  const ivalue_1 = require("./core/ivalue");
12
11
  Object.defineProperty(exports, "IValue", { enumerable: true, get: function () { return ivalue_1.IValue; } });
12
+ const safety_1 = require("./functional/safety");
13
+ Object.defineProperty(exports, "reportError", { enumerable: true, get: function () { return safety_1.reportError; } });
14
+ Object.defineProperty(exports, "setErrorHandler", { enumerable: true, get: function () { return safety_1.setErrorHandler; } });
13
15
  const array_model_1 = require("./models/array-model");
14
16
  Object.defineProperty(exports, "ArrayModel", { enumerable: true, get: function () { return array_model_1.ArrayModel; } });
17
+ Object.defineProperty(exports, "proxyArrayModel", { enumerable: true, get: function () { return array_model_1.proxyArrayModel; } });
15
18
  const listener_1 = require("./models/listener");
16
19
  Object.defineProperty(exports, "Listener", { enumerable: true, get: function () { return listener_1.Listener; } });
17
20
  const map_model_1 = require("./models/map-model");
18
21
  Object.defineProperty(exports, "MapModel", { enumerable: true, get: function () { return map_model_1.MapModel; } });
19
- const object_model_1 = require("./models/object-model");
20
- Object.defineProperty(exports, "ObjectModel", { enumerable: true, get: function () { return object_model_1.ObjectModel; } });
21
22
  const set_model_1 = require("./models/set-model");
22
23
  Object.defineProperty(exports, "SetModel", { enumerable: true, get: function () { return set_model_1.SetModel; } });
23
24
  const app_1 = require("./node/app");
24
25
  Object.defineProperty(exports, "App", { enumerable: true, get: function () { return app_1.App; } });
25
- Object.defineProperty(exports, "AppNode", { enumerable: true, get: function () { return app_1.AppNode; } });
26
26
  Object.defineProperty(exports, "Portal", { enumerable: true, get: function () { return app_1.Portal; } });
27
27
  const node_1 = require("./node/node");
28
- Object.defineProperty(exports, "Component", { enumerable: true, get: function () { return node_1.Component; } });
29
28
  Object.defineProperty(exports, "Extension", { enumerable: true, get: function () { return node_1.Extension; } });
30
29
  Object.defineProperty(exports, "Fragment", { enumerable: true, get: function () { return node_1.Fragment; } });
31
30
  Object.defineProperty(exports, "INode", { enumerable: true, get: function () { return node_1.INode; } });
32
31
  Object.defineProperty(exports, "Tag", { enumerable: true, get: function () { return node_1.Tag; } });
33
32
  const expression_1 = require("./value/expression");
34
33
  Object.defineProperty(exports, "Expression", { enumerable: true, get: function () { return expression_1.Expression; } });
35
- const mirror_1 = require("./value/mirror");
36
- Object.defineProperty(exports, "Mirror", { enumerable: true, get: function () { return mirror_1.Mirror; } });
37
34
  const pointer_1 = require("./value/pointer");
38
35
  Object.defineProperty(exports, "Pointer", { enumerable: true, get: function () { return pointer_1.Pointer; } });
39
36
  const reference_1 = require("./value/reference");
@@ -44,8 +41,6 @@ const base_view_1 = require("./views/base-view");
44
41
  Object.defineProperty(exports, "BaseView", { enumerable: true, get: function () { return base_view_1.BaseView; } });
45
42
  const map_view_1 = require("./views/map-view");
46
43
  Object.defineProperty(exports, "MapView", { enumerable: true, get: function () { return map_view_1.MapView; } });
47
- const object_view_1 = require("./views/object-view");
48
- Object.defineProperty(exports, "ObjectView", { enumerable: true, get: function () { return object_view_1.ObjectView; } });
49
44
  const set_view_1 = require("./views/set-view");
50
45
  Object.defineProperty(exports, "SetView", { enumerable: true, get: function () { return set_view_1.SetView; } });
51
46
  const binding_1 = require("./binding/binding");