@voidhash/mimic 0.0.4 → 0.0.6
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/.turbo/turbo-build.log +202 -198
- package/dist/Document.cjs +1 -2
- package/dist/Document.d.cts +9 -3
- package/dist/Document.d.cts.map +1 -1
- package/dist/Document.d.mts +9 -3
- package/dist/Document.d.mts.map +1 -1
- package/dist/Document.mjs +1 -2
- package/dist/Document.mjs.map +1 -1
- package/dist/Presence.d.mts.map +1 -1
- package/dist/Primitive.d.cts +2 -2
- package/dist/Primitive.d.mts +2 -2
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutProperties.cjs +15 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutProperties.mjs +15 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutPropertiesLoose.cjs +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutPropertiesLoose.mjs +13 -0
- package/dist/client/ClientDocument.cjs +17 -12
- package/dist/client/ClientDocument.d.mts.map +1 -1
- package/dist/client/ClientDocument.mjs +17 -12
- package/dist/client/ClientDocument.mjs.map +1 -1
- package/dist/client/WebSocketTransport.cjs +6 -6
- package/dist/client/WebSocketTransport.mjs +6 -6
- package/dist/client/WebSocketTransport.mjs.map +1 -1
- package/dist/primitives/Tree.cjs +58 -8
- package/dist/primitives/Tree.d.cts +99 -10
- package/dist/primitives/Tree.d.cts.map +1 -1
- package/dist/primitives/Tree.d.mts +99 -10
- package/dist/primitives/Tree.d.mts.map +1 -1
- package/dist/primitives/Tree.mjs +58 -8
- package/dist/primitives/Tree.mjs.map +1 -1
- package/dist/primitives/shared.d.cts +9 -0
- package/dist/primitives/shared.d.cts.map +1 -1
- package/dist/primitives/shared.d.mts +9 -0
- package/dist/primitives/shared.d.mts.map +1 -1
- package/dist/primitives/shared.mjs.map +1 -1
- package/dist/server/ServerDocument.cjs +1 -1
- package/dist/server/ServerDocument.d.cts +3 -3
- package/dist/server/ServerDocument.d.cts.map +1 -1
- package/dist/server/ServerDocument.d.mts +3 -3
- package/dist/server/ServerDocument.d.mts.map +1 -1
- package/dist/server/ServerDocument.mjs +1 -1
- package/dist/server/ServerDocument.mjs.map +1 -1
- package/package.json +2 -2
- package/src/Document.ts +18 -5
- package/src/client/ClientDocument.ts +20 -21
- package/src/client/WebSocketTransport.ts +9 -9
- package/src/primitives/Tree.ts +213 -19
- package/src/primitives/shared.ts +10 -1
- package/src/server/ServerDocument.ts +4 -3
- package/tests/client/ClientDocument.test.ts +309 -2
- package/tests/client/WebSocketTransport.test.ts +228 -3
- package/tests/primitives/Tree.test.ts +296 -17
- package/tests/server/ServerDocument.test.ts +1 -1
- package/tsconfig.json +1 -1
|
@@ -33,6 +33,8 @@ type TreeState<_TRoot extends AnyTreeNodePrimitive> = readonly TreeNodeState[];
|
|
|
33
33
|
*/
|
|
34
34
|
type TreeNodeSnapshot<TNode extends AnyTreeNodePrimitive> = {
|
|
35
35
|
readonly id: string;
|
|
36
|
+
readonly pos: string;
|
|
37
|
+
readonly parentId: string | null;
|
|
36
38
|
readonly type: InferTreeNodeType<TNode>;
|
|
37
39
|
readonly children: TreeNodeSnapshot<InferTreeNodeChildren<TNode>>[];
|
|
38
40
|
} & InferTreeNodeDataState<TNode>;
|
|
@@ -56,6 +58,86 @@ type TreeNodeUpdateValue<TNode extends AnyTreeNodePrimitive> = TNode["data"] ext
|
|
|
56
58
|
* always require a data object (even if empty for all-optional fields).
|
|
57
59
|
*/
|
|
58
60
|
type TreeNodeDataSetInput<TNode extends AnyTreeNodePrimitive> = TNode["data"] extends StructPrimitive<infer TFields, any, any> ? StructSetInput<TFields> : InferSetInput<TNode["data"]>;
|
|
61
|
+
/**
|
|
62
|
+
* Type guard to check if a type is `any` or unknown (structural check).
|
|
63
|
+
* Returns true if T is `any`, false otherwise.
|
|
64
|
+
*/
|
|
65
|
+
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
66
|
+
/**
|
|
67
|
+
* Get children types, with special handling for self-referential nodes.
|
|
68
|
+
* When InferTreeNodeChildren returns `any` (from TreeNodePrimitive<..., any>),
|
|
69
|
+
* we fall back to using TNode itself as its own child type.
|
|
70
|
+
* This handles the common case of self-referential nodes like:
|
|
71
|
+
* FolderNode = TreeNode("folder", { children: [TreeNodeSelf, FileNode] })
|
|
72
|
+
* Where FolderNode's TChildren is resolved to FolderNode | FileNode,
|
|
73
|
+
* but the self-referenced FolderNode has TChildren = any.
|
|
74
|
+
*/
|
|
75
|
+
type ResolveChildrenForInput<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = IsAny<InferTreeNodeChildren<TNode>> extends true ? TOriginalNode : InferTreeNodeChildren<TNode>;
|
|
76
|
+
/**
|
|
77
|
+
* Helper type that creates a properly typed node input for a specific node type.
|
|
78
|
+
* This is the "strict" version that enforces exact property matching.
|
|
79
|
+
*
|
|
80
|
+
* The TOriginalNode parameter is used to track the original root node type
|
|
81
|
+
* for proper self-reference resolution in deeply nested structures.
|
|
82
|
+
*/
|
|
83
|
+
type TreeNodeSetInputStrictWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = {
|
|
84
|
+
readonly type: InferTreeNodeType<TNode>;
|
|
85
|
+
readonly id?: string;
|
|
86
|
+
readonly children: TreeNodeSetInputUnionWithRoot<ResolveChildrenForInput<TNode, TOriginalNode>, TOriginalNode>[];
|
|
87
|
+
} & TreeNodeDataSetInput<TNode>;
|
|
88
|
+
/**
|
|
89
|
+
* Distributive conditional type that creates a union of TreeNodeSetInputStrict
|
|
90
|
+
* for each node type in the union. This ensures proper type discrimination.
|
|
91
|
+
*
|
|
92
|
+
* When TNode is a union (e.g., FolderNode | FileNode), this distributes to:
|
|
93
|
+
* TreeNodeSetInputStrict<FolderNode> | TreeNodeSetInputStrict<FileNode>
|
|
94
|
+
*
|
|
95
|
+
* This creates a proper discriminated union where excess property checking works.
|
|
96
|
+
*/
|
|
97
|
+
type TreeNodeSetInputUnionWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrictWithRoot<TNode, TOriginalNode> : never;
|
|
98
|
+
/**
|
|
99
|
+
* Helper type for single-parameter usage - uses TNode as its own original.
|
|
100
|
+
*/
|
|
101
|
+
type TreeNodeSetInputStrict<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputStrictWithRoot<TNode, TNode>;
|
|
102
|
+
/**
|
|
103
|
+
* Distributive conditional for single-parameter usage.
|
|
104
|
+
*/
|
|
105
|
+
type TreeNodeSetInputUnion<TNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrict<TNode> : never;
|
|
106
|
+
/**
|
|
107
|
+
* Input type for a single node in a nested tree set/default operation.
|
|
108
|
+
*
|
|
109
|
+
* - `type` is REQUIRED - explicit type discriminator for the node
|
|
110
|
+
* - `id` is optional - auto-generated if not provided
|
|
111
|
+
* - `children` is a typed array of allowed child node inputs
|
|
112
|
+
* - Data fields are spread at the node level (like TreeNodeSnapshot)
|
|
113
|
+
*
|
|
114
|
+
* When TNode is a union type (e.g., from InferTreeNodeChildren), this properly
|
|
115
|
+
* distributes to create a discriminated union where:
|
|
116
|
+
* - Each variant has its specific `type` literal
|
|
117
|
+
* - Each variant has its specific data fields
|
|
118
|
+
* - Excess property checking works correctly
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const input: TreeNodeSetInput<BoardNode> = {
|
|
123
|
+
* type: "board",
|
|
124
|
+
* name: "My Board",
|
|
125
|
+
* children: [
|
|
126
|
+
* { type: "column", name: "Todo", children: [] }
|
|
127
|
+
* ]
|
|
128
|
+
* };
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
type TreeNodeSetInput<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputUnion<TNode>;
|
|
132
|
+
/**
|
|
133
|
+
* Input type for tree set() and default() operations.
|
|
134
|
+
* Accepts a nested tree structure that will be converted to flat TreeState internally.
|
|
135
|
+
*/
|
|
136
|
+
type TreeSetInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
137
|
+
/**
|
|
138
|
+
* Infer the set input type for a tree primitive.
|
|
139
|
+
*/
|
|
140
|
+
type InferTreeSetInput<T extends TreePrimitive<any>> = T extends TreePrimitive<infer TRoot> ? TreeSetInput<TRoot> : never;
|
|
59
141
|
/**
|
|
60
142
|
* Typed proxy for a specific node type - provides type-safe data access
|
|
61
143
|
*/
|
|
@@ -92,8 +174,8 @@ interface TreeNodeProxyBase<_TRoot extends AnyTreeNodePrimitive> {
|
|
|
92
174
|
interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
93
175
|
/** Gets the entire tree state (flat array of nodes) */
|
|
94
176
|
get(): TreeState<TRoot$1>;
|
|
95
|
-
/** Replaces the entire tree */
|
|
96
|
-
set(
|
|
177
|
+
/** Replaces the entire tree with a nested input structure */
|
|
178
|
+
set(input: TreeSetInput<TRoot$1>): void;
|
|
97
179
|
/** Gets the root node state */
|
|
98
180
|
root(): TypedTreeNodeState<TRoot$1> | undefined;
|
|
99
181
|
/** Gets ordered children states of a parent (null for root's children) */
|
|
@@ -131,14 +213,12 @@ interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
131
213
|
}
|
|
132
214
|
interface TreePrimitiveSchema<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
133
215
|
readonly required: boolean;
|
|
134
|
-
readonly
|
|
216
|
+
readonly defaultInput: TreeNodeSetInput<TRoot$1> | undefined;
|
|
135
217
|
readonly root: TRoot$1;
|
|
136
218
|
readonly validators: readonly Validator<TreeState<TRoot$1>>[];
|
|
137
219
|
}
|
|
138
|
-
/** Input type for tree
|
|
139
|
-
type
|
|
140
|
-
/** Input type for tree update() - same as set() for trees */
|
|
141
|
-
type TreeUpdateInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeState<TRoot$1>;
|
|
220
|
+
/** Input type for tree update() - same as set() for trees (nested format) */
|
|
221
|
+
type TreeUpdateInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
142
222
|
declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<TreeState<TRoot$1>, TreeProxy<TRoot$1>, TRequired, THasDefault, TreeSetInput<TRoot$1>, TreeUpdateInput<TRoot$1>> {
|
|
143
223
|
readonly _tag: "TreePrimitive";
|
|
144
224
|
readonly _State: TreeState<TRoot$1>;
|
|
@@ -153,8 +233,8 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
153
233
|
constructor(schema: TreePrimitiveSchema<TRoot$1>);
|
|
154
234
|
/** Mark this tree as required */
|
|
155
235
|
required(): TreePrimitive<TRoot$1, true, THasDefault>;
|
|
156
|
-
/** Set a default value for this tree */
|
|
157
|
-
default(
|
|
236
|
+
/** Set a default value for this tree (nested format) */
|
|
237
|
+
default(defaultInput: TreeNodeSetInput<TRoot$1>): TreePrimitive<TRoot$1, TRequired, true>;
|
|
158
238
|
/** Get the root node type */
|
|
159
239
|
get root(): TRoot$1;
|
|
160
240
|
/** Add a custom validation rule */
|
|
@@ -171,6 +251,15 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
171
251
|
* Validate that a node type can be a child of a parent node type
|
|
172
252
|
*/
|
|
173
253
|
private _validateChildType;
|
|
254
|
+
/**
|
|
255
|
+
* Convert a nested TreeNodeSetInput to flat TreeState format.
|
|
256
|
+
* Recursively processes nodes, generating IDs and positions as needed.
|
|
257
|
+
*
|
|
258
|
+
* @param input - The root nested input to convert
|
|
259
|
+
* @param generateId - Optional ID generator (defaults to crypto.randomUUID)
|
|
260
|
+
* @returns Flat TreeState array
|
|
261
|
+
*/
|
|
262
|
+
private _convertNestedToFlat;
|
|
174
263
|
readonly _internal: PrimitiveInternal<TreeState<TRoot$1>, TreeProxy<TRoot$1>>;
|
|
175
264
|
}
|
|
176
265
|
/** Options for creating a Tree primitive */
|
|
@@ -181,5 +270,5 @@ interface TreeOptions<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
181
270
|
/** Creates a new TreePrimitive with the given root node type */
|
|
182
271
|
declare const Tree: <TRoot$1 extends AnyTreeNodePrimitive>(options: TreeOptions<TRoot$1>) => TreePrimitive<TRoot$1, false, false>;
|
|
183
272
|
//#endregion
|
|
184
|
-
export { InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
273
|
+
export { InferTreeSetInput, InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSetInput, TreeNodeSetInputUnion, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
185
274
|
//# sourceMappingURL=Tree.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.d.cts","names":[],"sources":["../../src/primitives/Tree.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkBA;AAWA;AAAkD,UAXjC,aAAA,CAWiC;EAEf,SAAA,EAAA,EAAA,MAAA;EAAlB,SAAA,IAAA,EAAA,MAAA;EAGuB,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EAAvB,SAAA,GAAA,EAAA,MAAA;EAAsB,SAAA,IAAA,EAAA,OAAA;AAMvC;AAwDA;;;
|
|
1
|
+
{"version":3,"file":"Tree.d.cts","names":[],"sources":["../../src/primitives/Tree.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -33,6 +33,8 @@ type TreeState<_TRoot extends AnyTreeNodePrimitive> = readonly TreeNodeState[];
|
|
|
33
33
|
*/
|
|
34
34
|
type TreeNodeSnapshot<TNode extends AnyTreeNodePrimitive> = {
|
|
35
35
|
readonly id: string;
|
|
36
|
+
readonly pos: string;
|
|
37
|
+
readonly parentId: string | null;
|
|
36
38
|
readonly type: InferTreeNodeType<TNode>;
|
|
37
39
|
readonly children: TreeNodeSnapshot<InferTreeNodeChildren<TNode>>[];
|
|
38
40
|
} & InferTreeNodeDataState<TNode>;
|
|
@@ -56,6 +58,86 @@ type TreeNodeUpdateValue<TNode extends AnyTreeNodePrimitive> = TNode["data"] ext
|
|
|
56
58
|
* always require a data object (even if empty for all-optional fields).
|
|
57
59
|
*/
|
|
58
60
|
type TreeNodeDataSetInput<TNode extends AnyTreeNodePrimitive> = TNode["data"] extends StructPrimitive<infer TFields, any, any> ? StructSetInput<TFields> : InferSetInput<TNode["data"]>;
|
|
61
|
+
/**
|
|
62
|
+
* Type guard to check if a type is `any` or unknown (structural check).
|
|
63
|
+
* Returns true if T is `any`, false otherwise.
|
|
64
|
+
*/
|
|
65
|
+
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
66
|
+
/**
|
|
67
|
+
* Get children types, with special handling for self-referential nodes.
|
|
68
|
+
* When InferTreeNodeChildren returns `any` (from TreeNodePrimitive<..., any>),
|
|
69
|
+
* we fall back to using TNode itself as its own child type.
|
|
70
|
+
* This handles the common case of self-referential nodes like:
|
|
71
|
+
* FolderNode = TreeNode("folder", { children: [TreeNodeSelf, FileNode] })
|
|
72
|
+
* Where FolderNode's TChildren is resolved to FolderNode | FileNode,
|
|
73
|
+
* but the self-referenced FolderNode has TChildren = any.
|
|
74
|
+
*/
|
|
75
|
+
type ResolveChildrenForInput<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = IsAny<InferTreeNodeChildren<TNode>> extends true ? TOriginalNode : InferTreeNodeChildren<TNode>;
|
|
76
|
+
/**
|
|
77
|
+
* Helper type that creates a properly typed node input for a specific node type.
|
|
78
|
+
* This is the "strict" version that enforces exact property matching.
|
|
79
|
+
*
|
|
80
|
+
* The TOriginalNode parameter is used to track the original root node type
|
|
81
|
+
* for proper self-reference resolution in deeply nested structures.
|
|
82
|
+
*/
|
|
83
|
+
type TreeNodeSetInputStrictWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = {
|
|
84
|
+
readonly type: InferTreeNodeType<TNode>;
|
|
85
|
+
readonly id?: string;
|
|
86
|
+
readonly children: TreeNodeSetInputUnionWithRoot<ResolveChildrenForInput<TNode, TOriginalNode>, TOriginalNode>[];
|
|
87
|
+
} & TreeNodeDataSetInput<TNode>;
|
|
88
|
+
/**
|
|
89
|
+
* Distributive conditional type that creates a union of TreeNodeSetInputStrict
|
|
90
|
+
* for each node type in the union. This ensures proper type discrimination.
|
|
91
|
+
*
|
|
92
|
+
* When TNode is a union (e.g., FolderNode | FileNode), this distributes to:
|
|
93
|
+
* TreeNodeSetInputStrict<FolderNode> | TreeNodeSetInputStrict<FileNode>
|
|
94
|
+
*
|
|
95
|
+
* This creates a proper discriminated union where excess property checking works.
|
|
96
|
+
*/
|
|
97
|
+
type TreeNodeSetInputUnionWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrictWithRoot<TNode, TOriginalNode> : never;
|
|
98
|
+
/**
|
|
99
|
+
* Helper type for single-parameter usage - uses TNode as its own original.
|
|
100
|
+
*/
|
|
101
|
+
type TreeNodeSetInputStrict<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputStrictWithRoot<TNode, TNode>;
|
|
102
|
+
/**
|
|
103
|
+
* Distributive conditional for single-parameter usage.
|
|
104
|
+
*/
|
|
105
|
+
type TreeNodeSetInputUnion<TNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrict<TNode> : never;
|
|
106
|
+
/**
|
|
107
|
+
* Input type for a single node in a nested tree set/default operation.
|
|
108
|
+
*
|
|
109
|
+
* - `type` is REQUIRED - explicit type discriminator for the node
|
|
110
|
+
* - `id` is optional - auto-generated if not provided
|
|
111
|
+
* - `children` is a typed array of allowed child node inputs
|
|
112
|
+
* - Data fields are spread at the node level (like TreeNodeSnapshot)
|
|
113
|
+
*
|
|
114
|
+
* When TNode is a union type (e.g., from InferTreeNodeChildren), this properly
|
|
115
|
+
* distributes to create a discriminated union where:
|
|
116
|
+
* - Each variant has its specific `type` literal
|
|
117
|
+
* - Each variant has its specific data fields
|
|
118
|
+
* - Excess property checking works correctly
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const input: TreeNodeSetInput<BoardNode> = {
|
|
123
|
+
* type: "board",
|
|
124
|
+
* name: "My Board",
|
|
125
|
+
* children: [
|
|
126
|
+
* { type: "column", name: "Todo", children: [] }
|
|
127
|
+
* ]
|
|
128
|
+
* };
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
type TreeNodeSetInput<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputUnion<TNode>;
|
|
132
|
+
/**
|
|
133
|
+
* Input type for tree set() and default() operations.
|
|
134
|
+
* Accepts a nested tree structure that will be converted to flat TreeState internally.
|
|
135
|
+
*/
|
|
136
|
+
type TreeSetInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
137
|
+
/**
|
|
138
|
+
* Infer the set input type for a tree primitive.
|
|
139
|
+
*/
|
|
140
|
+
type InferTreeSetInput<T extends TreePrimitive<any>> = T extends TreePrimitive<infer TRoot> ? TreeSetInput<TRoot> : never;
|
|
59
141
|
/**
|
|
60
142
|
* Typed proxy for a specific node type - provides type-safe data access
|
|
61
143
|
*/
|
|
@@ -92,8 +174,8 @@ interface TreeNodeProxyBase<_TRoot extends AnyTreeNodePrimitive> {
|
|
|
92
174
|
interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
93
175
|
/** Gets the entire tree state (flat array of nodes) */
|
|
94
176
|
get(): TreeState<TRoot$1>;
|
|
95
|
-
/** Replaces the entire tree */
|
|
96
|
-
set(
|
|
177
|
+
/** Replaces the entire tree with a nested input structure */
|
|
178
|
+
set(input: TreeSetInput<TRoot$1>): void;
|
|
97
179
|
/** Gets the root node state */
|
|
98
180
|
root(): TypedTreeNodeState<TRoot$1> | undefined;
|
|
99
181
|
/** Gets ordered children states of a parent (null for root's children) */
|
|
@@ -131,14 +213,12 @@ interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
131
213
|
}
|
|
132
214
|
interface TreePrimitiveSchema<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
133
215
|
readonly required: boolean;
|
|
134
|
-
readonly
|
|
216
|
+
readonly defaultInput: TreeNodeSetInput<TRoot$1> | undefined;
|
|
135
217
|
readonly root: TRoot$1;
|
|
136
218
|
readonly validators: readonly Validator<TreeState<TRoot$1>>[];
|
|
137
219
|
}
|
|
138
|
-
/** Input type for tree
|
|
139
|
-
type
|
|
140
|
-
/** Input type for tree update() - same as set() for trees */
|
|
141
|
-
type TreeUpdateInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeState<TRoot$1>;
|
|
220
|
+
/** Input type for tree update() - same as set() for trees (nested format) */
|
|
221
|
+
type TreeUpdateInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
142
222
|
declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired extends boolean = false, THasDefault extends boolean = false> implements Primitive<TreeState<TRoot$1>, TreeProxy<TRoot$1>, TRequired, THasDefault, TreeSetInput<TRoot$1>, TreeUpdateInput<TRoot$1>> {
|
|
143
223
|
readonly _tag: "TreePrimitive";
|
|
144
224
|
readonly _State: TreeState<TRoot$1>;
|
|
@@ -153,8 +233,8 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
153
233
|
constructor(schema: TreePrimitiveSchema<TRoot$1>);
|
|
154
234
|
/** Mark this tree as required */
|
|
155
235
|
required(): TreePrimitive<TRoot$1, true, THasDefault>;
|
|
156
|
-
/** Set a default value for this tree */
|
|
157
|
-
default(
|
|
236
|
+
/** Set a default value for this tree (nested format) */
|
|
237
|
+
default(defaultInput: TreeNodeSetInput<TRoot$1>): TreePrimitive<TRoot$1, TRequired, true>;
|
|
158
238
|
/** Get the root node type */
|
|
159
239
|
get root(): TRoot$1;
|
|
160
240
|
/** Add a custom validation rule */
|
|
@@ -171,6 +251,15 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
171
251
|
* Validate that a node type can be a child of a parent node type
|
|
172
252
|
*/
|
|
173
253
|
private _validateChildType;
|
|
254
|
+
/**
|
|
255
|
+
* Convert a nested TreeNodeSetInput to flat TreeState format.
|
|
256
|
+
* Recursively processes nodes, generating IDs and positions as needed.
|
|
257
|
+
*
|
|
258
|
+
* @param input - The root nested input to convert
|
|
259
|
+
* @param generateId - Optional ID generator (defaults to crypto.randomUUID)
|
|
260
|
+
* @returns Flat TreeState array
|
|
261
|
+
*/
|
|
262
|
+
private _convertNestedToFlat;
|
|
174
263
|
readonly _internal: PrimitiveInternal<TreeState<TRoot$1>, TreeProxy<TRoot$1>>;
|
|
175
264
|
}
|
|
176
265
|
/** Options for creating a Tree primitive */
|
|
@@ -181,5 +270,5 @@ interface TreeOptions<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
181
270
|
/** Creates a new TreePrimitive with the given root node type */
|
|
182
271
|
declare const Tree: <TRoot$1 extends AnyTreeNodePrimitive>(options: TreeOptions<TRoot$1>) => TreePrimitive<TRoot$1, false, false>;
|
|
183
272
|
//#endregion
|
|
184
|
-
export { InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
273
|
+
export { InferTreeSetInput, InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSetInput, TreeNodeSetInputUnion, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
185
274
|
//# sourceMappingURL=Tree.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.d.mts","names":[],"sources":["../../src/primitives/Tree.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkBA;AAWA;AAAkD,UAXjC,aAAA,CAWiC;EAEf,SAAA,EAAA,EAAA,MAAA;EAAlB,SAAA,IAAA,EAAA,MAAA;EAGuB,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EAAvB,SAAA,GAAA,EAAA,MAAA;EAAsB,SAAA,IAAA,EAAA,OAAA;AAMvC;AAwDA;;;
|
|
1
|
+
{"version":3,"file":"Tree.d.mts","names":[],"sources":["../../src/primitives/Tree.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/primitives/Tree.mjs
CHANGED
|
@@ -5,9 +5,15 @@ import { make } from "../OperationDefinition.mjs";
|
|
|
5
5
|
import { isPrefix, pathsEqual, pathsOverlap } from "../OperationPath.mjs";
|
|
6
6
|
import { fromDefinition } from "../Operation.mjs";
|
|
7
7
|
import { base62CharSet, generateKeyBetween } from "../FractionalIndex.mjs";
|
|
8
|
+
import { _objectWithoutProperties } from "../_virtual/_@oxc-project_runtime@0.103.0/helpers/objectWithoutProperties.mjs";
|
|
8
9
|
import { Effect, Schema } from "effect";
|
|
9
10
|
|
|
10
11
|
//#region src/primitives/Tree.ts
|
|
12
|
+
const _excluded = [
|
|
13
|
+
"type",
|
|
14
|
+
"id",
|
|
15
|
+
"children"
|
|
16
|
+
];
|
|
11
17
|
/**
|
|
12
18
|
* Helper to get children sorted by position
|
|
13
19
|
*/
|
|
@@ -125,15 +131,18 @@ var TreePrimitive = class TreePrimitive {
|
|
|
125
131
|
}
|
|
126
132
|
return _objectSpread2(_objectSpread2({
|
|
127
133
|
id: node.id,
|
|
128
|
-
type: node.type
|
|
134
|
+
type: node.type,
|
|
135
|
+
pos: node.pos,
|
|
136
|
+
parentId: node.parentId
|
|
129
137
|
}, node.data), {}, { children });
|
|
130
138
|
};
|
|
131
139
|
return {
|
|
132
140
|
get: () => {
|
|
133
141
|
return getCurrentState();
|
|
134
142
|
},
|
|
135
|
-
set: (
|
|
136
|
-
|
|
143
|
+
set: (input) => {
|
|
144
|
+
const flatState = this._convertNestedToFlat(input, env.generateId);
|
|
145
|
+
env.addOperation(fromDefinition(operationPath, this._opDefinitions.set, flatState));
|
|
137
146
|
},
|
|
138
147
|
root: () => {
|
|
139
148
|
return getCurrentState().find((n) => n.parentId === null);
|
|
@@ -428,7 +437,7 @@ var TreePrimitive = class TreePrimitive {
|
|
|
428
437
|
},
|
|
429
438
|
getInitialState: () => {
|
|
430
439
|
var _rootNodeType$data$_i;
|
|
431
|
-
if (this._schema.
|
|
440
|
+
if (this._schema.defaultInput !== void 0) return this._convertNestedToFlat(this._schema.defaultInput);
|
|
432
441
|
const rootNodeType = this._schema.root;
|
|
433
442
|
const rootData = (_rootNodeType$data$_i = rootNodeType.data._internal.getInitialState()) !== null && _rootNodeType$data$_i !== void 0 ? _rootNodeType$data$_i : {};
|
|
434
443
|
const rootId = crypto.randomUUID();
|
|
@@ -441,6 +450,9 @@ var TreePrimitive = class TreePrimitive {
|
|
|
441
450
|
data: rootData
|
|
442
451
|
}];
|
|
443
452
|
},
|
|
453
|
+
convertSetInputToState: (input) => {
|
|
454
|
+
return this._convertNestedToFlat(input);
|
|
455
|
+
},
|
|
444
456
|
transformOperation: (clientOp, serverOp) => {
|
|
445
457
|
const clientPath = clientOp.path;
|
|
446
458
|
const serverPath = serverOp.path;
|
|
@@ -509,9 +521,9 @@ var TreePrimitive = class TreePrimitive {
|
|
|
509
521
|
required() {
|
|
510
522
|
return new TreePrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { required: true }));
|
|
511
523
|
}
|
|
512
|
-
/** Set a default value for this tree */
|
|
513
|
-
default(
|
|
514
|
-
return new TreePrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, {
|
|
524
|
+
/** Set a default value for this tree (nested format) */
|
|
525
|
+
default(defaultInput) {
|
|
526
|
+
return new TreePrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { defaultInput }));
|
|
515
527
|
}
|
|
516
528
|
/** Get the root node type */
|
|
517
529
|
get root() {
|
|
@@ -560,11 +572,49 @@ var TreePrimitive = class TreePrimitive {
|
|
|
560
572
|
const parentNodePrimitive = this._getNodeTypePrimitive(parentType);
|
|
561
573
|
if (!parentNodePrimitive.isChildAllowed(childType)) throw new ValidationError(`Node type "${childType}" is not allowed as a child of "${parentType}". Allowed types: ${parentNodePrimitive.children.map((c) => c.type).join(", ") || "none"}`);
|
|
562
574
|
}
|
|
575
|
+
/**
|
|
576
|
+
* Convert a nested TreeNodeSetInput to flat TreeState format.
|
|
577
|
+
* Recursively processes nodes, generating IDs and positions as needed.
|
|
578
|
+
*
|
|
579
|
+
* @param input - The root nested input to convert
|
|
580
|
+
* @param generateId - Optional ID generator (defaults to crypto.randomUUID)
|
|
581
|
+
* @returns Flat TreeState array
|
|
582
|
+
*/
|
|
583
|
+
_convertNestedToFlat(input, generateId = () => crypto.randomUUID()) {
|
|
584
|
+
const result = [];
|
|
585
|
+
const seenIds = /* @__PURE__ */ new Set();
|
|
586
|
+
const processNode = (nodeInput, parentId, parentType, leftPos, rightPos) => {
|
|
587
|
+
var _nodeInput$id;
|
|
588
|
+
this._validateChildType(parentType, nodeInput.type);
|
|
589
|
+
const nodePrimitive = this._getNodeTypePrimitive(nodeInput.type);
|
|
590
|
+
const id = (_nodeInput$id = nodeInput.id) !== null && _nodeInput$id !== void 0 ? _nodeInput$id : generateId();
|
|
591
|
+
if (seenIds.has(id)) throw new ValidationError(`Duplicate node ID: ${id}`);
|
|
592
|
+
seenIds.add(id);
|
|
593
|
+
const pos = generateTreePosBetween(leftPos, rightPos);
|
|
594
|
+
const { type: _type, id: _id, children } = nodeInput, dataFields = _objectWithoutProperties(nodeInput, _excluded);
|
|
595
|
+
const mergedData = applyDefaults(nodePrimitive.data, dataFields);
|
|
596
|
+
result.push({
|
|
597
|
+
id,
|
|
598
|
+
type: nodeInput.type,
|
|
599
|
+
parentId,
|
|
600
|
+
pos,
|
|
601
|
+
data: mergedData
|
|
602
|
+
});
|
|
603
|
+
let prevChildPos = null;
|
|
604
|
+
for (let i = 0; i < children.length; i++) {
|
|
605
|
+
const childInput = children[i];
|
|
606
|
+
processNode(childInput, id, nodeInput.type, prevChildPos, null);
|
|
607
|
+
prevChildPos = result[result.length - 1].pos;
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
processNode(input, null, null, null, null);
|
|
611
|
+
return result;
|
|
612
|
+
}
|
|
563
613
|
};
|
|
564
614
|
/** Creates a new TreePrimitive with the given root node type */
|
|
565
615
|
const Tree = (options) => new TreePrimitive({
|
|
566
616
|
required: false,
|
|
567
|
-
|
|
617
|
+
defaultInput: void 0,
|
|
568
618
|
root: options.root,
|
|
569
619
|
validators: []
|
|
570
620
|
});
|