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.
Files changed (174) hide show
  1. package/CHANGELOG.md +864 -853
  2. package/README.md +61 -61
  3. package/dist/mobx-keystone.esm.js +11336 -11148
  4. package/dist/mobx-keystone.esm.mjs +11336 -11148
  5. package/dist/mobx-keystone.umd.js +12229 -11738
  6. package/dist/types/actionMiddlewares/undoMiddleware.d.ts +1 -1
  7. package/dist/types/modelShared/prop.d.ts +5 -0
  8. package/dist/types/redux/connectReduxDevTools.d.ts +17 -4
  9. package/dist/types/ref/Ref.d.ts +1 -1
  10. package/dist/types/treeUtils/sandbox.d.ts +1 -1
  11. package/dist/types/types/TypeChecker.d.ts +1 -1
  12. package/dist/types/types/arrayBased/typesArray.d.ts +1 -1
  13. package/dist/types/types/arrayBased/typesTuple.d.ts +1 -1
  14. package/dist/types/types/objectBased/typesArraySet.d.ts +1 -1
  15. package/dist/types/types/objectBased/typesDataModelData.d.ts +1 -1
  16. package/dist/types/types/objectBased/typesModel.d.ts +1 -1
  17. package/dist/types/types/objectBased/typesObject.d.ts +3 -3
  18. package/dist/types/types/objectBased/typesObjectMap.d.ts +1 -1
  19. package/dist/types/types/objectBased/typesRecord.d.ts +1 -1
  20. package/dist/types/types/primitiveBased/typesPrimitive.d.ts +1 -1
  21. package/dist/types/types/types.d.ts +3 -3
  22. package/dist/types/types/utility/typesCodec.d.ts +1 -6
  23. package/dist/types/types/utility/typesCodecCore.d.ts +1 -1
  24. package/dist/types/types/utility/typesOr.d.ts +1 -1
  25. package/dist/types/types/utility/typesRefinement.d.ts +1 -1
  26. package/dist/types/types/utility/typesSkipCheck.d.ts +1 -1
  27. package/dist/types/types/utility/typesTag.d.ts +1 -1
  28. package/dist/types/wrappers/ObjectMap.d.ts +2 -0
  29. package/dist/types/wrappers/asMap.d.ts +10 -6
  30. package/package.json +14 -12
  31. package/src/action/applyAction.ts +125 -114
  32. package/src/action/applyMethodCall.ts +37 -37
  33. package/src/action/isModelAction.ts +16 -16
  34. package/src/action/middleware.ts +137 -137
  35. package/src/action/modelFlow.ts +240 -240
  36. package/src/action/modelFlowPromiseGenerator.ts +127 -125
  37. package/src/action/pendingActions.ts +42 -42
  38. package/src/action/wrapInAction.ts +156 -156
  39. package/src/actionMiddlewares/actionSerialization/actionSerialization.ts +1 -1
  40. package/src/actionMiddlewares/actionSerialization/applySerializedAction.ts +172 -172
  41. package/src/actionMiddlewares/actionSerialization/arraySerializer.ts +20 -20
  42. package/src/actionMiddlewares/actionSerialization/dateSerializer.ts +17 -17
  43. package/src/actionMiddlewares/actionSerialization/mapSerializer.ts +42 -42
  44. package/src/actionMiddlewares/actionSerialization/objectPathSerializer.ts +50 -50
  45. package/src/actionMiddlewares/actionSerialization/objectSnapshotSerializer.ts +21 -21
  46. package/src/actionMiddlewares/actionSerialization/plainObjectSerializer.ts +24 -32
  47. package/src/actionMiddlewares/actionSerialization/primitiveSerializer.ts +51 -51
  48. package/src/actionMiddlewares/actionSerialization/setSerializer.ts +37 -37
  49. package/src/actionMiddlewares/actionTrackingMiddleware.ts +3 -3
  50. package/src/actionMiddlewares/onActionMiddleware.ts +2 -2
  51. package/src/actionMiddlewares/readonlyMiddleware.ts +2 -2
  52. package/src/actionMiddlewares/transactionMiddleware.ts +4 -4
  53. package/src/actionMiddlewares/undoMiddleware.ts +804 -796
  54. package/src/actionMiddlewares/utils.ts +2 -2
  55. package/src/computedTree/computedTree.ts +143 -143
  56. package/src/context/context.ts +1 -1
  57. package/src/dataModel/BaseDataModel.ts +194 -192
  58. package/src/dataModel/actions.ts +1 -1
  59. package/src/dataModel/newDataModel.ts +57 -57
  60. package/src/deepChange/index.ts +1 -1
  61. package/src/deepChange/onDeepChange.ts +244 -244
  62. package/src/frozen/Frozen.ts +146 -146
  63. package/src/globalConfig/globalConfig.ts +107 -107
  64. package/src/index.ts +24 -24
  65. package/src/model/BaseModel.ts +275 -273
  66. package/src/model/ModelConstructorOptions.ts +15 -15
  67. package/src/model/getModelMetadata.ts +51 -51
  68. package/src/model/index.ts +6 -6
  69. package/src/model/mixins.ts +288 -288
  70. package/src/model/newModel.ts +301 -301
  71. package/src/model/utils.ts +249 -249
  72. package/src/modelShared/modelDecorator.ts +260 -253
  73. package/src/modelShared/modelInfo.ts +50 -50
  74. package/src/modelShared/modelSymbols.ts +3 -3
  75. package/src/modelShared/newModel.ts +25 -25
  76. package/src/modelShared/prop.ts +713 -684
  77. package/src/modelShared/sharedInternalModel.ts +427 -417
  78. package/src/modelShared/utils.ts +24 -24
  79. package/src/parent/core.ts +65 -65
  80. package/src/parent/coreObjectChildren.ts +180 -180
  81. package/src/parent/detach.ts +47 -47
  82. package/src/parent/findParent.ts +1 -1
  83. package/src/parent/getChildrenObjects.ts +25 -25
  84. package/src/parent/path.ts +386 -381
  85. package/src/parent/setParent.ts +149 -149
  86. package/src/parent/walkTree.ts +1 -1
  87. package/src/patch/applyPatches.ts +187 -187
  88. package/src/patch/jsonPatch.ts +108 -108
  89. package/src/patch/patchRecorder.ts +6 -1
  90. package/src/redux/connectReduxDevTools.ts +39 -7
  91. package/src/redux/redux.ts +6 -2
  92. package/src/ref/Ref.ts +1 -1
  93. package/src/ref/core.ts +339 -345
  94. package/src/ref/customRef.ts +3 -3
  95. package/src/ref/rootRef.ts +100 -100
  96. package/src/rootStore/attachDetach.ts +89 -89
  97. package/src/rootStore/rootStore.ts +1 -1
  98. package/src/snapshot/SnapshotOf.ts +104 -104
  99. package/src/snapshot/SnapshotProcessingError.ts +45 -45
  100. package/src/snapshot/applySnapshot.ts +177 -181
  101. package/src/snapshot/cloneTreeValue.ts +30 -30
  102. package/src/snapshot/fromArraySnapshot.ts +27 -33
  103. package/src/snapshot/fromModelSnapshot.ts +70 -70
  104. package/src/snapshot/fromPlainObjectSnapshot.ts +47 -42
  105. package/src/snapshot/fromSnapshot.ts +198 -198
  106. package/src/snapshot/getSnapshot.ts +80 -79
  107. package/src/snapshot/index.ts +8 -8
  108. package/src/snapshot/internal.ts +230 -230
  109. package/src/snapshot/reconcileArraySnapshot.ts +70 -70
  110. package/src/snapshot/reconcileModelSnapshot.ts +155 -150
  111. package/src/snapshot/reconcilePlainObjectSnapshot.ts +72 -72
  112. package/src/snapshot/reconcileSnapshot.ts +88 -88
  113. package/src/standardActions/actions.ts +64 -64
  114. package/src/standardActions/objectActions.ts +60 -60
  115. package/src/transforms/ImmutableDate.ts +93 -93
  116. package/src/transforms/asMap.ts +50 -50
  117. package/src/transforms/asSet.ts +22 -22
  118. package/src/transforms/bigint.ts +20 -20
  119. package/src/transforms/date.ts +40 -40
  120. package/src/treeUtils/deepEquals.ts +55 -55
  121. package/src/treeUtils/sandbox.ts +6 -3
  122. package/src/tweaker/TweakerPriority.ts +9 -9
  123. package/src/tweaker/tweak.ts +4 -3
  124. package/src/tweaker/tweakArray.ts +530 -475
  125. package/src/tweaker/tweakFrozen.ts +42 -42
  126. package/src/tweaker/tweakModel.ts +1 -1
  127. package/src/tweaker/tweakPlainObject.ts +355 -355
  128. package/src/tweaker/typeChecking.ts +101 -101
  129. package/src/types/SnapshotTypeMismatchError.ts +46 -46
  130. package/src/types/TypeCheckError.ts +183 -184
  131. package/src/types/TypeChecker.ts +202 -185
  132. package/src/types/arrayBased/typesArray.ts +136 -137
  133. package/src/types/arrayBased/typesTuple.ts +138 -139
  134. package/src/types/createPerEntryCachedCheck.ts +166 -160
  135. package/src/types/index.ts +6 -6
  136. package/src/types/objectBased/typesArraySet.ts +133 -134
  137. package/src/types/objectBased/typesDataModelData.ts +203 -204
  138. package/src/types/objectBased/typesModel.ts +220 -221
  139. package/src/types/objectBased/typesObject.ts +308 -310
  140. package/src/types/objectBased/typesObjectMap.ts +142 -143
  141. package/src/types/objectBased/typesRecord.ts +156 -157
  142. package/src/types/objectBased/typesRef.ts +89 -89
  143. package/src/types/primitiveBased/typesEnum.ts +63 -63
  144. package/src/types/primitiveBased/typesPrimitive.ts +219 -220
  145. package/src/types/registerDefaultStandardTypeResolvers.ts +21 -21
  146. package/src/types/resolveTypeChecker.ts +78 -78
  147. package/src/types/schemas.ts +208 -208
  148. package/src/types/tProp.ts +277 -268
  149. package/src/types/typeCheck.ts +21 -21
  150. package/src/types/typeCheckErrorUtils.ts +23 -23
  151. package/src/types/types.ts +142 -142
  152. package/src/types/utility/typeToStoredData.ts +37 -37
  153. package/src/types/utility/typesBigInt.ts +15 -15
  154. package/src/types/utility/typesCodec.ts +41 -38
  155. package/src/types/utility/typesCodecCore.ts +178 -178
  156. package/src/types/utility/typesCodecSupport.ts +806 -806
  157. package/src/types/utility/typesDate.ts +27 -27
  158. package/src/types/utility/typesMap.ts +253 -222
  159. package/src/types/utility/typesOr.ts +263 -259
  160. package/src/types/utility/typesRefinement.ts +131 -125
  161. package/src/types/utility/typesSet.ts +110 -110
  162. package/src/types/utility/typesSkipCheck.ts +69 -70
  163. package/src/types/utility/typesTag.ts +88 -82
  164. package/src/types/utility/typesUnchecked.ts +40 -40
  165. package/src/utils/AnyFunction.ts +4 -4
  166. package/src/utils/ModelPool.ts +59 -59
  167. package/src/utils/chainFns.ts +18 -18
  168. package/src/utils/decorators.ts +274 -274
  169. package/src/utils/errorDiagnostics.ts +204 -204
  170. package/src/utils/index.ts +443 -372
  171. package/src/wrappers/ArraySet.ts +156 -156
  172. package/src/wrappers/ObjectMap.ts +155 -136
  173. package/src/wrappers/asMap.ts +65 -30
  174. package/src/wrappers/asSet.ts +3 -3
