@ivlev-dev/silent-reactivity 0.0.0-stage → 0.1.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.
package/dist/store.js ADDED
@@ -0,0 +1,123 @@
1
+ import { deepReactive, unwrap } from "./deep.js";
2
+ import { createMemo, createRoot, createSignalHandle, runWithOwner, untrack, } from "./graph.js";
3
+ class ReactiveStoreImpl {
4
+ disposedFlag = false;
5
+ fieldSignals = new Map();
6
+ computeds = new Map();
7
+ cleanups = [];
8
+ get disposed() {
9
+ return this.disposedFlag;
10
+ }
11
+ dispose() {
12
+ if (this.disposedFlag) {
13
+ return;
14
+ }
15
+ this.disposedFlag = true;
16
+ const cleanups = this.cleanups.splice(0);
17
+ for (let index = cleanups.length - 1; index >= 0; index -= 1) {
18
+ const cleanup = cleanups[index];
19
+ if (cleanup !== undefined) {
20
+ cleanup();
21
+ }
22
+ }
23
+ this.computeds.clear();
24
+ this.fieldSignals.clear();
25
+ }
26
+ }
27
+ const stores = new WeakMap();
28
+ function toImpl(store) {
29
+ if (store instanceof ReactiveStoreImpl) {
30
+ return store;
31
+ }
32
+ throw new TypeError("Unknown reactive store");
33
+ }
34
+ function getFieldSignal(store, key, getRaw) {
35
+ const existing = store.fieldSignals.get(key);
36
+ if (existing !== undefined) {
37
+ return existing;
38
+ }
39
+ const signal = createSignalHandle(getRaw());
40
+ store.fieldSignals.set(key, signal);
41
+ return signal;
42
+ }
43
+ export function createReactiveStore() {
44
+ return new ReactiveStoreImpl();
45
+ }
46
+ export function storeFor(instance) {
47
+ const existing = stores.get(instance);
48
+ if (existing !== undefined) {
49
+ return existing;
50
+ }
51
+ const store = new ReactiveStoreImpl();
52
+ stores.set(instance, store);
53
+ return store;
54
+ }
55
+ export function readField(instance, key, getRaw) {
56
+ const store = toImpl(storeFor(instance));
57
+ if (store.disposed) {
58
+ return deepReactive(getRaw());
59
+ }
60
+ const signal = getFieldSignal(store, key, getRaw);
61
+ return deepReactive(signal.read());
62
+ }
63
+ export function writeField(instance, key, value, setRaw) {
64
+ const store = toImpl(storeFor(instance));
65
+ const raw = unwrap(value);
66
+ if (store.disposed) {
67
+ setRaw(raw);
68
+ return value;
69
+ }
70
+ setRaw(raw);
71
+ const signal = getFieldSignal(store, key, () => raw);
72
+ signal.write(raw);
73
+ return value;
74
+ }
75
+ export function registerCleanup(store, fn) {
76
+ const impl = toImpl(store);
77
+ if (impl.disposed) {
78
+ fn();
79
+ return;
80
+ }
81
+ impl.cleanups.push(fn);
82
+ }
83
+ export function copyReactiveState(source, target) {
84
+ const sourceStore = stores.get(source);
85
+ if (sourceStore === undefined || sourceStore.disposed) {
86
+ return;
87
+ }
88
+ const targetStore = toImpl(storeFor(target));
89
+ for (const [key, signal] of sourceStore.fieldSignals) {
90
+ const value = untrack(() => signal.read());
91
+ const existing = targetStore.fieldSignals.get(key);
92
+ if (existing !== undefined) {
93
+ existing.write(value);
94
+ }
95
+ else {
96
+ targetStore.fieldSignals.set(key, createSignalHandle(value));
97
+ }
98
+ }
99
+ }
100
+ export function getComputed(instance, key, compute) {
101
+ const store = toImpl(storeFor(instance));
102
+ if (store.disposed) {
103
+ return untrack(compute);
104
+ }
105
+ const existing = store.computeds.get(key);
106
+ if (existing !== undefined) {
107
+ return existing.accessor();
108
+ }
109
+ const created = runWithOwner(null, () => createRoot((dispose) => {
110
+ const memo = createMemo(compute);
111
+ return { memo, dispose };
112
+ }));
113
+ store.computeds.set(key, {
114
+ accessor: created.memo,
115
+ dispose: created.dispose,
116
+ });
117
+ registerCleanup(store, () => {
118
+ store.computeds.delete(key);
119
+ created.dispose();
120
+ });
121
+ return created.memo();
122
+ }
123
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type Accessor<T> = () => T;
2
+ export type Setter<T> = (value: T | ((prev: T) => T)) => T;
3
+ export interface SignalOptions<T> {
4
+ equals?: (a: T, b: T) => boolean;
5
+ }
6
+ export interface MemoOptions<T> extends SignalOptions<T> {
7
+ }
8
+ export interface Owner {
9
+ readonly disposed: boolean;
10
+ dispose(): void;
11
+ }
12
+ export interface ReactiveStore {
13
+ readonly disposed: boolean;
14
+ dispose(): void;
15
+ }
16
+ export interface OnOptions {
17
+ defer?: boolean;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAElC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AAE3D,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAG;AAE3D,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
2
  "name": "@ivlev-dev/silent-reactivity",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.2",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "devDependencies": {
18
+ "typescript": "^7.0.2",
19
+ "vitest": "^5.1.0"
20
+ },
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/ivlev-dev/silent-framework.git"
25
+ },
26
+ "homepage": "https://github.com/ivlev-dev/silent-framework#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/ivlev-dev/silent-framework/issues"
29
+ },
30
+ "engines": {
31
+ "node": ">=22"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "description": "Granular reactive signal graph with deep proxies for Silent Framework",
37
+ "keywords": [
38
+ "reactivity",
39
+ "signals",
40
+ "solid",
41
+ "proxy",
42
+ "frontend"
43
+ ],
44
+ "scripts": {
45
+ "build": "tsc -p tsconfig.json",
46
+ "typecheck": "tsc --noEmit -p tsconfig.json",
47
+ "test": "vitest run"
48
+ }
6
49
  }