@manifesto-ai/sdk 1.2.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -34
- package/dist/index.d.ts +413 -22
- package/dist/index.js +587 -52
- package/dist/index.js.map +1 -1
- package/package.json +10 -9
- package/dist/__tests__/bootstrap.test.d.ts +0 -2
- package/dist/__tests__/bootstrap.test.d.ts.map +0 -1
- package/dist/__tests__/bootstrap.test.js +0 -33
- package/dist/__tests__/bootstrap.test.js.map +0 -1
- package/dist/__tests__/public-exports.test.d.ts +0 -2
- package/dist/__tests__/public-exports.test.d.ts.map +0 -1
- package/dist/__tests__/public-exports.test.js +0 -59
- package/dist/__tests__/public-exports.test.js.map +0 -1
- package/dist/__tests__/typed-ops-scenarios.test.d.ts +0 -2
- package/dist/__tests__/typed-ops-scenarios.test.d.ts.map +0 -1
- package/dist/__tests__/typed-ops-scenarios.test.js +0 -334
- package/dist/__tests__/typed-ops-scenarios.test.js.map +0 -1
- package/dist/__tests__/typed-ops.test.d.ts +0 -2
- package/dist/__tests__/typed-ops.test.d.ts.map +0 -1
- package/dist/__tests__/typed-ops.test.js +0 -210
- package/dist/__tests__/typed-ops.test.js.map +0 -1
- package/dist/app.d.ts +0 -51
- package/dist/app.d.ts.map +0 -1
- package/dist/app.js +0 -170
- package/dist/app.js.map +0 -1
- package/dist/create-app.d.ts +0 -52
- package/dist/create-app.d.ts.map +0 -1
- package/dist/create-app.js +0 -94
- package/dist/create-app.js.map +0 -1
- package/dist/hooks/app-ref.d.ts +0 -71
- package/dist/hooks/app-ref.d.ts.map +0 -1
- package/dist/hooks/app-ref.js +0 -82
- package/dist/hooks/app-ref.js.map +0 -1
- package/dist/hooks/context.d.ts +0 -22
- package/dist/hooks/context.d.ts.map +0 -1
- package/dist/hooks/context.js +0 -26
- package/dist/hooks/context.js.map +0 -1
- package/dist/hooks/hookable.d.ts +0 -79
- package/dist/hooks/hookable.d.ts.map +0 -1
- package/dist/hooks/hookable.js +0 -137
- package/dist/hooks/hookable.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -14
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -13
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/queue.d.ts +0 -57
- package/dist/hooks/queue.d.ts.map +0 -1
- package/dist/hooks/queue.js +0 -141
- package/dist/hooks/queue.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/manifest.d.ts +0 -10
- package/dist/manifest.d.ts.map +0 -1
- package/dist/manifest.js +0 -2
- package/dist/manifest.js.map +0 -1
- package/dist/typed-ops.d.ts +0 -148
- package/dist/typed-ops.d.ts.map +0 -1
- package/dist/typed-ops.js +0 -69
- package/dist/typed-ops.js.map +0 -1
package/dist/hooks/queue.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Job Queue Implementation
|
|
3
|
-
*
|
|
4
|
-
* Manages enqueued jobs with priority support.
|
|
5
|
-
*
|
|
6
|
-
* @see SPEC §11.3 ENQ-1~6
|
|
7
|
-
* @module
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Job Queue for managing enqueued jobs.
|
|
11
|
-
*
|
|
12
|
-
* @see SPEC §11.3
|
|
13
|
-
*/
|
|
14
|
-
export class JobQueue {
|
|
15
|
-
_immediateJobs = [];
|
|
16
|
-
_normalJobs = [];
|
|
17
|
-
_deferredJobs = [];
|
|
18
|
-
_isProcessing = false;
|
|
19
|
-
_processScheduled = false;
|
|
20
|
-
/**
|
|
21
|
-
* Enqueue a job with optional priority.
|
|
22
|
-
*
|
|
23
|
-
* ENQ-1: Jobs are executed after the current hook completes
|
|
24
|
-
* ENQ-2: Priority ordering: immediate > normal > defer
|
|
25
|
-
* ENQ-3: Within same priority, FIFO ordering
|
|
26
|
-
*
|
|
27
|
-
* @see SPEC §11.3
|
|
28
|
-
*/
|
|
29
|
-
enqueue(job, opts) {
|
|
30
|
-
const priority = opts?.priority ?? "normal";
|
|
31
|
-
const queuedJob = {
|
|
32
|
-
job,
|
|
33
|
-
priority,
|
|
34
|
-
label: opts?.label,
|
|
35
|
-
enqueuedAt: Date.now(),
|
|
36
|
-
};
|
|
37
|
-
switch (priority) {
|
|
38
|
-
case "immediate":
|
|
39
|
-
this._immediateJobs.push(queuedJob);
|
|
40
|
-
break;
|
|
41
|
-
case "defer":
|
|
42
|
-
this._deferredJobs.push(queuedJob);
|
|
43
|
-
break;
|
|
44
|
-
case "normal":
|
|
45
|
-
default:
|
|
46
|
-
this._normalJobs.push(queuedJob);
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
// Schedule processing if not already scheduled
|
|
50
|
-
this._scheduleProcess();
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Process all pending jobs.
|
|
54
|
-
*
|
|
55
|
-
* ENQ-4: Jobs are processed in priority order
|
|
56
|
-
* ENQ-5: Errors in jobs are caught and logged (don't break queue)
|
|
57
|
-
* ENQ-6: New jobs enqueued during processing are handled
|
|
58
|
-
*
|
|
59
|
-
* @see SPEC §11.3
|
|
60
|
-
*/
|
|
61
|
-
async processAll() {
|
|
62
|
-
if (this._isProcessing) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
this._isProcessing = true;
|
|
66
|
-
this._processScheduled = false;
|
|
67
|
-
try {
|
|
68
|
-
// Process until all queues are empty
|
|
69
|
-
while (this._hasJobs()) {
|
|
70
|
-
// Process in priority order: immediate > normal > defer
|
|
71
|
-
const job = this._dequeueNext();
|
|
72
|
-
if (job) {
|
|
73
|
-
try {
|
|
74
|
-
await job.job();
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
// ENQ-5: Log error but continue processing
|
|
78
|
-
console.error(`[JobQueue] Error in job${job.label ? ` "${job.label}"` : ""}:`, error);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
this._isProcessing = false;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Check if queue has pending jobs.
|
|
89
|
-
*/
|
|
90
|
-
hasPendingJobs() {
|
|
91
|
-
return this._hasJobs();
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Get count of pending jobs.
|
|
95
|
-
*/
|
|
96
|
-
pendingCount() {
|
|
97
|
-
return (this._immediateJobs.length +
|
|
98
|
-
this._normalJobs.length +
|
|
99
|
-
this._deferredJobs.length);
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Clear all pending jobs.
|
|
103
|
-
*/
|
|
104
|
-
clear() {
|
|
105
|
-
this._immediateJobs = [];
|
|
106
|
-
this._normalJobs = [];
|
|
107
|
-
this._deferredJobs = [];
|
|
108
|
-
}
|
|
109
|
-
// ===========================================================================
|
|
110
|
-
// Private Methods
|
|
111
|
-
// ===========================================================================
|
|
112
|
-
_hasJobs() {
|
|
113
|
-
return (this._immediateJobs.length > 0 ||
|
|
114
|
-
this._normalJobs.length > 0 ||
|
|
115
|
-
this._deferredJobs.length > 0);
|
|
116
|
-
}
|
|
117
|
-
_dequeueNext() {
|
|
118
|
-
// Priority order: immediate > normal > defer
|
|
119
|
-
if (this._immediateJobs.length > 0) {
|
|
120
|
-
return this._immediateJobs.shift();
|
|
121
|
-
}
|
|
122
|
-
if (this._normalJobs.length > 0) {
|
|
123
|
-
return this._normalJobs.shift();
|
|
124
|
-
}
|
|
125
|
-
if (this._deferredJobs.length > 0) {
|
|
126
|
-
return this._deferredJobs.shift();
|
|
127
|
-
}
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
_scheduleProcess() {
|
|
131
|
-
if (this._processScheduled || this._isProcessing) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
this._processScheduled = true;
|
|
135
|
-
// Use queueMicrotask for immediate scheduling
|
|
136
|
-
queueMicrotask(() => {
|
|
137
|
-
void this.processAll();
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=queue.js.map
|
package/dist/hooks/queue.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/hooks/queue.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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/manifest.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SDK package identity and SPEC version metadata.
|
|
3
|
-
* Used for phase tracking and compatibility verification.
|
|
4
|
-
*/
|
|
5
|
-
export type SdkManifest = {
|
|
6
|
-
readonly name: '@manifesto-ai/sdk';
|
|
7
|
-
readonly specVersion: '0.1.0';
|
|
8
|
-
readonly phase: 'bootstrap';
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=manifest.d.ts.map
|
package/dist/manifest.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B,CAAC"}
|
package/dist/manifest.js
DELETED
package/dist/manifest.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":""}
|
package/dist/typed-ops.d.ts
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
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
|
package/dist/typed-ops.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typed-ops.d.ts","sourceRoot":"","sources":["../src/typed-ops.ts"],"names":[],"mappings":"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"}
|
package/dist/typed-ops.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
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
|
package/dist/typed-ops.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|