@@ -1,108 +1,108 @@
1
- import type { Path } from "../parent/pathTypes"
2
- import { failure } from "../utils"
3
- import type { Patch } from "./Patch"
4
-
5
- export type JsonPatch =
6
- | JsonPatchAddOperation<any>
7
- | JsonPatchRemoveOperation
8
- | JsonPatchReplaceOperation<any>
9
-
10
- export interface JsonPatchBaseOperation {
11
- path: string
12
- }
13
-
14
- export interface JsonPatchAddOperation<T> extends JsonPatchBaseOperation {
15
- op: "add"
16
- value: T
17
- }
18
-
19
- export interface JsonPatchRemoveOperation extends JsonPatchBaseOperation {
20
- op: "remove"
21
- }
22
-
23
- export interface JsonPatchReplaceOperation<T> extends JsonPatchBaseOperation {
24
- op: "replace"
25
- value: T
26
- }
27
-
28
- /**
29
- * Escapes a json pointer path.
30
- *
31
- * @param path The raw pointer
32
- * @return the Escaped path
33
- */
34
- function escapePathComponent(path: string | number): string {
35
- if (typeof path === "number") {
36
- return String(path)
37
- }
38
- if (!(path.includes("/") || path.includes("~"))) {
39
- return path
40
- }
41
- return path.replace(/~/g, "~0").replace(/\//g, "~1")
42
- }
43
-
44
- /**
45
- * Unescapes a json pointer path.
46
- *
47
- * @param path The escaped pointer
48
- * @return The unescaped path
49
- */
50
- function unescapePathComponent(path: string): string {
51
- return path.replace(/~1/g, "/").replace(/~0/g, "~")
52
- }
53
-
54
- /**
55
- * Converts a path into a JSON pointer.
56
- *
57
- * @param path Path to convert.
58
- * @returns Converted JSON pointer.
59
- */
60
- export function pathToJsonPointer(path: Path): string {
61
- if (path.length <= 0) {
62
- return ""
63
- }
64
- return "/" + path.map(escapePathComponent).join("/")
65
- }
66
-
67
- /**
68
- * Converts a JSON pointer into a path.
69
- *
70
- * @param jsonPointer JSON pointer to convert.
71
- * @returns Converted path.
72
- */
73
- export function jsonPointerToPath(jsonPointer: string): Path {
74
- if (jsonPointer === "") {
75
- return []
76
- }
77
- if (!jsonPointer.startsWith("/")) {
78
- throw failure("a JSON pointer must start with '/' or be empty")
79
- }
80
- jsonPointer = jsonPointer.slice(1)
81
- return jsonPointer.split("/").map(unescapePathComponent)
82
- }
83
-
84
- /**
85
- * Convert a patch into a JSON patch.
86
- *
87
- * @param patch A patch.
88
- * @returns A JSON patch.
89
- */
90
- export function patchToJsonPatch(patch: Patch): JsonPatch {
91
- return {
92
- ...patch,
93
- path: pathToJsonPointer(patch.path),
94
- }
95
- }
96
-
97
- /**
98
- * Converts a JSON patch into a patch.
99
- *
100
- * @param jsonPatch A JSON patch.
101
- * @returns A patch.
102
- */
103
- export function jsonPatchToPatch(jsonPatch: JsonPatch): Patch {
104
- return {
105
- ...jsonPatch,
106
- path: jsonPointerToPath(jsonPatch.path),
107
- }
108
- }
1
+ import type { Path } from "../parent/pathTypes"
2
+ import { failure } from "../utils"
3
+ import type { Patch } from "./Patch"
4
+
5
+ export type JsonPatch =
6
+ | JsonPatchAddOperation<any>
7
+ | JsonPatchRemoveOperation
8
+ | JsonPatchReplaceOperation<any>
9
+
10
+ export interface JsonPatchBaseOperation {
11
+ path: string
12
+ }
13
+
14
+ export interface JsonPatchAddOperation<T> extends JsonPatchBaseOperation {
15
+ op: "add"
16
+ value: T
17
+ }
18
+
19
+ export interface JsonPatchRemoveOperation extends JsonPatchBaseOperation {
20
+ op: "remove"
21
+ }
22
+
23
+ export interface JsonPatchReplaceOperation<T> extends JsonPatchBaseOperation {
24
+ op: "replace"
25
+ value: T
26
+ }
27
+
28
+ /**
29
+ * Escapes a json pointer path.
30
+ *
31
+ * @param path The raw pointer
32
+ * @return the Escaped path
33
+ */
34
+ function escapePathComponent(path: string | number): string {
35
+ if (typeof path === "number") {
36
+ return String(path)
37
+ }
38
+ if (!(path.includes("/") || path.includes("~"))) {
39
+ return path
40
+ }
41
+ return path.replace(/~/g, "~0").replace(/\//g, "~1")
42
+ }
43
+
44
+ /**
45
+ * Unescapes a json pointer path.
46
+ *
47
+ * @param path The escaped pointer
48
+ * @return The unescaped path
49
+ */
50
+ function unescapePathComponent(path: string): string {
51
+ return path.replace(/~1/g, "/").replace(/~0/g, "~")
52
+ }
53
+
54
+ /**
55
+ * Converts a path into a JSON pointer.
56
+ *
57
+ * @param path Path to convert.
58
+ * @returns Converted JSON pointer.
59
+ */
60
+ export function pathToJsonPointer(path: Path): string {
61
+ if (path.length <= 0) {
62
+ return ""
63
+ }
64
+ return "/" + path.map(escapePathComponent).join("/")
65
+ }
66
+
67
+ /**
68
+ * Converts a JSON pointer into a path.
69
+ *
70
+ * @param jsonPointer JSON pointer to convert.
71
+ * @returns Converted path.
72
+ */
73
+ export function jsonPointerToPath(jsonPointer: string): Path {
74
+ if (jsonPointer === "") {
75
+ return []
76
+ }
77
+ if (!jsonPointer.startsWith("/")) {
78
+ throw failure("a JSON pointer must start with '/' or be empty")
79
+ }
80
+ jsonPointer = jsonPointer.slice(1)
81
+ return jsonPointer.split("/").map(unescapePathComponent)
82
+ }
83
+
84
+ /**
85
+ * Convert a patch into a JSON patch.
86
+ *
87
+ * @param patch A patch.
88
+ * @returns A JSON patch.
89
+ */
90
+ export function patchToJsonPatch(patch: Patch): JsonPatch {
91
+ return {
92
+ ...patch,
93
+ path: pathToJsonPointer(patch.path),
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Converts a JSON patch into a patch.
99
+ *
100
+ * @param jsonPatch A JSON patch.
101
+ * @returns A patch.
102
+ */
103
+ export function jsonPatchToPatch(jsonPatch: JsonPatch): Patch {
104
+ return {
105
+ ...jsonPatch,
106
+ path: jsonPointerToPath(jsonPatch.path),
107
+ }
108
+ }
@@ -1,6 +1,11 @@
1
1
  import { observable } from "mobx"
2
2
  import { assertTweakedObject } from "../tweaker/core"
3
- import { onGlobalPatches, onPatches, OnPatchesDisposer, OnPatchesListener } from "./emitPatch"
3
+ import {
4
+ type OnPatchesDisposer,
5
+ type OnPatchesListener,
6
+ onGlobalPatches,
7
+ onPatches,
8
+ } from "./emitPatch"
4
9
  import type { Patch } from "./Patch"
5
10
 
6
11
  /**
@@ -2,33 +2,49 @@ import { ActionContextActionType } from "../action"
2
2
  import {
3
3
  ActionTrackingResult,
4
4
  actionTrackingMiddleware,
5
- SimpleActionContext,
5
+ type SimpleActionContext,
6
6
  } from "../actionMiddlewares"
7
- import { fastGetRootPath, RootPath } from "../parent/path"
7
+ import { fastGetRootPath, type RootPath } from "../parent/path"
8
8
  import { applySnapshot } from "../snapshot/applySnapshot"
9
9
  import { getSnapshot } from "../snapshot/getSnapshot"
10
10
  import { assertTweakedObject } from "../tweaker/core"
11
11
 
12
+ export interface ConnectReduxDevToolsOptions {
13
+ /**
14
+ * If it should show the arguments near the action name.
15
+ *
16
+ * @default true
17
+ */
18
+ logArgsNearName?: boolean
19
+
20
+ /**
21
+ * If it should log child actions when they run inside another action tracked
22
+ * by the same target tree.
23
+ *
24
+ * @default true
25
+ */
26
+ logChildActions?: boolean
27
+ }
28
+
12
29
  /**
13
30
  * Connects a tree node to a redux dev tools instance.
14
31
  *
15
32
  * @param remotedevPackage The remotedev package (usually the result of `require("remoteDev")`) (https://www.npmjs.com/package/remotedev).
16
33
  * @param remotedevConnection The result of a connect method from the remotedev package (usually the result of `remoteDev.connectViaExtension(...)`).
17
34
  * @param target Object to use as root.
18
- * @param [options] Optional options object. `logArgsNearName` if it should show the arguments near the action name (default is `true`).
35
+ * @param [options] Optional options object.
19
36
  */
20
37
  export function connectReduxDevTools(
21
38
  remotedevPackage: any,
22
39
  remotedevConnection: any,
23
40
  target: object,
24
- options?: {
25
- logArgsNearName?: boolean
26
- }
41
+ options?: ConnectReduxDevToolsOptions
27
42
  ) {
28
43
  assertTweakedObject(target, "target")
29
44
 
30
45
  const opts = {
31
46
  logArgsNearName: true,
47
+ logChildActions: true,
32
48
  ...options,
33
49
  }
34
50
 
@@ -48,12 +64,15 @@ export function connectReduxDevTools(
48
64
  const actionIdSymbol = Symbol("actionId")
49
65
 
50
66
  actionTrackingMiddleware(target, {
67
+ filter(ctx) {
68
+ return opts.logChildActions || !hasDevToolsTrackedParentContext(ctx)
69
+ },
51
70
  onStart(ctx) {
52
71
  ctx.data[actionIdSymbol] = currentActionId++
53
72
  },
54
73
  onResume(ctx) {
55
74
  // give a chance to the parent to log its own changes before the child starts
56
- if (ctx.parentContext) {
75
+ if (opts.logChildActions && ctx.parentContext) {
57
76
  log(ctx.parentContext, undefined)
58
77
  }
59
78
  log(ctx, undefined)
@@ -184,4 +203,17 @@ export function connectReduxDevTools(
184
203
 
185
204
  return name
186
205
  }
206
+
207
+ function hasDevToolsTrackedParentContext(ctx: SimpleActionContext) {
208
+ let parentContext = ctx.parentContext
209
+
210
+ while (parentContext) {
211
+ if (parentContext.data[actionIdSymbol] !== undefined) {
212
+ return true
213
+ }
214
+ parentContext = parentContext.parentContext
215
+ }
216
+
217
+ return false
218
+ }
187
219
  }
@@ -1,6 +1,10 @@
1
- import { ActionCall, applyAction } from "../action"
1
+ import { type ActionCall, applyAction } from "../action"
2
2
  import { getSnapshot } from "../snapshot/getSnapshot"
3
- import { onSnapshot, OnSnapshotDisposer, OnSnapshotListener } from "../snapshot/onSnapshot"
3
+ import {
4
+ type OnSnapshotDisposer,
5
+ type OnSnapshotListener,
6
+ onSnapshot,
7
+ } from "../snapshot/onSnapshot"
4
8
  import type { SnapshotOutOf } from "../snapshot/SnapshotOf"
5
9
  import { assertTweakedObject } from "../tweaker/core"
6
10
  import { failure } from "../utils"
package/src/ref/Ref.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { computed } from "mobx"
2
- import { modelTypeKey } from "../model/metadata"
3
2
  import { Model } from "../model/Model"
3
+ import { modelTypeKey } from "../model/metadata"
4
4
  import type { ModelClass } from "../modelShared/BaseModelShared"
5
5
  import { typesString } from "../types/primitiveBased/typesPrimitive"
6
6
  import { tProp } from "../types/tProp"