@oscarpalmer/mora 0.22.0 → 0.24.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/dist/batch.js +8 -9
- package/dist/constants.js +36 -0
- package/dist/effect.js +7 -8
- package/dist/helpers/is.js +9 -19
- package/dist/helpers/proxy.js +12 -7
- package/dist/helpers/value.js +7 -8
- package/dist/index.js +1 -1
- package/dist/models.js +0 -0
- package/dist/mora.full.js +248 -148
- package/dist/subscription.js +7 -5
- package/dist/value/array.js +27 -29
- package/dist/value/computed.js +18 -21
- package/dist/value/reactive.js +2 -1
- package/dist/value/signal.js +2 -2
- package/dist/value/store.js +12 -3
- package/package.json +9 -11
- package/src/batch.ts +11 -13
- package/src/constants.ts +53 -0
- package/src/effect.ts +12 -17
- package/src/helpers/is.ts +45 -22
- package/src/helpers/proxy.ts +62 -39
- package/src/helpers/value.ts +19 -14
- package/src/index.ts +1 -0
- package/src/models.ts +66 -0
- package/src/subscription.ts +14 -16
- package/src/value/array.ts +92 -55
- package/src/value/computed.ts +29 -39
- package/src/value/reactive.ts +11 -25
- package/src/value/signal.ts +9 -3
- package/src/value/store.ts +55 -13
- package/types/batch.d.ts +3 -5
- package/types/constants.d.ts +16 -0
- package/types/effect.d.ts +2 -1
- package/types/helpers/is.d.ts +23 -10
- package/types/helpers/proxy.d.ts +4 -3
- package/types/helpers/value.d.ts +1 -1
- package/types/index.d.ts +1 -0
- package/types/models.d.ts +56 -0
- package/types/subscription.d.ts +3 -6
- package/types/value/array.d.ts +48 -7
- package/types/value/computed.d.ts +2 -11
- package/types/value/reactive.d.ts +8 -17
- package/types/value/signal.d.ts +7 -1
- package/types/value/store.d.ts +38 -7
package/dist/batch.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BATCH } from "./constants.js";
|
|
2
2
|
import { runEffect } from "./effect.js";
|
|
3
|
+
import { isEffect } from "./helpers/is.js";
|
|
3
4
|
function flushHandlers() {
|
|
4
|
-
while (
|
|
5
|
-
const handlers = [...
|
|
6
|
-
|
|
5
|
+
while (BATCH.depth === 0 && BATCH.handlers.size > 0) {
|
|
6
|
+
const handlers = [...BATCH.handlers];
|
|
7
|
+
BATCH.handlers.clear();
|
|
7
8
|
for (const handler of handlers) if (isEffect(handler)) runEffect(handler);
|
|
8
9
|
else handler.callback(handler.state.value);
|
|
9
10
|
}
|
|
10
11
|
}
|
|
11
12
|
function startBatch() {
|
|
12
|
-
|
|
13
|
+
BATCH.depth += 1;
|
|
13
14
|
}
|
|
14
15
|
function stopBatch() {
|
|
15
|
-
if (
|
|
16
|
+
if (BATCH.depth > 0) BATCH.depth -= 1;
|
|
16
17
|
flushHandlers();
|
|
17
18
|
}
|
|
18
|
-
|
|
19
|
-
let batchDepth = 0;
|
|
20
|
-
export { batchDepth, batchedHandlers, flushHandlers, startBatch, stopBatch };
|
|
19
|
+
export { flushHandlers, startBatch, stopBatch };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const ACTIVE = {};
|
|
2
|
+
const ARRAY_THRESHOLD = 100;
|
|
3
|
+
const ARRAY_OFFSET = 25;
|
|
4
|
+
const ARRAY_PEEK = 10;
|
|
5
|
+
const BATCH = {
|
|
6
|
+
depth: 0,
|
|
7
|
+
handlers: /* @__PURE__ */ new Set()
|
|
8
|
+
};
|
|
9
|
+
const METHODS_AFFECTING_LENGTH = new Set([
|
|
10
|
+
"pop",
|
|
11
|
+
"push",
|
|
12
|
+
"shift",
|
|
13
|
+
"unshift"
|
|
14
|
+
]);
|
|
15
|
+
const METHODS_UPDATE = new Set([
|
|
16
|
+
...METHODS_AFFECTING_LENGTH,
|
|
17
|
+
"copyWithin",
|
|
18
|
+
"fill",
|
|
19
|
+
"reverse",
|
|
20
|
+
"sort",
|
|
21
|
+
"splice"
|
|
22
|
+
]);
|
|
23
|
+
const NAME_ARRAY = "array";
|
|
24
|
+
const NAME_COMPUTED = "computed";
|
|
25
|
+
const NAME_EFFECT = "effect";
|
|
26
|
+
const NAME_MORA = "$mora";
|
|
27
|
+
const NAME_SIGNAL = "signal";
|
|
28
|
+
const NAME_STORE = "store";
|
|
29
|
+
const NAMES = new Set([
|
|
30
|
+
NAME_ARRAY,
|
|
31
|
+
NAME_COMPUTED,
|
|
32
|
+
NAME_SIGNAL,
|
|
33
|
+
NAME_STORE
|
|
34
|
+
]);
|
|
35
|
+
const PROPERTY_LENGTH = "length";
|
|
36
|
+
export { ACTIVE, ARRAY_OFFSET, ARRAY_PEEK, ARRAY_THRESHOLD, BATCH, METHODS_AFFECTING_LENGTH, METHODS_UPDATE, NAMES, NAME_ARRAY, NAME_COMPUTED, NAME_EFFECT, NAME_MORA, NAME_SIGNAL, NAME_STORE, PROPERTY_LENGTH };
|
package/dist/effect.js
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ACTIVE, NAME_EFFECT, NAME_MORA } from "./constants.js";
|
|
2
2
|
var Effect = class {
|
|
3
3
|
constructor(callback) {
|
|
4
|
-
Object.defineProperty(this,
|
|
4
|
+
Object.defineProperty(this, NAME_MORA, { value: NAME_EFFECT });
|
|
5
5
|
this.state = { callback };
|
|
6
6
|
runEffect(this);
|
|
7
7
|
}
|
|
8
8
|
};
|
|
9
9
|
function runEffect(effect$1) {
|
|
10
|
-
const previousEffect =
|
|
11
|
-
|
|
10
|
+
const previousEffect = ACTIVE.effect;
|
|
11
|
+
ACTIVE.effect = effect$1;
|
|
12
12
|
try {
|
|
13
13
|
effect$1.state.callback();
|
|
14
14
|
} finally {
|
|
15
|
-
|
|
15
|
+
ACTIVE.effect = previousEffect;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
function effect(callback) {
|
|
19
|
-
return new Effect(callback);
|
|
19
|
+
return typeof callback === "function" ? new Effect(callback) : void 0;
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
export { Effect, activeEffect, effect, runEffect };
|
|
21
|
+
export { Effect, effect, runEffect };
|
package/dist/helpers/is.js
CHANGED
|
@@ -1,33 +1,23 @@
|
|
|
1
|
+
import { NAMES, NAME_ARRAY, NAME_COMPUTED, NAME_EFFECT, NAME_MORA, NAME_SIGNAL, NAME_STORE } from "../constants.js";
|
|
1
2
|
function isArray(value) {
|
|
2
|
-
return isMora(value,
|
|
3
|
+
return isMora(value, NAME_ARRAY);
|
|
3
4
|
}
|
|
4
5
|
function isComputed(value) {
|
|
5
|
-
return isMora(value,
|
|
6
|
+
return isMora(value, NAME_COMPUTED);
|
|
6
7
|
}
|
|
7
8
|
function isEffect(value) {
|
|
8
|
-
return isMora(value,
|
|
9
|
+
return isMora(value, NAME_EFFECT);
|
|
9
10
|
}
|
|
10
11
|
function isMora(value, name) {
|
|
11
|
-
return typeof value === "object" && value != null && "$mora" in value && (typeof name === "string" ? value
|
|
12
|
+
return typeof value === "object" && value != null && "$mora" in value && (typeof name === "string" ? value["$mora"] === name : name.has(value["$mora"]));
|
|
12
13
|
}
|
|
13
14
|
function isReactive(value) {
|
|
14
|
-
return isMora(value,
|
|
15
|
+
return isMora(value, NAMES);
|
|
15
16
|
}
|
|
16
17
|
function isSignal(value) {
|
|
17
|
-
return isMora(value,
|
|
18
|
+
return isMora(value, NAME_SIGNAL);
|
|
18
19
|
}
|
|
19
20
|
function isStore(value) {
|
|
20
|
-
return isMora(value,
|
|
21
|
+
return isMora(value, NAME_STORE);
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
-
const computedName = "computed";
|
|
24
|
-
const effectName = "effect";
|
|
25
|
-
const signalName = "signal";
|
|
26
|
-
const storeName = "store";
|
|
27
|
-
var reactiveNames = new Set([
|
|
28
|
-
arrayName,
|
|
29
|
-
computedName,
|
|
30
|
-
signalName,
|
|
31
|
-
storeName
|
|
32
|
-
]);
|
|
33
|
-
export { arrayName, computedName, effectName, isArray, isComputed, isEffect, isReactive, isSignal, isStore, signalName, storeName };
|
|
23
|
+
export { isArray, isComputed, isEffect, isReactive, isSignal, isStore };
|
package/dist/helpers/proxy.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
import { PROPERTY_LENGTH } from "../constants.js";
|
|
1
2
|
import { startBatch, stopBatch } from "../batch.js";
|
|
2
3
|
import { computed } from "../value/computed.js";
|
|
3
4
|
import { emitValue } from "./value.js";
|
|
5
|
+
function emityProxyValues(state, mapped) {
|
|
6
|
+
const values = [...mapped.values()];
|
|
7
|
+
const { length } = values;
|
|
8
|
+
for (let index = 0; index < length; index += 1) values[index].effect.dirty = true;
|
|
9
|
+
emitValue(state);
|
|
10
|
+
}
|
|
4
11
|
function getReactiveValueInProxy(reactive, mapped, key, isArray) {
|
|
5
12
|
let item = mapped.get(key);
|
|
6
13
|
if (item == null) {
|
|
7
|
-
item = computed(() =>
|
|
8
|
-
const value = reactive.get();
|
|
9
|
-
return isArray ? value.at(key) : value[key];
|
|
10
|
-
});
|
|
14
|
+
item = computed(() => isArray ? reactive.get().at(key) : reactive.get()[key]);
|
|
11
15
|
mapped.set(key, item);
|
|
12
16
|
}
|
|
13
17
|
return item;
|
|
@@ -28,9 +32,10 @@ function setProxyValue(proxy, value) {
|
|
|
28
32
|
}
|
|
29
33
|
stopBatch();
|
|
30
34
|
}
|
|
31
|
-
function setValueInProxy(
|
|
35
|
+
function setValueInProxy(parameters) {
|
|
36
|
+
const { isArray, length, property, state, target, value } = parameters;
|
|
32
37
|
if (isArray) {
|
|
33
|
-
if (
|
|
38
|
+
if (!(!Number.isNaN(Number(property)) || property === "length")) return Reflect.set(target, property, value);
|
|
34
39
|
}
|
|
35
40
|
const previous = Reflect.get(target, property);
|
|
36
41
|
if (!state.equal(previous, value)) {
|
|
@@ -40,4 +45,4 @@ function setValueInProxy(target, property, value, state, isArray, length) {
|
|
|
40
45
|
}
|
|
41
46
|
return true;
|
|
42
47
|
}
|
|
43
|
-
export { getReactiveValueInProxy, setProxyValue, setValueInProxy };
|
|
48
|
+
export { emityProxyValues, getReactiveValueInProxy, setProxyValue, setValueInProxy };
|
package/dist/helpers/value.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { activeComputed } from "../value/computed.js";
|
|
1
|
+
import { ACTIVE, ARRAY_OFFSET, ARRAY_PEEK, ARRAY_THRESHOLD, BATCH } from "../constants.js";
|
|
2
|
+
import { flushHandlers } from "../batch.js";
|
|
4
3
|
function emitValue(state) {
|
|
5
4
|
for (const computed of state.computeds) computed.effect.dirty = true;
|
|
6
|
-
for (const effect of state.effects)
|
|
7
|
-
for (const [, subscription] of state.subscriptions)
|
|
8
|
-
if (
|
|
5
|
+
for (const effect of state.effects) BATCH.handlers.add(effect);
|
|
6
|
+
for (const [, subscription] of state.subscriptions) BATCH.handlers.add(subscription);
|
|
7
|
+
if (BATCH.depth === 0) flushHandlers();
|
|
9
8
|
}
|
|
10
9
|
function equalArrays(state, first, second) {
|
|
11
10
|
let { length } = first;
|
|
@@ -21,8 +20,8 @@ function equalArrays(state, first, second) {
|
|
|
21
20
|
return true;
|
|
22
21
|
}
|
|
23
22
|
function getValue(state) {
|
|
24
|
-
if (
|
|
25
|
-
if (
|
|
23
|
+
if (ACTIVE.computed != null) state.computeds.add(ACTIVE.computed);
|
|
24
|
+
if (ACTIVE.effect != null) state.effects.add(ACTIVE.effect);
|
|
26
25
|
return state.value;
|
|
27
26
|
}
|
|
28
27
|
export { emitValue, equalArrays, getValue };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { isArray, isComputed, isEffect, isReactive, isSignal } from "./helpers/is.js";
|
|
2
1
|
import { effect } from "./effect.js";
|
|
2
|
+
import { isArray, isComputed, isEffect, isReactive, isSignal } from "./helpers/is.js";
|
|
3
3
|
import { startBatch, stopBatch } from "./batch.js";
|
|
4
4
|
import { computed } from "./value/computed.js";
|
|
5
5
|
import { signal } from "./value/signal.js";
|
package/dist/models.js
ADDED
|
File without changes
|