@ellyco/agentic 0.1.2 → 0.2.1
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/README.md +88 -126
- package/dist/graphs/graph.d.ts.map +1 -1
- package/dist/graphs/graph.js +72 -47
- package/dist/graphs/graph.js.map +1 -1
- package/dist/graphs/index.d.ts +0 -1
- package/dist/graphs/index.d.ts.map +1 -1
- package/dist/graphs/index.js +0 -1
- package/dist/graphs/index.js.map +1 -1
- package/dist/graphs/iterator.d.ts +25 -21
- package/dist/graphs/iterator.d.ts.map +1 -1
- package/dist/graphs/iterator.js +30 -25
- package/dist/graphs/iterator.js.map +1 -1
- package/dist/graphs/types.d.ts +2 -3
- package/dist/graphs/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/BaseModel.d.ts +3 -1
- package/dist/models/BaseModel.d.ts.map +1 -1
- package/dist/models/BaseModel.js +5 -0
- package/dist/models/BaseModel.js.map +1 -1
- package/dist/models/react-agent.d.ts +12 -0
- package/dist/models/react-agent.d.ts.map +1 -0
- package/dist/models/react-agent.js +48 -0
- package/dist/models/react-agent.js.map +1 -0
- package/dist/nodes/index.d.ts +1 -0
- package/dist/nodes/index.d.ts.map +1 -1
- package/dist/nodes/index.js +1 -0
- package/dist/nodes/index.js.map +1 -1
- package/dist/nodes/model-node.d.ts +207 -25
- package/dist/nodes/model-node.d.ts.map +1 -1
- package/dist/nodes/model-node.js +124 -24
- package/dist/nodes/model-node.js.map +1 -1
- package/dist/nodes/state-transform.d.ts +108 -0
- package/dist/nodes/state-transform.d.ts.map +1 -0
- package/dist/nodes/state-transform.js +141 -0
- package/dist/nodes/state-transform.js.map +1 -0
- package/dist/tools.d.ts +10 -9
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +3 -2
- package/dist/tools.js.map +1 -1
- package/dist/util/clone-aware.d.ts +2 -0
- package/dist/util/clone-aware.d.ts.map +1 -0
- package/dist/util/clone-aware.js +29 -0
- package/dist/util/clone-aware.js.map +1 -0
- package/dist/util/index.d.ts +4 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +20 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/merge-state.d.ts +50 -0
- package/dist/util/merge-state.d.ts.map +1 -0
- package/dist/util/merge-state.js +88 -0
- package/dist/util/merge-state.js.map +1 -0
- package/dist/util/serializer.d.ts +15 -0
- package/dist/util/serializer.d.ts.map +1 -0
- package/dist/util/serializer.js +73 -0
- package/dist/util/serializer.js.map +1 -0
- package/package.json +5 -1
- package/dist/graphs/merge-state.d.ts +0 -22
- package/dist/graphs/merge-state.d.ts.map +0 -1
- package/dist/graphs/merge-state.js +0 -56
- package/dist/graphs/merge-state.js.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Merges partial state updates into a base state object.
|
|
4
|
+
*
|
|
5
|
+
* Uses registered custom merge strategies for specific types when available.
|
|
6
|
+
* Falls back to standard merge behavior based on value types:
|
|
7
|
+
* - Undefined/null keys: Set the new value directly
|
|
8
|
+
* - Custom merge functions: Use registered strategy (handles entire value including nested)
|
|
9
|
+
* - Class instances: Replace directly (preserves object identity)
|
|
10
|
+
* - Arrays: Replace entire array (no element-level merging)
|
|
11
|
+
* - Plain objects: Recursively merge nested properties
|
|
12
|
+
* - Primitives: Replace the value
|
|
13
|
+
*
|
|
14
|
+
* The merge process uses `cloneAware()` to create a deep clone of the base state,
|
|
15
|
+
* ensuring the original state is not mutated while preserving class instances.
|
|
16
|
+
*
|
|
17
|
+
* @template T - The state object type
|
|
18
|
+
* @param {T} base - The base state to merge into (will not be mutated)
|
|
19
|
+
* @param {Partial<T>} changes - Partial state with updates to apply
|
|
20
|
+
* @param {z.ZodObject} schema - Zod schema for the state type (used to look up custom merge strategies)
|
|
21
|
+
* @returns {T} New merged state object (base is not mutated)
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Basic merge
|
|
26
|
+
* const base = { count: 5, items: [1, 2, 3], user: { name: "Alice" } };
|
|
27
|
+
* const changes = { count: 10, user: { age: 30 } };
|
|
28
|
+
* const merged = mergeState(base, changes, schema);
|
|
29
|
+
* // Results in { count: 10, items: [1, 2, 3], user: { name: "Alice", age: 30 } }
|
|
30
|
+
*
|
|
31
|
+
* // Array replacement (arrays are replaced, not merged)
|
|
32
|
+
* const base2 = { items: [1, 2, 3] };
|
|
33
|
+
* const changes2 = { items: [4, 5] };
|
|
34
|
+
* const merged2 = mergeState(base2, changes2, schema);
|
|
35
|
+
* // Results in { items: [4, 5] } (not [1, 2, 3, 4, 5])
|
|
36
|
+
*
|
|
37
|
+
* // Custom merge strategy (if registered)
|
|
38
|
+
* const schema = z.object({
|
|
39
|
+
* count: z.number().register(STATE_MERGE, {
|
|
40
|
+
* merge: (old, change) => old + change // Additive merge
|
|
41
|
+
* })
|
|
42
|
+
* });
|
|
43
|
+
* const base3 = { count: 5 };
|
|
44
|
+
* const changes3 = { count: 3 };
|
|
45
|
+
* const merged3 = mergeState(base3, changes3, schema);
|
|
46
|
+
* // Results in { count: 8 } (5 + 3, not 3)
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function mergeState<T extends Record<string, any>>(base: T, changes: Partial<T>, schema: z.ZodObject): T;
|
|
50
|
+
//# sourceMappingURL=merge-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-state.d.ts","sourceRoot":"","sources":["../../src/util/merge-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAkC9G"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mergeState = mergeState;
|
|
4
|
+
const registry_1 = require("../graphs/registry");
|
|
5
|
+
const clone_aware_1 = require("./clone-aware");
|
|
6
|
+
/**
|
|
7
|
+
* Merges partial state updates into a base state object.
|
|
8
|
+
*
|
|
9
|
+
* Uses registered custom merge strategies for specific types when available.
|
|
10
|
+
* Falls back to standard merge behavior based on value types:
|
|
11
|
+
* - Undefined/null keys: Set the new value directly
|
|
12
|
+
* - Custom merge functions: Use registered strategy (handles entire value including nested)
|
|
13
|
+
* - Class instances: Replace directly (preserves object identity)
|
|
14
|
+
* - Arrays: Replace entire array (no element-level merging)
|
|
15
|
+
* - Plain objects: Recursively merge nested properties
|
|
16
|
+
* - Primitives: Replace the value
|
|
17
|
+
*
|
|
18
|
+
* The merge process uses `cloneAware()` to create a deep clone of the base state,
|
|
19
|
+
* ensuring the original state is not mutated while preserving class instances.
|
|
20
|
+
*
|
|
21
|
+
* @template T - The state object type
|
|
22
|
+
* @param {T} base - The base state to merge into (will not be mutated)
|
|
23
|
+
* @param {Partial<T>} changes - Partial state with updates to apply
|
|
24
|
+
* @param {z.ZodObject} schema - Zod schema for the state type (used to look up custom merge strategies)
|
|
25
|
+
* @returns {T} New merged state object (base is not mutated)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Basic merge
|
|
30
|
+
* const base = { count: 5, items: [1, 2, 3], user: { name: "Alice" } };
|
|
31
|
+
* const changes = { count: 10, user: { age: 30 } };
|
|
32
|
+
* const merged = mergeState(base, changes, schema);
|
|
33
|
+
* // Results in { count: 10, items: [1, 2, 3], user: { name: "Alice", age: 30 } }
|
|
34
|
+
*
|
|
35
|
+
* // Array replacement (arrays are replaced, not merged)
|
|
36
|
+
* const base2 = { items: [1, 2, 3] };
|
|
37
|
+
* const changes2 = { items: [4, 5] };
|
|
38
|
+
* const merged2 = mergeState(base2, changes2, schema);
|
|
39
|
+
* // Results in { items: [4, 5] } (not [1, 2, 3, 4, 5])
|
|
40
|
+
*
|
|
41
|
+
* // Custom merge strategy (if registered)
|
|
42
|
+
* const schema = z.object({
|
|
43
|
+
* count: z.number().register(STATE_MERGE, {
|
|
44
|
+
* merge: (old, change) => old + change // Additive merge
|
|
45
|
+
* })
|
|
46
|
+
* });
|
|
47
|
+
* const base3 = { count: 5 };
|
|
48
|
+
* const changes3 = { count: 3 };
|
|
49
|
+
* const merged3 = mergeState(base3, changes3, schema);
|
|
50
|
+
* // Results in { count: 8 } (5 + 3, not 3)
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
function mergeState(base, changes, schema) {
|
|
54
|
+
const acc = (0, clone_aware_1.cloneAware)(base);
|
|
55
|
+
for (const [key, value] of Object.entries(changes)) {
|
|
56
|
+
// If there's nothing already present for the key, then we just set the value
|
|
57
|
+
if (acc[key] === undefined || acc[key] === null) {
|
|
58
|
+
acc[key] = value;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// If there's a registered merge function, then we assume the function handles
|
|
62
|
+
// the entirety of the value, including any nested values
|
|
63
|
+
if (schema && registry_1.STATE_MERGE.has(schema.shape[key])) {
|
|
64
|
+
acc[key] = registry_1.STATE_MERGE.get(schema.shape[key]).merge(acc[key], value);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (typeof value === "object") {
|
|
68
|
+
// The value is a class instance - replace directly to preserve object identity
|
|
69
|
+
if ('constructor' in value && !["Object", "Array"].includes(value.constructor.name)) {
|
|
70
|
+
acc[key] = value;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// The value is an array - replace the entire array (no element-level merging)
|
|
74
|
+
if (Array.isArray(acc[key])) {
|
|
75
|
+
acc[key] = value;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// The value is a plain object - recursively merge nested properties
|
|
79
|
+
acc[key] = mergeState(acc[key], value, schema.shape[key]);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// The value is a primitive - replace directly
|
|
83
|
+
acc[key] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return acc;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=merge-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-state.js","sourceRoot":"","sources":["../../src/util/merge-state.ts"],"names":[],"mappings":";;AAmDA,gCAkCC;AApFD,iDAAiD;AACjD,+CAA2C;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,SAAgB,UAAU,CAAgC,IAAO,EAAE,OAAmB,EAAE,MAAmB;IACvG,MAAM,GAAG,GAAG,IAAA,wBAAU,EAAC,IAAI,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,6EAA6E;QAC7E,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1C,SAAS;QACb,CAAC;QACD,+EAA+E;QAC/E,yDAAyD;QACzD,IAAI,MAAM,IAAI,sBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,GAA2B,CAAC,GAAG,CAAC,GAAG,sBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/F,SAAS;QACb,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,+EAA+E;YAC/E,IAAI,aAAa,IAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjF,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC1C,SAAS;YACb,CAAC;YACD,8EAA8E;YAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzB,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC1C,SAAS;YACb,CAAC;YAED,oEAAoE;YACnE,GAA2B,CAAC,GAAG,CAAC,GAAG,UAAU,CAAE,GAA2B,CAAC,GAAG,CAAC,EAAE,KAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC,CAAC;QAC7I,CAAC;aAAM,CAAC;YACJ,8CAA8C;YAC7C,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC9C,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type SerializedObject = {
|
|
2
|
+
__className: string;
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
};
|
|
5
|
+
export interface Serializer<T, S extends Record<string, unknown>> {
|
|
6
|
+
serialize(value: T): S;
|
|
7
|
+
deserialize(value: S): T;
|
|
8
|
+
}
|
|
9
|
+
type ClassConstructor<T> = new (...args: any[]) => T;
|
|
10
|
+
export declare const SERIALIZERS: Map<string, Serializer<any, any>>;
|
|
11
|
+
export declare function registerSerializer<T, S extends Record<string, unknown>>(constructor: ClassConstructor<T>, serializer: Serializer<T, S>): void;
|
|
12
|
+
export declare function serialize<T extends object>(value: T): SerializedObject;
|
|
13
|
+
export declare function deserialize<T extends object>(value: SerializedObject): T;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/util/serializer.ts"],"names":[],"mappings":"AAEA,KAAK,gBAAgB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAExE,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACvB,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;CAC5B;AAED,KAAK,gBAAgB,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,mCAA0C,CAAC;AAEnE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAE7I;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAUtE;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,CAAC,CAOxE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SERIALIZERS = void 0;
|
|
4
|
+
exports.registerSerializer = registerSerializer;
|
|
5
|
+
exports.serialize = serialize;
|
|
6
|
+
exports.deserialize = deserialize;
|
|
7
|
+
const messages_1 = require("../messages");
|
|
8
|
+
exports.SERIALIZERS = new Map();
|
|
9
|
+
function registerSerializer(constructor, serializer) {
|
|
10
|
+
exports.SERIALIZERS.set(constructor.name, serializer);
|
|
11
|
+
}
|
|
12
|
+
function serialize(value) {
|
|
13
|
+
const className = value.constructor.name;
|
|
14
|
+
const serializer = exports.SERIALIZERS.get(className);
|
|
15
|
+
if (!serializer) {
|
|
16
|
+
throw new Error(`No serializer registered for ${className}`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
__className: className,
|
|
20
|
+
...serializer.serialize(value),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function deserialize(value) {
|
|
24
|
+
const { __className, ...rest } = value;
|
|
25
|
+
const serializer = exports.SERIALIZERS.get(__className);
|
|
26
|
+
if (!serializer) {
|
|
27
|
+
throw new Error(`No serializer registered for ${__className}`);
|
|
28
|
+
}
|
|
29
|
+
return serializer.deserialize(rest);
|
|
30
|
+
}
|
|
31
|
+
registerSerializer(messages_1.SystemMessage, {
|
|
32
|
+
serialize: (value) => ({
|
|
33
|
+
text: value.text,
|
|
34
|
+
}),
|
|
35
|
+
deserialize: (value) => new messages_1.SystemMessage(value.text),
|
|
36
|
+
});
|
|
37
|
+
registerSerializer(messages_1.UserMessage, {
|
|
38
|
+
serialize: (value) => ({
|
|
39
|
+
text: value.text,
|
|
40
|
+
}),
|
|
41
|
+
deserialize: (value) => new messages_1.UserMessage(value.text),
|
|
42
|
+
});
|
|
43
|
+
registerSerializer(messages_1.AgentMessage, {
|
|
44
|
+
serialize: (value) => ({
|
|
45
|
+
text: value.text,
|
|
46
|
+
}),
|
|
47
|
+
deserialize: (value) => new messages_1.AgentMessage(value.text),
|
|
48
|
+
});
|
|
49
|
+
registerSerializer(messages_1.ToolRequest, {
|
|
50
|
+
serialize: (value) => ({
|
|
51
|
+
toolUseId: value.toolUseId,
|
|
52
|
+
toolName: value.toolName,
|
|
53
|
+
input: value.input,
|
|
54
|
+
}),
|
|
55
|
+
deserialize: (value) => new messages_1.ToolRequest(value.toolUseId, value.toolName, value.input),
|
|
56
|
+
});
|
|
57
|
+
registerSerializer(messages_1.ToolResponse, {
|
|
58
|
+
serialize: (value) => ({
|
|
59
|
+
toolUseId: value.toolUseId,
|
|
60
|
+
toolName: value.toolName,
|
|
61
|
+
output: value.output,
|
|
62
|
+
}),
|
|
63
|
+
deserialize: (value) => new messages_1.ToolResponse(value.toolUseId, value.toolName, value.output),
|
|
64
|
+
});
|
|
65
|
+
registerSerializer(messages_1.ToolError, {
|
|
66
|
+
serialize: (value) => ({
|
|
67
|
+
toolUseId: value.toolUseId,
|
|
68
|
+
toolName: value.toolName,
|
|
69
|
+
error: value.error,
|
|
70
|
+
}),
|
|
71
|
+
deserialize: (value) => new messages_1.ToolError(value.toolUseId, value.toolName, value.error),
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/util/serializer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
/**
|
|
3
|
-
* Merges partial state updates into a base state object.
|
|
4
|
-
* Uses registered custom merge strategies for specific types.
|
|
5
|
-
* Falls back to standard object/array merge behavior.
|
|
6
|
-
*
|
|
7
|
-
* @template T - The state object type
|
|
8
|
-
* @param {T} base - The base state to merge into
|
|
9
|
-
* @param {Partial<T>} changes - Partial state with updates
|
|
10
|
-
* @param {z.ZodObject} schema - Zod schema for the state type
|
|
11
|
-
* @returns {T} Merged state object
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const base = { count: 5, items: [1, 2, 3] };
|
|
16
|
-
* const changes = { count: 10, items: [4] };
|
|
17
|
-
* const merged = mergeState(base, changes, schema);
|
|
18
|
-
* // Results in { count: 10, items: [4] }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
export declare function mergeState<T extends Record<string, any>>(base: T, changes: Partial<T>, schema: z.ZodObject): T;
|
|
22
|
-
//# sourceMappingURL=merge-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-state.d.ts","sourceRoot":"","sources":["../../src/graphs/merge-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CA4B9G"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mergeState = mergeState;
|
|
4
|
-
const registry_1 = require("./registry");
|
|
5
|
-
/**
|
|
6
|
-
* Merges partial state updates into a base state object.
|
|
7
|
-
* Uses registered custom merge strategies for specific types.
|
|
8
|
-
* Falls back to standard object/array merge behavior.
|
|
9
|
-
*
|
|
10
|
-
* @template T - The state object type
|
|
11
|
-
* @param {T} base - The base state to merge into
|
|
12
|
-
* @param {Partial<T>} changes - Partial state with updates
|
|
13
|
-
* @param {z.ZodObject} schema - Zod schema for the state type
|
|
14
|
-
* @returns {T} Merged state object
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const base = { count: 5, items: [1, 2, 3] };
|
|
19
|
-
* const changes = { count: 10, items: [4] };
|
|
20
|
-
* const merged = mergeState(base, changes, schema);
|
|
21
|
-
* // Results in { count: 10, items: [4] }
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
function mergeState(base, changes, schema) {
|
|
25
|
-
const acc = structuredClone(base);
|
|
26
|
-
for (const [key, value] of Object.entries(changes)) {
|
|
27
|
-
// if there's nothing already present for the key, then we just set the value
|
|
28
|
-
if (acc[key] === undefined || acc[key] === null) {
|
|
29
|
-
acc[key] = value;
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
// if there's a registered merge function, then we assume the function handles the entirety of the value, including any nested values
|
|
33
|
-
if (registry_1.STATE_MERGE.has(schema.shape[key])) {
|
|
34
|
-
acc[key] = registry_1.STATE_MERGE.get(schema.shape[key]).merge(acc[key], value);
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
if (typeof value === "object") {
|
|
38
|
-
if (Array.isArray(acc[key])) {
|
|
39
|
-
acc[key] = value;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
acc[key] = mergeState(acc[key], value, schema.shape[key]);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
if (registry_1.STATE_MERGE.has(schema.shape[key]) && acc[key] !== undefined) {
|
|
47
|
-
acc[key] = registry_1.STATE_MERGE.get(schema.shape[key]).merge(acc[key], value);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
acc[key] = value;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return acc;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=merge-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-state.js","sourceRoot":"","sources":["../../src/graphs/merge-state.ts"],"names":[],"mappings":";;AAsBA,gCA4BC;AAjDD,yCAAyC;AAEzC;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,UAAU,CAAgC,IAAO,EAAE,OAAmB,EAAE,MAAmB;IACvG,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,6EAA6E;QAC7E,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1C,SAAS;QACb,CAAC;QACD,qIAAqI;QACrI,IAAI,sBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACpC,GAA2B,CAAC,GAAG,CAAC,GAAG,sBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/F,SAAS;QACb,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzB,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACH,GAA2B,CAAC,GAAG,CAAC,GAAG,UAAU,CAAE,GAA2B,CAAC,GAAG,CAAC,EAAE,KAAmB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC,CAAC;YAC7I,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,sBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9D,GAA2B,CAAC,GAAG,CAAC,GAAG,sBAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACnG,CAAC;iBAAM,CAAC;gBACH,GAA2B,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC9C,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
|