@manifesto-ai/sdk 1.1.0 → 1.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 +3 -11
- package/dist/__tests__/public-exports.test.js +1 -0
- package/dist/__tests__/public-exports.test.js.map +1 -1
- package/dist/__tests__/typed-ops-scenarios.test.d.ts +2 -0
- package/dist/__tests__/typed-ops-scenarios.test.d.ts.map +1 -0
- package/dist/__tests__/typed-ops-scenarios.test.js +334 -0
- package/dist/__tests__/typed-ops-scenarios.test.js.map +1 -0
- package/dist/__tests__/typed-ops.test.d.ts +2 -0
- package/dist/__tests__/typed-ops.test.d.ts.map +1 -0
- package/dist/__tests__/typed-ops.test.js +210 -0
- package/dist/__tests__/typed-ops.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/typed-ops.d.ts +148 -0
- package/dist/typed-ops.d.ts.map +1 -0
- package/dist/typed-ops.js +69 -0
- package/dist/typed-ops.js.map +1 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -81,21 +81,13 @@ SDK re-exports public contract types and errors (for example `AppConfig`, `AppSt
|
|
|
81
81
|
| Delegates to | `@manifesto-ai/runtime` | All orchestration via runtime pipeline |
|
|
82
82
|
| Uses | `@manifesto-ai/core` | Schema and expression types |
|
|
83
83
|
| Uses | `@manifesto-ai/world` | World protocol types |
|
|
84
|
-
| Legacy predecessor |
|
|
84
|
+
| Legacy predecessor | App facade package | Removed in R2 (see API retirement record) |
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
|
-
## Migration from
|
|
88
|
+
## Migration from Legacy App Facade
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
// Before
|
|
94
|
-
import { createApp } from "@manifesto-ai/app";
|
|
95
|
-
|
|
96
|
-
// After
|
|
97
|
-
import { createApp } from "@manifesto-ai/sdk";
|
|
98
|
-
```
|
|
90
|
+
Legacy app-facade imports should be replaced with `@manifesto-ai/sdk`.
|
|
99
91
|
|
|
100
92
|
For automated rewrite guidance, see:
|
|
101
93
|
- [docs/guides/migrate-app-to-sdk.md](../../docs/guides/migrate-app-to-sdk.md)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-exports.test.js","sourceRoot":"","sources":["../../src/__tests__/public-exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7C,MAAM,YAAY,GAAG;YACnB,mBAAmB;YACnB,qBAAqB;YACrB,wBAAwB;YACxB,qBAAqB;YACrB,oBAAoB;YACpB,kBAAkB;YAClB,kBAAkB;YAClB,YAAY;YACZ,yBAAyB;YACzB,qBAAqB;YACrB,oBAAoB;YACpB,qBAAqB;YACrB,iBAAiB;YACjB,mBAAmB;YACnB,cAAc;YACd,UAAU;YACV,cAAc;YACd,mBAAmB;YACnB,qBAAqB;YACrB,0BAA0B;YAC1B,iBAAiB;YACjB,yBAAyB;YACzB,wBAAwB;YACxB,6BAA6B;YAC7B,2BAA2B;YAC3B,0BAA0B;YAC1B,oBAAoB;YACpB,wBAAwB;YACxB,8BAA8B;YAC9B,WAAW;YACX,cAAc;YACd,mBAAmB;YACnB,eAAe;
|
|
1
|
+
{"version":3,"file":"public-exports.test.js","sourceRoot":"","sources":["../../src/__tests__/public-exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7C,MAAM,YAAY,GAAG;YACnB,mBAAmB;YACnB,qBAAqB;YACrB,wBAAwB;YACxB,qBAAqB;YACrB,oBAAoB;YACpB,kBAAkB;YAClB,kBAAkB;YAClB,YAAY;YACZ,yBAAyB;YACzB,qBAAqB;YACrB,oBAAoB;YACpB,qBAAqB;YACrB,iBAAiB;YACjB,mBAAmB;YACnB,cAAc;YACd,UAAU;YACV,cAAc;YACd,mBAAmB;YACnB,qBAAqB;YACrB,0BAA0B;YAC1B,iBAAiB;YACjB,yBAAyB;YACzB,wBAAwB;YACxB,6BAA6B;YAC7B,2BAA2B;YAC3B,0BAA0B;YAC1B,oBAAoB;YACpB,wBAAwB;YACxB,8BAA8B;YAC9B,WAAW;YACX,cAAc;YACd,mBAAmB;YACnB,eAAe;YACf,WAAW;SACZ,CAAC,IAAI,EAAE,CAAC;QAET,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG;YAChB,2BAA2B;YAC3B,2BAA2B;YAC3B,4BAA4B;YAC5B,0BAA0B;YAC1B,eAAe;YACf,6BAA6B;YAC7B,wBAAwB;SACzB,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ops-scenarios.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/typed-ops-scenarios.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed Ops Usage Pattern Simulation
|
|
3
|
+
*
|
|
4
|
+
* Tests real-world usage patterns and edge cases to verify type-level
|
|
5
|
+
* correctness before shipping to users.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, expectTypeOf } from "vitest";
|
|
8
|
+
import { defineOps } from "../typed-ops.js";
|
|
9
|
+
describe("Scenario 1: Todo App", () => {
|
|
10
|
+
const ops = defineOps();
|
|
11
|
+
it("should set primitive fields", () => {
|
|
12
|
+
const p1 = ops.set("count", 10);
|
|
13
|
+
expect(p1).toEqual({ op: "set", path: "count", value: 10 });
|
|
14
|
+
const p2 = ops.set("filter", "active");
|
|
15
|
+
expect(p2).toEqual({ op: "set", path: "filter", value: "active" });
|
|
16
|
+
});
|
|
17
|
+
it("should replace entire array", () => {
|
|
18
|
+
const newTodos = [
|
|
19
|
+
{ id: "1", title: "Test", completed: false },
|
|
20
|
+
];
|
|
21
|
+
const p = ops.set("todos", newTodos);
|
|
22
|
+
expect(p).toEqual({ op: "set", path: "todos", value: newTodos });
|
|
23
|
+
});
|
|
24
|
+
it("should NOT allow merge on primitive or array fields", () => {
|
|
25
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
26
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
27
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
28
|
+
});
|
|
29
|
+
it("should work in effect handler return pattern", () => {
|
|
30
|
+
const handler = async () => {
|
|
31
|
+
return [
|
|
32
|
+
ops.set("count", 5),
|
|
33
|
+
ops.set("filter", "completed"),
|
|
34
|
+
];
|
|
35
|
+
};
|
|
36
|
+
expectTypeOf(handler).returns.resolves.toMatchTypeOf();
|
|
37
|
+
});
|
|
38
|
+
it("should NOT generate nested paths for array items", () => {
|
|
39
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
40
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("Scenario 2: E-commerce (deep nesting)", () => {
|
|
44
|
+
const ops = defineOps();
|
|
45
|
+
it("should autocomplete paths up to 3 levels of nesting", () => {
|
|
46
|
+
// root
|
|
47
|
+
expectTypeOf().toMatchTypeOf();
|
|
48
|
+
expectTypeOf().toMatchTypeOf();
|
|
49
|
+
// 1 level nested
|
|
50
|
+
expectTypeOf().toMatchTypeOf();
|
|
51
|
+
expectTypeOf().toMatchTypeOf();
|
|
52
|
+
expectTypeOf().toMatchTypeOf();
|
|
53
|
+
// 2 levels nested
|
|
54
|
+
expectTypeOf().toMatchTypeOf();
|
|
55
|
+
expectTypeOf().toMatchTypeOf();
|
|
56
|
+
});
|
|
57
|
+
it("should type-check values at nested paths", () => {
|
|
58
|
+
const p1 = ops.set("customer.address.city", "Seoul");
|
|
59
|
+
expect(p1.value).toBe("Seoul");
|
|
60
|
+
const p2 = ops.set("customer.preferences.theme", "dark");
|
|
61
|
+
expect(p2.value).toBe("dark");
|
|
62
|
+
const p3 = ops.set("status", "checkout");
|
|
63
|
+
expect(p3.value).toBe("checkout");
|
|
64
|
+
});
|
|
65
|
+
it("should merge at object paths only", () => {
|
|
66
|
+
const p1 = ops.merge("customer.address", { city: "Busan", zip: "12345" });
|
|
67
|
+
expect(p1).toEqual({
|
|
68
|
+
op: "merge",
|
|
69
|
+
path: "customer.address",
|
|
70
|
+
value: { city: "Busan", zip: "12345" },
|
|
71
|
+
});
|
|
72
|
+
const p2 = ops.merge("customer.preferences", { newsletter: true });
|
|
73
|
+
expect(p2).toEqual({
|
|
74
|
+
op: "merge",
|
|
75
|
+
path: "customer.preferences",
|
|
76
|
+
value: { newsletter: true },
|
|
77
|
+
});
|
|
78
|
+
const p3 = ops.merge("customer", { name: "Kim" });
|
|
79
|
+
expect(p3.value).toEqual({ name: "Kim" });
|
|
80
|
+
});
|
|
81
|
+
it("should handle null union fields", () => {
|
|
82
|
+
const p1 = ops.set("error", "Payment failed");
|
|
83
|
+
expect(p1.value).toBe("Payment failed");
|
|
84
|
+
const p2 = ops.set("error", null);
|
|
85
|
+
expect(p2.value).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe("Scenario 3: Optional fields", () => {
|
|
89
|
+
const ops = defineOps();
|
|
90
|
+
it("should handle optional primitive fields", () => {
|
|
91
|
+
expectTypeOf().toMatchTypeOf();
|
|
92
|
+
expectTypeOf().toMatchTypeOf();
|
|
93
|
+
});
|
|
94
|
+
it("should handle optional object fields and their nested paths", () => {
|
|
95
|
+
expectTypeOf().toMatchTypeOf();
|
|
96
|
+
expectTypeOf().toMatchTypeOf();
|
|
97
|
+
expectTypeOf().toMatchTypeOf();
|
|
98
|
+
});
|
|
99
|
+
it("should type-check optional field values correctly", () => {
|
|
100
|
+
const p1 = ops.set("bio", "Hello world");
|
|
101
|
+
expect(p1.value).toBe("Hello world");
|
|
102
|
+
const p2 = ops.set("avatar", { url: "https://example.com/a.png", width: 100, height: 100 });
|
|
103
|
+
expect(p2.value).toEqual({ url: "https://example.com/a.png", width: 100, height: 100 });
|
|
104
|
+
});
|
|
105
|
+
it("should allow merge on optional object paths", () => {
|
|
106
|
+
expectTypeOf().toMatchTypeOf();
|
|
107
|
+
expectTypeOf().toMatchTypeOf();
|
|
108
|
+
const p = ops.merge("avatar", { url: "https://new.com/b.png" });
|
|
109
|
+
expect(p.value).toEqual({ url: "https://new.com/b.png" });
|
|
110
|
+
});
|
|
111
|
+
it("should exclude undefined from set() for optional fields", () => {
|
|
112
|
+
expectTypeOf().toMatchTypeOf(); // ValueAt still includes undefined
|
|
113
|
+
// But the set() method signature rejects it:
|
|
114
|
+
// ops.set("bio", undefined) → TS compile error
|
|
115
|
+
// ops.unset("bio") → correct way to clear
|
|
116
|
+
const p = ops.set("bio", "Hello");
|
|
117
|
+
expect(p.value).toBe("Hello");
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("Scenario 4: Effect handler pattern", () => {
|
|
121
|
+
const ops = defineOps();
|
|
122
|
+
it("should build success patch sequence", () => {
|
|
123
|
+
const now = "2026-02-19T00:00:00Z";
|
|
124
|
+
const items = ["a", "b", "c"];
|
|
125
|
+
const patches = [
|
|
126
|
+
ops.set("data.items", items),
|
|
127
|
+
ops.set("data.lastSync", now),
|
|
128
|
+
ops.set("syncStatus", "success"),
|
|
129
|
+
ops.set("errorMessage", null),
|
|
130
|
+
];
|
|
131
|
+
expect(patches).toHaveLength(4);
|
|
132
|
+
expect(patches[0]).toEqual({ op: "set", path: "data.items", value: items });
|
|
133
|
+
expect(patches[2]).toEqual({ op: "set", path: "syncStatus", value: "success" });
|
|
134
|
+
});
|
|
135
|
+
it("should build error patch sequence", () => {
|
|
136
|
+
const patches = [
|
|
137
|
+
ops.set("syncStatus", "error"),
|
|
138
|
+
ops.set("errorMessage", "Network timeout"),
|
|
139
|
+
ops.set("retryCount", 3),
|
|
140
|
+
];
|
|
141
|
+
expect(patches).toHaveLength(3);
|
|
142
|
+
});
|
|
143
|
+
it("should merge data object partially", () => {
|
|
144
|
+
const p = ops.merge("data", { lastSync: "2026-02-19T12:00:00Z" });
|
|
145
|
+
expect(p).toEqual({
|
|
146
|
+
op: "merge",
|
|
147
|
+
path: "data",
|
|
148
|
+
value: { lastSync: "2026-02-19T12:00:00Z" },
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
it("should create error convenience patch", () => {
|
|
152
|
+
const p = ops.error("SYNC_FAILED", "API returned 500", { context: { endpoint: "/api/items" } });
|
|
153
|
+
expect(p.op).toBe("set");
|
|
154
|
+
expect(p.path).toBe("system.lastError");
|
|
155
|
+
});
|
|
156
|
+
it("should create error patch with source metadata", () => {
|
|
157
|
+
const p = ops.error("SYNC_FAILED", "API returned 500", {
|
|
158
|
+
source: { actionId: "sync-action", nodePath: "sync.fetch" },
|
|
159
|
+
timestamp: Date.now(),
|
|
160
|
+
context: { endpoint: "/api/items" },
|
|
161
|
+
});
|
|
162
|
+
expect(p.op).toBe("set");
|
|
163
|
+
expect(p.value.code).toBe("SYNC_FAILED");
|
|
164
|
+
expect(p.value.source.actionId).toBe("sync-action");
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe("Scenario 5: raw escape hatch", () => {
|
|
168
|
+
const ops = defineOps();
|
|
169
|
+
it("should allow platform namespace paths via raw", () => {
|
|
170
|
+
const p1 = ops.raw.set("$host.intentSlots", { slot1: "value" });
|
|
171
|
+
expect(p1.path).toBe("$host.intentSlots");
|
|
172
|
+
const p2 = ops.raw.merge("$host.config", { debug: true });
|
|
173
|
+
expect(p2.path).toBe("$host.config");
|
|
174
|
+
});
|
|
175
|
+
it("should allow system paths via raw", () => {
|
|
176
|
+
const p = ops.raw.set("system.status", "idle");
|
|
177
|
+
expect(p).toEqual({ op: "set", path: "system.status", value: "idle" });
|
|
178
|
+
});
|
|
179
|
+
it("should allow input paths via raw", () => {
|
|
180
|
+
const p = ops.raw.set("input.amount", 100);
|
|
181
|
+
expect(p).toEqual({ op: "set", path: "input.amount", value: 100 });
|
|
182
|
+
});
|
|
183
|
+
it("should allow array item access via raw", () => {
|
|
184
|
+
const todoOps = defineOps();
|
|
185
|
+
// Typed API only allows whole-array replacement
|
|
186
|
+
const p1 = todoOps.set("todos", [{ id: "1", title: "a", completed: false }]);
|
|
187
|
+
expect(p1.op).toBe("set");
|
|
188
|
+
// Raw allows individual item access
|
|
189
|
+
const p2 = todoOps.raw.set("todos.0.completed", true);
|
|
190
|
+
expect(p2).toEqual({ op: "set", path: "todos.0.completed", value: true });
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe("Scenario 6: Flat state (no nesting)", () => {
|
|
194
|
+
const ops = defineOps();
|
|
195
|
+
it("should have only top-level paths", () => {
|
|
196
|
+
expectTypeOf().toMatchTypeOf();
|
|
197
|
+
expectTypeOf().toMatchTypeOf();
|
|
198
|
+
expectTypeOf().toMatchTypeOf();
|
|
199
|
+
});
|
|
200
|
+
it("should have no mergeable paths (all primitives)", () => {
|
|
201
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
202
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
203
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
204
|
+
});
|
|
205
|
+
it("should create correct patches", () => {
|
|
206
|
+
expect(ops.set("a", "hello")).toEqual({ op: "set", path: "a", value: "hello" });
|
|
207
|
+
expect(ops.set("b", 42)).toEqual({ op: "set", path: "b", value: 42 });
|
|
208
|
+
expect(ops.set("c", true)).toEqual({ op: "set", path: "c", value: true });
|
|
209
|
+
expect(ops.unset("a")).toEqual({ op: "unset", path: "a" });
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe("Scenario 7: Record<string, T> fields", () => {
|
|
213
|
+
const ops = defineOps();
|
|
214
|
+
it("should include Record field as a valid path", () => {
|
|
215
|
+
expectTypeOf().toMatchTypeOf();
|
|
216
|
+
expectTypeOf().toMatchTypeOf();
|
|
217
|
+
});
|
|
218
|
+
it("should NOT generate sub-paths for Record<string, T> fields", () => {
|
|
219
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
220
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
221
|
+
});
|
|
222
|
+
it("should still resolve Record sub-path value type via ValueAt", () => {
|
|
223
|
+
expectTypeOf().toEqualTypeOf();
|
|
224
|
+
});
|
|
225
|
+
it("should allow merge on Record fields", () => {
|
|
226
|
+
const p = ops.merge("widgets", {
|
|
227
|
+
widget1: { title: "Chart", visible: true },
|
|
228
|
+
});
|
|
229
|
+
expect(p).toEqual({
|
|
230
|
+
op: "merge",
|
|
231
|
+
path: "widgets",
|
|
232
|
+
value: { widget1: { title: "Chart", visible: true } },
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
it("should allow set to replace entire Record", () => {
|
|
236
|
+
const p = ops.set("widgets", {
|
|
237
|
+
w1: { title: "A", visible: true },
|
|
238
|
+
w2: { title: "B", visible: false },
|
|
239
|
+
});
|
|
240
|
+
expect(p.op).toBe("set");
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe("Scenario 8: Depth limit (D=3)", () => {
|
|
244
|
+
it("should resolve up to root + 3 levels of nesting (4 segments)", () => {
|
|
245
|
+
expectTypeOf().toMatchTypeOf(); // 1 segment
|
|
246
|
+
expectTypeOf().toMatchTypeOf(); // 2 segments
|
|
247
|
+
expectTypeOf().toMatchTypeOf(); // 3 segments
|
|
248
|
+
expectTypeOf().toMatchTypeOf(); // 4 segments (limit)
|
|
249
|
+
});
|
|
250
|
+
it("should NOT resolve beyond 4 segments", () => {
|
|
251
|
+
// 5 segments → blocked by depth limit
|
|
252
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
253
|
+
// 6 segments → also blocked
|
|
254
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
255
|
+
});
|
|
256
|
+
it("should still allow raw for deep paths beyond limit", () => {
|
|
257
|
+
const ops = defineOps();
|
|
258
|
+
const p = ops.raw.set("a.b.c.d.e.value", "deep");
|
|
259
|
+
expect(p.value).toBe("deep");
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe("Scenario 9: Multiple instances isolation", () => {
|
|
263
|
+
it("should not leak paths between instances", () => {
|
|
264
|
+
const opsA = defineOps();
|
|
265
|
+
const opsB = defineOps();
|
|
266
|
+
const pA = opsA.set("x", 42);
|
|
267
|
+
expect(pA.value).toBe(42);
|
|
268
|
+
const pB = opsB.set("y", "hello");
|
|
269
|
+
expect(pB.value).toBe("hello");
|
|
270
|
+
expectTypeOf().toMatchTypeOf();
|
|
271
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
272
|
+
expectTypeOf().toMatchTypeOf();
|
|
273
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
// ============================================================================
|
|
277
|
+
// Scenario 10: Patch[] accumulation pattern
|
|
278
|
+
// ============================================================================
|
|
279
|
+
describe("Scenario 10: Batch accumulation", () => {
|
|
280
|
+
const ops = defineOps();
|
|
281
|
+
it("should accumulate heterogeneous patches in array", () => {
|
|
282
|
+
const patches = [];
|
|
283
|
+
patches.push(ops.set("status", "checkout"));
|
|
284
|
+
patches.push(ops.merge("customer", { email: "new@test.com" }));
|
|
285
|
+
patches.push(ops.unset("error"));
|
|
286
|
+
patches.push(ops.set("total", 99.99));
|
|
287
|
+
expect(patches).toHaveLength(4);
|
|
288
|
+
expect(patches.map((p) => p.op)).toEqual(["set", "merge", "unset", "set"]);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
// ============================================================================
|
|
292
|
+
// Scenario 11: ValueAt edge cases
|
|
293
|
+
// ============================================================================
|
|
294
|
+
describe("Scenario 11: ValueAt edge cases", () => {
|
|
295
|
+
it("should resolve nullable types", () => {
|
|
296
|
+
expectTypeOf().toEqualTypeOf();
|
|
297
|
+
});
|
|
298
|
+
it("should resolve union literal types", () => {
|
|
299
|
+
expectTypeOf().toEqualTypeOf();
|
|
300
|
+
});
|
|
301
|
+
it("should resolve array types as-is", () => {
|
|
302
|
+
expectTypeOf().toEqualTypeOf();
|
|
303
|
+
});
|
|
304
|
+
it("should return never for invalid paths", () => {
|
|
305
|
+
expectTypeOf().toEqualTypeOf();
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe("Scenario 12: Reserved snapshot root exclusion", () => {
|
|
309
|
+
const ops = defineOps();
|
|
310
|
+
it("should allow non-reserved paths", () => {
|
|
311
|
+
const p1 = ops.set("count", 42);
|
|
312
|
+
expect(p1).toEqual({ op: "set", path: "count", value: 42 });
|
|
313
|
+
const p2 = ops.set("safe.nested", "hello");
|
|
314
|
+
expect(p2).toEqual({ op: "set", path: "safe.nested", value: "hello" });
|
|
315
|
+
});
|
|
316
|
+
it("should exclude reserved root paths from DataPaths", () => {
|
|
317
|
+
// DataPaths itself still generates these (it's generic)
|
|
318
|
+
expectTypeOf().toMatchTypeOf();
|
|
319
|
+
expectTypeOf().toMatchTypeOf();
|
|
320
|
+
// But TypedOps interface filters them — verified by:
|
|
321
|
+
// ops.set("system", ...) → TS error
|
|
322
|
+
// ops.set("system.foo", ...) → TS error
|
|
323
|
+
// Users should use raw for reserved namespace access.
|
|
324
|
+
});
|
|
325
|
+
it("should allow reserved path access via raw escape hatch", () => {
|
|
326
|
+
const p = ops.raw.set("system.status", "idle");
|
|
327
|
+
expect(p).toEqual({ op: "set", path: "system.status", value: "idle" });
|
|
328
|
+
});
|
|
329
|
+
it("should not filter reserved names in nested positions", () => {
|
|
330
|
+
expectTypeOf().toMatchTypeOf();
|
|
331
|
+
expectTypeOf().toMatchTypeOf();
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
//# sourceMappingURL=typed-ops-scenarios.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ops-scenarios.test.js","sourceRoot":"","sources":["../../src/__tests__/typed-ops-scenarios.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ops.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/typed-ops.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { describe, it, expect, expectTypeOf } from "vitest";
|
|
2
|
+
import { defineOps } from "../typed-ops.js";
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Compile-Time Type Tests
|
|
5
|
+
// ============================================================================
|
|
6
|
+
describe("Type-level: DataPaths", () => {
|
|
7
|
+
it("should include top-level keys", () => {
|
|
8
|
+
expectTypeOf().toMatchTypeOf();
|
|
9
|
+
expectTypeOf().toMatchTypeOf();
|
|
10
|
+
expectTypeOf().toMatchTypeOf();
|
|
11
|
+
expectTypeOf().toMatchTypeOf();
|
|
12
|
+
expectTypeOf().toMatchTypeOf();
|
|
13
|
+
expectTypeOf().toMatchTypeOf();
|
|
14
|
+
});
|
|
15
|
+
it("should include nested object paths", () => {
|
|
16
|
+
expectTypeOf().toMatchTypeOf();
|
|
17
|
+
expectTypeOf().toMatchTypeOf();
|
|
18
|
+
expectTypeOf().toMatchTypeOf();
|
|
19
|
+
expectTypeOf().toMatchTypeOf();
|
|
20
|
+
expectTypeOf().toMatchTypeOf();
|
|
21
|
+
expectTypeOf().toMatchTypeOf();
|
|
22
|
+
});
|
|
23
|
+
it("should NOT include invalid paths", () => {
|
|
24
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
25
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
26
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("Type-level: ValueAt", () => {
|
|
30
|
+
it("should resolve top-level field types", () => {
|
|
31
|
+
expectTypeOf().toEqualTypeOf();
|
|
32
|
+
expectTypeOf().toEqualTypeOf();
|
|
33
|
+
expectTypeOf().toEqualTypeOf();
|
|
34
|
+
expectTypeOf().toEqualTypeOf();
|
|
35
|
+
});
|
|
36
|
+
it("should resolve nested field types", () => {
|
|
37
|
+
expectTypeOf().toEqualTypeOf();
|
|
38
|
+
expectTypeOf().toEqualTypeOf();
|
|
39
|
+
expectTypeOf().toEqualTypeOf();
|
|
40
|
+
expectTypeOf().toEqualTypeOf();
|
|
41
|
+
});
|
|
42
|
+
it("should resolve object types", () => {
|
|
43
|
+
expectTypeOf().toEqualTypeOf();
|
|
44
|
+
expectTypeOf().toEqualTypeOf();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("Type-level: ObjectPaths", () => {
|
|
48
|
+
it("should include plain object paths", () => {
|
|
49
|
+
expectTypeOf().toMatchTypeOf();
|
|
50
|
+
expectTypeOf().toMatchTypeOf();
|
|
51
|
+
expectTypeOf().toMatchTypeOf();
|
|
52
|
+
});
|
|
53
|
+
it("should exclude primitive and array paths", () => {
|
|
54
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
55
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
56
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
57
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
58
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
59
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
// ============================================================================
|
|
63
|
+
// Runtime Tests
|
|
64
|
+
// ============================================================================
|
|
65
|
+
describe("defineOps", () => {
|
|
66
|
+
const ops = defineOps();
|
|
67
|
+
describe("set", () => {
|
|
68
|
+
it("should create a set patch for a top-level field", () => {
|
|
69
|
+
const patch = ops.set("count", 42);
|
|
70
|
+
expect(patch).toEqual({ op: "set", path: "count", value: 42 });
|
|
71
|
+
});
|
|
72
|
+
it("should create a set patch for a nested field", () => {
|
|
73
|
+
const patch = ops.set("user.name", "Alice");
|
|
74
|
+
expect(patch).toEqual({ op: "set", path: "user.name", value: "Alice" });
|
|
75
|
+
});
|
|
76
|
+
it("should create a set patch for an enum field", () => {
|
|
77
|
+
const patch = ops.set("filter", "active");
|
|
78
|
+
expect(patch).toEqual({ op: "set", path: "filter", value: "active" });
|
|
79
|
+
});
|
|
80
|
+
it("should create a set patch for a deeply nested field", () => {
|
|
81
|
+
const patch = ops.set("user.address.city", "Seoul");
|
|
82
|
+
expect(patch).toEqual({
|
|
83
|
+
op: "set",
|
|
84
|
+
path: "user.address.city",
|
|
85
|
+
value: "Seoul",
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
it("should create a set patch for an array field", () => {
|
|
89
|
+
const todos = [{ title: "test", completed: false }];
|
|
90
|
+
const patch = ops.set("todos", todos);
|
|
91
|
+
expect(patch).toEqual({ op: "set", path: "todos", value: todos });
|
|
92
|
+
});
|
|
93
|
+
it("should return SetPatch type", () => {
|
|
94
|
+
const patch = ops.set("count", 1);
|
|
95
|
+
expectTypeOf(patch).toEqualTypeOf();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("unset", () => {
|
|
99
|
+
it("should create an unset patch", () => {
|
|
100
|
+
const patch = ops.unset("count");
|
|
101
|
+
expect(patch).toEqual({ op: "unset", path: "count" });
|
|
102
|
+
});
|
|
103
|
+
it("should create an unset patch for nested field", () => {
|
|
104
|
+
const patch = ops.unset("user.name");
|
|
105
|
+
expect(patch).toEqual({ op: "unset", path: "user.name" });
|
|
106
|
+
});
|
|
107
|
+
it("should return UnsetPatch type", () => {
|
|
108
|
+
const patch = ops.unset("count");
|
|
109
|
+
expectTypeOf(patch).toEqualTypeOf();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe("merge", () => {
|
|
113
|
+
it("should create a merge patch for an object field", () => {
|
|
114
|
+
const patch = ops.merge("user", { name: "Bob" });
|
|
115
|
+
expect(patch).toEqual({
|
|
116
|
+
op: "merge",
|
|
117
|
+
path: "user",
|
|
118
|
+
value: { name: "Bob" },
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
it("should create a merge patch for a nested object", () => {
|
|
122
|
+
const patch = ops.merge("user.address", { city: "Busan" });
|
|
123
|
+
expect(patch).toEqual({
|
|
124
|
+
op: "merge",
|
|
125
|
+
path: "user.address",
|
|
126
|
+
value: { city: "Busan" },
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
it("should return MergePatch type", () => {
|
|
130
|
+
const patch = ops.merge("user", { age: 30 });
|
|
131
|
+
expectTypeOf(patch).toEqualTypeOf();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe("error", () => {
|
|
135
|
+
it("should create a system.lastError set patch", () => {
|
|
136
|
+
const patch = ops.error("VALIDATION", "Field required");
|
|
137
|
+
expect(patch).toEqual({
|
|
138
|
+
op: "set",
|
|
139
|
+
path: "system.lastError",
|
|
140
|
+
value: {
|
|
141
|
+
code: "VALIDATION",
|
|
142
|
+
message: "Field required",
|
|
143
|
+
source: { actionId: "", nodePath: "" },
|
|
144
|
+
timestamp: 0,
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
it("should include context when provided", () => {
|
|
149
|
+
const patch = ops.error("API_ERROR", "Timeout", { context: { endpoint: "/api/v1" } });
|
|
150
|
+
expect(patch.value).toEqual(expect.objectContaining({
|
|
151
|
+
code: "API_ERROR",
|
|
152
|
+
context: { endpoint: "/api/v1" },
|
|
153
|
+
}));
|
|
154
|
+
});
|
|
155
|
+
it("should accept source and timestamp overrides", () => {
|
|
156
|
+
const patch = ops.error("SYNC_FAIL", "Timeout", {
|
|
157
|
+
source: { actionId: "act-1", nodePath: "sync.run" },
|
|
158
|
+
timestamp: 1700000000,
|
|
159
|
+
});
|
|
160
|
+
expect(patch.value).toEqual(expect.objectContaining({
|
|
161
|
+
code: "SYNC_FAIL",
|
|
162
|
+
source: { actionId: "act-1", nodePath: "sync.run" },
|
|
163
|
+
timestamp: 1700000000,
|
|
164
|
+
}));
|
|
165
|
+
});
|
|
166
|
+
it("should return SetPatch type", () => {
|
|
167
|
+
const patch = ops.error("CODE", "msg");
|
|
168
|
+
expectTypeOf(patch).toEqualTypeOf();
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe("raw", () => {
|
|
172
|
+
it("should create untyped set patch", () => {
|
|
173
|
+
const patch = ops.raw.set("$host.custom", { key: "value" });
|
|
174
|
+
expect(patch).toEqual({
|
|
175
|
+
op: "set",
|
|
176
|
+
path: "$host.custom",
|
|
177
|
+
value: { key: "value" },
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
it("should create untyped unset patch", () => {
|
|
181
|
+
const patch = ops.raw.unset("$host.temp");
|
|
182
|
+
expect(patch).toEqual({ op: "unset", path: "$host.temp" });
|
|
183
|
+
});
|
|
184
|
+
it("should create untyped merge patch", () => {
|
|
185
|
+
const patch = ops.raw.merge("$host.config", { enabled: true });
|
|
186
|
+
expect(patch).toEqual({
|
|
187
|
+
op: "merge",
|
|
188
|
+
path: "$host.config",
|
|
189
|
+
value: { enabled: true },
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe("integration with apply()", () => {
|
|
194
|
+
it("should produce patches compatible with Core apply", () => {
|
|
195
|
+
const patches = [
|
|
196
|
+
ops.set("count", 10),
|
|
197
|
+
ops.set("user.name", "Charlie"),
|
|
198
|
+
ops.merge("user.address", { zip: "12345" }),
|
|
199
|
+
];
|
|
200
|
+
// Verify all patches have valid structure
|
|
201
|
+
for (const patch of patches) {
|
|
202
|
+
expect(patch).toHaveProperty("op");
|
|
203
|
+
expect(patch).toHaveProperty("path");
|
|
204
|
+
expect(typeof patch.path).toBe("string");
|
|
205
|
+
expect(patch.path.length).toBeGreaterThan(0);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=typed-ops.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ops.test.js","sourceRoot":"","sources":["../../src/__tests__/typed-ops.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,4 +18,6 @@ export { HookableImpl } from './hooks/index.js';
|
|
|
18
18
|
export type { HookState } from './hooks/index.js';
|
|
19
19
|
export { JobQueue } from './hooks/index.js';
|
|
20
20
|
export { HookContextImpl, createHookContext } from './hooks/index.js';
|
|
21
|
+
export { defineOps } from './typed-ops.js';
|
|
22
|
+
export type { TypedOps, DataPaths, ValueAt, ObjectPaths } from './typed-ops.js';
|
|
21
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD,YAAY,EAEV,SAAS,EACT,WAAW,EACX,WAAW,EAGX,WAAW,EAGX,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC7B,cAAc,EAGd,YAAY,EACZ,kBAAkB,EAGlB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EAGd,QAAQ,EACR,WAAW,EACX,YAAY,EAGZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,wBAAwB,EAGxB,aAAa,EACb,gBAAgB,EAChB,WAAW,EAGX,GAAG,EACH,YAAY,EACZ,MAAM,EACN,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,cAAc,EAGd,SAAS,EAGT,QAAQ,EAGR,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EAGX,WAAW,EAGX,SAAS,EACT,MAAM,EACN,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,MAAM,EACN,yBAAyB,EACzB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EACL,SAAS,EAGT,OAAO,EACP,gBAAgB,EAChB,aAAa,EAGb,UAAU,EAGV,OAAO,GACR,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAEL,iBAAiB,EAGjB,gBAAgB,EAChB,gBAAgB,EAGhB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EAGnB,iBAAiB,EAGjB,uBAAuB,EAGvB,yBAAyB,EACzB,wBAAwB,EAGxB,mBAAmB,EAGnB,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,EAGtB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EAGf,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD,YAAY,EAEV,SAAS,EACT,WAAW,EACX,WAAW,EAGX,WAAW,EAGX,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,6BAA6B,EAC7B,cAAc,EAGd,YAAY,EACZ,kBAAkB,EAGlB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EAGd,QAAQ,EACR,WAAW,EACX,YAAY,EAGZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,wBAAwB,EAGxB,aAAa,EACb,gBAAgB,EAChB,WAAW,EAGX,GAAG,EACH,YAAY,EACZ,MAAM,EACN,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,cAAc,EAGd,SAAS,EAGT,QAAQ,EAGR,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EAGX,WAAW,EAGX,SAAS,EACT,MAAM,EACN,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,MAAM,EACN,yBAAyB,EACzB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EACL,SAAS,EAGT,OAAO,EACP,gBAAgB,EAChB,aAAa,EAGb,UAAU,EAGV,OAAO,GACR,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAEL,iBAAiB,EAGjB,gBAAgB,EAChB,gBAAgB,EAGhB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EAGnB,iBAAiB,EAGjB,uBAAuB,EAGvB,yBAAyB,EACzB,wBAAwB,EAGxB,mBAAmB,EAGnB,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,EAGtB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EAGf,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMtE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -46,4 +46,8 @@ export { AppRefImpl, createAppRef } from './hooks/index.js';
|
|
|
46
46
|
export { HookableImpl } from './hooks/index.js';
|
|
47
47
|
export { JobQueue } from './hooks/index.js';
|
|
48
48
|
export { HookContextImpl, createHookContext } from './hooks/index.js';
|
|
49
|
+
// =============================================================================
|
|
50
|
+
// Typed Patch Operations
|
|
51
|
+
// =============================================================================
|
|
52
|
+
export { defineOps } from './typed-ops.js';
|
|
49
53
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2HH,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF,OAAO;AACL,OAAO;AACP,iBAAiB;AAEjB,YAAY;AACZ,gBAAgB,EAChB,gBAAgB;AAEhB,SAAS;AACT,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB;AAEnB,OAAO;AACP,iBAAiB;AAEjB,UAAU;AACV,uBAAuB;AAEvB,SAAS;AACT,yBAAyB,EACzB,wBAAwB;AAExB,SAAS;AACT,mBAAmB;AAEnB,eAAe;AACf,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB;AAEtB,QAAQ;AACR,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe;AAEf,oBAAoB;AACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,gFAAgF;AAChF,oDAAoD;AACpD,gFAAgF;AAEhF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2HH,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF,OAAO;AACL,OAAO;AACP,iBAAiB;AAEjB,YAAY;AACZ,gBAAgB,EAChB,gBAAgB;AAEhB,SAAS;AACT,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB;AAEnB,OAAO;AACP,iBAAiB;AAEjB,UAAU;AACV,uBAAuB;AAEvB,SAAS;AACT,yBAAyB,EACzB,wBAAwB;AAExB,SAAS;AACT,mBAAmB;AAEnB,eAAe;AACf,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB;AAEtB,QAAQ;AACR,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe;AAEf,oBAAoB;AACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,gFAAgF;AAChF,oDAAoD;AACpD,gFAAgF;AAEhF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { SetPatch, UnsetPatch, MergePatch } from "@manifesto-ai/core";
|
|
2
|
+
/**
|
|
3
|
+
* Depth counter for recursive type operations.
|
|
4
|
+
* Prevents infinite recursion in TypeScript's type system.
|
|
5
|
+
*
|
|
6
|
+
* Usage: Prev[4] = 3, Prev[3] = 2, ... Prev[0] = never
|
|
7
|
+
*/
|
|
8
|
+
type Prev = [never, 0, 1, 2, 3, 4];
|
|
9
|
+
/**
|
|
10
|
+
* Extract all valid dot-separated paths from a data type.
|
|
11
|
+
*
|
|
12
|
+
* - Object keys become path segments
|
|
13
|
+
* - Nested objects generate dot-separated paths (e.g. "user.name")
|
|
14
|
+
* - Arrays, primitives, and Record<string, T> are leaf nodes
|
|
15
|
+
* (Record sub-paths are not supported by Core's path resolution)
|
|
16
|
+
* - Limited to 3 levels of nesting to avoid TS recursion limits
|
|
17
|
+
* (root key + 3 nested levels = max 4 path segments)
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* type State = { user: { name: string; age: number }; count: number };
|
|
21
|
+
* type P = DataPaths<State>;
|
|
22
|
+
* // "user" | "user.name" | "user.age" | "count"
|
|
23
|
+
*/
|
|
24
|
+
export type DataPaths<T, D extends number = 3> = [D] extends [never] ? never : T extends Record<string, unknown> ? T extends unknown[] ? never : {
|
|
25
|
+
[K in keyof T & string]: K | (NonNullable<T[K]> extends Record<string, unknown> ? NonNullable<T[K]> extends unknown[] ? never : string extends keyof NonNullable<T[K]> ? never : `${K}.${DataPaths<NonNullable<T[K]>, Prev[D]>}` : never);
|
|
26
|
+
}[keyof T & string] : never;
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the value type at a dot-separated path.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* type State = { user: { name: string } };
|
|
32
|
+
* type V = ValueAt<State, "user.name">; // string
|
|
33
|
+
* type U = ValueAt<State, "user">; // { name: string }
|
|
34
|
+
*/
|
|
35
|
+
export type ValueAt<T, P extends string> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? ValueAt<NonNullable<T[K]>, Rest> : never : P extends keyof T ? T[P] : never;
|
|
36
|
+
/**
|
|
37
|
+
* Paths that resolve to plain object types (valid targets for merge).
|
|
38
|
+
* Arrays and primitives are excluded since merge performs shallow object merge.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* type State = { user: { name: string }; tags: string[]; count: number };
|
|
42
|
+
* type M = ObjectPaths<State>;
|
|
43
|
+
* // "user" (tags and count excluded - not plain objects)
|
|
44
|
+
*/
|
|
45
|
+
export type ObjectPaths<T, D extends number = 3> = [D] extends [never] ? never : T extends Record<string, unknown> ? T extends unknown[] ? never : {
|
|
46
|
+
[K in keyof T & string]: (NonNullable<T[K]> extends Record<string, unknown> ? NonNullable<T[K]> extends unknown[] ? never : K : never) | (NonNullable<T[K]> extends Record<string, unknown> ? NonNullable<T[K]> extends unknown[] ? never : string extends keyof NonNullable<T[K]> ? never : `${K}.${ObjectPaths<NonNullable<T[K]>, Prev[D]>}` : never);
|
|
47
|
+
}[keyof T & string] : never;
|
|
48
|
+
/**
|
|
49
|
+
* Snapshot root prefixes reserved by Core's splitPatchPath().
|
|
50
|
+
* Paths starting with these are routed to snapshot.system / .input / etc.,
|
|
51
|
+
* NOT to snapshot.data. Typed ops exclude them to prevent silent misrouting.
|
|
52
|
+
*/
|
|
53
|
+
type ReservedRoot = "system" | "input" | "computed" | "meta";
|
|
54
|
+
/** DataPaths with reserved snapshot roots filtered out. */
|
|
55
|
+
type SafeDataPaths<T extends Record<string, unknown>> = Exclude<DataPaths<T>, ReservedRoot | `${ReservedRoot}.${string}`>;
|
|
56
|
+
/** ObjectPaths with reserved snapshot roots filtered out. */
|
|
57
|
+
type SafeObjectPaths<T extends Record<string, unknown>> = Exclude<ObjectPaths<T>, ReservedRoot | `${ReservedRoot}.${string}`>;
|
|
58
|
+
/**
|
|
59
|
+
* Type-safe patch operations builder.
|
|
60
|
+
*
|
|
61
|
+
* Provides IDE autocomplete for state paths and compile-time type checking
|
|
62
|
+
* for patch values. All methods return standard Patch objects compatible
|
|
63
|
+
* with Core's apply() function.
|
|
64
|
+
*
|
|
65
|
+
* @typeParam TData - The shape of domain state (snapshot.data)
|
|
66
|
+
*/
|
|
67
|
+
export interface TypedOps<TData extends Record<string, unknown>> {
|
|
68
|
+
/**
|
|
69
|
+
* Create a set patch — replace value at path (create if missing).
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ops.set('count', 5);
|
|
73
|
+
* ops.set('user.name', 'Alice');
|
|
74
|
+
*/
|
|
75
|
+
set<P extends SafeDataPaths<TData>>(path: P, value: Exclude<ValueAt<TData, P>, undefined>): SetPatch;
|
|
76
|
+
/**
|
|
77
|
+
* Create an unset patch — remove property at path.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ops.unset('temporaryField');
|
|
81
|
+
*/
|
|
82
|
+
unset<P extends SafeDataPaths<TData>>(path: P): UnsetPatch;
|
|
83
|
+
/**
|
|
84
|
+
* Create a merge patch — shallow merge at object path.
|
|
85
|
+
* Only valid for paths that resolve to plain object types.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ops.merge('user', { name: 'Bob' });
|
|
89
|
+
*/
|
|
90
|
+
merge<P extends SafeObjectPaths<TData>>(path: P, value: {
|
|
91
|
+
[K in keyof ValueAt<TData, P>]?: Exclude<ValueAt<TData, P>[K], undefined>;
|
|
92
|
+
}): MergePatch;
|
|
93
|
+
/**
|
|
94
|
+
* Create an error patch targeting system.lastError.
|
|
95
|
+
*
|
|
96
|
+
* Convenience for writing error state from effect handlers.
|
|
97
|
+
* Provide source and timestamp for full audit trail;
|
|
98
|
+
* omitted fields default to empty/zero.
|
|
99
|
+
*/
|
|
100
|
+
error(code: string, message: string, options?: {
|
|
101
|
+
source?: {
|
|
102
|
+
actionId: string;
|
|
103
|
+
nodePath: string;
|
|
104
|
+
};
|
|
105
|
+
timestamp?: number;
|
|
106
|
+
context?: Record<string, unknown>;
|
|
107
|
+
}): SetPatch;
|
|
108
|
+
/**
|
|
109
|
+
* Raw (untyped) patch creation — escape hatch for dynamic paths
|
|
110
|
+
* or platform namespace ($*) targets.
|
|
111
|
+
*/
|
|
112
|
+
raw: {
|
|
113
|
+
set(path: string, value: unknown): SetPatch;
|
|
114
|
+
unset(path: string): UnsetPatch;
|
|
115
|
+
merge(path: string, value: Record<string, unknown>): MergePatch;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a type-safe patch operations builder.
|
|
120
|
+
*
|
|
121
|
+
* Injects the domain state type to enable:
|
|
122
|
+
* - IDE autocomplete on all valid state paths
|
|
123
|
+
* - Compile-time type checking of patch values
|
|
124
|
+
* - Merge restricted to object-typed paths
|
|
125
|
+
*
|
|
126
|
+
* @typeParam TData - The shape of domain state (snapshot.data)
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* type State = {
|
|
130
|
+
* count: number;
|
|
131
|
+
* user: { name: string; age: number };
|
|
132
|
+
* tags: string[];
|
|
133
|
+
* };
|
|
134
|
+
*
|
|
135
|
+
* const ops = defineOps<State>();
|
|
136
|
+
*
|
|
137
|
+
* ops.set('count', 5); // OK — value: number
|
|
138
|
+
* ops.set('user.name', 'Alice'); // OK — value: string
|
|
139
|
+
* ops.set('count', 'hello'); // TS error — expected number
|
|
140
|
+
* ops.merge('user', { name: 'B' }); // OK — partial object merge
|
|
141
|
+
* ops.unset('tags'); // OK
|
|
142
|
+
*
|
|
143
|
+
* // Escape hatch for dynamic / platform paths
|
|
144
|
+
* ops.raw.set('$host.custom', { key: 'value' });
|
|
145
|
+
*/
|
|
146
|
+
export declare function defineOps<TData extends Record<string, unknown>>(): TypedOps<TData>;
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=typed-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ops.d.ts","sourceRoot":"","sources":["../src/typed-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Factory
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Create a type-safe patch operations builder.
|
|
6
|
+
*
|
|
7
|
+
* Injects the domain state type to enable:
|
|
8
|
+
* - IDE autocomplete on all valid state paths
|
|
9
|
+
* - Compile-time type checking of patch values
|
|
10
|
+
* - Merge restricted to object-typed paths
|
|
11
|
+
*
|
|
12
|
+
* @typeParam TData - The shape of domain state (snapshot.data)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* type State = {
|
|
16
|
+
* count: number;
|
|
17
|
+
* user: { name: string; age: number };
|
|
18
|
+
* tags: string[];
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* const ops = defineOps<State>();
|
|
22
|
+
*
|
|
23
|
+
* ops.set('count', 5); // OK — value: number
|
|
24
|
+
* ops.set('user.name', 'Alice'); // OK — value: string
|
|
25
|
+
* ops.set('count', 'hello'); // TS error — expected number
|
|
26
|
+
* ops.merge('user', { name: 'B' }); // OK — partial object merge
|
|
27
|
+
* ops.unset('tags'); // OK
|
|
28
|
+
*
|
|
29
|
+
* // Escape hatch for dynamic / platform paths
|
|
30
|
+
* ops.raw.set('$host.custom', { key: 'value' });
|
|
31
|
+
*/
|
|
32
|
+
export function defineOps() {
|
|
33
|
+
return {
|
|
34
|
+
set(path, value) {
|
|
35
|
+
return { op: "set", path, value };
|
|
36
|
+
},
|
|
37
|
+
unset(path) {
|
|
38
|
+
return { op: "unset", path };
|
|
39
|
+
},
|
|
40
|
+
merge(path, value) {
|
|
41
|
+
return { op: "merge", path, value: value };
|
|
42
|
+
},
|
|
43
|
+
error(code, message, options) {
|
|
44
|
+
return {
|
|
45
|
+
op: "set",
|
|
46
|
+
path: "system.lastError",
|
|
47
|
+
value: {
|
|
48
|
+
code,
|
|
49
|
+
message,
|
|
50
|
+
source: options?.source ?? { actionId: "", nodePath: "" },
|
|
51
|
+
timestamp: options?.timestamp ?? 0,
|
|
52
|
+
...(options?.context !== undefined ? { context: options.context } : {}),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
raw: {
|
|
57
|
+
set(path, value) {
|
|
58
|
+
return { op: "set", path, value };
|
|
59
|
+
},
|
|
60
|
+
unset(path) {
|
|
61
|
+
return { op: "unset", path };
|
|
62
|
+
},
|
|
63
|
+
merge(path, value) {
|
|
64
|
+
return { op: "merge", path, value };
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=typed-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-ops.js","sourceRoot":"","sources":["../src/typed-ops.ts"],"names":[],"mappings":"AAwLA,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,SAAS;IAGvB,OAAO;QACL,GAAG,CAAC,IAAY,EAAE,KAAc;YAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,IAAY;YAChB,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,IAAY,EAAE,KAAc;YAChC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAgC,EAAE,CAAC;QACxE,CAAC;QACD,KAAK,CACH,IAAY,EACZ,OAAe,EACf,OAIC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE;oBACL,IAAI;oBACJ,OAAO;oBACP,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;oBACzD,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC;oBAClC,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxE;aACF,CAAC;QACJ,CAAC;QACD,GAAG,EAAE;YACH,GAAG,CAAC,IAAY,EAAE,KAAc;gBAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACpC,CAAC;YACD,KAAK,CAAC,IAAY;gBAChB,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/B,CAAC;YACD,KAAK,CAAC,IAAY,EAAE,KAA8B;gBAChD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACtC,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manifesto-ai/sdk",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Manifesto SDK - Public developer API layer",
|
|
5
5
|
"author": "eggplantiny <eggplantiny@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"dist"
|
|
36
36
|
],
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@manifesto-ai/
|
|
39
|
-
"@manifesto-ai/
|
|
40
|
-
"@manifesto-ai/
|
|
38
|
+
"@manifesto-ai/runtime": "0.1.2",
|
|
39
|
+
"@manifesto-ai/core": "2.5.0",
|
|
40
|
+
"@manifesto-ai/world": "2.4.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"typescript": "^5.9.3"
|