vasille 2.2.2 → 2.3.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 (68) hide show
  1. package/README.md +34 -28
  2. package/cdn/es2015.js +18 -724
  3. package/cdn/es5.js +687 -957
  4. package/flow-typed/vasille.js +14 -59
  5. package/lib/core/core.js +3 -3
  6. package/lib/index.js +5 -4
  7. package/lib/models/array-model.js +6 -9
  8. package/lib/models/object-model.js +3 -17
  9. package/lib/node/node.js +6 -3
  10. package/lib/views/object-view.js +1 -1
  11. package/lib-node/binding/attribute.js +35 -0
  12. package/lib-node/binding/binding.js +33 -0
  13. package/lib-node/binding/class.js +48 -0
  14. package/lib-node/binding/style.js +27 -0
  15. package/lib-node/core/core.js +243 -0
  16. package/lib-node/core/destroyable.js +49 -0
  17. package/lib-node/core/errors.js +23 -0
  18. package/lib-node/core/ivalue.js +63 -0
  19. package/lib-node/functional/options.js +2 -0
  20. package/lib-node/index.js +54 -0
  21. package/lib-node/models/array-model.js +218 -0
  22. package/lib-node/models/listener.js +134 -0
  23. package/lib-node/models/map-model.js +70 -0
  24. package/lib-node/models/model.js +2 -0
  25. package/lib-node/models/object-model.js +82 -0
  26. package/lib-node/models/set-model.js +66 -0
  27. package/lib-node/node/app.js +54 -0
  28. package/lib-node/node/node.js +885 -0
  29. package/lib-node/node/watch.js +23 -0
  30. package/lib-node/spec/html.js +2 -0
  31. package/lib-node/spec/react.js +2 -0
  32. package/lib-node/spec/svg.js +2 -0
  33. package/lib-node/value/expression.js +90 -0
  34. package/lib-node/value/mirror.js +60 -0
  35. package/lib-node/value/pointer.js +30 -0
  36. package/lib-node/value/reference.js +55 -0
  37. package/lib-node/views/array-view.js +21 -0
  38. package/lib-node/views/base-view.js +43 -0
  39. package/lib-node/views/map-view.js +18 -0
  40. package/lib-node/views/object-view.js +20 -0
  41. package/lib-node/views/repeat-node.js +71 -0
  42. package/lib-node/views/set-view.js +19 -0
  43. package/package.json +21 -17
  44. package/types/core/core.d.ts +4 -4
  45. package/types/functional/options.d.ts +2 -2
  46. package/types/index.d.ts +10 -7
  47. package/types/models/array-model.d.ts +1 -1
  48. package/types/models/object-model.d.ts +1 -1
  49. package/types/node/node.d.ts +5 -4
  50. package/types/node/watch.d.ts +2 -2
  51. package/types/views/repeat-node.d.ts +2 -2
  52. package/lib/core/executor.js +0 -154
  53. package/lib/core/signal.js +0 -50
  54. package/lib/core/slot.js +0 -47
  55. package/lib/functional/components.js +0 -17
  56. package/lib/functional/merge.js +0 -41
  57. package/lib/functional/models.js +0 -26
  58. package/lib/functional/reactivity.js +0 -33
  59. package/lib/functional/stack.js +0 -127
  60. package/lib/node/interceptor.js +0 -83
  61. package/lib/v/index.js +0 -23
  62. package/lib/views/repeater.js +0 -63
  63. package/types/functional/components.d.ts +0 -4
  64. package/types/functional/merge.d.ts +0 -1
  65. package/types/functional/models.d.ts +0 -10
  66. package/types/functional/reactivity.d.ts +0 -11
  67. package/types/functional/stack.d.ts +0 -24
  68. package/types/v/index.d.ts +0 -36
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listener = void 0;
4
+ /**
5
+ * Represent a listener for a model
6
+ * @class Listener
7
+ */
8
+ class Listener {
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;
45
+ }
46
+ /**
47
+ * Emits added event to listeners
48
+ * @param index {*} index of value
49
+ * @param value {*} value of added item
50
+ */
51
+ 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
+ }
62
+ }
63
+ /**
64
+ * Emits removed event to listeners
65
+ * @param index {*} index of removed value
66
+ * @param value {*} value of removed item
67
+ */
68
+ 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
+ }
79
+ }
80
+ /**
81
+ * Adds a handler to added event
82
+ * @param handler {function} function to run on event emitting
83
+ */
84
+ onAdd(handler) {
85
+ this.onAdded.add(handler);
86
+ }
87
+ /**
88
+ * Adds a handler to removed event
89
+ * @param handler {function} function to run on event emitting
90
+ */
91
+ onRemove(handler) {
92
+ this.onRemoved.add(handler);
93
+ }
94
+ /**
95
+ * Removes an handler from added event
96
+ * @param handler {function} handler to remove
97
+ */
98
+ offAdd(handler) {
99
+ this.onAdded.delete(handler);
100
+ }
101
+ /**
102
+ * Removes an handler form removed event
103
+ * @param handler {function} handler to remove
104
+ */
105
+ offRemove(handler) {
106
+ this.onRemoved.delete(handler);
107
+ }
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
+ }
134
+ exports.Listener = Listener;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MapModel = void 0;
4
+ const listener_1 = require("./listener");
5
+ /**
6
+ * A Map based memory
7
+ * @class MapModel
8
+ * @extends Map
9
+ * @implements IModel
10
+ */
11
+ class MapModel extends Map {
12
+ /**
13
+ * Constructs a map model
14
+ * @param map {[*, *][]} input data
15
+ */
16
+ constructor(map = []) {
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]) => {
24
+ super.set(key, value);
25
+ });
26
+ }
27
+ /**
28
+ * Calls Map.clear and notify abut changes
29
+ */
30
+ clear() {
31
+ this.forEach((value, key) => {
32
+ this.listener.emitRemoved(key, value);
33
+ });
34
+ super.clear();
35
+ }
36
+ /**
37
+ * Calls Map.delete and notify abut changes
38
+ * @param key {*} key
39
+ * @return {boolean} true if removed something, otherwise false
40
+ */
41
+ delete(key) {
42
+ const tmp = super.get(key);
43
+ if (tmp) {
44
+ this.listener.emitRemoved(key, tmp);
45
+ }
46
+ return super.delete(key);
47
+ }
48
+ /**
49
+ * Calls Map.set and notify abut changes
50
+ * @param key {*} key
51
+ * @param value {*} value
52
+ * @return {MapModel} a pointer to this
53
+ */
54
+ set(key, value) {
55
+ const tmp = super.get(key);
56
+ if (tmp) {
57
+ this.listener.emitRemoved(key, tmp);
58
+ }
59
+ super.set(key, value);
60
+ this.listener.emitAdded(key, value);
61
+ return this;
62
+ }
63
+ enableReactivity() {
64
+ this.listener.enableReactivity();
65
+ }
66
+ disableReactivity() {
67
+ this.listener.disableReactivity();
68
+ }
69
+ }
70
+ exports.MapModel = MapModel;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObjectModel = void 0;
4
+ const listener_1 = require("./listener");
5
+ /**
6
+ * Object based model
7
+ * @extends Object
8
+ */
9
+ class ObjectModel extends Object {
10
+ /**
11
+ * Constructs a object model
12
+ * @param obj {Object} input data
13
+ */
14
+ constructor(obj = {}) {
15
+ super();
16
+ this.container = Object.create(null);
17
+ Object.defineProperty(this, 'listener', {
18
+ value: new listener_1.Listener,
19
+ writable: false,
20
+ configurable: false
21
+ });
22
+ for (const i in obj) {
23
+ Object.defineProperty(this.container, i, {
24
+ value: obj[i],
25
+ configurable: true,
26
+ writable: true,
27
+ enumerable: true
28
+ });
29
+ this.listener.emitAdded(i, obj[i]);
30
+ }
31
+ }
32
+ /**
33
+ * Gets a value of a field
34
+ * @param key {string}
35
+ * @return {*}
36
+ */
37
+ get(key) {
38
+ return this.container[key];
39
+ }
40
+ /**
41
+ * Sets an object property value
42
+ * @param key {string} property name
43
+ * @param v {*} property value
44
+ * @return {ObjectModel} a pointer to this
45
+ */
46
+ set(key, v) {
47
+ if (Reflect.has(this.container, key)) {
48
+ this.listener.emitRemoved(key, this.container[key]);
49
+ this.container[key] = v;
50
+ }
51
+ else {
52
+ Object.defineProperty(this.container, key, {
53
+ value: v,
54
+ configurable: true,
55
+ writable: true,
56
+ enumerable: true
57
+ });
58
+ }
59
+ this.listener.emitAdded(key, this.container[key]);
60
+ return this;
61
+ }
62
+ get values() {
63
+ return this.container;
64
+ }
65
+ /**
66
+ * Deletes an object property
67
+ * @param key {string} property name
68
+ */
69
+ delete(key) {
70
+ if (this.container[key]) {
71
+ this.listener.emitRemoved(key, this.container[key]);
72
+ delete this.container[key];
73
+ }
74
+ }
75
+ enableReactivity() {
76
+ this.listener.enableReactivity();
77
+ }
78
+ disableReactivity() {
79
+ this.listener.disableReactivity();
80
+ }
81
+ }
82
+ exports.ObjectModel = ObjectModel;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SetModel = void 0;
4
+ const listener_1 = require("./listener");
5
+ /**
6
+ * A Set based model
7
+ * @class SetModel
8
+ * @extends Set
9
+ * @implements IModel
10
+ */
11
+ class SetModel extends Set {
12
+ /**
13
+ * Constructs a set model based on a set
14
+ * @param set {Set} input data
15
+ */
16
+ constructor(set = []) {
17
+ super();
18
+ Object.defineProperty(this, 'listener', {
19
+ value: new listener_1.Listener,
20
+ writable: false,
21
+ configurable: false
22
+ });
23
+ set.forEach(item => {
24
+ super.add(item);
25
+ });
26
+ }
27
+ /**
28
+ * Calls Set.add and notify abut changes
29
+ * @param value {*} value
30
+ * @return {this} a pointer to this
31
+ */
32
+ add(value) {
33
+ if (!super.has(value)) {
34
+ this.listener.emitAdded(value, value);
35
+ super.add(value);
36
+ }
37
+ return this;
38
+ }
39
+ /**
40
+ * Calls Set.clear and notify abut changes
41
+ */
42
+ clear() {
43
+ this.forEach(item => {
44
+ this.listener.emitRemoved(item, item);
45
+ });
46
+ super.clear();
47
+ }
48
+ /**
49
+ * Calls Set.delete and notify abut changes
50
+ * @param value {*}
51
+ * @return {boolean} true if a value was deleted, otherwise false
52
+ */
53
+ delete(value) {
54
+ if (super.has(value)) {
55
+ this.listener.emitRemoved(value, value);
56
+ }
57
+ return super.delete(value);
58
+ }
59
+ enableReactivity() {
60
+ this.listener.enableReactivity();
61
+ }
62
+ disableReactivity() {
63
+ this.listener.disableReactivity();
64
+ }
65
+ }
66
+ exports.SetModel = SetModel;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Portal = exports.App = exports.AppNode = void 0;
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
+ /**
22
+ * Represents a Vasille.js application
23
+ * @class App
24
+ * @extends AppNode
25
+ */
26
+ class App extends AppNode {
27
+ /**
28
+ * Constructs an app node
29
+ * @param node {Element} The root of application
30
+ * @param input
31
+ */
32
+ constructor(node, input) {
33
+ super(input);
34
+ this.$.node = node;
35
+ this.preinit(this, this);
36
+ this.init();
37
+ this.$seal();
38
+ }
39
+ appendNode(node) {
40
+ this.$.node.appendChild(node);
41
+ }
42
+ }
43
+ exports.App = App;
44
+ class Portal extends AppNode {
45
+ constructor(input) {
46
+ super(input);
47
+ this.$.node = input.node;
48
+ this.$seal();
49
+ }
50
+ appendNode(node) {
51
+ this.$.node.appendChild(node);
52
+ }
53
+ }
54
+ exports.Portal = Portal;