@voidhash/mimic 0.0.4 → 0.0.5
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/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 +55 -7
- package/dist/primitives/Tree.d.cts +97 -10
- package/dist/primitives/Tree.d.cts.map +1 -1
- package/dist/primitives/Tree.d.mts +97 -10
- package/dist/primitives/Tree.d.mts.map +1 -1
- package/dist/primitives/Tree.mjs +55 -7
- 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 +209 -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 +291 -17
- package/tests/server/ServerDocument.test.ts +1 -1
- package/tsconfig.json +1 -1
|
@@ -56,6 +56,86 @@ type TreeNodeUpdateValue<TNode extends AnyTreeNodePrimitive> = TNode["data"] ext
|
|
|
56
56
|
* always require a data object (even if empty for all-optional fields).
|
|
57
57
|
*/
|
|
58
58
|
type TreeNodeDataSetInput<TNode extends AnyTreeNodePrimitive> = TNode["data"] extends StructPrimitive<infer TFields, any, any> ? StructSetInput<TFields> : InferSetInput<TNode["data"]>;
|
|
59
|
+
/**
|
|
60
|
+
* Type guard to check if a type is `any` or unknown (structural check).
|
|
61
|
+
* Returns true if T is `any`, false otherwise.
|
|
62
|
+
*/
|
|
63
|
+
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
64
|
+
/**
|
|
65
|
+
* Get children types, with special handling for self-referential nodes.
|
|
66
|
+
* When InferTreeNodeChildren returns `any` (from TreeNodePrimitive<..., any>),
|
|
67
|
+
* we fall back to using TNode itself as its own child type.
|
|
68
|
+
* This handles the common case of self-referential nodes like:
|
|
69
|
+
* FolderNode = TreeNode("folder", { children: [TreeNodeSelf, FileNode] })
|
|
70
|
+
* Where FolderNode's TChildren is resolved to FolderNode | FileNode,
|
|
71
|
+
* but the self-referenced FolderNode has TChildren = any.
|
|
72
|
+
*/
|
|
73
|
+
type ResolveChildrenForInput<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = IsAny<InferTreeNodeChildren<TNode>> extends true ? TOriginalNode : InferTreeNodeChildren<TNode>;
|
|
74
|
+
/**
|
|
75
|
+
* Helper type that creates a properly typed node input for a specific node type.
|
|
76
|
+
* This is the "strict" version that enforces exact property matching.
|
|
77
|
+
*
|
|
78
|
+
* The TOriginalNode parameter is used to track the original root node type
|
|
79
|
+
* for proper self-reference resolution in deeply nested structures.
|
|
80
|
+
*/
|
|
81
|
+
type TreeNodeSetInputStrictWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = {
|
|
82
|
+
readonly type: InferTreeNodeType<TNode>;
|
|
83
|
+
readonly id?: string;
|
|
84
|
+
readonly children: TreeNodeSetInputUnionWithRoot<ResolveChildrenForInput<TNode, TOriginalNode>, TOriginalNode>[];
|
|
85
|
+
} & TreeNodeDataSetInput<TNode>;
|
|
86
|
+
/**
|
|
87
|
+
* Distributive conditional type that creates a union of TreeNodeSetInputStrict
|
|
88
|
+
* for each node type in the union. This ensures proper type discrimination.
|
|
89
|
+
*
|
|
90
|
+
* When TNode is a union (e.g., FolderNode | FileNode), this distributes to:
|
|
91
|
+
* TreeNodeSetInputStrict<FolderNode> | TreeNodeSetInputStrict<FileNode>
|
|
92
|
+
*
|
|
93
|
+
* This creates a proper discriminated union where excess property checking works.
|
|
94
|
+
*/
|
|
95
|
+
type TreeNodeSetInputUnionWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrictWithRoot<TNode, TOriginalNode> : never;
|
|
96
|
+
/**
|
|
97
|
+
* Helper type for single-parameter usage - uses TNode as its own original.
|
|
98
|
+
*/
|
|
99
|
+
type TreeNodeSetInputStrict<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputStrictWithRoot<TNode, TNode>;
|
|
100
|
+
/**
|
|
101
|
+
* Distributive conditional for single-parameter usage.
|
|
102
|
+
*/
|
|
103
|
+
type TreeNodeSetInputUnion<TNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrict<TNode> : never;
|
|
104
|
+
/**
|
|
105
|
+
* Input type for a single node in a nested tree set/default operation.
|
|
106
|
+
*
|
|
107
|
+
* - `type` is REQUIRED - explicit type discriminator for the node
|
|
108
|
+
* - `id` is optional - auto-generated if not provided
|
|
109
|
+
* - `children` is a typed array of allowed child node inputs
|
|
110
|
+
* - Data fields are spread at the node level (like TreeNodeSnapshot)
|
|
111
|
+
*
|
|
112
|
+
* When TNode is a union type (e.g., from InferTreeNodeChildren), this properly
|
|
113
|
+
* distributes to create a discriminated union where:
|
|
114
|
+
* - Each variant has its specific `type` literal
|
|
115
|
+
* - Each variant has its specific data fields
|
|
116
|
+
* - Excess property checking works correctly
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const input: TreeNodeSetInput<BoardNode> = {
|
|
121
|
+
* type: "board",
|
|
122
|
+
* name: "My Board",
|
|
123
|
+
* children: [
|
|
124
|
+
* { type: "column", name: "Todo", children: [] }
|
|
125
|
+
* ]
|
|
126
|
+
* };
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
type TreeNodeSetInput<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputUnion<TNode>;
|
|
130
|
+
/**
|
|
131
|
+
* Input type for tree set() and default() operations.
|
|
132
|
+
* Accepts a nested tree structure that will be converted to flat TreeState internally.
|
|
133
|
+
*/
|
|
134
|
+
type TreeSetInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
135
|
+
/**
|
|
136
|
+
* Infer the set input type for a tree primitive.
|
|
137
|
+
*/
|
|
138
|
+
type InferTreeSetInput<T extends TreePrimitive<any>> = T extends TreePrimitive<infer TRoot> ? TreeSetInput<TRoot> : never;
|
|
59
139
|
/**
|
|
60
140
|
* Typed proxy for a specific node type - provides type-safe data access
|
|
61
141
|
*/
|
|
@@ -92,8 +172,8 @@ interface TreeNodeProxyBase<_TRoot extends AnyTreeNodePrimitive> {
|
|
|
92
172
|
interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
93
173
|
/** Gets the entire tree state (flat array of nodes) */
|
|
94
174
|
get(): TreeState<TRoot$1>;
|
|
95
|
-
/** Replaces the entire tree */
|
|
96
|
-
set(
|
|
175
|
+
/** Replaces the entire tree with a nested input structure */
|
|
176
|
+
set(input: TreeSetInput<TRoot$1>): void;
|
|
97
177
|
/** Gets the root node state */
|
|
98
178
|
root(): TypedTreeNodeState<TRoot$1> | undefined;
|
|
99
179
|
/** Gets ordered children states of a parent (null for root's children) */
|
|
@@ -131,14 +211,12 @@ interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
131
211
|
}
|
|
132
212
|
interface TreePrimitiveSchema<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
133
213
|
readonly required: boolean;
|
|
134
|
-
readonly
|
|
214
|
+
readonly defaultInput: TreeNodeSetInput<TRoot$1> | undefined;
|
|
135
215
|
readonly root: TRoot$1;
|
|
136
216
|
readonly validators: readonly Validator<TreeState<TRoot$1>>[];
|
|
137
217
|
}
|
|
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>;
|
|
218
|
+
/** Input type for tree update() - same as set() for trees (nested format) */
|
|
219
|
+
type TreeUpdateInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
142
220
|
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
221
|
readonly _tag: "TreePrimitive";
|
|
144
222
|
readonly _State: TreeState<TRoot$1>;
|
|
@@ -153,8 +231,8 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
153
231
|
constructor(schema: TreePrimitiveSchema<TRoot$1>);
|
|
154
232
|
/** Mark this tree as required */
|
|
155
233
|
required(): TreePrimitive<TRoot$1, true, THasDefault>;
|
|
156
|
-
/** Set a default value for this tree */
|
|
157
|
-
default(
|
|
234
|
+
/** Set a default value for this tree (nested format) */
|
|
235
|
+
default(defaultInput: TreeNodeSetInput<TRoot$1>): TreePrimitive<TRoot$1, TRequired, true>;
|
|
158
236
|
/** Get the root node type */
|
|
159
237
|
get root(): TRoot$1;
|
|
160
238
|
/** Add a custom validation rule */
|
|
@@ -171,6 +249,15 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
171
249
|
* Validate that a node type can be a child of a parent node type
|
|
172
250
|
*/
|
|
173
251
|
private _validateChildType;
|
|
252
|
+
/**
|
|
253
|
+
* Convert a nested TreeNodeSetInput to flat TreeState format.
|
|
254
|
+
* Recursively processes nodes, generating IDs and positions as needed.
|
|
255
|
+
*
|
|
256
|
+
* @param input - The root nested input to convert
|
|
257
|
+
* @param generateId - Optional ID generator (defaults to crypto.randomUUID)
|
|
258
|
+
* @returns Flat TreeState array
|
|
259
|
+
*/
|
|
260
|
+
private _convertNestedToFlat;
|
|
174
261
|
readonly _internal: PrimitiveInternal<TreeState<TRoot$1>, TreeProxy<TRoot$1>>;
|
|
175
262
|
}
|
|
176
263
|
/** Options for creating a Tree primitive */
|
|
@@ -181,5 +268,5 @@ interface TreeOptions<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
181
268
|
/** Creates a new TreePrimitive with the given root node type */
|
|
182
269
|
declare const Tree: <TRoot$1 extends AnyTreeNodePrimitive>(options: TreeOptions<TRoot$1>) => TreePrimitive<TRoot$1, false, false>;
|
|
183
270
|
//#endregion
|
|
184
|
-
export { InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
271
|
+
export { InferTreeSetInput, InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSetInput, TreeNodeSetInputUnion, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
185
272
|
//# 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;;;AAEiB,UArEA,kBAqEA,CAAA,cArEiC,oBAqEjC,CAAA,CAAA;EAC2C,SAAA,EAAA,EAAA,MAAA;EAAtB,SAAA,IAAA,EApErB,iBAoEqB,CApEH,KAoEG,CAAA;EAAjB,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EACM,SAAA,GAAA,EAAA,MAAA;EAAvB,SAAA,IAAA,EAlEa,sBAkEb,CAlEoC,KAkEpC,CAAA;;AAKJ;;;AACY,KAlEA,SAkEA,CAAA,eAlEyB,oBAkEzB,CAAA,GAAA,SAlE0D,aAkE1D,EAAA;;;;AAOA,KAjBA,gBAiBmB,CAAA,cAjBY,oBAiBZ,CAAA,GAAA;EAAe,SAAA,EAAA,EAAA,MAAA;EAC5C,SAAA,IAAA,EAhBe,iBAgBf,CAhBiC,KAgBjC,CAAA;EAAsB,SAAA,QAAA,EAfH,gBAeG,CAfc,qBAed,CAfoC,KAepC,CAAA,CAAA,EAAA;CACA,GAfpB,sBAeoB,CAfG,KAeH,CAAA;;;;AACF,KAXV,iBAWU,CAAA,UAXkB,aAWlB,CAAA,GAAA,CAAA,CAAA,GAVpB,CAUoB,SAVV,aAUU,CAAA,KAAA,MAAA,CAAA,GAVmB,gBAUnB,CAVoC,KAUpC,CAAA,GAAA,KAAA;AAWtB;;;;;AAEM,KAhBM,mBAgBN,CAAA,cAhBwC,oBAgBxC,CAAA,GAfJ,KAeI,CAAA,MAAA,CAAA,SAfkB,eAelB,CAAA,KAAA,QAAA,EAAA,GAAA,EAAA,GAAA,CAAA,GAdA,iBAcA,CAdkB,OAclB,CAAA,GAbA,gBAaA,CAbiB,KAajB,CAAA,MAAA,CAAA,CAAA;;;;
|
|
1
|
+
{"version":3,"file":"Tree.d.cts","names":[],"sources":["../../src/primitives/Tree.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -56,6 +56,86 @@ type TreeNodeUpdateValue<TNode extends AnyTreeNodePrimitive> = TNode["data"] ext
|
|
|
56
56
|
* always require a data object (even if empty for all-optional fields).
|
|
57
57
|
*/
|
|
58
58
|
type TreeNodeDataSetInput<TNode extends AnyTreeNodePrimitive> = TNode["data"] extends StructPrimitive<infer TFields, any, any> ? StructSetInput<TFields> : InferSetInput<TNode["data"]>;
|
|
59
|
+
/**
|
|
60
|
+
* Type guard to check if a type is `any` or unknown (structural check).
|
|
61
|
+
* Returns true if T is `any`, false otherwise.
|
|
62
|
+
*/
|
|
63
|
+
type IsAny<T> = 0 extends (1 & T) ? true : false;
|
|
64
|
+
/**
|
|
65
|
+
* Get children types, with special handling for self-referential nodes.
|
|
66
|
+
* When InferTreeNodeChildren returns `any` (from TreeNodePrimitive<..., any>),
|
|
67
|
+
* we fall back to using TNode itself as its own child type.
|
|
68
|
+
* This handles the common case of self-referential nodes like:
|
|
69
|
+
* FolderNode = TreeNode("folder", { children: [TreeNodeSelf, FileNode] })
|
|
70
|
+
* Where FolderNode's TChildren is resolved to FolderNode | FileNode,
|
|
71
|
+
* but the self-referenced FolderNode has TChildren = any.
|
|
72
|
+
*/
|
|
73
|
+
type ResolveChildrenForInput<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = IsAny<InferTreeNodeChildren<TNode>> extends true ? TOriginalNode : InferTreeNodeChildren<TNode>;
|
|
74
|
+
/**
|
|
75
|
+
* Helper type that creates a properly typed node input for a specific node type.
|
|
76
|
+
* This is the "strict" version that enforces exact property matching.
|
|
77
|
+
*
|
|
78
|
+
* The TOriginalNode parameter is used to track the original root node type
|
|
79
|
+
* for proper self-reference resolution in deeply nested structures.
|
|
80
|
+
*/
|
|
81
|
+
type TreeNodeSetInputStrictWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = {
|
|
82
|
+
readonly type: InferTreeNodeType<TNode>;
|
|
83
|
+
readonly id?: string;
|
|
84
|
+
readonly children: TreeNodeSetInputUnionWithRoot<ResolveChildrenForInput<TNode, TOriginalNode>, TOriginalNode>[];
|
|
85
|
+
} & TreeNodeDataSetInput<TNode>;
|
|
86
|
+
/**
|
|
87
|
+
* Distributive conditional type that creates a union of TreeNodeSetInputStrict
|
|
88
|
+
* for each node type in the union. This ensures proper type discrimination.
|
|
89
|
+
*
|
|
90
|
+
* When TNode is a union (e.g., FolderNode | FileNode), this distributes to:
|
|
91
|
+
* TreeNodeSetInputStrict<FolderNode> | TreeNodeSetInputStrict<FileNode>
|
|
92
|
+
*
|
|
93
|
+
* This creates a proper discriminated union where excess property checking works.
|
|
94
|
+
*/
|
|
95
|
+
type TreeNodeSetInputUnionWithRoot<TNode extends AnyTreeNodePrimitive, TOriginalNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrictWithRoot<TNode, TOriginalNode> : never;
|
|
96
|
+
/**
|
|
97
|
+
* Helper type for single-parameter usage - uses TNode as its own original.
|
|
98
|
+
*/
|
|
99
|
+
type TreeNodeSetInputStrict<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputStrictWithRoot<TNode, TNode>;
|
|
100
|
+
/**
|
|
101
|
+
* Distributive conditional for single-parameter usage.
|
|
102
|
+
*/
|
|
103
|
+
type TreeNodeSetInputUnion<TNode extends AnyTreeNodePrimitive> = TNode extends AnyTreeNodePrimitive ? TreeNodeSetInputStrict<TNode> : never;
|
|
104
|
+
/**
|
|
105
|
+
* Input type for a single node in a nested tree set/default operation.
|
|
106
|
+
*
|
|
107
|
+
* - `type` is REQUIRED - explicit type discriminator for the node
|
|
108
|
+
* - `id` is optional - auto-generated if not provided
|
|
109
|
+
* - `children` is a typed array of allowed child node inputs
|
|
110
|
+
* - Data fields are spread at the node level (like TreeNodeSnapshot)
|
|
111
|
+
*
|
|
112
|
+
* When TNode is a union type (e.g., from InferTreeNodeChildren), this properly
|
|
113
|
+
* distributes to create a discriminated union where:
|
|
114
|
+
* - Each variant has its specific `type` literal
|
|
115
|
+
* - Each variant has its specific data fields
|
|
116
|
+
* - Excess property checking works correctly
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const input: TreeNodeSetInput<BoardNode> = {
|
|
121
|
+
* type: "board",
|
|
122
|
+
* name: "My Board",
|
|
123
|
+
* children: [
|
|
124
|
+
* { type: "column", name: "Todo", children: [] }
|
|
125
|
+
* ]
|
|
126
|
+
* };
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
type TreeNodeSetInput<TNode extends AnyTreeNodePrimitive> = TreeNodeSetInputUnion<TNode>;
|
|
130
|
+
/**
|
|
131
|
+
* Input type for tree set() and default() operations.
|
|
132
|
+
* Accepts a nested tree structure that will be converted to flat TreeState internally.
|
|
133
|
+
*/
|
|
134
|
+
type TreeSetInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
135
|
+
/**
|
|
136
|
+
* Infer the set input type for a tree primitive.
|
|
137
|
+
*/
|
|
138
|
+
type InferTreeSetInput<T extends TreePrimitive<any>> = T extends TreePrimitive<infer TRoot> ? TreeSetInput<TRoot> : never;
|
|
59
139
|
/**
|
|
60
140
|
* Typed proxy for a specific node type - provides type-safe data access
|
|
61
141
|
*/
|
|
@@ -92,8 +172,8 @@ interface TreeNodeProxyBase<_TRoot extends AnyTreeNodePrimitive> {
|
|
|
92
172
|
interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
93
173
|
/** Gets the entire tree state (flat array of nodes) */
|
|
94
174
|
get(): TreeState<TRoot$1>;
|
|
95
|
-
/** Replaces the entire tree */
|
|
96
|
-
set(
|
|
175
|
+
/** Replaces the entire tree with a nested input structure */
|
|
176
|
+
set(input: TreeSetInput<TRoot$1>): void;
|
|
97
177
|
/** Gets the root node state */
|
|
98
178
|
root(): TypedTreeNodeState<TRoot$1> | undefined;
|
|
99
179
|
/** Gets ordered children states of a parent (null for root's children) */
|
|
@@ -131,14 +211,12 @@ interface TreeProxy<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
131
211
|
}
|
|
132
212
|
interface TreePrimitiveSchema<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
133
213
|
readonly required: boolean;
|
|
134
|
-
readonly
|
|
214
|
+
readonly defaultInput: TreeNodeSetInput<TRoot$1> | undefined;
|
|
135
215
|
readonly root: TRoot$1;
|
|
136
216
|
readonly validators: readonly Validator<TreeState<TRoot$1>>[];
|
|
137
217
|
}
|
|
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>;
|
|
218
|
+
/** Input type for tree update() - same as set() for trees (nested format) */
|
|
219
|
+
type TreeUpdateInput<TRoot$1 extends AnyTreeNodePrimitive> = TreeNodeSetInput<TRoot$1>;
|
|
142
220
|
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
221
|
readonly _tag: "TreePrimitive";
|
|
144
222
|
readonly _State: TreeState<TRoot$1>;
|
|
@@ -153,8 +231,8 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
153
231
|
constructor(schema: TreePrimitiveSchema<TRoot$1>);
|
|
154
232
|
/** Mark this tree as required */
|
|
155
233
|
required(): TreePrimitive<TRoot$1, true, THasDefault>;
|
|
156
|
-
/** Set a default value for this tree */
|
|
157
|
-
default(
|
|
234
|
+
/** Set a default value for this tree (nested format) */
|
|
235
|
+
default(defaultInput: TreeNodeSetInput<TRoot$1>): TreePrimitive<TRoot$1, TRequired, true>;
|
|
158
236
|
/** Get the root node type */
|
|
159
237
|
get root(): TRoot$1;
|
|
160
238
|
/** Add a custom validation rule */
|
|
@@ -171,6 +249,15 @@ declare class TreePrimitive<TRoot$1 extends AnyTreeNodePrimitive, TRequired exte
|
|
|
171
249
|
* Validate that a node type can be a child of a parent node type
|
|
172
250
|
*/
|
|
173
251
|
private _validateChildType;
|
|
252
|
+
/**
|
|
253
|
+
* Convert a nested TreeNodeSetInput to flat TreeState format.
|
|
254
|
+
* Recursively processes nodes, generating IDs and positions as needed.
|
|
255
|
+
*
|
|
256
|
+
* @param input - The root nested input to convert
|
|
257
|
+
* @param generateId - Optional ID generator (defaults to crypto.randomUUID)
|
|
258
|
+
* @returns Flat TreeState array
|
|
259
|
+
*/
|
|
260
|
+
private _convertNestedToFlat;
|
|
174
261
|
readonly _internal: PrimitiveInternal<TreeState<TRoot$1>, TreeProxy<TRoot$1>>;
|
|
175
262
|
}
|
|
176
263
|
/** Options for creating a Tree primitive */
|
|
@@ -181,5 +268,5 @@ interface TreeOptions<TRoot$1 extends AnyTreeNodePrimitive> {
|
|
|
181
268
|
/** Creates a new TreePrimitive with the given root node type */
|
|
182
269
|
declare const Tree: <TRoot$1 extends AnyTreeNodePrimitive>(options: TreeOptions<TRoot$1>) => TreePrimitive<TRoot$1, false, false>;
|
|
183
270
|
//#endregion
|
|
184
|
-
export { InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
271
|
+
export { InferTreeSetInput, InferTreeSnapshot, Tree, TreeNodeDataSetInput, TreeNodeProxyBase, TreeNodeSetInput, TreeNodeSetInputUnion, TreeNodeSnapshot, TreeNodeState, TreeNodeUpdateValue, TreeOptions, TreePrimitive, TreeProxy, TreeSetInput, TreeState, TreeUpdateInput, TypedNodeProxy, TypedTreeNodeState };
|
|
185
272
|
//# 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;;;AAEiB,UArEA,kBAqEA,CAAA,cArEiC,oBAqEjC,CAAA,CAAA;EAC2C,SAAA,EAAA,EAAA,MAAA;EAAtB,SAAA,IAAA,EApErB,iBAoEqB,CApEH,KAoEG,CAAA;EAAjB,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EACM,SAAA,GAAA,EAAA,MAAA;EAAvB,SAAA,IAAA,EAlEa,sBAkEb,CAlEoC,KAkEpC,CAAA;;AAKJ;;;AACY,KAlEA,SAkEA,CAAA,eAlEyB,oBAkEzB,CAAA,GAAA,SAlE0D,aAkE1D,EAAA;;;;AAOA,KAjBA,gBAiBmB,CAAA,cAjBY,oBAiBZ,CAAA,GAAA;EAAe,SAAA,EAAA,EAAA,MAAA;EAC5C,SAAA,IAAA,EAhBe,iBAgBf,CAhBiC,KAgBjC,CAAA;EAAsB,SAAA,QAAA,EAfH,gBAeG,CAfc,qBAed,CAfoC,KAepC,CAAA,CAAA,EAAA;CACA,GAfpB,sBAeoB,CAfG,KAeH,CAAA;;;;AACF,KAXV,iBAWU,CAAA,UAXkB,aAWlB,CAAA,GAAA,CAAA,CAAA,GAVpB,CAUoB,SAVV,aAUU,CAAA,KAAA,MAAA,CAAA,GAVmB,gBAUnB,CAVoC,KAUpC,CAAA,GAAA,KAAA;AAWtB;;;;;AAEM,KAhBM,mBAgBN,CAAA,cAhBwC,oBAgBxC,CAAA,GAfJ,KAeI,CAAA,MAAA,CAAA,SAfkB,eAelB,CAAA,KAAA,QAAA,EAAA,GAAA,EAAA,GAAA,CAAA,GAdA,iBAcA,CAdkB,OAclB,CAAA,GAbA,gBAaA,CAbiB,KAajB,CAAA,MAAA,CAAA,CAAA;;;;
|
|
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;;;AAEiB,UArEA,kBAqEA,CAAA,cArEiC,oBAqEjC,CAAA,CAAA;EAC2C,SAAA,EAAA,EAAA,MAAA;EAAtB,SAAA,IAAA,EApErB,iBAoEqB,CApEH,KAoEG,CAAA;EAAjB,SAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EACM,SAAA,GAAA,EAAA,MAAA;EAAvB,SAAA,IAAA,EAlEa,sBAkEb,CAlEoC,KAkEpC,CAAA;;AAKJ;;;AACY,KAlEA,SAkEA,CAAA,eAlEyB,oBAkEzB,CAAA,GAAA,SAlE0D,aAkE1D,EAAA;;;;AAOA,KAjBA,gBAiBmB,CAAA,cAjBY,oBAiBZ,CAAA,GAAA;EAAe,SAAA,EAAA,EAAA,MAAA;EAC5C,SAAA,IAAA,EAhBe,iBAgBf,CAhBiC,KAgBjC,CAAA;EAAsB,SAAA,QAAA,EAfH,gBAeG,CAfc,qBAed,CAfoC,KAepC,CAAA,CAAA,EAAA;CACA,GAfpB,sBAeoB,CAfG,KAeH,CAAA;;;;AACF,KAXV,iBAWU,CAAA,UAXkB,aAWlB,CAAA,GAAA,CAAA,CAAA,GAVpB,CAUoB,SAVV,aAUU,CAAA,KAAA,MAAA,CAAA,GAVmB,gBAUnB,CAVoC,KAUpC,CAAA,GAAA,KAAA;AAWtB;;;;;AAEM,KAhBM,mBAgBN,CAAA,cAhBwC,oBAgBxC,CAAA,GAfJ,KAeI,CAAA,MAAA,CAAA,SAfkB,eAelB,CAAA,KAAA,QAAA,EAAA,GAAA,EAAA,GAAA,CAAA,GAdA,iBAcA,CAdkB,OAclB,CAAA,GAbA,gBAaA,CAbiB,KAajB,CAAA,MAAA,CAAA,CAAA;;;;AAC6B;AAUH;;;;;AAY9B,KAzBU,oBAyBV,CAAA,cAzB6C,oBAyB7C,CAAA,GAxBA,KAwBA,CAAA,MAAA,CAAA,SAxBsB,eAwBtB,CAAA,KAAA,QAAA,EAAA,GAAA,EAAA,GAAA,CAAA,GAvBI,cAuBJ,CAvBmB,OAuBnB,CAAA,GAtBI,aAsBJ,CAtBkB,KAsBlB,CAAA,MAAA,CAAA,CAAA;;;;;AAEyB,KAdtB,KAuBA,CAAA,CAAA,CAAA,GAAA,CAAA,SAAA,CAAA,CAAA,GAvB0B,CAuB1B,CAAA,GAAA,IAA8B,GAAA,KAAA;;;;;;;;;;KAZ9B,uBAgBoB,CAAA,cAhBkB,oBAgBlB,EAAA,sBAhB8D,oBAgB9D,CAAA,GAfvB,KAeuB,CAfjB,qBAeiB,CAfK,KAeL,CAAA,CAAA,SAAA,IAAA,GAdnB,aAcmB,GAbnB,qBAamB,CAbG,KAaH,CAAA;;;AAAD;;;;;KAJnB,8BAgBiE,CAAA,cAhBpB,oBAgBoB,EAAA,sBAhBwB,oBAgBxB,CAAA,GAAA;EAAO,SAAA,IAAA,EAf5D,iBAe4D,CAf1C,KAe0C,CAAA;EAAtC,SAAA,EAAA,CAAA,EAAA,MAAA;EAA8B,SAAA,QAAA,EAbhD,6BAagD,CAblB,uBAakB,CAbM,KAaN,EAba,aAab,CAAA,EAb6B,aAa7B,CAAA,EAAA;AAAA,CAAA,GAZjE,oBAiBC,CAjBoB,KAiBE,CAAA;;;;;;AAM3B;;;;KAZK,6BAayD,CAAA,cAbb,oBAaa,EAAA,sBAb+B,oBAa/B,CAAA,GAZ5D,KAY4D,SAZ9C,oBAY8C,GAZvB,8BAYuB,CAZQ,KAYR,EAZe,aAYf,CAAA,GAAA,KAAA;;;AA2B9D;KAlCK,sBAkCsC,CAAA,cAlCD,oBAkCC,CAAA,GAjCzC,8BAiCyC,CAjCV,KAiCU,EAjCH,KAiCG,CAAA;;;;AAM/B,KAlCA,qBAkCY,CAAA,cAlCwB,oBAkCxB,CAAA,GAjCtB,KAiCsB,SAjCR,oBAiCQ,GAjCe,sBAiCf,CAjCsC,KAiCtC,CAAA,GAAA,KAAA;;;;;AAKxB;;;;;;;AAmBA;;;;;;;;;;;AAgBA;;;AAOc,KArDF,gBAqDE,CAAA,cArD6B,oBAqD7B,CAAA,GArDqD,qBAqDrD,CArD2E,KAqD3E,CAAA;;;;;AAKM,KApDR,YAoDQ,CAAA,gBApDmB,oBAoDnB,CAAA,GApD2C,gBAoD3C,CApD4D,OAoD5D,CAAA;;;;AAQH,KAvDL,iBAuDc,CAAA,UAvDc,aAuDd,CAAA,GAAA,CAAA,CAAA,GAtDxB,CAsDwB,SAtDd,aAsDc,CAAA,KAAA,MAAA,CAAA,GAtDe,YAsDf,CAtD4B,KAsD5B,CAAA,GAAA,KAAA;;;;AAKA,UAzCT,cAyCS,CAAA,cAzCoB,oBAyCpB,CAAA,CAAA;EAAb;EAGgB,SAAA,EAAA,EAAA,MAAA;EAAnB;EAG2B,SAAA,IAAA,EA3CpB,iBA2CoB,CA3CF,KA2CE,CAAA;EAGC;EAAlB,SAAA,IAAA,EA5CH,UA4CG,CA5CQ,KA4CR,CAAA,MAAA,CAAA,CAAA;EAGQ;EAEd,GAAA,EAAA,EA/CL,kBA+CK,CA/Cc,KA+Cd,CAAA;EACiB;EAArB,MAAA,CAAA,KAAA,EA9CM,mBA8CN,CA9C0B,KA8C1B,CAAA,CAAA,EAAA,IAAA;;;;;AAWe,UAnDR,iBAmDQ,CAAA,eAnDyB,oBAmDzB,CAAA,CAAA;EAGX;EACiB,SAAA,EAAA,EAAA,MAAA;EAArB;EAIkB,SAAA,IAAA,EAAA,MAAA;EAEd;EACiB,EAAA,CAAA,cAxDZ,oBAwDY,CAAA,CAAA,QAAA,EAvDjB,KAuDiB,CAAA,EAAA,IAAA,IAtDlB,cAsDkB,CAtDH,KAsDG,CAAA;EAArB;EAImB,EAAA,CAAA,cAxDV,oBAwDU,CAAA,CAAA,QAAA,EAvDf,KAuDe,CAAA,EAtDxB,cAsDwB,CAtDT,KAsDS,CAAA;EAEf;EACiB,GAAA,EAAA,EAvDtB,aAuDsB;;;;;AAyB1B,UA1EY,SA0EZ,CAAA,gBA1EoC,oBA0EpC,CAAA,CAAA;EAGoB;EAEX,GAAA,EAAA,EA7EL,SA6EK,CA7EK,OA6EL,CAAA;EACiB;EAApB,GAAA,CAAA,KAAA,EA3EE,YA2EF,CA3Ee,OA2Ef,CAAA,CAAA,EAAA,IAAA;EAIsB;EAAjB,IAAA,EAAA,EA5EN,kBA4EM,CA5Ea,OA4Eb,CAAA,GAAA,SAAA;EAAgB;EAGtB,QAAA,CAAA,QAAA,EAAA,MAAmB,GAAA,IAAA,CAAA,EA5EQ,aA4ER,EAAA;EAAe;EAEF,IAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EA3EtB,iBA2EsB,CA3EJ,OA2EI,CAAA,GAAA,SAAA;EAAjB;EACR,WAAA,CAAA,cAzEW,oBAyEX,CAAA,CAAA,QAAA,EAAA,MAAA,GAAA,IAAA,EAAA,QAAA,EAvEH,KAuEG,EAAA,IAAA,EAtEP,oBAsEO,CAtEc,KAsEd,CAAA,CAAA,EAAA,MAAA;EACmC;EAAV,UAAA,CAAA,cAnEf,oBAmEe,CAAA,CAAA,QAAA,EAAA,MAAA,GAAA,IAAA,EAAA,QAAA,EAjE5B,KAiE4B,EAAA,IAAA,EAhEhC,oBAgEgC,CAhEX,KAgEW,CAAA,CAAA,EAAA,MAAA;EAAV;EAAS,QAAA,CAAA,cA5DhB,oBA4DgB,CAAA,CAAA,QAAA,EAAA,MAAA,GAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAzD3B,KAyD2B,EAAA,IAAA,EAxD/B,oBAwD+B,CAxDV,KAwDU,CAAA,CAAA,EAAA,MAAA;EAI7B;EAA8B,WAAA,CAAA,cAxDd,oBAwDc,CAAA,CAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAtD5B,KAsD4B,EAAA,IAAA,EArDhC,oBAqDgC,CArDX,KAqDW,CAAA,CAAA,EAAA,MAAA;EAAyC;EAAjB,YAAA,CAAA,cAjDrC,oBAiDqC,CAAA,CAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EA/CpD,KA+CoD,EAAA,IAAA,EA9CxD,oBA8CwD,CA9CnC,KA8CmC,CAAA,CAAA,EAAA,MAAA;EAAgB;EAErE,MAAA,CAAA,EAAA,EAAA,MAAa,CAAA,EAAA,IAAA;EAAe;EACR,IAAA,CAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,GAAA,IAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAV;EAA4B,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAV;EAAkB,UAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAW;EAA0B,WAAA,CAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAAA,IAAA;EAAb;EAAqC,UAAA,CAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAAA,IAAA;EAAhB;EAG1E,EAAA,CAAA,cA9BX,oBA8BW,CAAA,CAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EA5BhB,KA4BgB,CAAA,EA3BzB,UA2ByB,CA3Bd,KA2Bc,CAAA,MAAA,CAAA,CAAA;EAAV;EACU,QAAA,CAAA,cAzBL,oBAyBK,CAAA,CAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAvBhB,KAuBgB,EAAA,KAAA,EAtBnB,mBAsBmB,CAtBC,KAsBD,CAAA,CAAA,EAAA,IAAA;EAAV;EACI,UAAA,EAAA,EAnBR,gBAmBQ,CAnBS,OAmBT,CAAA,GAAA,SAAA;;UAhBd,mBAkB0B,CAAA,gBAlBQ,oBAkBR,CAAA,CAAA;EAAb,SAAA,QAAA,EAAA,OAAA;EACmB,SAAA,YAAA,EAjBjB,gBAiBiB,CAjBA,OAiBA,CAAA,GAAA,SAAA;EAAhB,SAAA,IAAA,EAhBT,OAgBS;EAgCgB,SAAA,UAAA,EAAA,SA/CV,SA+CU,CA/CA,SA+CA,CA/CU,OA+CV,CAAA,CAAA,EAAA;;;AAKD,KAhD7B,eAgD6B,CAAA,gBAhDC,oBAgDD,CAAA,GAhDyB,gBAgDzB,CAhD0C,OAgD1C,CAAA;AAA3B,cA9CD,aA8CC,CAAA,gBA9C2B,oBA8C3B,EAAA,kBAAA,OAAA,GAAA,KAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,YA7CD,SA6CC,CA7CS,SA6CT,CA7CmB,OA6CnB,CAAA,EA7C2B,SA6C3B,CA7CqC,OA6CrC,CAAA,EA7C6C,SA6C7C,EA7CwD,WA6CxD,EA7CqE,YA6CrE,CA7CkF,OA6ClF,CAAA,EA7C0F,eA6C1F,CA7C0G,OA6C1G,CAAA,CAAA,CAAA;EAQ2B,SAAA,IAAA,EAAA,eAAA;EAAjB,SAAA,MAAA,EAlDJ,SAkDI,CAlDM,OAkDN,CAAA;EAAwC,SAAA,MAAA,EAjD5C,SAiD4C,CAjDlC,OAiDkC,CAAA;EAAO,SAAA,UAAA,EAhD/C,SAgD+C;EAArB,SAAA,YAAA,EA/CxB,WA+CwB;EAQpC,SAAA,SAAA,EAtDS,YAsDT,CAtDsB,OAsDtB,CAAA;EAKiB,SAAA,YAAA,EA1DL,eA0DK,CA1DW,OA0DX,CAAA;EAAV,iBAAA,OAAA;EAA8D,QAAA,iBAAA;EAAO,iBAAA,cAAA;EAAW,WAAA,CAAA,MAAA,EA1B/E,mBA0B+E,CA1B3D,OA0B2D,CAAA;EAAhC;EAgJnB,QAAA,CAAA,CAAA,EArKpC,aAqKoC,CArKtB,OAqKsB,EAAA,IAAA,EArKT,WAqKS,CAAA;EAAV;EAA4B,OAAA,CAAA,YAAA,EA7J5C,gBA6J4C,CA7J3B,OA6J2B,CAAA,CAAA,EA7JlB,aA6JkB,CA7JJ,OA6JI,EA7JG,SA6JH,EAAA,IAAA,CAAA;EAAV;EAApC,IAAA,IAAA,CAAA,CAAA,EArJR,OAqJQ;EAlNT;EAAS,MAAA,CAAA,EAAA,EAAA,CAAA,KAAA,EAkED,SAlEC,CAkES,OAlET,CAAA,EAAA,GAAA,OAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAkE+C,aAlE/C,CAkE6D,OAlE7D,EAkEoE,SAlEpE,EAkE+E,WAlE/E,CAAA;EAw+BL;AAMjB;;EACuB,QAAA,sBAAA;EAAZ;;;EACK,QAAA,qBAAA;;;;;;;;;;;;;;sBA9xBM,kBAAkB,UAAU,UAAQ,UAAU;;;UAsxBnD,4BAA0B;;iBAE1B;;;cAIJ,uBAAsB,+BACxB,YAAY,aACpB,cAAc"}
|
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
|
*/
|
|
@@ -132,8 +138,9 @@ var TreePrimitive = class TreePrimitive {
|
|
|
132
138
|
get: () => {
|
|
133
139
|
return getCurrentState();
|
|
134
140
|
},
|
|
135
|
-
set: (
|
|
136
|
-
|
|
141
|
+
set: (input) => {
|
|
142
|
+
const flatState = this._convertNestedToFlat(input, env.generateId);
|
|
143
|
+
env.addOperation(fromDefinition(operationPath, this._opDefinitions.set, flatState));
|
|
137
144
|
},
|
|
138
145
|
root: () => {
|
|
139
146
|
return getCurrentState().find((n) => n.parentId === null);
|
|
@@ -428,7 +435,7 @@ var TreePrimitive = class TreePrimitive {
|
|
|
428
435
|
},
|
|
429
436
|
getInitialState: () => {
|
|
430
437
|
var _rootNodeType$data$_i;
|
|
431
|
-
if (this._schema.
|
|
438
|
+
if (this._schema.defaultInput !== void 0) return this._convertNestedToFlat(this._schema.defaultInput);
|
|
432
439
|
const rootNodeType = this._schema.root;
|
|
433
440
|
const rootData = (_rootNodeType$data$_i = rootNodeType.data._internal.getInitialState()) !== null && _rootNodeType$data$_i !== void 0 ? _rootNodeType$data$_i : {};
|
|
434
441
|
const rootId = crypto.randomUUID();
|
|
@@ -441,6 +448,9 @@ var TreePrimitive = class TreePrimitive {
|
|
|
441
448
|
data: rootData
|
|
442
449
|
}];
|
|
443
450
|
},
|
|
451
|
+
convertSetInputToState: (input) => {
|
|
452
|
+
return this._convertNestedToFlat(input);
|
|
453
|
+
},
|
|
444
454
|
transformOperation: (clientOp, serverOp) => {
|
|
445
455
|
const clientPath = clientOp.path;
|
|
446
456
|
const serverPath = serverOp.path;
|
|
@@ -509,9 +519,9 @@ var TreePrimitive = class TreePrimitive {
|
|
|
509
519
|
required() {
|
|
510
520
|
return new TreePrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { required: true }));
|
|
511
521
|
}
|
|
512
|
-
/** Set a default value for this tree */
|
|
513
|
-
default(
|
|
514
|
-
return new TreePrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, {
|
|
522
|
+
/** Set a default value for this tree (nested format) */
|
|
523
|
+
default(defaultInput) {
|
|
524
|
+
return new TreePrimitive(_objectSpread2(_objectSpread2({}, this._schema), {}, { defaultInput }));
|
|
515
525
|
}
|
|
516
526
|
/** Get the root node type */
|
|
517
527
|
get root() {
|
|
@@ -560,11 +570,49 @@ var TreePrimitive = class TreePrimitive {
|
|
|
560
570
|
const parentNodePrimitive = this._getNodeTypePrimitive(parentType);
|
|
561
571
|
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
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* Convert a nested TreeNodeSetInput to flat TreeState format.
|
|
575
|
+
* Recursively processes nodes, generating IDs and positions as needed.
|
|
576
|
+
*
|
|
577
|
+
* @param input - The root nested input to convert
|
|
578
|
+
* @param generateId - Optional ID generator (defaults to crypto.randomUUID)
|
|
579
|
+
* @returns Flat TreeState array
|
|
580
|
+
*/
|
|
581
|
+
_convertNestedToFlat(input, generateId = () => crypto.randomUUID()) {
|
|
582
|
+
const result = [];
|
|
583
|
+
const seenIds = /* @__PURE__ */ new Set();
|
|
584
|
+
const processNode = (nodeInput, parentId, parentType, leftPos, rightPos) => {
|
|
585
|
+
var _nodeInput$id;
|
|
586
|
+
this._validateChildType(parentType, nodeInput.type);
|
|
587
|
+
const nodePrimitive = this._getNodeTypePrimitive(nodeInput.type);
|
|
588
|
+
const id = (_nodeInput$id = nodeInput.id) !== null && _nodeInput$id !== void 0 ? _nodeInput$id : generateId();
|
|
589
|
+
if (seenIds.has(id)) throw new ValidationError(`Duplicate node ID: ${id}`);
|
|
590
|
+
seenIds.add(id);
|
|
591
|
+
const pos = generateTreePosBetween(leftPos, rightPos);
|
|
592
|
+
const { type: _type, id: _id, children } = nodeInput, dataFields = _objectWithoutProperties(nodeInput, _excluded);
|
|
593
|
+
const mergedData = applyDefaults(nodePrimitive.data, dataFields);
|
|
594
|
+
result.push({
|
|
595
|
+
id,
|
|
596
|
+
type: nodeInput.type,
|
|
597
|
+
parentId,
|
|
598
|
+
pos,
|
|
599
|
+
data: mergedData
|
|
600
|
+
});
|
|
601
|
+
let prevChildPos = null;
|
|
602
|
+
for (let i = 0; i < children.length; i++) {
|
|
603
|
+
const childInput = children[i];
|
|
604
|
+
processNode(childInput, id, nodeInput.type, prevChildPos, null);
|
|
605
|
+
prevChildPos = result[result.length - 1].pos;
|
|
606
|
+
}
|
|
607
|
+
};
|
|
608
|
+
processNode(input, null, null, null, null);
|
|
609
|
+
return result;
|
|
610
|
+
}
|
|
563
611
|
};
|
|
564
612
|
/** Creates a new TreePrimitive with the given root node type */
|
|
565
613
|
const Tree = (options) => new TreePrimitive({
|
|
566
614
|
required: false,
|
|
567
|
-
|
|
615
|
+
defaultInput: void 0,
|
|
568
616
|
root: options.root,
|
|
569
617
|
validators: []
|
|
570
618
|
});
|