r-state-tree 0.4.0 → 0.4.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/README.md +68 -16
- package/dist/api.d.ts +9 -0
- package/dist/computedProxy.d.ts +2 -0
- package/dist/context.d.ts +13 -0
- package/dist/decorators.d.ts +6 -0
- package/dist/index.d.ts +10 -0
- package/dist/model/ChildModelsAdministration.d.ts +35 -0
- package/dist/model/Model.d.ts +17 -0
- package/dist/model/ModelAdministration.d.ts +42 -0
- package/dist/model/idMap.d.ts +8 -0
- package/dist/observables/array.d.ts +21 -0
- package/dist/observables/collection.d.ts +43 -0
- package/dist/observables/date.d.ts +4 -0
- package/dist/observables/index.d.ts +6 -0
- package/dist/observables/internal/Administration.d.ts +17 -0
- package/dist/observables/internal/NodeMap.d.ts +23 -0
- package/dist/observables/internal/lookup.d.ts +14 -0
- package/dist/observables/internal/utils.d.ts +9 -0
- package/dist/observables/object.d.ts +25 -0
- package/dist/observables/preact.d.ts +69 -0
- package/dist/store/Store.d.ts +14 -0
- package/dist/store/StoreAdministration.d.ts +30 -0
- package/dist/types.d.ts +73 -0
- package/dist/utils.d.ts +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,15 +51,15 @@ updateStore(app.todo, { title: "Ship release" });
|
|
|
51
51
|
|
|
52
52
|
### Child stores
|
|
53
53
|
|
|
54
|
-
Use `@child` for single child stores and
|
|
54
|
+
Use `@child` for both single child stores and arrays.
|
|
55
55
|
|
|
56
56
|
```ts
|
|
57
|
-
import { child
|
|
57
|
+
import { child } from "r-state-tree";
|
|
58
58
|
|
|
59
59
|
class ListStore extends Store {
|
|
60
60
|
items = ["Buy milk", "Walk dog"];
|
|
61
61
|
|
|
62
|
-
@
|
|
62
|
+
@child get todos() {
|
|
63
63
|
return this.items.map((title, i) =>
|
|
64
64
|
createStore(TodoStore, { title, key: i })
|
|
65
65
|
);
|
|
@@ -220,20 +220,38 @@ todo.title = "Learn r-state-tree";
|
|
|
220
220
|
stop();
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
+
### Model lifecycle hooks
|
|
224
|
+
|
|
225
|
+
Models support lifecycle methods:
|
|
226
|
+
|
|
227
|
+
```ts
|
|
228
|
+
class TodoModel extends Model {
|
|
229
|
+
@child tags: TagModel[] = [];
|
|
230
|
+
|
|
231
|
+
modelDidInit(snapshot?, ...args: unknown[]) {
|
|
232
|
+
// Called when model is created via Model.create()
|
|
233
|
+
// Receives the snapshot and any additional arguments passed to create()
|
|
234
|
+
console.log("Model initialized", snapshot);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
modelDidAttach() {
|
|
238
|
+
// Called when this model is attached as a child to another model
|
|
239
|
+
console.log("Model attached to parent");
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
modelWillDetach() {
|
|
243
|
+
// Called when this model is detached from its parent
|
|
244
|
+
console.log("Model will be detached");
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
223
249
|
### Model decorators
|
|
224
250
|
|
|
225
251
|
Use decorators to configure model properties:
|
|
226
252
|
|
|
227
253
|
```ts
|
|
228
|
-
import {
|
|
229
|
-
Model,
|
|
230
|
-
state,
|
|
231
|
-
identifier,
|
|
232
|
-
child,
|
|
233
|
-
children,
|
|
234
|
-
modelRef,
|
|
235
|
-
modelRefs,
|
|
236
|
-
} from "r-state-tree";
|
|
254
|
+
import { Model, state, identifier, child, modelRef } from "r-state-tree";
|
|
237
255
|
|
|
238
256
|
class User extends Model {
|
|
239
257
|
@identifier id = 0;
|
|
@@ -245,19 +263,29 @@ class TodoModel extends Model {
|
|
|
245
263
|
@state title = "";
|
|
246
264
|
@modelRef assignee?: User; // Reference to another model by ID
|
|
247
265
|
@child metadata = MetadataModel.create(); // Nested child model
|
|
248
|
-
@
|
|
266
|
+
@child tags: TagModel[] = []; // Array of child models
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
The `@child` and `@modelRef` decorators support both single values and arrays. You can also specify the child type using `@child(ChildType)`:
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
class TodoModel extends Model {
|
|
274
|
+
@child(TagModel) tags: TagModel[] = []; // Type-safe array of child models
|
|
275
|
+
@child(TagModel) primaryTag: TagModel | null = null; // Can switch between single and array at runtime
|
|
249
276
|
}
|
|
250
277
|
```
|
|
251
278
|
|
|
252
279
|
### Model references
|
|
253
280
|
|
|
254
|
-
Reference models by ID using `@modelRef
|
|
281
|
+
Reference models by ID using `@modelRef`:
|
|
255
282
|
|
|
256
283
|
```ts
|
|
257
284
|
class ProjectModel extends Model {
|
|
258
285
|
@identifier id = 0;
|
|
259
|
-
@
|
|
260
|
-
@modelRef owner?: User;
|
|
286
|
+
@child users: User[] = [];
|
|
287
|
+
@modelRef owner?: User; // Single reference
|
|
288
|
+
@modelRef assignees: User[] = []; // Array of references
|
|
261
289
|
|
|
262
290
|
assignOwner(userId: number) {
|
|
263
291
|
// Find user by ID and set as owner
|
|
@@ -278,6 +306,30 @@ const project = ProjectModel.create({
|
|
|
278
306
|
project.owner?.name; // "Alice"
|
|
279
307
|
```
|
|
280
308
|
|
|
309
|
+
Both `@child` and `@modelRef` support runtime type switching between single values and arrays:
|
|
310
|
+
|
|
311
|
+
```ts
|
|
312
|
+
class ItemModel extends Model {
|
|
313
|
+
@identifier id = 0;
|
|
314
|
+
@state value = 0;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
class ContainerModel extends Model {
|
|
318
|
+
@child(ItemModel) items: ItemModel | ItemModel[]; // Can be single or array
|
|
319
|
+
|
|
320
|
+
setSingle() {
|
|
321
|
+
this.items = ItemModel.create({ id: 1, value: 10 });
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
setArray() {
|
|
325
|
+
this.items = [
|
|
326
|
+
ItemModel.create({ id: 2, value: 20 }),
|
|
327
|
+
ItemModel.create({ id: 3, value: 30 }),
|
|
328
|
+
];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
281
333
|
### Snapshot diffs
|
|
282
334
|
|
|
283
335
|
Use `onSnapshotDiff` to receive undo/redo payloads:
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Snapshot, SnapshotDiff } from "./types";
|
|
2
|
+
import Store from "./store/Store";
|
|
3
|
+
import Model from "./model/Model";
|
|
4
|
+
export declare function mount<T extends Store>(container: T): T;
|
|
5
|
+
export declare function unmount<S extends Store>(container: S): void;
|
|
6
|
+
export declare function toSnapshot<T extends Model>(model: T): Snapshot<T>;
|
|
7
|
+
export declare function onSnapshot<T extends Model>(model: T, callback: (snapshot: Snapshot<T>, model: T) => void): () => void;
|
|
8
|
+
export declare function onSnapshotDiff<T extends Model>(model: T, callback: (snapshotDiff: SnapshotDiff<T>, model: T) => void): () => void;
|
|
9
|
+
export declare function applySnapshot<T extends Model>(model: T, snapshot: Snapshot<T>): T;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type Model from "./model/Model";
|
|
2
|
+
import type Store from "./store/Store";
|
|
3
|
+
declare const CONTEXT_SYMBOL: unique symbol;
|
|
4
|
+
declare const HAS_DEFAULT: unique symbol;
|
|
5
|
+
export interface Context<T> {
|
|
6
|
+
readonly [CONTEXT_SYMBOL]: symbol;
|
|
7
|
+
readonly [HAS_DEFAULT]: boolean;
|
|
8
|
+
readonly defaultValue: T | undefined;
|
|
9
|
+
readonly provide: symbol;
|
|
10
|
+
consume(instance: Model | Store): T;
|
|
11
|
+
}
|
|
12
|
+
export declare function createContext<T>(defaultValue?: T): Context<T>;
|
|
13
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "@tsmetadata/polyfill";
|
|
2
|
+
import Store, { createStore, updateStore } from "./store/Store";
|
|
3
|
+
import Model from "./model/Model";
|
|
4
|
+
import { mount, unmount, onSnapshot, toSnapshot, applySnapshot, onSnapshotDiff } from "./api";
|
|
5
|
+
import { createContext } from "./context";
|
|
6
|
+
export { createStore, Store, Model, mount, unmount, updateStore, onSnapshot, onSnapshotDiff, toSnapshot, applySnapshot, createContext, };
|
|
7
|
+
export { observable, computed, source, reportChanged, reportObserved, getSignal, isObservable, reaction, Signal, ReadonlySignal, batch, untracked, effect, Observable, signal, } from "./observables";
|
|
8
|
+
export * from "./decorators";
|
|
9
|
+
export type { Configuration, Snapshot, IdType, SnapshotDiff } from "./types";
|
|
10
|
+
export type { Context } from "./context";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ArrayAdministration } from "../observables";
|
|
2
|
+
export declare function notifyArrayUpdate<T>(arr: T[], index: number, oldValue: T, newValue: T): void;
|
|
3
|
+
export declare function notifySpliceArray<T>(arr: T[], index: number, added: T[], removed: T[]): void;
|
|
4
|
+
export declare function observe<T>(obj: object, method: MutationListener<T>): () => void;
|
|
5
|
+
export type UpdateArrayEvent<T> = {
|
|
6
|
+
object: T[];
|
|
7
|
+
type: "updateArray";
|
|
8
|
+
index: number;
|
|
9
|
+
oldValue: T;
|
|
10
|
+
newValue: T;
|
|
11
|
+
};
|
|
12
|
+
export type SpliceArrayEvent<T> = {
|
|
13
|
+
object: T[];
|
|
14
|
+
type: "spliceArray";
|
|
15
|
+
index: number;
|
|
16
|
+
added: T[];
|
|
17
|
+
removed: T[];
|
|
18
|
+
};
|
|
19
|
+
export type MutationEvent<T> = UpdateArrayEvent<T> | SpliceArrayEvent<T>;
|
|
20
|
+
export type MutationListener<T> = (ev: MutationEvent<T>) => void;
|
|
21
|
+
export type HasListener<T> = {
|
|
22
|
+
listener: ObservableListener<T>;
|
|
23
|
+
};
|
|
24
|
+
declare class ObservableListener<T> {
|
|
25
|
+
private listeners;
|
|
26
|
+
private notifying;
|
|
27
|
+
subscribe(l: MutationListener<T>): () => void;
|
|
28
|
+
get size(): number;
|
|
29
|
+
notify(ev: MutationEvent<T>): void;
|
|
30
|
+
}
|
|
31
|
+
export declare class ChildModelsAdministration<T> extends ArrayAdministration<T> {
|
|
32
|
+
set(index: number, newValue: T): void;
|
|
33
|
+
spliceWithArray(index: number, deleteCount?: number | undefined, newItems?: T[] | undefined): T[];
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ModelConfiguration, Snapshot } from "../types";
|
|
2
|
+
type ExtractModelDidInitArgs<T extends Model> = T extends {
|
|
3
|
+
modelDidInit(...args: infer Args): unknown;
|
|
4
|
+
} ? Args extends [infer Snapshot, ...infer Rest] ? Rest : [] : [];
|
|
5
|
+
export default class Model {
|
|
6
|
+
static get types(): ModelConfiguration<unknown>;
|
|
7
|
+
static childTypes: object;
|
|
8
|
+
static create<T extends Model = Model>(this: {
|
|
9
|
+
new (...args: unknown[]): T;
|
|
10
|
+
}, snapshot?: Snapshot<T>, ...args: ExtractModelDidInitArgs<T>): T;
|
|
11
|
+
constructor();
|
|
12
|
+
get parent(): Model | null;
|
|
13
|
+
modelDidInit(snapshot?: Snapshot<this>, ...args: unknown[]): void;
|
|
14
|
+
modelDidAttach(): void;
|
|
15
|
+
modelWillDetach(): void;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { PreactObjectAdministration, ComputedNode, AtomNode } from "../observables";
|
|
2
|
+
import Model from "../model/Model";
|
|
3
|
+
import { ModelConfiguration, Snapshot, SnapshotChange } from "../types";
|
|
4
|
+
export declare function getConfigurationFromSnapshot(snapshot: object): ModelConfiguration<unknown> | undefined;
|
|
5
|
+
export declare function getModelAdm<T extends Model>(model: T): ModelAdministration;
|
|
6
|
+
export declare class ModelAdministration extends PreactObjectAdministration<any> {
|
|
7
|
+
static proxyTraps: ProxyHandler<object>;
|
|
8
|
+
private configurationGetter?;
|
|
9
|
+
private _parent;
|
|
10
|
+
private parentAtom;
|
|
11
|
+
referencedAtoms: Map<PropertyKey, AtomNode>;
|
|
12
|
+
referencedModels: Map<PropertyKey, ComputedNode<Model[]>>;
|
|
13
|
+
activeModels: Set<PropertyKey>;
|
|
14
|
+
root: ModelAdministration;
|
|
15
|
+
private modelsTraceUnsub;
|
|
16
|
+
private writeInProgress;
|
|
17
|
+
private computedSnapshot;
|
|
18
|
+
private snapshotMap;
|
|
19
|
+
private contextCache;
|
|
20
|
+
parentName: PropertyKey | null;
|
|
21
|
+
get parent(): ModelAdministration | null;
|
|
22
|
+
set parent(value: ModelAdministration | null);
|
|
23
|
+
setConfiguration(configurationGetter: () => ModelConfiguration<any>): void;
|
|
24
|
+
private get configuration();
|
|
25
|
+
private getReferencedAtom;
|
|
26
|
+
private setState;
|
|
27
|
+
private setId;
|
|
28
|
+
private setModel;
|
|
29
|
+
private setModels;
|
|
30
|
+
private getModelRef;
|
|
31
|
+
private getModelRefs;
|
|
32
|
+
private setModelRef;
|
|
33
|
+
private setModelRefs;
|
|
34
|
+
private attach;
|
|
35
|
+
private detach;
|
|
36
|
+
getContextValue<T>(contextId: symbol, provideSymbol: symbol, defaultValue: T | undefined, hasDefault: boolean): T;
|
|
37
|
+
private lookupContextValue;
|
|
38
|
+
private toJSON;
|
|
39
|
+
onSnapshotChange(onChange: SnapshotChange<any>): () => void;
|
|
40
|
+
loadSnapshot(snapshot: Snapshot<any>): void;
|
|
41
|
+
getSnapshot(): Snapshot<any>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IdType } from "../types";
|
|
2
|
+
import Model from "./Model";
|
|
3
|
+
export declare function onSnapshotLoad<T>(fn: () => T): T;
|
|
4
|
+
export declare function setIdentifier(model: Model, id: string | number): void;
|
|
5
|
+
export declare function getIdentifier(model: Model): IdType | undefined;
|
|
6
|
+
export declare function getModelById(root: Model, id: IdType): Model | undefined;
|
|
7
|
+
export declare function onModelAttached(model: Model): void;
|
|
8
|
+
export declare function onModelDetached(model: Model): void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AtomNode } from "./preact";
|
|
2
|
+
import { Administration } from "./internal/Administration";
|
|
3
|
+
import { SignalMap } from "./internal/NodeMap";
|
|
4
|
+
export declare class ArrayAdministration<T> extends Administration<T[]> {
|
|
5
|
+
valuesMap: SignalMap<number>;
|
|
6
|
+
keysAtom: AtomNode;
|
|
7
|
+
static proxyTraps: ProxyHandler<Array<unknown>>;
|
|
8
|
+
static methods: Partial<{
|
|
9
|
+
[K in keyof typeof Array.prototype as (typeof Array.prototype)[K] extends Function ? K : never]: (typeof Array.prototype)[K];
|
|
10
|
+
}>;
|
|
11
|
+
constructor(source?: T[]);
|
|
12
|
+
protected reportObserveDeep(): void;
|
|
13
|
+
getNode(key?: number): unknown;
|
|
14
|
+
get(index: number): T | undefined;
|
|
15
|
+
set(index: number, newValue: T): void;
|
|
16
|
+
getArrayLength(): number;
|
|
17
|
+
setArrayLength(newLength: number): void;
|
|
18
|
+
spliceWithArray(index: number, deleteCount?: number, newItems?: T[]): T[];
|
|
19
|
+
spliceItemsIntoValues(index: number, deleteCount: number, newItems: T[]): T[];
|
|
20
|
+
onArrayChanged(lengthChanged?: boolean, index?: number, count?: number): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AtomNode } from "./preact";
|
|
2
|
+
import { Administration } from "./internal/Administration";
|
|
3
|
+
import { AtomMap, SignalMap } from "./internal/NodeMap";
|
|
4
|
+
type Collection<K, V> = Set<K> | Map<K, V>;
|
|
5
|
+
export declare class CollectionAdministration<K, V = K> extends Administration<Collection<K, V>> {
|
|
6
|
+
isMap: boolean;
|
|
7
|
+
hasMap: AtomMap<K>;
|
|
8
|
+
valuesMap: SignalMap<K>;
|
|
9
|
+
keysAtom: AtomNode;
|
|
10
|
+
static proxyTraps: ProxyHandler<Set<unknown> | Map<unknown, unknown>>;
|
|
11
|
+
static methods: {
|
|
12
|
+
clear: (this: any) => unknown;
|
|
13
|
+
forEach: (this: any) => unknown;
|
|
14
|
+
has: (this: any) => unknown;
|
|
15
|
+
add: (this: any) => unknown;
|
|
16
|
+
set: (this: any) => unknown;
|
|
17
|
+
get: (this: any) => unknown;
|
|
18
|
+
delete: (this: any) => unknown;
|
|
19
|
+
entries: (this: any) => unknown;
|
|
20
|
+
keys: (this: any) => unknown;
|
|
21
|
+
values: (this: any) => unknown;
|
|
22
|
+
[Symbol.iterator]: (this: any) => unknown;
|
|
23
|
+
};
|
|
24
|
+
constructor(source: Collection<K, V>);
|
|
25
|
+
private hasEntry;
|
|
26
|
+
private onCollectionChange;
|
|
27
|
+
protected reportObserveDeep(): void;
|
|
28
|
+
getNode(key?: K): unknown;
|
|
29
|
+
clear(): void;
|
|
30
|
+
forEach(callbackFn: (value: V, key: K, collection: Collection<K, V>) => void, thisArg?: unknown): void;
|
|
31
|
+
get size(): number;
|
|
32
|
+
add(value: K): this;
|
|
33
|
+
delete(value: K): boolean;
|
|
34
|
+
has(value: K): boolean;
|
|
35
|
+
entries(): IterableIterator<[K, V]>;
|
|
36
|
+
keys(): IterableIterator<K>;
|
|
37
|
+
get(key: K): V | undefined;
|
|
38
|
+
set(key: K, value: V): this;
|
|
39
|
+
values(): IterableIterator<V>;
|
|
40
|
+
[Symbol.iterator](): IterableIterator<[K, V] | V>;
|
|
41
|
+
[Symbol.toStringTag]: string;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { getAdministration, getSource, isObservable, getObservable, getObservableClassInstance, getInternalNode, createObservableWithCustomAdministration, } from "./internal/lookup";
|
|
2
|
+
export { ArrayAdministration } from "./array";
|
|
3
|
+
export { CollectionAdministration } from "./collection";
|
|
4
|
+
export { DateAdministration } from "./date";
|
|
5
|
+
export { ObjectAdministration } from "./object";
|
|
6
|
+
export { AtomNode, reaction, SignalNode, createAtom, batch, createComputed, createSignal, untracked, ListenerNode, createListener, ComputedNode, PreactObjectAdministration, getSignal, source, reportChanged, reportObserved, observable, computed, Signal, ReadonlySignal, effect, signal, Observable, } from "./preact";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ObservedAtomNode } from "../preact";
|
|
2
|
+
import { SignalMap } from "./NodeMap";
|
|
3
|
+
export declare class Administration<T extends object = any> {
|
|
4
|
+
static readonly proxyTraps: ProxyHandler<object>;
|
|
5
|
+
readonly proxy: T;
|
|
6
|
+
readonly source: T;
|
|
7
|
+
readonly atom: ObservedAtomNode;
|
|
8
|
+
protected valuesMap?: SignalMap;
|
|
9
|
+
protected isObserved: boolean;
|
|
10
|
+
private forceObservedAtoms?;
|
|
11
|
+
constructor(source: T);
|
|
12
|
+
protected flushChange(): void;
|
|
13
|
+
getNode(): unknown;
|
|
14
|
+
reportChanged(): void;
|
|
15
|
+
protected reportObserveDeep(): void;
|
|
16
|
+
reportObserved(deep?: boolean): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AtomNode, ObservedAtomNode, SignalNode } from "../preact";
|
|
2
|
+
declare class NodeMap<K = unknown, GraphNode extends AtomNode | SignalNode<unknown> = AtomNode | SignalNode<unknown>> {
|
|
3
|
+
private map;
|
|
4
|
+
private weakMap;
|
|
5
|
+
private observedAtom?;
|
|
6
|
+
private cleanUpRegistered;
|
|
7
|
+
constructor(observedAtom?: ObservedAtomNode);
|
|
8
|
+
private registerCleanup;
|
|
9
|
+
protected createNode(_initialValue?: unknown): GraphNode;
|
|
10
|
+
get(key: unknown): GraphNode | undefined;
|
|
11
|
+
delete(key: K): void;
|
|
12
|
+
add(key: K, atom: GraphNode): void;
|
|
13
|
+
getOrCreate(key: K, value?: unknown): GraphNode;
|
|
14
|
+
reportObserved(key: K, value?: unknown): void;
|
|
15
|
+
reportChanged(key: K, value?: unknown): void;
|
|
16
|
+
}
|
|
17
|
+
export declare class AtomMap<K = unknown> extends NodeMap<K, AtomNode> {
|
|
18
|
+
protected createNode(): AtomNode;
|
|
19
|
+
}
|
|
20
|
+
export declare class SignalMap<K = unknown, V = unknown> extends NodeMap<K, SignalNode<V>> {
|
|
21
|
+
protected createNode(initialValue?: unknown): SignalNode<V>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CollectionAdministration } from "../collection";
|
|
2
|
+
import { PreactObjectAdministration } from "../preact";
|
|
3
|
+
import { ArrayAdministration } from "../array";
|
|
4
|
+
import { DateAdministration } from "../date";
|
|
5
|
+
import { Administration } from "./Administration";
|
|
6
|
+
export declare function getAdministration<T extends object>(obj: T): T extends Set<infer S> ? CollectionAdministration<S> : T extends Map<infer K, infer V> ? CollectionAdministration<K, V> : T extends Array<infer R> ? ArrayAdministration<R> : T extends Date ? DateAdministration : PreactObjectAdministration<any>;
|
|
7
|
+
export declare function getSource<T>(obj: T): T;
|
|
8
|
+
export declare function getAction<T extends Function>(fn: T): T;
|
|
9
|
+
export declare function getObservableClassInstance<T extends object>(value: T): T;
|
|
10
|
+
export declare function getObservableIfExists<T>(value: T): T | undefined;
|
|
11
|
+
export declare function createObservableWithCustomAdministration<T>(value: T, Adm: new (obj: any) => Administration): T;
|
|
12
|
+
export declare function getObservable<T>(value: T): T;
|
|
13
|
+
export declare function isObservable(obj: unknown): boolean;
|
|
14
|
+
export declare function getInternalNode(obj: object, key?: PropertyKey): any;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AtomNode, ComputedNode, SignalNode } from "../preact";
|
|
2
|
+
export declare function defaultEquals<T>(a: T, b: T): boolean;
|
|
3
|
+
export declare function isNonPrimitive(val: unknown): val is object;
|
|
4
|
+
export declare function isPropertyKey(val: unknown): val is string | number | symbol;
|
|
5
|
+
export type PropertyType = "action" | "computed" | "observable";
|
|
6
|
+
export declare function getPropertyType(key: PropertyKey, obj: object): PropertyType | null;
|
|
7
|
+
export declare function getPropertyDescriptor(obj: object, key: PropertyKey): PropertyDescriptor | undefined;
|
|
8
|
+
export declare function isPlainObject(value: unknown): value is object;
|
|
9
|
+
export declare function resolveNode(node: SignalNode<unknown> | AtomNode | ComputedNode<unknown>): unknown;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AtomNode, ComputedNode } from "./preact";
|
|
2
|
+
import { PropertyType } from "./internal/utils";
|
|
3
|
+
import { Administration } from "./internal/Administration";
|
|
4
|
+
import { AtomMap, SignalMap } from "./internal/NodeMap";
|
|
5
|
+
export declare class ObjectAdministration<T extends object> extends Administration<T> {
|
|
6
|
+
keysAtom: AtomNode;
|
|
7
|
+
hasMap: AtomMap<PropertyKey>;
|
|
8
|
+
valuesMap: SignalMap<PropertyKey>;
|
|
9
|
+
computedMap: Map<PropertyKey, ComputedNode<T[keyof T]>>;
|
|
10
|
+
types: Map<PropertyKey, PropertyType | null>;
|
|
11
|
+
static proxyTraps: ProxyHandler<object>;
|
|
12
|
+
constructor(source?: T);
|
|
13
|
+
private get;
|
|
14
|
+
private set;
|
|
15
|
+
private getComputed;
|
|
16
|
+
private callComputed;
|
|
17
|
+
private getType;
|
|
18
|
+
protected reportObserveDeep(): void;
|
|
19
|
+
reportChanged(): void;
|
|
20
|
+
getNode(key?: keyof T): unknown;
|
|
21
|
+
read(key: keyof T): unknown;
|
|
22
|
+
write(key: keyof T, newValue: T[keyof T]): void;
|
|
23
|
+
has(key: keyof T): boolean;
|
|
24
|
+
remove(key: keyof T): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { signal, Signal, ReadonlySignal, batch, effect, untracked } from "@preact/signals-core";
|
|
2
|
+
import { ObjectAdministration } from "./object";
|
|
3
|
+
export { isObservable } from "./index";
|
|
4
|
+
export declare class PreactObjectAdministration<T extends object> extends ObjectAdministration<T> {
|
|
5
|
+
static proxyTraps: ProxyHandler<object>;
|
|
6
|
+
}
|
|
7
|
+
export interface AtomNode {
|
|
8
|
+
reportObserved(): void;
|
|
9
|
+
reportChanged(val?: unknown): void;
|
|
10
|
+
node?: Signal<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export type ObservedAtomNode = AtomNode & {
|
|
13
|
+
observing: boolean;
|
|
14
|
+
onObservedStateChange(callback: (observing: boolean) => void): () => void;
|
|
15
|
+
};
|
|
16
|
+
export interface SignalNode<T> {
|
|
17
|
+
reportObserved(): void;
|
|
18
|
+
reportChanged(val: T): void;
|
|
19
|
+
node?: Signal<T>;
|
|
20
|
+
get: () => T;
|
|
21
|
+
set: (value: T) => T;
|
|
22
|
+
}
|
|
23
|
+
export interface ComputedNode<T> {
|
|
24
|
+
get(): T;
|
|
25
|
+
node?: ReadonlySignal<T>;
|
|
26
|
+
clear: () => void;
|
|
27
|
+
}
|
|
28
|
+
export interface ListenerNode {
|
|
29
|
+
dispose: () => void;
|
|
30
|
+
track: <T>(trackFn: () => T) => T;
|
|
31
|
+
isDisposed: boolean;
|
|
32
|
+
}
|
|
33
|
+
export declare function createObservedAtom(): {
|
|
34
|
+
node: Signal<number>;
|
|
35
|
+
reportObserved(): number;
|
|
36
|
+
reportChanged(): number;
|
|
37
|
+
readonly observing: boolean;
|
|
38
|
+
onObservedStateChange(callback: (observing: boolean) => void): () => void;
|
|
39
|
+
};
|
|
40
|
+
export declare function createSignal<T>(initialValue: T): SignalNode<T>;
|
|
41
|
+
export declare function createAtom(): AtomNode;
|
|
42
|
+
export { effect, signal, batch, untracked, Signal, ReadonlySignal };
|
|
43
|
+
export declare function reaction<T>(fn: () => T, callback: (value: T) => void): () => void;
|
|
44
|
+
export type Listener = {
|
|
45
|
+
dispose: () => void;
|
|
46
|
+
track: <T>(trackFn: () => T) => T;
|
|
47
|
+
isDisposed: boolean;
|
|
48
|
+
callback(listener: Listener): void;
|
|
49
|
+
};
|
|
50
|
+
export declare function createListener(callback: (listener: Listener) => void): Listener;
|
|
51
|
+
export declare function createComputed<T>(fn: () => T, context?: unknown): ComputedNode<T>;
|
|
52
|
+
export type PreactObservable<T> = T extends Function ? T : T extends Map<infer K, infer V> ? Map<K, PreactObservable<V>> : T extends Array<infer V> ? Array<PreactObservable<V>> : T extends Set<infer V> ? Set<PreactObservable<V>> : T extends WeakSet<infer V> ? WeakSet<PreactObservable<V>> : T extends WeakMap<infer K, infer V> ? WeakMap<K, PreactObservable<V>> : {
|
|
53
|
+
[key in keyof T]: T[key] extends object ? PreactObservable<T[key]> : T[key];
|
|
54
|
+
} & {
|
|
55
|
+
readonly [key in keyof T as T[key] extends object ? never : `$${string & key}`]?: Signal<T[key]>;
|
|
56
|
+
};
|
|
57
|
+
export declare function observable<T>(obj: T): PreactObservable<T>;
|
|
58
|
+
export declare function observable(value: undefined, context: ClassFieldDecoratorContext): void;
|
|
59
|
+
export declare function computed<T>(value: () => T, context: ClassGetterDecoratorContext): void;
|
|
60
|
+
export declare function computed<T>(fn: () => T): ReadonlySignal<T>;
|
|
61
|
+
export declare function source<T>(obj: PreactObservable<T> | T): T;
|
|
62
|
+
export declare class Observable {
|
|
63
|
+
constructor();
|
|
64
|
+
}
|
|
65
|
+
export declare function reportChanged<T extends object>(obj: T): T;
|
|
66
|
+
export declare function reportObserved<T extends object>(obj: T, opts?: {
|
|
67
|
+
deep?: boolean;
|
|
68
|
+
}): T;
|
|
69
|
+
export declare function getSignal<T extends object>(obj: T, key: keyof T): Signal<T[keyof T]>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Props, StoreConfiguration } from "../types";
|
|
2
|
+
export declare function allowNewStore<T>(fn: () => T): T;
|
|
3
|
+
export declare function createStore<K extends Store<T>, T extends Props>(Type: new (props: T) => K, props?: T): K;
|
|
4
|
+
export declare function updateStore<K extends Store<T>, T extends Props>(store: K, props: T): K;
|
|
5
|
+
export declare function types<T extends Store>(config: Partial<StoreConfiguration<T>>): Partial<StoreConfiguration<T>>;
|
|
6
|
+
export default class Store<PropsType extends Props = Props> {
|
|
7
|
+
static get types(): StoreConfiguration<unknown>;
|
|
8
|
+
props: PropsType;
|
|
9
|
+
constructor(props: PropsType);
|
|
10
|
+
get key(): string | number | undefined;
|
|
11
|
+
reaction<T>(track: () => T, callback: (a: T) => void): () => void;
|
|
12
|
+
storeDidMount(): void;
|
|
13
|
+
storeWillUnmount(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PreactObjectAdministration as ObjectAdministration } from "../observables";
|
|
2
|
+
import Store from "./Store";
|
|
3
|
+
import { StoreConfiguration, Props } from "../types";
|
|
4
|
+
export declare function updateProps(props: Props, newProps: Props): void;
|
|
5
|
+
export declare function getStoreAdm(store: Store): StoreAdministration;
|
|
6
|
+
export declare class StoreAdministration<StoreType extends Store = Store> extends ObjectAdministration<Store> {
|
|
7
|
+
static proxyTraps: ProxyHandler<object>;
|
|
8
|
+
parent: StoreAdministration | null;
|
|
9
|
+
mounted: boolean;
|
|
10
|
+
private contextCache;
|
|
11
|
+
private childStoreDataMap;
|
|
12
|
+
private reactionsUnsub;
|
|
13
|
+
private configurationGetter?;
|
|
14
|
+
setConfiguration(configurationGetter: () => StoreConfiguration<StoreType>): void;
|
|
15
|
+
private get configuration();
|
|
16
|
+
private createChildStore;
|
|
17
|
+
private setStoreList;
|
|
18
|
+
private setSingleStore;
|
|
19
|
+
private updateStore;
|
|
20
|
+
private getComputedGetter;
|
|
21
|
+
private initializeStore;
|
|
22
|
+
private getStore;
|
|
23
|
+
private getModelRef;
|
|
24
|
+
isRoot(): boolean;
|
|
25
|
+
getContextValue<T>(contextId: symbol, provideSymbol: symbol, defaultValue: T | undefined, hasDefault: boolean): T;
|
|
26
|
+
private lookupContextValue;
|
|
27
|
+
reaction<T>(track: () => T, callback: (a: T) => void): () => void;
|
|
28
|
+
mount(parent?: StoreAdministration | null): void;
|
|
29
|
+
unmount(): void;
|
|
30
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import Store from "./store/Store";
|
|
2
|
+
import Model from "./model/Model";
|
|
3
|
+
export type StoreElement = {
|
|
4
|
+
Type: new (...args: unknown[]) => Store;
|
|
5
|
+
props: Props;
|
|
6
|
+
key: string | number;
|
|
7
|
+
};
|
|
8
|
+
export type ChildStore = Store | Store[] | null;
|
|
9
|
+
export type Key = string | number | undefined;
|
|
10
|
+
export type Context = {
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
export type Props = {
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
key?: Key;
|
|
16
|
+
models?: {
|
|
17
|
+
[key: string]: Model | Model[] | null;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type StoreCtor<S extends Store = Store> = (new (...args: ConstructorParameters<typeof Store>) => S) & {
|
|
21
|
+
[P in keyof Store]: Store[P];
|
|
22
|
+
};
|
|
23
|
+
export type ChildModel = Model | Model[] | null;
|
|
24
|
+
export type IdType = string | number;
|
|
25
|
+
export declare enum CommonCfgTypes {
|
|
26
|
+
child = "child"
|
|
27
|
+
}
|
|
28
|
+
export declare enum ModelCfgTypes {
|
|
29
|
+
state = "state",
|
|
30
|
+
id = "id",
|
|
31
|
+
modelRef = "modelRef"
|
|
32
|
+
}
|
|
33
|
+
export declare enum StoreCfgTypes {
|
|
34
|
+
model = "model"
|
|
35
|
+
}
|
|
36
|
+
export declare enum ObservableCfgTypes {
|
|
37
|
+
observable = "observable",
|
|
38
|
+
computed = "computed"
|
|
39
|
+
}
|
|
40
|
+
export type ConfigurationTypes = CommonCfgTypes | ModelCfgTypes | StoreCfgTypes | ObservableCfgTypes;
|
|
41
|
+
export type ConfigurationType = {
|
|
42
|
+
type: ConfigurationTypes;
|
|
43
|
+
childType?: Function;
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
};
|
|
46
|
+
export type ModelConfiguration<T> = Record<PropertyKey, ConfigurationType>;
|
|
47
|
+
export type StoreConfiguration<T> = Record<PropertyKey, ConfigurationType>;
|
|
48
|
+
export type Configuration<T> = ModelConfiguration<T> | StoreConfiguration<T>;
|
|
49
|
+
type SnapshotValue<T> = T extends Model ? Snapshot<T> : T extends Array<infer R> ? R extends Model ? Array<Snapshot<R>> : T : T;
|
|
50
|
+
export type Snapshot<T extends Model = Model> = {
|
|
51
|
+
[K in keyof T]?: T[K] extends infer U ? U extends Model | Model[] ? SnapshotValue<U> | null : U extends null | undefined ? null : SnapshotValue<Exclude<U, null | undefined>> | null : never;
|
|
52
|
+
};
|
|
53
|
+
export type SnapshotDiff<T extends Model = Model> = {
|
|
54
|
+
undo: Snapshot<T>;
|
|
55
|
+
redo: Snapshot<T>;
|
|
56
|
+
};
|
|
57
|
+
export type SnapshotChange<T extends Model = Model> = (snapshot: Snapshot<T>, model: T) => void;
|
|
58
|
+
export type RefSnapshot = {
|
|
59
|
+
[key: string]: IdType;
|
|
60
|
+
[key: number]: IdType;
|
|
61
|
+
};
|
|
62
|
+
export declare const childType: ((childType: Function) => ConfigurationType) & {
|
|
63
|
+
type: CommonCfgTypes;
|
|
64
|
+
};
|
|
65
|
+
export declare const stateType: ConfigurationType;
|
|
66
|
+
export declare const modelRefType: ((childType: Function) => ConfigurationType) & {
|
|
67
|
+
type: ModelCfgTypes;
|
|
68
|
+
};
|
|
69
|
+
export declare const idType: ConfigurationType;
|
|
70
|
+
export declare const modelType: ConfigurationType;
|
|
71
|
+
export declare const observableType: ConfigurationType;
|
|
72
|
+
export declare const computedType: ConfigurationType;
|
|
73
|
+
export {};
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ModelConfiguration } from "./types";
|
|
2
|
+
export declare function getPropertyDescriptor(obj: object, key: PropertyKey): PropertyDescriptor | undefined;
|
|
3
|
+
export declare function getParentConstructor(Ctor: Function | undefined): Function | undefined;
|
|
4
|
+
export declare function clone<T>(val: T): T;
|
|
5
|
+
export declare function getDiff<T extends object>(o1: T, o2: T, getConfig: (snapshot: object) => ModelConfiguration<unknown> | undefined): Partial<T> | null;
|