vasille 1.2.9 → 2.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.
- package/LICENSE.md +21 -0
- package/flow-typed/vasille.js +836 -0
- package/img/favicon.svg +17 -204
- package/lib/binding/attribute.js +32 -0
- package/lib/binding/binding.js +39 -0
- package/lib/binding/class.js +51 -0
- package/lib/binding/style.js +29 -0
- package/lib/core/core.js +178 -0
- package/lib/core/destroyable.js +45 -0
- package/lib/core/errors.js +16 -0
- package/lib/core/executor.js +154 -0
- package/lib/core/ivalue.js +56 -0
- package/lib/core/signal.js +50 -0
- package/lib/core/slot.js +47 -0
- package/lib/index.js +27 -22
- package/lib/models/array-model.js +208 -0
- package/lib/models/listener.js +130 -0
- package/lib/models/map-model.js +66 -0
- package/lib/models/model.js +1 -0
- package/lib/models/object-model.js +78 -0
- package/lib/models/set-model.js +62 -0
- package/lib/node/app.js +38 -0
- package/lib/node/interceptor.js +83 -0
- package/lib/node/node.js +1185 -0
- package/lib/node/watch.js +27 -0
- package/lib/value/expression.js +83 -0
- package/lib/value/mirror.js +58 -0
- package/lib/value/pointer.js +26 -0
- package/lib/value/reference.js +55 -0
- package/lib/views/array-view.js +24 -0
- package/lib/views/base-view.js +49 -0
- package/lib/views/map-view.js +20 -0
- package/lib/views/object-view.js +20 -0
- package/lib/views/repeat-node.js +106 -0
- package/lib/views/repeater.js +63 -0
- package/lib/views/set-view.js +23 -0
- package/package.json +16 -15
- package/types/binding/attribute.d.ts +23 -0
- package/types/binding/binding.d.ts +30 -0
- package/types/binding/class.d.ts +23 -0
- package/types/binding/style.d.ts +23 -0
- package/types/core/core.d.ts +140 -0
- package/types/core/destroyable.d.ts +15 -0
- package/types/core/errors.d.ts +4 -0
- package/types/core/executor.d.ts +87 -0
- package/types/core/ivalue.d.ts +45 -0
- package/types/core/signal.d.ts +35 -0
- package/types/core/slot.d.ts +45 -0
- package/types/index.d.ts +27 -21
- package/types/models/array-model.d.ts +103 -0
- package/types/models/listener.d.ts +74 -0
- package/types/models/map-model.d.ts +35 -0
- package/types/models/model.d.ts +19 -0
- package/types/models/object-model.d.ts +36 -0
- package/types/models/set-model.d.ts +34 -0
- package/types/node/app.d.ts +37 -0
- package/types/node/interceptor.d.ts +50 -0
- package/types/node/node.d.ts +739 -0
- package/types/node/watch.d.ts +23 -0
- package/types/value/expression.d.ts +60 -0
- package/types/value/mirror.d.ts +35 -0
- package/types/value/pointer.d.ts +19 -0
- package/types/value/reference.d.ts +30 -0
- package/types/views/array-view.d.ts +13 -0
- package/types/views/base-view.d.ts +44 -0
- package/types/views/map-view.d.ts +11 -0
- package/types/views/object-view.d.ts +11 -0
- package/types/views/repeat-node.d.ts +35 -0
- package/types/views/repeater.d.ts +38 -0
- package/types/views/set-view.d.ts +11 -0
- package/CHANGELOG.md +0 -23
- package/lib/attribute.js +0 -71
- package/lib/attribute.js.map +0 -1
- package/lib/bind.js +0 -286
- package/lib/bind.js.map +0 -1
- package/lib/class.js +0 -97
- package/lib/class.js.map +0 -1
- package/lib/executor.js +0 -167
- package/lib/executor.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/interfaces/core.js +0 -247
- package/lib/interfaces/core.js.map +0 -1
- package/lib/interfaces/destroyable.js +0 -39
- package/lib/interfaces/destroyable.js.map +0 -1
- package/lib/interfaces/errors.js +0 -49
- package/lib/interfaces/errors.js.map +0 -1
- package/lib/interfaces/ibind.js +0 -31
- package/lib/interfaces/ibind.js.map +0 -1
- package/lib/interfaces/idefinition.js +0 -64
- package/lib/interfaces/idefinition.js.map +0 -1
- package/lib/interfaces/ivalue.js +0 -60
- package/lib/interfaces/ivalue.js.map +0 -1
- package/lib/models.js +0 -579
- package/lib/models.js.map +0 -1
- package/lib/node.js +0 -2155
- package/lib/node.js.map +0 -1
- package/lib/property.js +0 -38
- package/lib/property.js.map +0 -1
- package/lib/style.js +0 -66
- package/lib/style.js.map +0 -1
- package/lib/value.js +0 -203
- package/lib/value.js.map +0 -1
- package/lib/views.js +0 -688
- package/lib/views.js.map +0 -1
- package/types/attribute.d.ts +0 -18
- package/types/bind.d.ts +0 -72
- package/types/class.d.ts +0 -19
- package/types/data.d.ts +0 -11
- package/types/event.d.ts +0 -10
- package/types/executor.d.ts +0 -57
- package/types/interfaces/core.d.ts +0 -129
- package/types/interfaces/destroyable.d.ts +0 -11
- package/types/interfaces/errors.d.ts +0 -24
- package/types/interfaces/ibind.d.ts +0 -19
- package/types/interfaces/idefinition.d.ts +0 -29
- package/types/interfaces/ivalue.d.ts +0 -40
- package/types/models.d.ts +0 -179
- package/types/node.d.ts +0 -906
- package/types/property.d.ts +0 -9
- package/types/style.d.ts +0 -28
- package/types/value.d.ts +0 -43
- package/types/views.d.ts +0 -135
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Listener } from "./listener";
|
|
2
|
+
/**
|
|
3
|
+
* A Map based memory
|
|
4
|
+
* @class MapModel
|
|
5
|
+
* @extends Map
|
|
6
|
+
* @implements IModel
|
|
7
|
+
*/
|
|
8
|
+
export class MapModel extends Map {
|
|
9
|
+
/**
|
|
10
|
+
* Constructs a map model
|
|
11
|
+
* @param map {[*, *][]} input data
|
|
12
|
+
*/
|
|
13
|
+
constructor(map = []) {
|
|
14
|
+
super();
|
|
15
|
+
Object.defineProperty(this, 'listener', {
|
|
16
|
+
value: new Listener,
|
|
17
|
+
writable: false,
|
|
18
|
+
configurable: false
|
|
19
|
+
});
|
|
20
|
+
map.forEach(([key, value]) => {
|
|
21
|
+
super.set(key, value);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calls Map.clear and notify abut changes
|
|
26
|
+
*/
|
|
27
|
+
clear() {
|
|
28
|
+
this.forEach((value, key) => {
|
|
29
|
+
this.listener.emitRemoved(key, value);
|
|
30
|
+
});
|
|
31
|
+
super.clear();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calls Map.delete and notify abut changes
|
|
35
|
+
* @param key {*} key
|
|
36
|
+
* @return {boolean} true if removed something, otherwise false
|
|
37
|
+
*/
|
|
38
|
+
delete(key) {
|
|
39
|
+
const tmp = super.get(key);
|
|
40
|
+
if (tmp) {
|
|
41
|
+
this.listener.emitRemoved(key, tmp);
|
|
42
|
+
}
|
|
43
|
+
return super.delete(key);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calls Map.set and notify abut changes
|
|
47
|
+
* @param key {*} key
|
|
48
|
+
* @param value {*} value
|
|
49
|
+
* @return {MapModel} a pointer to this
|
|
50
|
+
*/
|
|
51
|
+
set(key, value) {
|
|
52
|
+
const tmp = super.get(key);
|
|
53
|
+
if (tmp) {
|
|
54
|
+
this.listener.emitRemoved(key, tmp);
|
|
55
|
+
}
|
|
56
|
+
super.set(key, value);
|
|
57
|
+
this.listener.emitAdded(key, value);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
enableReactivity() {
|
|
61
|
+
this.listener.enableReactivity();
|
|
62
|
+
}
|
|
63
|
+
disableReactivity() {
|
|
64
|
+
this.listener.disableReactivity();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Listener } from "./listener";
|
|
2
|
+
/**
|
|
3
|
+
* Object based model
|
|
4
|
+
* @extends Object
|
|
5
|
+
*/
|
|
6
|
+
export class ObjectModel extends Object {
|
|
7
|
+
/**
|
|
8
|
+
* Constructs a object model
|
|
9
|
+
* @param obj {Object} input data
|
|
10
|
+
*/
|
|
11
|
+
constructor(obj = {}) {
|
|
12
|
+
super();
|
|
13
|
+
Object.defineProperty(this, 'listener', {
|
|
14
|
+
value: new Listener,
|
|
15
|
+
writable: false,
|
|
16
|
+
configurable: false
|
|
17
|
+
});
|
|
18
|
+
for (const i in obj) {
|
|
19
|
+
Object.defineProperty(this, i, {
|
|
20
|
+
value: obj[i],
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
enumerable: true
|
|
24
|
+
});
|
|
25
|
+
this.listener.emitAdded(i, obj[i]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gets a value of a field
|
|
30
|
+
* @param key {string}
|
|
31
|
+
* @return {*}
|
|
32
|
+
*/
|
|
33
|
+
get(key) {
|
|
34
|
+
const ts = this;
|
|
35
|
+
return ts[key];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Sets an object property value
|
|
39
|
+
* @param key {string} property name
|
|
40
|
+
* @param v {*} property value
|
|
41
|
+
* @return {ObjectModel} a pointer to this
|
|
42
|
+
*/
|
|
43
|
+
set(key, v) {
|
|
44
|
+
const ts = this;
|
|
45
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
46
|
+
if (ts.hasOwnProperty(key)) {
|
|
47
|
+
this.listener.emitRemoved(key, ts[key]);
|
|
48
|
+
ts[key] = v;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
Object.defineProperty(ts, key, {
|
|
52
|
+
value: v,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
enumerable: true
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
this.listener.emitAdded(key, ts[key]);
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Deletes an object property
|
|
63
|
+
* @param key {string} property name
|
|
64
|
+
*/
|
|
65
|
+
delete(key) {
|
|
66
|
+
const ts = this;
|
|
67
|
+
if (ts[key]) {
|
|
68
|
+
this.listener.emitRemoved(key, ts[key]);
|
|
69
|
+
delete ts[key];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
enableReactivity() {
|
|
73
|
+
this.listener.enableReactivity();
|
|
74
|
+
}
|
|
75
|
+
disableReactivity() {
|
|
76
|
+
this.listener.disableReactivity();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Listener } from "./listener";
|
|
2
|
+
/**
|
|
3
|
+
* A Set based model
|
|
4
|
+
* @class SetModel
|
|
5
|
+
* @extends Set
|
|
6
|
+
* @implements IModel
|
|
7
|
+
*/
|
|
8
|
+
export class SetModel extends Set {
|
|
9
|
+
/**
|
|
10
|
+
* Constructs a set model based on a set
|
|
11
|
+
* @param set {Set} input data
|
|
12
|
+
*/
|
|
13
|
+
constructor(set = []) {
|
|
14
|
+
super();
|
|
15
|
+
Object.defineProperty(this, 'listener', {
|
|
16
|
+
value: new Listener,
|
|
17
|
+
writable: false,
|
|
18
|
+
configurable: false
|
|
19
|
+
});
|
|
20
|
+
set.forEach(item => {
|
|
21
|
+
super.add(item);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calls Set.add and notify abut changes
|
|
26
|
+
* @param value {*} value
|
|
27
|
+
* @return {this} a pointer to this
|
|
28
|
+
*/
|
|
29
|
+
add(value) {
|
|
30
|
+
if (!super.has(value)) {
|
|
31
|
+
this.listener.emitAdded(value, value);
|
|
32
|
+
super.add(value);
|
|
33
|
+
}
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calls Set.clear and notify abut changes
|
|
38
|
+
*/
|
|
39
|
+
clear() {
|
|
40
|
+
this.forEach(item => {
|
|
41
|
+
this.listener.emitRemoved(item, item);
|
|
42
|
+
});
|
|
43
|
+
super.clear();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calls Set.delete and notify abut changes
|
|
47
|
+
* @param value {*}
|
|
48
|
+
* @return {boolean} true if a value was deleted, otherwise false
|
|
49
|
+
*/
|
|
50
|
+
delete(value) {
|
|
51
|
+
if (super.has(value)) {
|
|
52
|
+
this.listener.emitRemoved(value, value);
|
|
53
|
+
}
|
|
54
|
+
return super.delete(value);
|
|
55
|
+
}
|
|
56
|
+
enableReactivity() {
|
|
57
|
+
this.listener.enableReactivity();
|
|
58
|
+
}
|
|
59
|
+
disableReactivity() {
|
|
60
|
+
this.listener.disableReactivity();
|
|
61
|
+
}
|
|
62
|
+
}
|
package/lib/node/app.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { instantExecutor, timeoutExecutor } from "../core/executor";
|
|
2
|
+
import { INode } from "./node";
|
|
3
|
+
/**
|
|
4
|
+
* Application Node
|
|
5
|
+
* @class AppNode
|
|
6
|
+
* @extends INode
|
|
7
|
+
*/
|
|
8
|
+
export class AppNode extends INode {
|
|
9
|
+
/**
|
|
10
|
+
* @param options {Object} Application options
|
|
11
|
+
*/
|
|
12
|
+
constructor(options) {
|
|
13
|
+
super();
|
|
14
|
+
this.$run = (options === null || options === void 0 ? void 0 : options.executor) || ((options === null || options === void 0 ? void 0 : options.freezeUi) === false ? timeoutExecutor : instantExecutor);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Represents a Vasille.js application
|
|
19
|
+
* @class App
|
|
20
|
+
* @extends AppNode
|
|
21
|
+
*/
|
|
22
|
+
export class App extends AppNode {
|
|
23
|
+
/**
|
|
24
|
+
* Constructs an app node
|
|
25
|
+
* @param node {Element} The root of application
|
|
26
|
+
* @param options {Object} Application options
|
|
27
|
+
*/
|
|
28
|
+
constructor(node, options) {
|
|
29
|
+
super(options);
|
|
30
|
+
this.$.node = node;
|
|
31
|
+
this.$preinit(this, this);
|
|
32
|
+
this.$seal();
|
|
33
|
+
}
|
|
34
|
+
$$appendNode(node) {
|
|
35
|
+
const $ = this.$;
|
|
36
|
+
$.app.$run.appendChild($.node, node);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Extension } from "./node";
|
|
2
|
+
import { Destroyable } from "../core/destroyable";
|
|
3
|
+
import { Signal } from "../core/signal";
|
|
4
|
+
import { Slot } from "../core/slot";
|
|
5
|
+
/**
|
|
6
|
+
* Interceptor is designed to connect signals & methods of children elements
|
|
7
|
+
* @class Interceptor
|
|
8
|
+
* @extends Destroyable
|
|
9
|
+
*/
|
|
10
|
+
export class Interceptor extends Destroyable {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
/**
|
|
14
|
+
* Set of signals
|
|
15
|
+
* @type Set
|
|
16
|
+
*/
|
|
17
|
+
this.signals = new Set;
|
|
18
|
+
/**
|
|
19
|
+
* Set of handlers
|
|
20
|
+
* @type Set
|
|
21
|
+
*/
|
|
22
|
+
this.handlers = new Set;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Connect a signal or a handler
|
|
26
|
+
* @param thing {Signal | function}
|
|
27
|
+
*/
|
|
28
|
+
connect(thing) {
|
|
29
|
+
// interceptor will connect signals and handlers together
|
|
30
|
+
if (thing instanceof Signal) {
|
|
31
|
+
this.handlers.forEach(handler => {
|
|
32
|
+
thing.subscribe(handler);
|
|
33
|
+
});
|
|
34
|
+
this.signals.add(thing);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.signals.forEach(signal => {
|
|
38
|
+
signal.subscribe(thing);
|
|
39
|
+
});
|
|
40
|
+
this.handlers.add(thing);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Disconnect a handler from signals
|
|
45
|
+
* @param handler {function}
|
|
46
|
+
*/
|
|
47
|
+
disconnect(handler) {
|
|
48
|
+
this.signals.forEach(signal => {
|
|
49
|
+
signal.unsubscribe(handler);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
$destroy() {
|
|
53
|
+
super.$destroy();
|
|
54
|
+
this.signals.forEach(signal => {
|
|
55
|
+
this.handlers.forEach(handler => {
|
|
56
|
+
signal.unsubscribe(handler);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Interceptor node to implement directly to vasille DOM
|
|
63
|
+
* @class InterceptorNode
|
|
64
|
+
* @extends Extension
|
|
65
|
+
*/
|
|
66
|
+
export class InterceptorNode extends Extension {
|
|
67
|
+
constructor() {
|
|
68
|
+
super(...arguments);
|
|
69
|
+
/**
|
|
70
|
+
* Internal interceptor
|
|
71
|
+
* @type Interceptor
|
|
72
|
+
*/
|
|
73
|
+
this.interceptor = new Interceptor;
|
|
74
|
+
/**
|
|
75
|
+
* The default slot of node
|
|
76
|
+
* @type Slot
|
|
77
|
+
*/
|
|
78
|
+
this.slot = new Slot;
|
|
79
|
+
}
|
|
80
|
+
$compose() {
|
|
81
|
+
this.slot.release(this, this.interceptor);
|
|
82
|
+
}
|
|
83
|
+
}
|