@quark-fw/atom 0.0.1
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/global.d.ts +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +37 -0
- package/package.json +28 -0
package/dist/global.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "@quark-fw/core/src/global.js";
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Зависимость атома: от неё нужна только подписка, значение не читается.
|
|
3
|
+
* Поэтому здесь не Atom<T> — у него value инвариантно, и список зависимостей
|
|
4
|
+
* с разными типами значений собрать было бы нельзя.
|
|
5
|
+
*/
|
|
6
|
+
export type AtomDependency = {
|
|
7
|
+
readonly key: string;
|
|
8
|
+
subscribe(fn: () => void): () => void;
|
|
9
|
+
};
|
|
10
|
+
export interface Atom<T> {
|
|
11
|
+
readonly key: string;
|
|
12
|
+
readonly deps: AtomDependency[];
|
|
13
|
+
get value(): T;
|
|
14
|
+
set value(v: T);
|
|
15
|
+
subscribe(fn: (v: T) => void): () => void;
|
|
16
|
+
}
|
|
17
|
+
export default function atom<T>(key: string, initial: T, deps?: AtomDependency[]): Atom<T>;
|
|
18
|
+
export declare function computed<T>(key: string, deps: AtomDependency[], fn: () => T): Atom<T>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export default function atom(key, initial, deps = []) {
|
|
2
|
+
let value = initial;
|
|
3
|
+
const listeners = new Set();
|
|
4
|
+
const obj = {
|
|
5
|
+
key,
|
|
6
|
+
deps,
|
|
7
|
+
get value() {
|
|
8
|
+
return value;
|
|
9
|
+
},
|
|
10
|
+
set value(v) {
|
|
11
|
+
value = v;
|
|
12
|
+
// локальные подписчики
|
|
13
|
+
for (const fn of listeners)
|
|
14
|
+
fn(v);
|
|
15
|
+
// Глобальный emitter. Тип quark объявляет ядро, которое само
|
|
16
|
+
// зависит от атомов, поэтому здесь описана только та форма,
|
|
17
|
+
// которая нужна для отправки события.
|
|
18
|
+
const host = globalThis;
|
|
19
|
+
host.quark?.ee?.value?.emit("atom:update", { key, value: v });
|
|
20
|
+
},
|
|
21
|
+
subscribe(fn) {
|
|
22
|
+
listeners.add(fn);
|
|
23
|
+
return () => listeners.delete(fn);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
export function computed(key, deps, fn) {
|
|
29
|
+
const c = atom(key, fn(), deps);
|
|
30
|
+
// пересчитываем при изменении deps
|
|
31
|
+
for (const dep of deps) {
|
|
32
|
+
dep.subscribe(() => {
|
|
33
|
+
c.value = fn();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return c;
|
|
37
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@quark-fw/atom",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Reactive atom primitive for the Quark framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json",
|
|
14
|
+
"./src/*": "./dist/*",
|
|
15
|
+
"./*": "./dist/*"
|
|
16
|
+
},
|
|
17
|
+
"files": ["dist"],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "tsx watch src/index.ts",
|
|
20
|
+
"build": "tsc -p tsconfig.build.json && node ../../scripts/postbuild.mjs"
|
|
21
|
+
},
|
|
22
|
+
"keywords": ["quark"],
|
|
23
|
+
"author": "",
|
|
24
|
+
"license": "ISC",
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
}
|
|
28
|
+
}
|