mobx-keystone 1.20.0 → 1.22.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/CHANGELOG.md +864 -853
- package/README.md +61 -61
- package/dist/mobx-keystone.esm.js +11336 -11148
- package/dist/mobx-keystone.esm.mjs +11336 -11148
- package/dist/mobx-keystone.umd.js +12229 -11738
- package/dist/types/actionMiddlewares/undoMiddleware.d.ts +1 -1
- package/dist/types/modelShared/prop.d.ts +5 -0
- package/dist/types/redux/connectReduxDevTools.d.ts +17 -4
- package/dist/types/ref/Ref.d.ts +1 -1
- package/dist/types/treeUtils/sandbox.d.ts +1 -1
- package/dist/types/types/TypeChecker.d.ts +1 -1
- package/dist/types/types/arrayBased/typesArray.d.ts +1 -1
- package/dist/types/types/arrayBased/typesTuple.d.ts +1 -1
- package/dist/types/types/objectBased/typesArraySet.d.ts +1 -1
- package/dist/types/types/objectBased/typesDataModelData.d.ts +1 -1
- package/dist/types/types/objectBased/typesModel.d.ts +1 -1
- package/dist/types/types/objectBased/typesObject.d.ts +3 -3
- package/dist/types/types/objectBased/typesObjectMap.d.ts +1 -1
- package/dist/types/types/objectBased/typesRecord.d.ts +1 -1
- package/dist/types/types/primitiveBased/typesPrimitive.d.ts +1 -1
- package/dist/types/types/types.d.ts +3 -3
- package/dist/types/types/utility/typesCodec.d.ts +1 -6
- package/dist/types/types/utility/typesCodecCore.d.ts +1 -1
- package/dist/types/types/utility/typesOr.d.ts +1 -1
- package/dist/types/types/utility/typesRefinement.d.ts +1 -1
- package/dist/types/types/utility/typesSkipCheck.d.ts +1 -1
- package/dist/types/types/utility/typesTag.d.ts +1 -1
- package/dist/types/wrappers/ObjectMap.d.ts +2 -0
- package/dist/types/wrappers/asMap.d.ts +10 -6
- package/package.json +14 -12
- package/src/action/applyAction.ts +125 -114
- package/src/action/applyMethodCall.ts +37 -37
- package/src/action/isModelAction.ts +16 -16
- package/src/action/middleware.ts +137 -137
- package/src/action/modelFlow.ts +240 -240
- package/src/action/modelFlowPromiseGenerator.ts +127 -125
- package/src/action/pendingActions.ts +42 -42
- package/src/action/wrapInAction.ts +156 -156
- package/src/actionMiddlewares/actionSerialization/actionSerialization.ts +1 -1
- package/src/actionMiddlewares/actionSerialization/applySerializedAction.ts +172 -172
- package/src/actionMiddlewares/actionSerialization/arraySerializer.ts +20 -20
- package/src/actionMiddlewares/actionSerialization/dateSerializer.ts +17 -17
- package/src/actionMiddlewares/actionSerialization/mapSerializer.ts +42 -42
- package/src/actionMiddlewares/actionSerialization/objectPathSerializer.ts +50 -50
- package/src/actionMiddlewares/actionSerialization/objectSnapshotSerializer.ts +21 -21
- package/src/actionMiddlewares/actionSerialization/plainObjectSerializer.ts +24 -32
- package/src/actionMiddlewares/actionSerialization/primitiveSerializer.ts +51 -51
- package/src/actionMiddlewares/actionSerialization/setSerializer.ts +37 -37
- package/src/actionMiddlewares/actionTrackingMiddleware.ts +3 -3
- package/src/actionMiddlewares/onActionMiddleware.ts +2 -2
- package/src/actionMiddlewares/readonlyMiddleware.ts +2 -2
- package/src/actionMiddlewares/transactionMiddleware.ts +4 -4
- package/src/actionMiddlewares/undoMiddleware.ts +804 -796
- package/src/actionMiddlewares/utils.ts +2 -2
- package/src/computedTree/computedTree.ts +143 -143
- package/src/context/context.ts +1 -1
- package/src/dataModel/BaseDataModel.ts +194 -192
- package/src/dataModel/actions.ts +1 -1
- package/src/dataModel/newDataModel.ts +57 -57
- package/src/deepChange/index.ts +1 -1
- package/src/deepChange/onDeepChange.ts +244 -244
- package/src/frozen/Frozen.ts +146 -146
- package/src/globalConfig/globalConfig.ts +107 -107
- package/src/index.ts +24 -24
- package/src/model/BaseModel.ts +275 -273
- package/src/model/ModelConstructorOptions.ts +15 -15
- package/src/model/getModelMetadata.ts +51 -51
- package/src/model/index.ts +6 -6
- package/src/model/mixins.ts +288 -288
- package/src/model/newModel.ts +301 -301
- package/src/model/utils.ts +249 -249
- package/src/modelShared/modelDecorator.ts +260 -253
- package/src/modelShared/modelInfo.ts +50 -50
- package/src/modelShared/modelSymbols.ts +3 -3
- package/src/modelShared/newModel.ts +25 -25
- package/src/modelShared/prop.ts +713 -684
- package/src/modelShared/sharedInternalModel.ts +427 -417
- package/src/modelShared/utils.ts +24 -24
- package/src/parent/core.ts +65 -65
- package/src/parent/coreObjectChildren.ts +180 -180
- package/src/parent/detach.ts +47 -47
- package/src/parent/findParent.ts +1 -1
- package/src/parent/getChildrenObjects.ts +25 -25
- package/src/parent/path.ts +386 -381
- package/src/parent/setParent.ts +149 -149
- package/src/parent/walkTree.ts +1 -1
- package/src/patch/applyPatches.ts +187 -187
- package/src/patch/jsonPatch.ts +108 -108
- package/src/patch/patchRecorder.ts +6 -1
- package/src/redux/connectReduxDevTools.ts +39 -7
- package/src/redux/redux.ts +6 -2
- package/src/ref/Ref.ts +1 -1
- package/src/ref/core.ts +339 -345
- package/src/ref/customRef.ts +3 -3
- package/src/ref/rootRef.ts +100 -100
- package/src/rootStore/attachDetach.ts +89 -89
- package/src/rootStore/rootStore.ts +1 -1
- package/src/snapshot/SnapshotOf.ts +104 -104
- package/src/snapshot/SnapshotProcessingError.ts +45 -45
- package/src/snapshot/applySnapshot.ts +177 -181
- package/src/snapshot/cloneTreeValue.ts +30 -30
- package/src/snapshot/fromArraySnapshot.ts +27 -33
- package/src/snapshot/fromModelSnapshot.ts +70 -70
- package/src/snapshot/fromPlainObjectSnapshot.ts +47 -42
- package/src/snapshot/fromSnapshot.ts +198 -198
- package/src/snapshot/getSnapshot.ts +80 -79
- package/src/snapshot/index.ts +8 -8
- package/src/snapshot/internal.ts +230 -230
- package/src/snapshot/reconcileArraySnapshot.ts +70 -70
- package/src/snapshot/reconcileModelSnapshot.ts +155 -150
- package/src/snapshot/reconcilePlainObjectSnapshot.ts +72 -72
- package/src/snapshot/reconcileSnapshot.ts +88 -88
- package/src/standardActions/actions.ts +64 -64
- package/src/standardActions/objectActions.ts +60 -60
- package/src/transforms/ImmutableDate.ts +93 -93
- package/src/transforms/asMap.ts +50 -50
- package/src/transforms/asSet.ts +22 -22
- package/src/transforms/bigint.ts +20 -20
- package/src/transforms/date.ts +40 -40
- package/src/treeUtils/deepEquals.ts +55 -55
- package/src/treeUtils/sandbox.ts +6 -3
- package/src/tweaker/TweakerPriority.ts +9 -9
- package/src/tweaker/tweak.ts +4 -3
- package/src/tweaker/tweakArray.ts +530 -475
- package/src/tweaker/tweakFrozen.ts +42 -42
- package/src/tweaker/tweakModel.ts +1 -1
- package/src/tweaker/tweakPlainObject.ts +355 -355
- package/src/tweaker/typeChecking.ts +101 -101
- package/src/types/SnapshotTypeMismatchError.ts +46 -46
- package/src/types/TypeCheckError.ts +183 -184
- package/src/types/TypeChecker.ts +202 -185
- package/src/types/arrayBased/typesArray.ts +136 -137
- package/src/types/arrayBased/typesTuple.ts +138 -139
- package/src/types/createPerEntryCachedCheck.ts +166 -160
- package/src/types/index.ts +6 -6
- package/src/types/objectBased/typesArraySet.ts +133 -134
- package/src/types/objectBased/typesDataModelData.ts +203 -204
- package/src/types/objectBased/typesModel.ts +220 -221
- package/src/types/objectBased/typesObject.ts +308 -310
- package/src/types/objectBased/typesObjectMap.ts +142 -143
- package/src/types/objectBased/typesRecord.ts +156 -157
- package/src/types/objectBased/typesRef.ts +89 -89
- package/src/types/primitiveBased/typesEnum.ts +63 -63
- package/src/types/primitiveBased/typesPrimitive.ts +219 -220
- package/src/types/registerDefaultStandardTypeResolvers.ts +21 -21
- package/src/types/resolveTypeChecker.ts +78 -78
- package/src/types/schemas.ts +208 -208
- package/src/types/tProp.ts +277 -268
- package/src/types/typeCheck.ts +21 -21
- package/src/types/typeCheckErrorUtils.ts +23 -23
- package/src/types/types.ts +142 -142
- package/src/types/utility/typeToStoredData.ts +37 -37
- package/src/types/utility/typesBigInt.ts +15 -15
- package/src/types/utility/typesCodec.ts +41 -38
- package/src/types/utility/typesCodecCore.ts +178 -178
- package/src/types/utility/typesCodecSupport.ts +806 -806
- package/src/types/utility/typesDate.ts +27 -27
- package/src/types/utility/typesMap.ts +253 -222
- package/src/types/utility/typesOr.ts +263 -259
- package/src/types/utility/typesRefinement.ts +131 -125
- package/src/types/utility/typesSet.ts +110 -110
- package/src/types/utility/typesSkipCheck.ts +69 -70
- package/src/types/utility/typesTag.ts +88 -82
- package/src/types/utility/typesUnchecked.ts +40 -40
- package/src/utils/AnyFunction.ts +4 -4
- package/src/utils/ModelPool.ts +59 -59
- package/src/utils/chainFns.ts +18 -18
- package/src/utils/decorators.ts +274 -274
- package/src/utils/errorDiagnostics.ts +204 -204
- package/src/utils/index.ts +443 -372
- package/src/wrappers/ArraySet.ts +156 -156
- package/src/wrappers/ObjectMap.ts +155 -136
- package/src/wrappers/asMap.ts +65 -30
- package/src/wrappers/asSet.ts +3 -3
|
@@ -11,7 +11,7 @@ export function rootPathToTargetPathIds(rootPath: RootPath<any>): (string | null
|
|
|
11
11
|
|
|
12
12
|
for (let i = 0; i < rootPath.path.length; i++) {
|
|
13
13
|
const targetObj = rootPath.pathObjects[i + 1] // first is root, we don't care about its ID
|
|
14
|
-
const targetObjId = isModel(targetObj) ? targetObj[modelIdKey] ?? null : null
|
|
14
|
+
const targetObjId = isModel(targetObj) ? (targetObj[modelIdKey] ?? null) : null
|
|
15
15
|
targetPathIds.push(targetObjId)
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -27,7 +27,7 @@ export function pathToTargetPathIds(root: any, path: Path): (string | null)[] {
|
|
|
27
27
|
|
|
28
28
|
for (let i = 0; i < path.length; i++) {
|
|
29
29
|
current = current[path[i]]
|
|
30
|
-
const targetObjId = isModel(current) ? current[modelIdKey] ?? null : null
|
|
30
|
+
const targetObjId = isModel(current) ? (current[modelIdKey] ?? null) : null
|
|
31
31
|
targetPathIds.push(targetObjId)
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
import { computed, IComputedValue } from "mobx"
|
|
2
|
-
import { readonlyMiddleware } from "../actionMiddlewares/readonlyMiddleware"
|
|
3
|
-
import { createContext } from "../context/context"
|
|
4
|
-
import { isDataModelClass } from "../dataModel/utils"
|
|
5
|
-
import { isModelClass } from "../model/utils"
|
|
6
|
-
import { isTreeNode } from "../tweaker/core"
|
|
7
|
-
import { tweak } from "../tweaker/tweak"
|
|
8
|
-
import { addLateInitializationFunction, failure, runBeforeOnInitSymbol } from "../utils"
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
const computedTreeContext = createContext(false)
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Returns if a given node is a computed tree node.
|
|
16
|
-
*
|
|
17
|
-
* @param node Node to check.
|
|
18
|
-
* @returns `true` if it is a computed tree node, `false` otherwise.
|
|
19
|
-
*/
|
|
20
|
-
export function isComputedTreeNode(node: object): boolean {
|
|
21
|
-
return computedTreeContext.get(node)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const tweakedComputedTreeNodes = new WeakSet<object>()
|
|
25
|
-
|
|
26
|
-
function tweakComputedTreeNode<T>(newValue: T, parent: unknown, path: string): T {
|
|
27
|
-
const tweakedValue = tweak(newValue, { parent, path })
|
|
28
|
-
if (isTreeNode(tweakedValue) && !tweakedComputedTreeNodes.has(tweakedValue)) {
|
|
29
|
-
tweakedComputedTreeNodes.add(tweakedValue)
|
|
30
|
-
readonlyMiddleware(tweakedValue)
|
|
31
|
-
computedTreeContext.set(tweakedValue, true)
|
|
32
|
-
}
|
|
33
|
-
return tweakedValue
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const computedTreeNodeInfo = new WeakMap<
|
|
37
|
-
object,
|
|
38
|
-
Map<string, { computed: IComputedValue<unknown>; value: unknown; tweakedValue: unknown }>
|
|
39
|
-
>()
|
|
40
|
-
|
|
41
|
-
function getOrCreateComputedTreeNodeInfo(instance: object) {
|
|
42
|
-
return getOrCreate(computedTreeNodeInfo, instance, () => new Map())
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Decorator for turning a computed property into a computed tree which supports tree traversal
|
|
47
|
-
* functions, contexts, references, etc.
|
|
48
|
-
*/
|
|
49
|
-
export function computedTree(...args: any[]): any {
|
|
50
|
-
const createGetter = (propertyKey: string) =>
|
|
51
|
-
function (this: any) {
|
|
52
|
-
const entry = getOrCreateComputedTreeNodeInfo(this).get(propertyKey)!
|
|
53
|
-
|
|
54
|
-
const oldValue = entry.value
|
|
55
|
-
const newValue = entry.computed.get()
|
|
56
|
-
|
|
57
|
-
if (oldValue === newValue) {
|
|
58
|
-
return entry.tweakedValue
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const oldTweakedValue = entry.tweakedValue
|
|
62
|
-
tweak(oldTweakedValue, undefined)
|
|
63
|
-
|
|
64
|
-
const tweakedValue = tweakComputedTreeNode(newValue, this, propertyKey)
|
|
65
|
-
entry.value = newValue
|
|
66
|
-
entry.tweakedValue = tweakedValue
|
|
67
|
-
return tweakedValue
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const runLateInit = (instance: any, original: () => any, propertyKey: string) => {
|
|
71
|
-
const c = computed(() => original.call(instance), { keepAlive: true })
|
|
72
|
-
const newValue = c.get()
|
|
73
|
-
const tweakedValue = tweakComputedTreeNode(newValue, instance, propertyKey)
|
|
74
|
-
|
|
75
|
-
getOrCreateComputedTreeNodeInfo(instance).set(propertyKey, {
|
|
76
|
-
computed: c,
|
|
77
|
-
value: newValue,
|
|
78
|
-
tweakedValue,
|
|
79
|
-
})
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const checkInstanceClass = (instance: any) => {
|
|
83
|
-
const instanceClass = instance.constructor
|
|
84
|
-
if (!(isModelClass(instanceClass) || isDataModelClass(instanceClass))) {
|
|
85
|
-
throw failure("@computedTree can only decorate 'get' accessors of class or data models")
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (typeof args[1] === "object") {
|
|
90
|
-
// standard decorators
|
|
91
|
-
const value = args[0]
|
|
92
|
-
const ctx = args[1] as ClassGetterDecoratorContext
|
|
93
|
-
|
|
94
|
-
if (ctx.kind !== "getter") {
|
|
95
|
-
throw failure("@computedTree requires a 'get' accessor")
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
checkDecoratorContext("computedTree", ctx.name, ctx.static)
|
|
99
|
-
|
|
100
|
-
const propertyKey = ctx.name as string
|
|
101
|
-
const original = value
|
|
102
|
-
|
|
103
|
-
let classChecked = false
|
|
104
|
-
|
|
105
|
-
ctx.addInitializer(function (this: any) {
|
|
106
|
-
const instance = this
|
|
107
|
-
|
|
108
|
-
if (!classChecked) {
|
|
109
|
-
checkInstanceClass(instance)
|
|
110
|
-
classChecked = true
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
runLateInit(instance, original, propertyKey)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
const getter = createGetter(propertyKey)
|
|
117
|
-
copyFunctionMetadata(original, getter)
|
|
118
|
-
return getter
|
|
119
|
-
} else {
|
|
120
|
-
// non-standard decorators
|
|
121
|
-
const instance = args[0]
|
|
122
|
-
const propertyKey: string = args[1]
|
|
123
|
-
const descriptor = args[2]
|
|
124
|
-
|
|
125
|
-
if (!descriptor.get) {
|
|
126
|
-
throw failure("@computedTree requires a 'get' accessor")
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
checkDecoratorContext("computedTree", propertyKey, false)
|
|
130
|
-
|
|
131
|
-
checkInstanceClass(instance)
|
|
132
|
-
|
|
133
|
-
const original = descriptor.get
|
|
134
|
-
|
|
135
|
-
const getter = createGetter(propertyKey)
|
|
136
|
-
copyFunctionMetadata(original, getter)
|
|
137
|
-
descriptor.get = getter
|
|
138
|
-
|
|
139
|
-
addLateInitializationFunction(instance, runBeforeOnInitSymbol, (instance) => {
|
|
140
|
-
runLateInit(instance, original, propertyKey)
|
|
141
|
-
})
|
|
142
|
-
}
|
|
143
|
-
}
|
|
1
|
+
import { computed, type IComputedValue } from "mobx"
|
|
2
|
+
import { readonlyMiddleware } from "../actionMiddlewares/readonlyMiddleware"
|
|
3
|
+
import { createContext } from "../context/context"
|
|
4
|
+
import { isDataModelClass } from "../dataModel/utils"
|
|
5
|
+
import { isModelClass } from "../model/utils"
|
|
6
|
+
import { isTreeNode } from "../tweaker/core"
|
|
7
|
+
import { tweak } from "../tweaker/tweak"
|
|
8
|
+
import { addLateInitializationFunction, failure, runBeforeOnInitSymbol } from "../utils"
|
|
9
|
+
import { checkDecoratorContext, copyFunctionMetadata } from "../utils/decorators"
|
|
10
|
+
import { getOrCreate } from "../utils/mapUtils"
|
|
11
|
+
|
|
12
|
+
const computedTreeContext = createContext(false)
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Returns if a given node is a computed tree node.
|
|
16
|
+
*
|
|
17
|
+
* @param node Node to check.
|
|
18
|
+
* @returns `true` if it is a computed tree node, `false` otherwise.
|
|
19
|
+
*/
|
|
20
|
+
export function isComputedTreeNode(node: object): boolean {
|
|
21
|
+
return computedTreeContext.get(node)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const tweakedComputedTreeNodes = new WeakSet<object>()
|
|
25
|
+
|
|
26
|
+
function tweakComputedTreeNode<T>(newValue: T, parent: unknown, path: string): T {
|
|
27
|
+
const tweakedValue = tweak(newValue, { parent, path })
|
|
28
|
+
if (isTreeNode(tweakedValue) && !tweakedComputedTreeNodes.has(tweakedValue)) {
|
|
29
|
+
tweakedComputedTreeNodes.add(tweakedValue)
|
|
30
|
+
readonlyMiddleware(tweakedValue)
|
|
31
|
+
computedTreeContext.set(tweakedValue, true)
|
|
32
|
+
}
|
|
33
|
+
return tweakedValue
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const computedTreeNodeInfo = new WeakMap<
|
|
37
|
+
object,
|
|
38
|
+
Map<string, { computed: IComputedValue<unknown>; value: unknown; tweakedValue: unknown }>
|
|
39
|
+
>()
|
|
40
|
+
|
|
41
|
+
function getOrCreateComputedTreeNodeInfo(instance: object) {
|
|
42
|
+
return getOrCreate(computedTreeNodeInfo, instance, () => new Map())
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Decorator for turning a computed property into a computed tree which supports tree traversal
|
|
47
|
+
* functions, contexts, references, etc.
|
|
48
|
+
*/
|
|
49
|
+
export function computedTree(...args: any[]): any {
|
|
50
|
+
const createGetter = (propertyKey: string) =>
|
|
51
|
+
function (this: any) {
|
|
52
|
+
const entry = getOrCreateComputedTreeNodeInfo(this).get(propertyKey)!
|
|
53
|
+
|
|
54
|
+
const oldValue = entry.value
|
|
55
|
+
const newValue = entry.computed.get()
|
|
56
|
+
|
|
57
|
+
if (oldValue === newValue) {
|
|
58
|
+
return entry.tweakedValue
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const oldTweakedValue = entry.tweakedValue
|
|
62
|
+
tweak(oldTweakedValue, undefined)
|
|
63
|
+
|
|
64
|
+
const tweakedValue = tweakComputedTreeNode(newValue, this, propertyKey)
|
|
65
|
+
entry.value = newValue
|
|
66
|
+
entry.tweakedValue = tweakedValue
|
|
67
|
+
return tweakedValue
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const runLateInit = (instance: any, original: () => any, propertyKey: string) => {
|
|
71
|
+
const c = computed(() => original.call(instance), { keepAlive: true })
|
|
72
|
+
const newValue = c.get()
|
|
73
|
+
const tweakedValue = tweakComputedTreeNode(newValue, instance, propertyKey)
|
|
74
|
+
|
|
75
|
+
getOrCreateComputedTreeNodeInfo(instance).set(propertyKey, {
|
|
76
|
+
computed: c,
|
|
77
|
+
value: newValue,
|
|
78
|
+
tweakedValue,
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const checkInstanceClass = (instance: any) => {
|
|
83
|
+
const instanceClass = instance.constructor
|
|
84
|
+
if (!(isModelClass(instanceClass) || isDataModelClass(instanceClass))) {
|
|
85
|
+
throw failure("@computedTree can only decorate 'get' accessors of class or data models")
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (typeof args[1] === "object") {
|
|
90
|
+
// standard decorators
|
|
91
|
+
const value = args[0]
|
|
92
|
+
const ctx = args[1] as ClassGetterDecoratorContext
|
|
93
|
+
|
|
94
|
+
if (ctx.kind !== "getter") {
|
|
95
|
+
throw failure("@computedTree requires a 'get' accessor")
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
checkDecoratorContext("computedTree", ctx.name, ctx.static)
|
|
99
|
+
|
|
100
|
+
const propertyKey = ctx.name as string
|
|
101
|
+
const original = value
|
|
102
|
+
|
|
103
|
+
let classChecked = false
|
|
104
|
+
|
|
105
|
+
ctx.addInitializer(function (this: any) {
|
|
106
|
+
const instance = this
|
|
107
|
+
|
|
108
|
+
if (!classChecked) {
|
|
109
|
+
checkInstanceClass(instance)
|
|
110
|
+
classChecked = true
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
runLateInit(instance, original, propertyKey)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
const getter = createGetter(propertyKey)
|
|
117
|
+
copyFunctionMetadata(original, getter)
|
|
118
|
+
return getter
|
|
119
|
+
} else {
|
|
120
|
+
// non-standard decorators
|
|
121
|
+
const instance = args[0]
|
|
122
|
+
const propertyKey: string = args[1]
|
|
123
|
+
const descriptor = args[2]
|
|
124
|
+
|
|
125
|
+
if (!descriptor.get) {
|
|
126
|
+
throw failure("@computedTree requires a 'get' accessor")
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
checkDecoratorContext("computedTree", propertyKey, false)
|
|
130
|
+
|
|
131
|
+
checkInstanceClass(instance)
|
|
132
|
+
|
|
133
|
+
const original = descriptor.get
|
|
134
|
+
|
|
135
|
+
const getter = createGetter(propertyKey)
|
|
136
|
+
copyFunctionMetadata(original, getter)
|
|
137
|
+
descriptor.get = getter
|
|
138
|
+
|
|
139
|
+
addLateInitializationFunction(instance, runBeforeOnInitSymbol, (instance) => {
|
|
140
|
+
runLateInit(instance, original, propertyKey)
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
}
|
package/src/context/context.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { action, computed, createAtom, IAtom, IComputedValue, observable } from "mobx"
|
|
1
|
+
import { action, computed, createAtom, type IAtom, type IComputedValue, observable } from "mobx"
|
|
2
2
|
import { fastGetParent } from "../parent/path"
|
|
3
3
|
import { assertTweakedObject, isTweakedObject } from "../tweaker/core"
|
|
4
4
|
import { getOrCreate } from "../utils/mapUtils"
|