@jbrowse/mobx-state-tree 5.6.10 → 5.7.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/core/action.js.map +1 -1
- package/dist/core/actionContext.js.map +1 -1
- package/dist/core/flow.js.map +1 -1
- package/dist/core/json-patch.js.map +1 -1
- package/dist/core/mst-operations.js.map +1 -1
- package/dist/core/node/BaseNode.js.map +1 -1
- package/dist/core/node/Hook.js.map +1 -1
- package/dist/core/node/create-node.js.map +1 -1
- package/dist/core/node/identifier-cache.js.map +1 -1
- package/dist/core/node/livelinessChecking.js.map +1 -1
- package/dist/core/node/node-utils.js.map +1 -1
- package/dist/core/node/object-node.d.ts +3 -1
- package/dist/core/node/object-node.js +2 -1
- package/dist/core/node/object-node.js.map +1 -1
- package/dist/core/node/scalar-node.d.ts +3 -1
- package/dist/core/node/scalar-node.js +2 -1
- package/dist/core/node/scalar-node.js.map +1 -1
- package/dist/core/process.js.map +1 -1
- package/dist/core/type/type-checker.js.map +1 -1
- package/dist/core/type/type.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/middlewares/create-action-tracking-middleware.js.map +1 -1
- package/dist/middlewares/createActionTrackingMiddleware2.js.map +1 -1
- package/dist/middlewares/on-action.js.map +1 -1
- package/dist/package.json +1 -0
- package/dist/types/complex-types/array.d.ts +2 -1
- package/dist/types/complex-types/array.js +2 -1
- package/dist/types/complex-types/array.js.map +1 -1
- package/dist/types/complex-types/map.d.ts +2 -1
- package/dist/types/complex-types/map.js +2 -1
- package/dist/types/complex-types/map.js.map +1 -1
- package/dist/types/complex-types/model.d.ts +2 -1
- package/dist/types/complex-types/model.js +2 -1
- package/dist/types/complex-types/model.js.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/primitives.d.ts +2 -1
- package/dist/types/primitives.js +2 -1
- package/dist/types/primitives.js.map +1 -1
- package/dist/types/utility-types/custom.d.ts +2 -1
- package/dist/types/utility-types/custom.js +2 -1
- package/dist/types/utility-types/custom.js.map +1 -1
- package/dist/types/utility-types/enumeration.js.map +1 -1
- package/dist/types/utility-types/frozen.d.ts +2 -1
- package/dist/types/utility-types/frozen.js +2 -1
- package/dist/types/utility-types/frozen.js.map +1 -1
- package/dist/types/utility-types/identifier.d.ts +2 -1
- package/dist/types/utility-types/identifier.js +2 -1
- package/dist/types/utility-types/identifier.js.map +1 -1
- package/dist/types/utility-types/late.js +2 -1
- package/dist/types/utility-types/late.js.map +1 -1
- package/dist/types/utility-types/lazy.d.ts +2 -1
- package/dist/types/utility-types/lazy.js +2 -1
- package/dist/types/utility-types/lazy.js.map +1 -1
- package/dist/types/utility-types/literal.d.ts +2 -1
- package/dist/types/utility-types/literal.js +2 -1
- package/dist/types/utility-types/literal.js.map +1 -1
- package/dist/types/utility-types/maybe.js.map +1 -1
- package/dist/types/utility-types/optional.d.ts +2 -1
- package/dist/types/utility-types/optional.js +2 -1
- package/dist/types/utility-types/optional.js.map +1 -1
- package/dist/types/utility-types/reference.d.ts +2 -1
- package/dist/types/utility-types/reference.js +2 -1
- package/dist/types/utility-types/reference.js.map +1 -1
- package/dist/types/utility-types/refinement.js +2 -1
- package/dist/types/utility-types/refinement.js.map +1 -1
- package/dist/types/utility-types/resilient.js +2 -1
- package/dist/types/utility-types/resilient.js.map +1 -1
- package/dist/types/utility-types/snapshotProcessor.js +3 -2
- package/dist/types/utility-types/snapshotProcessor.js.map +1 -1
- package/dist/types/utility-types/union.d.ts +2 -1
- package/dist/types/utility-types/union.js +2 -1
- package/dist/types/utility-types/union.js.map +1 -1
- package/dist/utils.js.map +1 -1
- package/esm/core/action.d.ts +87 -0
- package/esm/core/action.js +219 -0
- package/esm/core/action.js.map +1 -0
- package/esm/core/actionContext.d.ts +27 -0
- package/esm/core/actionContext.js +37 -0
- package/esm/core/actionContext.js.map +1 -0
- package/esm/core/flow.d.ts +69 -0
- package/esm/core/flow.js +173 -0
- package/esm/core/flow.js.map +1 -0
- package/esm/core/json-patch.d.ts +46 -0
- package/esm/core/json-patch.js +125 -0
- package/esm/core/json-patch.js.map +1 -0
- package/esm/core/mst-operations.d.ts +459 -0
- package/esm/core/mst-operations.js +844 -0
- package/esm/core/mst-operations.js.map +1 -0
- package/esm/core/node/BaseNode.d.ts +62 -0
- package/esm/core/node/BaseNode.js +148 -0
- package/esm/core/node/BaseNode.js.map +1 -0
- package/esm/core/node/Hook.d.ts +17 -0
- package/esm/core/node/Hook.js +12 -0
- package/esm/core/node/Hook.js.map +1 -0
- package/esm/core/node/create-node.d.ts +16 -0
- package/esm/core/node/create-node.js +36 -0
- package/esm/core/node/create-node.js.map +1 -0
- package/esm/core/node/identifier-cache.d.ts +19 -0
- package/esm/core/node/identifier-cache.js +111 -0
- package/esm/core/node/identifier-cache.js.map +1 -0
- package/esm/core/node/livelinessChecking.d.ts +37 -0
- package/esm/core/node/livelinessChecking.js +33 -0
- package/esm/core/node/livelinessChecking.js.map +1 -0
- package/esm/core/node/node-utils.d.ts +83 -0
- package/esm/core/node/node-utils.js +153 -0
- package/esm/core/node/node-utils.js.map +1 -0
- package/esm/core/node/object-node.d.ts +101 -0
- package/esm/core/node/object-node.js +542 -0
- package/esm/core/node/object-node.js.map +1 -0
- package/esm/core/node/scalar-node.d.ts +21 -0
- package/esm/core/node/scalar-node.js +86 -0
- package/esm/core/node/scalar-node.js.map +1 -0
- package/esm/core/process.d.ts +50 -0
- package/esm/core/process.js +35 -0
- package/esm/core/process.js.map +1 -0
- package/esm/core/type/type-checker.d.ts +69 -0
- package/esm/core/type/type-checker.js +144 -0
- package/esm/core/type/type-checker.js.map +1 -0
- package/esm/core/type/type.d.ts +317 -0
- package/esm/core/type/type.js +243 -0
- package/esm/core/type/type.js.map +1 -0
- package/esm/index.d.ts +2 -0
- package/esm/index.js +2 -0
- package/esm/index.js.map +1 -0
- package/esm/internal.d.ts +39 -0
- package/esm/internal.js +44 -0
- package/esm/internal.js.map +1 -0
- package/esm/middlewares/create-action-tracking-middleware.d.ts +24 -0
- package/esm/middlewares/create-action-tracking-middleware.js +78 -0
- package/esm/middlewares/create-action-tracking-middleware.js.map +1 -0
- package/esm/middlewares/createActionTrackingMiddleware2.d.ts +34 -0
- package/esm/middlewares/createActionTrackingMiddleware2.js +130 -0
- package/esm/middlewares/createActionTrackingMiddleware2.js.map +1 -0
- package/esm/middlewares/on-action.d.ts +87 -0
- package/esm/middlewares/on-action.js +210 -0
- package/esm/middlewares/on-action.js.map +1 -0
- package/esm/types/complex-types/array.d.ts +81 -0
- package/esm/types/complex-types/array.js +347 -0
- package/esm/types/complex-types/array.js.map +1 -0
- package/esm/types/complex-types/map.d.ts +111 -0
- package/esm/types/complex-types/map.js +356 -0
- package/esm/types/complex-types/map.js.map +1 -0
- package/esm/types/complex-types/model.d.ts +193 -0
- package/esm/types/complex-types/model.js +471 -0
- package/esm/types/complex-types/model.js.map +1 -0
- package/esm/types/index.d.ts +33 -0
- package/esm/types/index.js +35 -0
- package/esm/types/index.js.map +1 -0
- package/esm/types/primitives.d.ts +125 -0
- package/esm/types/primitives.js +177 -0
- package/esm/types/primitives.js.map +1 -0
- package/esm/types/utility-types/custom.d.ts +75 -0
- package/esm/types/utility-types/custom.js +106 -0
- package/esm/types/utility-types/custom.js.map +1 -0
- package/esm/types/utility-types/enumeration.d.ts +5 -0
- package/esm/types/utility-types/enumeration.js +31 -0
- package/esm/types/utility-types/enumeration.js.map +1 -0
- package/esm/types/utility-types/frozen.d.ts +24 -0
- package/esm/types/utility-types/frozen.js +92 -0
- package/esm/types/utility-types/frozen.js.map +1 -0
- package/esm/types/utility-types/identifier.d.ts +87 -0
- package/esm/types/utility-types/identifier.js +121 -0
- package/esm/types/utility-types/identifier.js.map +1 -0
- package/esm/types/utility-types/late.d.ts +10 -0
- package/esm/types/utility-types/late.js +106 -0
- package/esm/types/utility-types/late.js.map +1 -0
- package/esm/types/utility-types/lazy.d.ts +23 -0
- package/esm/types/utility-types/lazy.js +72 -0
- package/esm/types/utility-types/lazy.js.map +1 -0
- package/esm/types/utility-types/literal.d.ts +38 -0
- package/esm/types/utility-types/literal.js +58 -0
- package/esm/types/utility-types/literal.js.map +1 -0
- package/esm/types/utility-types/maybe.d.ts +26 -0
- package/esm/types/utility-types/maybe.js +26 -0
- package/esm/types/utility-types/maybe.js.map +1 -0
- package/esm/types/utility-types/optional.d.ts +42 -0
- package/esm/types/utility-types/optional.js +135 -0
- package/esm/types/utility-types/optional.js.map +1 -0
- package/esm/types/utility-types/reference.d.ts +90 -0
- package/esm/types/utility-types/reference.js +383 -0
- package/esm/types/utility-types/reference.js.map +1 -0
- package/esm/types/utility-types/refinement.d.ts +10 -0
- package/esm/types/utility-types/refinement.js +82 -0
- package/esm/types/utility-types/refinement.js.map +1 -0
- package/esm/types/utility-types/resilient.d.ts +18 -0
- package/esm/types/utility-types/resilient.js +118 -0
- package/esm/types/utility-types/resilient.js.map +1 -0
- package/esm/types/utility-types/snapshotProcessor.d.ts +63 -0
- package/esm/types/utility-types/snapshotProcessor.js +159 -0
- package/esm/types/utility-types/snapshotProcessor.js.map +1 -0
- package/esm/types/utility-types/union.d.ts +78 -0
- package/esm/types/utility-types/union.js +240 -0
- package/esm/types/utility-types/union.js.map +1 -0
- package/esm/utils.d.ts +230 -0
- package/esm/utils.js +449 -0
- package/esm/utils.js.map +1 -0
- package/package.json +23 -22
- package/dist/mobx-state-tree.js +0 -86
- package/dist/mobx-state-tree.js.map +0 -1
- package/dist/mobx-state-tree.module.js +0 -84
- package/dist/mobx-state-tree.module.js.map +0 -1
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
import { _allowStateChangesInsideComputed, action, computed, reaction } from "mobx";
|
|
2
|
+
import { BaseNode } from "./BaseNode.js";
|
|
3
|
+
import { EMPTY_OBJECT, EventHandlers, Hook, IdentifierCache, NodeLifeCycle, addHiddenFinalProp, convertChildNodesToArray, createActionInvoker, devMode, escapeJsonPath, extend, fail, freeze, getCurrentActionContext, getLivelinessChecking, getPath, normalizeIdentifier, resolveNodeByPathParts, splitJsonPath, splitPatch, toJSON, warnError } from "../../internal.js";
|
|
4
|
+
let nextNodeId = 1;
|
|
5
|
+
const snapshotReactionOptions = {
|
|
6
|
+
onError(e) {
|
|
7
|
+
throw e;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
* @hidden
|
|
13
|
+
*/
|
|
14
|
+
export class ObjectNode extends BaseNode {
|
|
15
|
+
nodeId = ++nextNodeId;
|
|
16
|
+
identifierAttribute;
|
|
17
|
+
identifier; // Identifier is always normalized to string, even if the identifier property isn't
|
|
18
|
+
unnormalizedIdentifier;
|
|
19
|
+
identifierCache;
|
|
20
|
+
isProtectionEnabled = true;
|
|
21
|
+
middlewares;
|
|
22
|
+
hasSnapshotPostProcessor = false;
|
|
23
|
+
_applyPatches;
|
|
24
|
+
applyPatches(patches) {
|
|
25
|
+
this.createObservableInstanceIfNeeded();
|
|
26
|
+
this._applyPatches(patches);
|
|
27
|
+
}
|
|
28
|
+
_applySnapshot;
|
|
29
|
+
applySnapshot(snapshot) {
|
|
30
|
+
this.createObservableInstanceIfNeeded();
|
|
31
|
+
this._applySnapshot(snapshot);
|
|
32
|
+
}
|
|
33
|
+
_autoUnbox = true; // unboxing is disabled when reading child nodes
|
|
34
|
+
_isRunningAction = false; // only relevant for root
|
|
35
|
+
_hasSnapshotReaction = false;
|
|
36
|
+
_observableInstanceState = 0 /* ObservableInstanceLifecycle.UNINITIALIZED */;
|
|
37
|
+
_childNodes;
|
|
38
|
+
_initialSnapshot;
|
|
39
|
+
_cachedInitialSnapshot;
|
|
40
|
+
_cachedInitialSnapshotCreated = false;
|
|
41
|
+
_snapshotComputed;
|
|
42
|
+
constructor(complexType, parent, subpath, environment, initialValue) {
|
|
43
|
+
super(complexType, parent, subpath, environment);
|
|
44
|
+
this._snapshotComputed = computed(() => freeze(this.getSnapshot()));
|
|
45
|
+
this.unbox = this.unbox.bind(this);
|
|
46
|
+
this._initialSnapshot = freeze(initialValue);
|
|
47
|
+
this.identifierAttribute = complexType.identifierAttribute;
|
|
48
|
+
if (!parent) {
|
|
49
|
+
this.identifierCache = new IdentifierCache();
|
|
50
|
+
}
|
|
51
|
+
this._childNodes = complexType.initializeChildNodes(this, this._initialSnapshot);
|
|
52
|
+
// identifier can not be changed during lifecycle of a node
|
|
53
|
+
// so we safely can read it from initial snapshot
|
|
54
|
+
this.identifier = null;
|
|
55
|
+
this.unnormalizedIdentifier = null;
|
|
56
|
+
if (this.identifierAttribute && this._initialSnapshot) {
|
|
57
|
+
let id = this._initialSnapshot[this.identifierAttribute];
|
|
58
|
+
if (id === undefined) {
|
|
59
|
+
// try with the actual node if not (for optional identifiers)
|
|
60
|
+
const childNode = this._childNodes[this.identifierAttribute];
|
|
61
|
+
if (childNode) {
|
|
62
|
+
id = childNode.value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (typeof id !== "string" && typeof id !== "number") {
|
|
66
|
+
throw fail(`Instance identifier '${this.identifierAttribute}' for type '${this.type.name}' must be a string or a number`);
|
|
67
|
+
}
|
|
68
|
+
// normalize internal identifier to string
|
|
69
|
+
this.identifier = normalizeIdentifier(id);
|
|
70
|
+
this.unnormalizedIdentifier = id;
|
|
71
|
+
}
|
|
72
|
+
if (!parent) {
|
|
73
|
+
this.identifierCache.addNodeToCache(this);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
parent.root.identifierCache.addNodeToCache(this);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
createObservableInstanceIfNeeded(fireHooks = true) {
|
|
80
|
+
if (this._observableInstanceState ===
|
|
81
|
+
0 /* ObservableInstanceLifecycle.UNINITIALIZED */) {
|
|
82
|
+
this.createObservableInstance(fireHooks);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
createObservableInstance(fireHooks = true) {
|
|
86
|
+
if (devMode()) {
|
|
87
|
+
if (this.state !== NodeLifeCycle.INITIALIZING) {
|
|
88
|
+
// istanbul ignore next
|
|
89
|
+
throw fail("assertion failed: the creation of the observable instance must be done on the initializing phase");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
this._observableInstanceState = 1 /* ObservableInstanceLifecycle.CREATING */;
|
|
93
|
+
// make sure the parent chain is created as well
|
|
94
|
+
// array with parent chain from parent to child
|
|
95
|
+
const parentChain = [];
|
|
96
|
+
let parent = this.parent;
|
|
97
|
+
// for performance reasons we never go back further than the most direct
|
|
98
|
+
// uninitialized parent
|
|
99
|
+
// this is done to avoid traversing the whole tree to the root when using
|
|
100
|
+
// the same reference again
|
|
101
|
+
while (parent &&
|
|
102
|
+
parent._observableInstanceState ===
|
|
103
|
+
0 /* ObservableInstanceLifecycle.UNINITIALIZED */) {
|
|
104
|
+
parentChain.unshift(parent);
|
|
105
|
+
parent = parent.parent;
|
|
106
|
+
}
|
|
107
|
+
// initialize the uninitialized parent chain from parent to child
|
|
108
|
+
for (const p of parentChain) {
|
|
109
|
+
// delay firing hooks until after all parents have been created
|
|
110
|
+
p.createObservableInstanceIfNeeded(false);
|
|
111
|
+
}
|
|
112
|
+
const type = this.type;
|
|
113
|
+
try {
|
|
114
|
+
// @ts-expect-error storedValue type mismatch during initialization
|
|
115
|
+
this.storedValue = type.createNewInstance(this._childNodes);
|
|
116
|
+
this.preboot();
|
|
117
|
+
this._isRunningAction = true;
|
|
118
|
+
type.finalizeNewInstance(this, this.storedValue);
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
// short-cut to die the instance, to avoid the snapshot computed starting to throw...
|
|
122
|
+
this.state = NodeLifeCycle.DEAD;
|
|
123
|
+
throw e;
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
this._isRunningAction = false;
|
|
127
|
+
}
|
|
128
|
+
this._observableInstanceState = 2 /* ObservableInstanceLifecycle.CREATED */;
|
|
129
|
+
this._snapshotComputed.trackAndCompute();
|
|
130
|
+
if (this.isRoot) {
|
|
131
|
+
this._addSnapshotReaction();
|
|
132
|
+
}
|
|
133
|
+
this._childNodes = EMPTY_OBJECT;
|
|
134
|
+
this.state = NodeLifeCycle.CREATED;
|
|
135
|
+
if (fireHooks) {
|
|
136
|
+
this.fireHook(Hook.afterCreate);
|
|
137
|
+
// Note that the parent might not be finalized at this point
|
|
138
|
+
// so afterAttach won't be called until later in that case
|
|
139
|
+
this.finalizeCreation();
|
|
140
|
+
// fire the hooks of the parents that we created
|
|
141
|
+
for (const p of parentChain.reverse()) {
|
|
142
|
+
p.fireHook(Hook.afterCreate);
|
|
143
|
+
// This will call afterAttach on the child if necessary
|
|
144
|
+
p.finalizeCreation();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
get root() {
|
|
149
|
+
const parent = this.parent;
|
|
150
|
+
return parent ? parent.root : this;
|
|
151
|
+
}
|
|
152
|
+
clearParent() {
|
|
153
|
+
if (!this.parent) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// detach if attached
|
|
157
|
+
this.fireHook(Hook.beforeDetach);
|
|
158
|
+
const previousState = this.state;
|
|
159
|
+
this.state = NodeLifeCycle.DETACHING;
|
|
160
|
+
const root = this.root;
|
|
161
|
+
const newEnv = root.environment;
|
|
162
|
+
const newIdCache = root.identifierCache.splitCache(this);
|
|
163
|
+
try {
|
|
164
|
+
this.parent.removeChild(this.subpath);
|
|
165
|
+
this.baseSetParent(null, "");
|
|
166
|
+
this.environment = newEnv;
|
|
167
|
+
this.identifierCache = newIdCache;
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
this.state = previousState;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
setParent(newParent, subpath) {
|
|
174
|
+
const parentChanged = newParent !== this.parent;
|
|
175
|
+
const subpathChanged = subpath !== this.subpath;
|
|
176
|
+
if (!parentChanged && !subpathChanged) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (devMode()) {
|
|
180
|
+
if (!subpath) {
|
|
181
|
+
// istanbul ignore next
|
|
182
|
+
throw fail("assertion failed: subpath expected");
|
|
183
|
+
}
|
|
184
|
+
if (!newParent) {
|
|
185
|
+
// istanbul ignore next
|
|
186
|
+
throw fail("assertion failed: new parent expected");
|
|
187
|
+
}
|
|
188
|
+
if (this.parent && parentChanged) {
|
|
189
|
+
throw fail(`A node cannot exists twice in the state tree. Failed to add ${this} to path '${newParent.path}/${subpath}'.`);
|
|
190
|
+
}
|
|
191
|
+
if (!this.parent && newParent.root === this) {
|
|
192
|
+
throw fail(`A state tree is not allowed to contain itself. Cannot assign ${this} to path '${newParent.path}/${subpath}'`);
|
|
193
|
+
}
|
|
194
|
+
if (!this.parent &&
|
|
195
|
+
!!this.environment &&
|
|
196
|
+
this.environment !== newParent.root.environment) {
|
|
197
|
+
throw fail(`A state tree cannot be made part of another state tree as long as their environments are different.`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (parentChanged) {
|
|
201
|
+
// attach to new parent
|
|
202
|
+
this.environment = undefined; // will use root's
|
|
203
|
+
newParent.root.identifierCache.mergeCache(this);
|
|
204
|
+
this.baseSetParent(newParent, subpath);
|
|
205
|
+
this.fireHook(Hook.afterAttach);
|
|
206
|
+
}
|
|
207
|
+
else if (subpathChanged) {
|
|
208
|
+
// moving to a new subpath on the same parent
|
|
209
|
+
this.baseSetParent(this.parent, subpath);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
fireHook(name) {
|
|
213
|
+
this.fireInternalHook(name);
|
|
214
|
+
const fn = this.storedValue &&
|
|
215
|
+
typeof this.storedValue === "object" &&
|
|
216
|
+
this.storedValue[name];
|
|
217
|
+
if (typeof fn === "function") {
|
|
218
|
+
// we check for it to allow old mobx peer dependencies that don't have the method to work (even when still bugged)
|
|
219
|
+
if (_allowStateChangesInsideComputed) {
|
|
220
|
+
_allowStateChangesInsideComputed(() => {
|
|
221
|
+
fn.apply(this.storedValue);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
fn.apply(this.storedValue);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
_snapshotUponDeath;
|
|
230
|
+
// advantage of using computed for a snapshot is that nicely respects transactions etc.
|
|
231
|
+
get snapshot() {
|
|
232
|
+
if (this.hasSnapshotPostProcessor) {
|
|
233
|
+
this.createObservableInstanceIfNeeded();
|
|
234
|
+
}
|
|
235
|
+
return this._snapshotComputed.get();
|
|
236
|
+
}
|
|
237
|
+
// NOTE: we use this method to get snapshot without creating @computed overhead
|
|
238
|
+
getSnapshot() {
|
|
239
|
+
if (!this.isAlive) {
|
|
240
|
+
return this._snapshotUponDeath;
|
|
241
|
+
}
|
|
242
|
+
return this._observableInstanceState === 2 /* ObservableInstanceLifecycle.CREATED */
|
|
243
|
+
? this._getActualSnapshot()
|
|
244
|
+
: this._getCachedInitialSnapshot();
|
|
245
|
+
}
|
|
246
|
+
_getActualSnapshot() {
|
|
247
|
+
return this.type.getSnapshot(this);
|
|
248
|
+
}
|
|
249
|
+
_getCachedInitialSnapshot() {
|
|
250
|
+
if (!this._cachedInitialSnapshotCreated) {
|
|
251
|
+
const type = this.type;
|
|
252
|
+
const childNodes = this._childNodes;
|
|
253
|
+
const snapshot = this._initialSnapshot;
|
|
254
|
+
this._cachedInitialSnapshot = type.processInitialSnapshot(childNodes, snapshot);
|
|
255
|
+
this._cachedInitialSnapshotCreated = true;
|
|
256
|
+
}
|
|
257
|
+
return this._cachedInitialSnapshot;
|
|
258
|
+
}
|
|
259
|
+
isRunningAction() {
|
|
260
|
+
if (this._isRunningAction) {
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
if (this.isRoot) {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
return this.parent.isRunningAction();
|
|
267
|
+
}
|
|
268
|
+
assertAlive(context) {
|
|
269
|
+
const livelinessChecking = getLivelinessChecking();
|
|
270
|
+
if (!this.isAlive && livelinessChecking !== "ignore") {
|
|
271
|
+
const error = this._getAssertAliveError(context);
|
|
272
|
+
switch (livelinessChecking) {
|
|
273
|
+
case "error":
|
|
274
|
+
throw fail(error);
|
|
275
|
+
case "warn":
|
|
276
|
+
warnError(error);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
_getAssertAliveError(context) {
|
|
281
|
+
const escapedPath = this.getEscapedPath(false) || this.pathUponDeath || "";
|
|
282
|
+
const subpath = (context.subpath && escapeJsonPath(context.subpath)) || "";
|
|
283
|
+
let actionContext = context.actionContext || getCurrentActionContext();
|
|
284
|
+
// try to use a real action context if possible since it includes the action name
|
|
285
|
+
if (actionContext &&
|
|
286
|
+
actionContext.type !== "action" &&
|
|
287
|
+
actionContext.parentActionEvent) {
|
|
288
|
+
actionContext = actionContext.parentActionEvent;
|
|
289
|
+
}
|
|
290
|
+
let actionFullPath = "";
|
|
291
|
+
if (actionContext && actionContext.name != null) {
|
|
292
|
+
// try to use the context, and if it not available use the node one
|
|
293
|
+
const actionPath = (actionContext &&
|
|
294
|
+
actionContext.context &&
|
|
295
|
+
getPath(actionContext.context)) ||
|
|
296
|
+
escapedPath;
|
|
297
|
+
actionFullPath = `${actionPath}.${actionContext.name}()`;
|
|
298
|
+
}
|
|
299
|
+
return `You are trying to read or write to an object that is no longer part of a state tree. (Object type: '${this.type.name}', Path upon death: '${escapedPath}', Subpath: '${subpath}', Action: '${actionFullPath}'). Either detach nodes first, or don't use objects after removing / replacing them in the tree.`;
|
|
300
|
+
}
|
|
301
|
+
getChildNode(subpath) {
|
|
302
|
+
this.assertAlive({
|
|
303
|
+
subpath
|
|
304
|
+
});
|
|
305
|
+
this._autoUnbox = false;
|
|
306
|
+
try {
|
|
307
|
+
return this._observableInstanceState ===
|
|
308
|
+
2 /* ObservableInstanceLifecycle.CREATED */
|
|
309
|
+
? this.type.getChildNode(this, subpath)
|
|
310
|
+
: this._childNodes[subpath];
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
this._autoUnbox = true;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
getChildren() {
|
|
317
|
+
this.assertAlive(EMPTY_OBJECT);
|
|
318
|
+
this._autoUnbox = false;
|
|
319
|
+
try {
|
|
320
|
+
return this._observableInstanceState ===
|
|
321
|
+
2 /* ObservableInstanceLifecycle.CREATED */
|
|
322
|
+
? this.type.getChildren(this)
|
|
323
|
+
: convertChildNodesToArray(this._childNodes);
|
|
324
|
+
}
|
|
325
|
+
finally {
|
|
326
|
+
this._autoUnbox = true;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
getChildType(propertyName) {
|
|
330
|
+
return this.type.getChildType(propertyName);
|
|
331
|
+
}
|
|
332
|
+
get isProtected() {
|
|
333
|
+
return this.root.isProtectionEnabled;
|
|
334
|
+
}
|
|
335
|
+
assertWritable(context) {
|
|
336
|
+
this.assertAlive(context);
|
|
337
|
+
if (!this.isRunningAction() && this.isProtected) {
|
|
338
|
+
throw fail(`Cannot modify '${this}', the object is protected and can only be modified by using an action.`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
removeChild(subpath) {
|
|
342
|
+
this.type.removeChild(this, subpath);
|
|
343
|
+
}
|
|
344
|
+
// bound on the constructor
|
|
345
|
+
unbox(childNode) {
|
|
346
|
+
if (!childNode) {
|
|
347
|
+
return childNode;
|
|
348
|
+
}
|
|
349
|
+
this.assertAlive({
|
|
350
|
+
subpath: childNode.subpath || childNode.subpathUponDeath
|
|
351
|
+
});
|
|
352
|
+
return this._autoUnbox ? childNode.value : childNode;
|
|
353
|
+
}
|
|
354
|
+
toString() {
|
|
355
|
+
const path = (this.isAlive ? this.path : this.pathUponDeath) || "<root>";
|
|
356
|
+
const identifier = this.identifier ? `(id: ${this.identifier})` : "";
|
|
357
|
+
return `${this.type.name}@${path}${identifier}${this.isAlive ? "" : " [dead]"}`;
|
|
358
|
+
}
|
|
359
|
+
finalizeCreation() {
|
|
360
|
+
this.baseFinalizeCreation(() => {
|
|
361
|
+
for (const child of this.getChildren()) {
|
|
362
|
+
child.finalizeCreation();
|
|
363
|
+
}
|
|
364
|
+
this.fireInternalHook(Hook.afterCreationFinalization);
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
detach() {
|
|
368
|
+
if (!this.isAlive) {
|
|
369
|
+
throw fail(`Error while detaching, node is not alive.`);
|
|
370
|
+
}
|
|
371
|
+
this.clearParent();
|
|
372
|
+
}
|
|
373
|
+
preboot() {
|
|
374
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
375
|
+
const self = this;
|
|
376
|
+
this._applyPatches = createActionInvoker(this.storedValue, "@APPLY_PATCHES", (patches) => {
|
|
377
|
+
patches.forEach(patch => {
|
|
378
|
+
if (!patch.path) {
|
|
379
|
+
self.type.applySnapshot(self, patch.value);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const parts = splitJsonPath(patch.path);
|
|
383
|
+
const node = resolveNodeByPathParts(self, parts.slice(0, -1));
|
|
384
|
+
node.applyPatchLocally(parts[parts.length - 1], patch);
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
this._applySnapshot = createActionInvoker(this.storedValue, "@APPLY_SNAPSHOT", (snapshot) => {
|
|
388
|
+
// if the snapshot is the same as the current one, avoid performing a reconcile
|
|
389
|
+
if (snapshot === self.snapshot) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
// else, apply it by calling the type logic
|
|
393
|
+
return self.type.applySnapshot(self, snapshot);
|
|
394
|
+
});
|
|
395
|
+
addHiddenFinalProp(this.storedValue, "$treenode", this);
|
|
396
|
+
addHiddenFinalProp(this.storedValue, "toJSON", toJSON);
|
|
397
|
+
}
|
|
398
|
+
die() {
|
|
399
|
+
if (!this.isAlive || this.state === NodeLifeCycle.DETACHING) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
this.aboutToDie();
|
|
403
|
+
this.finalizeDeath();
|
|
404
|
+
}
|
|
405
|
+
aboutToDie() {
|
|
406
|
+
if (this._observableInstanceState ===
|
|
407
|
+
0 /* ObservableInstanceLifecycle.UNINITIALIZED */) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
this.getChildren().forEach(node => {
|
|
411
|
+
node.aboutToDie();
|
|
412
|
+
});
|
|
413
|
+
// beforeDestroy should run before the disposers since else we could end up in a situation where
|
|
414
|
+
// a disposer added with addDisposer at this stage (beforeDestroy) is actually never released
|
|
415
|
+
this.baseAboutToDie();
|
|
416
|
+
this._internalEventsEmit("dispose" /* InternalEvents.Dispose */);
|
|
417
|
+
this._internalEventsClear("dispose" /* InternalEvents.Dispose */);
|
|
418
|
+
}
|
|
419
|
+
finalizeDeath() {
|
|
420
|
+
// invariant: not called directly but from "die"
|
|
421
|
+
this.getChildren().forEach(node => {
|
|
422
|
+
node.finalizeDeath();
|
|
423
|
+
});
|
|
424
|
+
this.root.identifierCache.notifyDied(this);
|
|
425
|
+
// "kill" the computed prop and just store the last snapshot
|
|
426
|
+
const snapshot = this.snapshot;
|
|
427
|
+
this._snapshotUponDeath = snapshot;
|
|
428
|
+
this._internalEventsClearAll();
|
|
429
|
+
this.baseFinalizeDeath();
|
|
430
|
+
}
|
|
431
|
+
onSnapshot(onChange) {
|
|
432
|
+
this._addSnapshotReaction();
|
|
433
|
+
return this._internalEventsRegister("snapshot" /* InternalEvents.Snapshot */, onChange);
|
|
434
|
+
}
|
|
435
|
+
emitSnapshot(snapshot) {
|
|
436
|
+
this._internalEventsEmit("snapshot" /* InternalEvents.Snapshot */, snapshot);
|
|
437
|
+
}
|
|
438
|
+
onPatch(handler) {
|
|
439
|
+
return this._internalEventsRegister("patch" /* InternalEvents.Patch */, handler);
|
|
440
|
+
}
|
|
441
|
+
emitPatch(basePatch, source) {
|
|
442
|
+
if (this._internalEventsHasSubscribers("patch" /* InternalEvents.Patch */)) {
|
|
443
|
+
const localizedPatch = extend({}, basePatch, {
|
|
444
|
+
path: source.path.substr(this.path.length) + "/" + basePatch.path // calculate the relative path of the patch
|
|
445
|
+
});
|
|
446
|
+
const [patch, reversePatch] = splitPatch(localizedPatch);
|
|
447
|
+
this._internalEventsEmit("patch" /* InternalEvents.Patch */, patch, reversePatch);
|
|
448
|
+
}
|
|
449
|
+
if (this.parent) {
|
|
450
|
+
this.parent.emitPatch(basePatch, source);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
hasDisposer(disposer) {
|
|
454
|
+
return this._internalEventsHas("dispose" /* InternalEvents.Dispose */, disposer);
|
|
455
|
+
}
|
|
456
|
+
addDisposer(disposer) {
|
|
457
|
+
if (!this.hasDisposer(disposer)) {
|
|
458
|
+
this._internalEventsRegister("dispose" /* InternalEvents.Dispose */, disposer, true);
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
throw fail("cannot add a disposer when it is already registered for execution");
|
|
462
|
+
}
|
|
463
|
+
removeDisposer(disposer) {
|
|
464
|
+
if (!this._internalEventsHas("dispose" /* InternalEvents.Dispose */, disposer)) {
|
|
465
|
+
throw fail("cannot remove a disposer which was never registered for execution");
|
|
466
|
+
}
|
|
467
|
+
this._internalEventsUnregister("dispose" /* InternalEvents.Dispose */, disposer);
|
|
468
|
+
}
|
|
469
|
+
removeMiddleware(middleware) {
|
|
470
|
+
if (this.middlewares) {
|
|
471
|
+
const index = this.middlewares.indexOf(middleware);
|
|
472
|
+
if (index >= 0) {
|
|
473
|
+
this.middlewares.splice(index, 1);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
addMiddleWare(handler, includeHooks = true) {
|
|
478
|
+
const middleware = { handler, includeHooks };
|
|
479
|
+
if (!this.middlewares) {
|
|
480
|
+
this.middlewares = [middleware];
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
this.middlewares.push(middleware);
|
|
484
|
+
}
|
|
485
|
+
return () => {
|
|
486
|
+
this.removeMiddleware(middleware);
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
applyPatchLocally(subpath, patch) {
|
|
490
|
+
this.assertWritable({
|
|
491
|
+
subpath
|
|
492
|
+
});
|
|
493
|
+
this.createObservableInstanceIfNeeded();
|
|
494
|
+
this.type.applyPatchLocally(this, subpath, patch);
|
|
495
|
+
}
|
|
496
|
+
_addSnapshotReaction() {
|
|
497
|
+
if (!this._hasSnapshotReaction) {
|
|
498
|
+
const snapshotDisposer = reaction(() => this.snapshot, snapshot => this.emitSnapshot(snapshot), snapshotReactionOptions);
|
|
499
|
+
this.addDisposer(snapshotDisposer);
|
|
500
|
+
this._hasSnapshotReaction = true;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// #region internal event handling
|
|
504
|
+
_internalEvents;
|
|
505
|
+
// we proxy the methods to avoid creating an EventHandlers instance when it is not needed
|
|
506
|
+
_internalEventsHasSubscribers(event) {
|
|
507
|
+
return !!this._internalEvents && this._internalEvents.hasSubscribers(event);
|
|
508
|
+
}
|
|
509
|
+
_internalEventsRegister(event, eventHandler, atTheBeginning = false) {
|
|
510
|
+
if (!this._internalEvents) {
|
|
511
|
+
this._internalEvents = new EventHandlers();
|
|
512
|
+
}
|
|
513
|
+
return this._internalEvents.register(event, eventHandler, atTheBeginning);
|
|
514
|
+
}
|
|
515
|
+
_internalEventsHas(event, eventHandler) {
|
|
516
|
+
return (!!this._internalEvents && this._internalEvents.has(event, eventHandler));
|
|
517
|
+
}
|
|
518
|
+
_internalEventsUnregister(event, eventHandler) {
|
|
519
|
+
if (this._internalEvents) {
|
|
520
|
+
this._internalEvents.unregister(event, eventHandler);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
_internalEventsEmit(event, ...args) {
|
|
524
|
+
if (this._internalEvents) {
|
|
525
|
+
this._internalEvents.emit(event, ...args);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
_internalEventsClear(event) {
|
|
529
|
+
if (this._internalEvents) {
|
|
530
|
+
this._internalEvents.clear(event);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
_internalEventsClearAll() {
|
|
534
|
+
if (this._internalEvents) {
|
|
535
|
+
this._internalEvents.clearAll();
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
ObjectNode.prototype.createObservableInstance = action(ObjectNode.prototype.createObservableInstance);
|
|
540
|
+
ObjectNode.prototype.detach = action(ObjectNode.prototype.detach);
|
|
541
|
+
ObjectNode.prototype.die = action(ObjectNode.prototype.die);
|
|
542
|
+
//# sourceMappingURL=object-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-node.js","sourceRoot":"","sources":["../../../src/core/node/object-node.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type IComputedValue,\n _allowStateChangesInsideComputed,\n action,\n computed,\n reaction\n} from \"mobx\"\n\nimport { BaseNode } from \"./BaseNode.ts\"\nimport { ComplexType } from \"../type/type.ts\"\nimport {\n EMPTY_OBJECT,\n EventHandlers,\n Hook,\n IdentifierCache,\n NodeLifeCycle,\n addHiddenFinalProp,\n convertChildNodesToArray,\n createActionInvoker,\n devMode,\n escapeJsonPath,\n extend,\n fail,\n freeze,\n getCurrentActionContext,\n getLivelinessChecking,\n getPath,\n normalizeIdentifier,\n resolveNodeByPathParts,\n splitJsonPath,\n splitPatch,\n toJSON,\n warnError\n} from \"../../internal.ts\"\n\nimport type {\n AnyNode,\n ArgumentTypes,\n IAnyType,\n IDisposer,\n IJsonPatch,\n IMiddleware,\n IMiddlewareEvent,\n IMiddlewareHandler,\n IReversibleJsonPatch,\n IStateTreeNode,\n IType,\n ReferenceIdentifier\n} from \"../../internal.ts\"\n\nlet nextNodeId = 1\n\nconst enum ObservableInstanceLifecycle {\n // the actual observable instance has not been created yet\n UNINITIALIZED,\n // the actual observable instance is being created\n CREATING,\n // the actual observable instance has been created\n CREATED\n}\n\nconst enum InternalEvents {\n Dispose = \"dispose\",\n Patch = \"patch\",\n Snapshot = \"snapshot\"\n}\n\n/**\n * @internal\n * @hidden\n */\nexport interface IChildNodesMap {\n [key: string]: AnyNode\n}\n\nconst snapshotReactionOptions = {\n onError(e: any) {\n throw e\n }\n}\n\ntype InternalEventHandlers<S> = {\n [InternalEvents.Dispose]: IDisposer\n [InternalEvents.Patch]: (patch: IJsonPatch, reversePatch: IJsonPatch) => void\n [InternalEvents.Snapshot]: (snapshot: S) => void\n}\n\n/**\n * @internal\n * @hidden\n */\nexport class ObjectNode<C, S, T> extends BaseNode<C, S, T> {\n declare readonly type: ComplexType<C, S, T>\n declare storedValue: T & IStateTreeNode<IType<C, S, T>>\n\n readonly nodeId = ++nextNodeId\n readonly identifierAttribute?: string\n readonly identifier: string | null // Identifier is always normalized to string, even if the identifier property isn't\n readonly unnormalizedIdentifier: ReferenceIdentifier | null\n\n identifierCache?: IdentifierCache\n isProtectionEnabled = true\n middlewares?: IMiddleware[]\n hasSnapshotPostProcessor = false\n\n private _applyPatches?: (patches: IJsonPatch[]) => void\n\n applyPatches(patches: IJsonPatch[]): void {\n this.createObservableInstanceIfNeeded()\n this._applyPatches!(patches)\n }\n\n private _applySnapshot?: (snapshot: C) => void\n\n applySnapshot(snapshot: C): void {\n this.createObservableInstanceIfNeeded()\n this._applySnapshot!(snapshot)\n }\n\n private _autoUnbox = true // unboxing is disabled when reading child nodes\n _isRunningAction = false // only relevant for root\n private _hasSnapshotReaction = false\n\n private _observableInstanceState = ObservableInstanceLifecycle.UNINITIALIZED\n private _childNodes: IChildNodesMap\n private _initialSnapshot: C\n private _cachedInitialSnapshot?: S\n private _cachedInitialSnapshotCreated = false\n private _snapshotComputed: IComputedValue<S>\n\n constructor(\n complexType: ComplexType<C, S, T>,\n parent: AnyObjectNode | null,\n subpath: string,\n environment: any,\n initialValue: C\n ) {\n super(complexType, parent, subpath, environment)\n this._snapshotComputed = computed<S>(() => freeze(this.getSnapshot()))\n\n this.unbox = this.unbox.bind(this)\n\n this._initialSnapshot = freeze(initialValue)\n this.identifierAttribute = complexType.identifierAttribute\n\n if (!parent) {\n this.identifierCache = new IdentifierCache()\n }\n\n this._childNodes = complexType.initializeChildNodes(\n this,\n this._initialSnapshot\n )\n\n // identifier can not be changed during lifecycle of a node\n // so we safely can read it from initial snapshot\n this.identifier = null\n this.unnormalizedIdentifier = null\n if (this.identifierAttribute && this._initialSnapshot) {\n let id = (this._initialSnapshot as any)[this.identifierAttribute]\n if (id === undefined) {\n // try with the actual node if not (for optional identifiers)\n const childNode = this._childNodes[this.identifierAttribute]\n if (childNode) {\n id = childNode.value\n }\n }\n\n if (typeof id !== \"string\" && typeof id !== \"number\") {\n throw fail(\n `Instance identifier '${this.identifierAttribute}' for type '${this.type.name}' must be a string or a number`\n )\n }\n\n // normalize internal identifier to string\n this.identifier = normalizeIdentifier(id)\n this.unnormalizedIdentifier = id\n }\n\n if (!parent) {\n this.identifierCache!.addNodeToCache(this)\n } else {\n parent.root.identifierCache!.addNodeToCache(this)\n }\n }\n\n createObservableInstanceIfNeeded(fireHooks = true): void {\n if (\n this._observableInstanceState ===\n ObservableInstanceLifecycle.UNINITIALIZED\n ) {\n this.createObservableInstance(fireHooks)\n }\n }\n\n createObservableInstance(fireHooks = true): void {\n if (devMode()) {\n if (this.state !== NodeLifeCycle.INITIALIZING) {\n // istanbul ignore next\n throw fail(\n \"assertion failed: the creation of the observable instance must be done on the initializing phase\"\n )\n }\n }\n this._observableInstanceState = ObservableInstanceLifecycle.CREATING\n\n // make sure the parent chain is created as well\n\n // array with parent chain from parent to child\n const parentChain = []\n\n let parent = this.parent\n // for performance reasons we never go back further than the most direct\n // uninitialized parent\n // this is done to avoid traversing the whole tree to the root when using\n // the same reference again\n while (\n parent &&\n parent._observableInstanceState ===\n ObservableInstanceLifecycle.UNINITIALIZED\n ) {\n parentChain.unshift(parent)\n parent = parent.parent\n }\n\n // initialize the uninitialized parent chain from parent to child\n for (const p of parentChain) {\n // delay firing hooks until after all parents have been created\n p.createObservableInstanceIfNeeded(false)\n }\n\n const type = this.type\n\n try {\n // @ts-expect-error storedValue type mismatch during initialization\n this.storedValue = type.createNewInstance(this._childNodes)\n this.preboot()\n\n this._isRunningAction = true\n type.finalizeNewInstance(this, this.storedValue)\n } catch (e) {\n // short-cut to die the instance, to avoid the snapshot computed starting to throw...\n this.state = NodeLifeCycle.DEAD\n throw e\n } finally {\n this._isRunningAction = false\n }\n\n this._observableInstanceState = ObservableInstanceLifecycle.CREATED\n\n // NOTE: we need to touch snapshot, because non-observable\n // \"_observableInstanceState\" field was touched\n ;(this._snapshotComputed as any).trackAndCompute()\n\n if (this.isRoot) {\n this._addSnapshotReaction()\n }\n\n this._childNodes = EMPTY_OBJECT\n\n this.state = NodeLifeCycle.CREATED\n\n if (fireHooks) {\n this.fireHook(Hook.afterCreate)\n // Note that the parent might not be finalized at this point\n // so afterAttach won't be called until later in that case\n this.finalizeCreation()\n\n // fire the hooks of the parents that we created\n for (const p of parentChain.reverse()) {\n p.fireHook(Hook.afterCreate)\n // This will call afterAttach on the child if necessary\n p.finalizeCreation()\n }\n }\n }\n\n get root(): AnyObjectNode {\n const parent = this.parent\n return parent ? parent.root : this\n }\n\n clearParent(): void {\n if (!this.parent) {\n return\n }\n\n // detach if attached\n this.fireHook(Hook.beforeDetach)\n const previousState = this.state\n this.state = NodeLifeCycle.DETACHING\n\n const root = this.root\n const newEnv = root.environment\n const newIdCache = root.identifierCache!.splitCache(this)\n\n try {\n this.parent.removeChild(this.subpath)\n this.baseSetParent(null, \"\")\n this.environment = newEnv\n this.identifierCache = newIdCache\n } finally {\n this.state = previousState\n }\n }\n\n setParent(newParent: AnyObjectNode, subpath: string): void {\n const parentChanged = newParent !== this.parent\n const subpathChanged = subpath !== this.subpath\n\n if (!parentChanged && !subpathChanged) {\n return\n }\n\n if (devMode()) {\n if (!subpath) {\n // istanbul ignore next\n throw fail(\"assertion failed: subpath expected\")\n }\n if (!newParent) {\n // istanbul ignore next\n throw fail(\"assertion failed: new parent expected\")\n }\n\n if (this.parent && parentChanged) {\n throw fail(\n `A node cannot exists twice in the state tree. Failed to add ${this} to path '${newParent.path}/${subpath}'.`\n )\n }\n if (!this.parent && newParent.root === this) {\n throw fail(\n `A state tree is not allowed to contain itself. Cannot assign ${this} to path '${newParent.path}/${subpath}'`\n )\n }\n if (\n !this.parent &&\n !!this.environment &&\n this.environment !== newParent.root.environment\n ) {\n throw fail(\n `A state tree cannot be made part of another state tree as long as their environments are different.`\n )\n }\n }\n\n if (parentChanged) {\n // attach to new parent\n this.environment = undefined // will use root's\n newParent.root.identifierCache!.mergeCache(this)\n this.baseSetParent(newParent, subpath)\n this.fireHook(Hook.afterAttach)\n } else if (subpathChanged) {\n // moving to a new subpath on the same parent\n this.baseSetParent(this.parent, subpath)\n }\n }\n\n protected fireHook(name: Hook): void {\n this.fireInternalHook(name)\n\n const fn =\n this.storedValue &&\n typeof this.storedValue === \"object\" &&\n (this.storedValue as any)[name]\n if (typeof fn === \"function\") {\n // we check for it to allow old mobx peer dependencies that don't have the method to work (even when still bugged)\n if (_allowStateChangesInsideComputed) {\n _allowStateChangesInsideComputed(() => {\n fn.apply(this.storedValue)\n })\n } else {\n fn.apply(this.storedValue)\n }\n }\n }\n\n private _snapshotUponDeath?: S\n\n // advantage of using computed for a snapshot is that nicely respects transactions etc.\n get snapshot(): S {\n if (this.hasSnapshotPostProcessor) {\n this.createObservableInstanceIfNeeded()\n }\n return this._snapshotComputed.get()\n }\n\n // NOTE: we use this method to get snapshot without creating @computed overhead\n getSnapshot(): S {\n if (!this.isAlive) {\n return this._snapshotUponDeath!\n }\n return this._observableInstanceState === ObservableInstanceLifecycle.CREATED\n ? this._getActualSnapshot()\n : this._getCachedInitialSnapshot()\n }\n\n private _getActualSnapshot(): S {\n return this.type.getSnapshot(this)\n }\n\n private _getCachedInitialSnapshot(): S {\n if (!this._cachedInitialSnapshotCreated) {\n const type = this.type\n const childNodes = this._childNodes\n const snapshot = this._initialSnapshot\n\n this._cachedInitialSnapshot = type.processInitialSnapshot(\n childNodes,\n snapshot\n )\n this._cachedInitialSnapshotCreated = true\n }\n\n return this._cachedInitialSnapshot!\n }\n\n private isRunningAction(): boolean {\n if (this._isRunningAction) {\n return true\n }\n if (this.isRoot) {\n return false\n }\n return this.parent!.isRunningAction()\n }\n\n assertAlive(context: AssertAliveContext): void {\n const livelinessChecking = getLivelinessChecking()\n if (!this.isAlive && livelinessChecking !== \"ignore\") {\n const error = this._getAssertAliveError(context)\n switch (livelinessChecking) {\n case \"error\":\n throw fail(error)\n case \"warn\":\n warnError(error)\n }\n }\n }\n\n private _getAssertAliveError(context: AssertAliveContext): string {\n const escapedPath = this.getEscapedPath(false) || this.pathUponDeath || \"\"\n const subpath = (context.subpath && escapeJsonPath(context.subpath)) || \"\"\n\n let actionContext = context.actionContext || getCurrentActionContext()\n\n // try to use a real action context if possible since it includes the action name\n if (\n actionContext &&\n actionContext.type !== \"action\" &&\n actionContext.parentActionEvent\n ) {\n actionContext = actionContext.parentActionEvent\n }\n\n let actionFullPath = \"\"\n if (actionContext && actionContext.name != null) {\n // try to use the context, and if it not available use the node one\n const actionPath =\n (actionContext &&\n actionContext.context &&\n getPath(actionContext.context)) ||\n escapedPath\n actionFullPath = `${actionPath}.${actionContext.name}()`\n }\n\n return `You are trying to read or write to an object that is no longer part of a state tree. (Object type: '${this.type.name}', Path upon death: '${escapedPath}', Subpath: '${subpath}', Action: '${actionFullPath}'). Either detach nodes first, or don't use objects after removing / replacing them in the tree.`\n }\n\n getChildNode(subpath: string): AnyNode {\n this.assertAlive({\n subpath\n })\n this._autoUnbox = false\n try {\n return this._observableInstanceState ===\n ObservableInstanceLifecycle.CREATED\n ? this.type.getChildNode(this, subpath)\n : this._childNodes![subpath]\n } finally {\n this._autoUnbox = true\n }\n }\n\n getChildren(): ReadonlyArray<AnyNode> {\n this.assertAlive(EMPTY_OBJECT)\n this._autoUnbox = false\n try {\n return this._observableInstanceState ===\n ObservableInstanceLifecycle.CREATED\n ? this.type.getChildren(this)\n : convertChildNodesToArray(this._childNodes)\n } finally {\n this._autoUnbox = true\n }\n }\n\n getChildType(propertyName?: string): IAnyType {\n return this.type.getChildType(propertyName)\n }\n\n get isProtected(): boolean {\n return this.root.isProtectionEnabled\n }\n\n assertWritable(context: AssertAliveContext): void {\n this.assertAlive(context)\n if (!this.isRunningAction() && this.isProtected) {\n throw fail(\n `Cannot modify '${this}', the object is protected and can only be modified by using an action.`\n )\n }\n }\n\n removeChild(subpath: string): void {\n this.type.removeChild(this, subpath)\n }\n\n // bound on the constructor\n unbox(childNode: AnyNode | undefined): AnyNode | undefined {\n if (!childNode) {\n return childNode\n }\n\n this.assertAlive({\n subpath: childNode.subpath || childNode.subpathUponDeath\n })\n return this._autoUnbox ? childNode.value : childNode\n }\n\n toString(): string {\n const path = (this.isAlive ? this.path : this.pathUponDeath) || \"<root>\"\n const identifier = this.identifier ? `(id: ${this.identifier})` : \"\"\n return `${this.type.name}@${path}${identifier}${this.isAlive ? \"\" : \" [dead]\"}`\n }\n\n finalizeCreation(): void {\n this.baseFinalizeCreation(() => {\n for (const child of this.getChildren()) {\n child.finalizeCreation()\n }\n\n this.fireInternalHook(Hook.afterCreationFinalization)\n })\n }\n\n detach(): void {\n if (!this.isAlive) {\n throw fail(`Error while detaching, node is not alive.`)\n }\n\n this.clearParent()\n }\n\n private preboot(): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n this._applyPatches = createActionInvoker(\n this.storedValue,\n \"@APPLY_PATCHES\",\n (patches: IJsonPatch[]) => {\n patches.forEach(patch => {\n if (!patch.path) {\n self.type.applySnapshot(self, patch.value)\n return\n }\n const parts = splitJsonPath(patch.path)\n const node = resolveNodeByPathParts(\n self,\n parts.slice(0, -1)\n ) as AnyObjectNode\n node.applyPatchLocally(parts[parts.length - 1], patch)\n })\n }\n )\n this._applySnapshot = createActionInvoker(\n this.storedValue,\n \"@APPLY_SNAPSHOT\",\n (snapshot: C) => {\n // if the snapshot is the same as the current one, avoid performing a reconcile\n if (snapshot === (self.snapshot as any)) {\n return\n }\n // else, apply it by calling the type logic\n return self.type.applySnapshot(self, snapshot as any)\n }\n )\n\n addHiddenFinalProp(this.storedValue, \"$treenode\", this)\n addHiddenFinalProp(this.storedValue, \"toJSON\", toJSON)\n }\n\n die(): void {\n if (!this.isAlive || this.state === NodeLifeCycle.DETACHING) {\n return\n }\n this.aboutToDie()\n this.finalizeDeath()\n }\n\n aboutToDie(): void {\n if (\n this._observableInstanceState ===\n ObservableInstanceLifecycle.UNINITIALIZED\n ) {\n return\n }\n\n this.getChildren().forEach(node => {\n node.aboutToDie()\n })\n\n // beforeDestroy should run before the disposers since else we could end up in a situation where\n // a disposer added with addDisposer at this stage (beforeDestroy) is actually never released\n this.baseAboutToDie()\n\n this._internalEventsEmit(InternalEvents.Dispose)\n this._internalEventsClear(InternalEvents.Dispose)\n }\n\n finalizeDeath(): void {\n // invariant: not called directly but from \"die\"\n this.getChildren().forEach(node => {\n node.finalizeDeath()\n })\n this.root.identifierCache!.notifyDied(this)\n\n // \"kill\" the computed prop and just store the last snapshot\n const snapshot = this.snapshot\n this._snapshotUponDeath = snapshot\n\n this._internalEventsClearAll()\n\n this.baseFinalizeDeath()\n }\n\n onSnapshot(onChange: (snapshot: S) => void): IDisposer {\n this._addSnapshotReaction()\n return this._internalEventsRegister(InternalEvents.Snapshot, onChange)\n }\n\n protected emitSnapshot(snapshot: S): void {\n this._internalEventsEmit(InternalEvents.Snapshot, snapshot)\n }\n\n onPatch(\n handler: (patch: IJsonPatch, reversePatch: IJsonPatch) => void\n ): IDisposer {\n return this._internalEventsRegister(InternalEvents.Patch, handler)\n }\n\n emitPatch(basePatch: IReversibleJsonPatch, source: AnyNode): void {\n if (this._internalEventsHasSubscribers(InternalEvents.Patch)) {\n const localizedPatch: IReversibleJsonPatch = extend({}, basePatch, {\n path: source.path.substr(this.path.length) + \"/\" + basePatch.path // calculate the relative path of the patch\n })\n const [patch, reversePatch] = splitPatch(localizedPatch)\n this._internalEventsEmit(InternalEvents.Patch, patch, reversePatch)\n }\n if (this.parent) {\n this.parent.emitPatch(basePatch, source)\n }\n }\n\n hasDisposer(disposer: () => void): boolean {\n return this._internalEventsHas(InternalEvents.Dispose, disposer)\n }\n\n addDisposer(disposer: () => void): void {\n if (!this.hasDisposer(disposer)) {\n this._internalEventsRegister(InternalEvents.Dispose, disposer, true)\n return\n }\n throw fail(\n \"cannot add a disposer when it is already registered for execution\"\n )\n }\n\n removeDisposer(disposer: () => void): void {\n if (!this._internalEventsHas(InternalEvents.Dispose, disposer)) {\n throw fail(\n \"cannot remove a disposer which was never registered for execution\"\n )\n }\n this._internalEventsUnregister(InternalEvents.Dispose, disposer)\n }\n\n private removeMiddleware(middleware: IMiddleware): void {\n if (this.middlewares) {\n const index = this.middlewares.indexOf(middleware)\n if (index >= 0) {\n this.middlewares.splice(index, 1)\n }\n }\n }\n\n addMiddleWare(\n handler: IMiddlewareHandler,\n includeHooks: boolean = true\n ): IDisposer {\n const middleware = { handler, includeHooks }\n if (!this.middlewares) {\n this.middlewares = [middleware]\n } else {\n this.middlewares.push(middleware)\n }\n\n return () => {\n this.removeMiddleware(middleware)\n }\n }\n\n applyPatchLocally(subpath: string, patch: IJsonPatch): void {\n this.assertWritable({\n subpath\n })\n this.createObservableInstanceIfNeeded()\n this.type.applyPatchLocally(this, subpath, patch)\n }\n\n private _addSnapshotReaction(): void {\n if (!this._hasSnapshotReaction) {\n const snapshotDisposer = reaction(\n () => this.snapshot,\n snapshot => this.emitSnapshot(snapshot),\n snapshotReactionOptions\n )\n this.addDisposer(snapshotDisposer)\n this._hasSnapshotReaction = true\n }\n }\n\n // #region internal event handling\n\n private _internalEvents?: EventHandlers<InternalEventHandlers<S>>\n\n // we proxy the methods to avoid creating an EventHandlers instance when it is not needed\n\n private _internalEventsHasSubscribers(event: InternalEvents): boolean {\n return !!this._internalEvents && this._internalEvents.hasSubscribers(event)\n }\n\n private _internalEventsRegister<IE extends InternalEvents>(\n event: IE,\n eventHandler: InternalEventHandlers<S>[IE],\n atTheBeginning = false\n ): IDisposer {\n if (!this._internalEvents) {\n this._internalEvents = new EventHandlers()\n }\n return this._internalEvents.register(event, eventHandler, atTheBeginning)\n }\n\n private _internalEventsHas<IE extends InternalEvents>(\n event: IE,\n eventHandler: InternalEventHandlers<S>[IE]\n ): boolean {\n return (\n !!this._internalEvents && this._internalEvents.has(event, eventHandler)\n )\n }\n\n private _internalEventsUnregister<IE extends InternalEvents>(\n event: IE,\n eventHandler: InternalEventHandlers<S>[IE]\n ): void {\n if (this._internalEvents) {\n this._internalEvents.unregister(event, eventHandler)\n }\n }\n\n private _internalEventsEmit<IE extends InternalEvents>(\n event: IE,\n ...args: ArgumentTypes<InternalEventHandlers<S>[IE]>\n ): void {\n if (this._internalEvents) {\n this._internalEvents.emit(event, ...args)\n }\n }\n\n private _internalEventsClear(event: InternalEvents): void {\n if (this._internalEvents) {\n this._internalEvents.clear(event)\n }\n }\n\n private _internalEventsClearAll(): void {\n if (this._internalEvents) {\n this._internalEvents.clearAll()\n }\n }\n\n // #endregion\n}\nObjectNode.prototype.createObservableInstance = action(\n ObjectNode.prototype.createObservableInstance\n)\nObjectNode.prototype.detach = action(ObjectNode.prototype.detach)\nObjectNode.prototype.die = action(ObjectNode.prototype.die)\n\n/**\n * @internal\n * @hidden\n */\nexport type AnyObjectNode = ObjectNode<any, any, any>\n\n/**\n * @internal\n * @hidden\n */\nexport interface AssertAliveContext {\n subpath?: string\n actionContext?: IMiddlewareEvent\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseNode } from "./BaseNode.ts";
|
|
2
|
+
import { SimpleType } from "../type/type.ts";
|
|
3
|
+
import { type AnyObjectNode, Hook } from "../../internal.ts";
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
* @hidden
|
|
7
|
+
*/
|
|
8
|
+
export declare class ScalarNode<C, S, T> extends BaseNode<C, S, T> {
|
|
9
|
+
readonly type: SimpleType<C, S, T>;
|
|
10
|
+
constructor(simpleType: SimpleType<C, S, T>, parent: AnyObjectNode | null, subpath: string, environment: any, initialSnapshot: C);
|
|
11
|
+
get root(): AnyObjectNode;
|
|
12
|
+
setParent(newParent: AnyObjectNode, subpath: string): void;
|
|
13
|
+
get snapshot(): S;
|
|
14
|
+
getSnapshot(): S;
|
|
15
|
+
toString(): string;
|
|
16
|
+
die(): void;
|
|
17
|
+
finalizeCreation(): void;
|
|
18
|
+
aboutToDie(): void;
|
|
19
|
+
finalizeDeath(): void;
|
|
20
|
+
protected fireHook(name: Hook): void;
|
|
21
|
+
}
|