@threadplane/a2ui 0.0.55 → 0.0.56
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/package.json +1 -1
- package/src/lib/guards.d.ts +4 -0
- package/src/lib/guards.d.ts.map +1 -1
- package/src/lib/guards.js +4 -0
- package/src/lib/parser.d.ts +14 -0
- package/src/lib/parser.d.ts.map +1 -1
- package/src/lib/parser.js +13 -0
- package/src/lib/pointer.d.ts +32 -0
- package/src/lib/pointer.d.ts.map +1 -1
- package/src/lib/pointer.js +32 -0
- package/src/lib/resolve.d.ts +14 -0
- package/src/lib/resolve.d.ts.map +1 -1
- package/src/lib/resolve.js +14 -0
package/package.json
CHANGED
package/src/lib/guards.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
/** Returns true when `value` is an A2UI dynamic path reference. */
|
|
1
2
|
export declare function isPathRef(value: unknown): value is {
|
|
2
3
|
path: string;
|
|
3
4
|
};
|
|
5
|
+
/** Returns true when `value` is an A2UI string literal wrapper. */
|
|
4
6
|
export declare function isLiteralString(value: unknown): value is {
|
|
5
7
|
literalString: string;
|
|
6
8
|
};
|
|
9
|
+
/** Returns true when `value` is an A2UI number literal wrapper. */
|
|
7
10
|
export declare function isLiteralNumber(value: unknown): value is {
|
|
8
11
|
literalNumber: number;
|
|
9
12
|
};
|
|
13
|
+
/** Returns true when `value` is an A2UI boolean literal wrapper. */
|
|
10
14
|
export declare function isLiteralBoolean(value: unknown): value is {
|
|
11
15
|
literalBoolean: boolean;
|
|
12
16
|
};
|
package/src/lib/guards.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/guards.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAGnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAElF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAElF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,CAErF"}
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/guards.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAGnE;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAElF;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAElF;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,CAErF"}
|
package/src/lib/guards.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
|
+
/** Returns true when `value` is an A2UI dynamic path reference. */
|
|
2
3
|
export function isPathRef(value) {
|
|
3
4
|
return typeof value === 'object' && value !== null
|
|
4
5
|
&& 'path' in value && typeof value.path === 'string';
|
|
5
6
|
}
|
|
7
|
+
/** Returns true when `value` is an A2UI string literal wrapper. */
|
|
6
8
|
export function isLiteralString(value) {
|
|
7
9
|
return typeof value === 'object' && value !== null && 'literalString' in value;
|
|
8
10
|
}
|
|
11
|
+
/** Returns true when `value` is an A2UI number literal wrapper. */
|
|
9
12
|
export function isLiteralNumber(value) {
|
|
10
13
|
return typeof value === 'object' && value !== null && 'literalNumber' in value;
|
|
11
14
|
}
|
|
15
|
+
/** Returns true when `value` is an A2UI boolean literal wrapper. */
|
|
12
16
|
export function isLiteralBoolean(value) {
|
|
13
17
|
return typeof value === 'object' && value !== null && 'literalBoolean' in value;
|
|
14
18
|
}
|
package/src/lib/parser.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import type { A2uiMessage } from './types.js';
|
|
2
2
|
export interface A2uiMessageParser {
|
|
3
|
+
/** Push a JSONL stream chunk and return every complete A2UI envelope parsed from it. */
|
|
3
4
|
push(chunk: string): A2uiMessage[];
|
|
4
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Creates a stateful parser for newline-delimited A2UI message streams.
|
|
8
|
+
*
|
|
9
|
+
* The parser buffers incomplete lines, skips malformed JSON, and returns only
|
|
10
|
+
* recognized A2UI envelopes: `surfaceUpdate`, `dataModelUpdate`,
|
|
11
|
+
* `beginRendering`, and `deleteSurface`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const parser = createA2uiMessageParser();
|
|
16
|
+
* const messages = parser.push('{"beginRendering":{"surfaceId":"s1","root":"root"}}\n');
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
5
19
|
export declare function createA2uiMessageParser(): A2uiMessageParser;
|
|
6
20
|
//# sourceMappingURL=parser.d.ts.map
|
package/src/lib/parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;CACpC;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAsC3D"}
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;CACpC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAsC3D"}
|
package/src/lib/parser.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
const ENVELOPE_KEYS = ['surfaceUpdate', 'dataModelUpdate', 'beginRendering', 'deleteSurface'];
|
|
2
|
+
/**
|
|
3
|
+
* Creates a stateful parser for newline-delimited A2UI message streams.
|
|
4
|
+
*
|
|
5
|
+
* The parser buffers incomplete lines, skips malformed JSON, and returns only
|
|
6
|
+
* recognized A2UI envelopes: `surfaceUpdate`, `dataModelUpdate`,
|
|
7
|
+
* `beginRendering`, and `deleteSurface`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const parser = createA2uiMessageParser();
|
|
12
|
+
* const messages = parser.push('{"beginRendering":{"surfaceId":"s1","root":"root"}}\n');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
2
15
|
export function createA2uiMessageParser() {
|
|
3
16
|
let buffer = '';
|
|
4
17
|
function parseEnvelope(json) {
|
package/src/lib/pointer.d.ts
CHANGED
|
@@ -1,4 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads a value from a model using the package's simple slash-separated pointer syntax.
|
|
3
|
+
*
|
|
4
|
+
* Empty string and `/` target the root. Segments are not RFC 6901-unescaped;
|
|
5
|
+
* normalize keys before using pointers that would require `~0` or `~1`.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* getByPointer({ user: { name: 'Ada' } }, '/user/name'); // 'Ada'
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
1
12
|
export declare function getByPointer(model: Record<string, unknown>, pointer: string): unknown;
|
|
13
|
+
/**
|
|
14
|
+
* Returns a new model with `value` written at `pointer`.
|
|
15
|
+
*
|
|
16
|
+
* The input model is not mutated. Missing intermediate objects are created.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const next = setByPointer({}, '/user/name', 'Ada');
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
2
23
|
export declare function setByPointer(model: Record<string, unknown>, pointer: string, value: unknown): Record<string, unknown>;
|
|
24
|
+
/**
|
|
25
|
+
* Returns a new model with the key at `pointer` removed.
|
|
26
|
+
*
|
|
27
|
+
* Empty string and `/` clear the whole model. Missing parent paths leave the
|
|
28
|
+
* input model unchanged.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const next = deleteByPointer({ user: { name: 'Ada' } }, '/user/name');
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
3
35
|
export declare function deleteByPointer(model: Record<string, unknown>, pointer: string): Record<string, unknown>;
|
|
4
36
|
//# sourceMappingURL=pointer.d.ts.map
|
package/src/lib/pointer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/pointer.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrF;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
|
|
1
|
+
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/pointer.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
|
package/src/lib/pointer.js
CHANGED
|
@@ -4,6 +4,17 @@ function parsePointer(pointer) {
|
|
|
4
4
|
return [];
|
|
5
5
|
return pointer.split('/').filter(Boolean);
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Reads a value from a model using the package's simple slash-separated pointer syntax.
|
|
9
|
+
*
|
|
10
|
+
* Empty string and `/` target the root. Segments are not RFC 6901-unescaped;
|
|
11
|
+
* normalize keys before using pointers that would require `~0` or `~1`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* getByPointer({ user: { name: 'Ada' } }, '/user/name'); // 'Ada'
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
7
18
|
export function getByPointer(model, pointer) {
|
|
8
19
|
const segments = parsePointer(pointer);
|
|
9
20
|
let current = model;
|
|
@@ -14,6 +25,16 @@ export function getByPointer(model, pointer) {
|
|
|
14
25
|
}
|
|
15
26
|
return current;
|
|
16
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns a new model with `value` written at `pointer`.
|
|
30
|
+
*
|
|
31
|
+
* The input model is not mutated. Missing intermediate objects are created.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const next = setByPointer({}, '/user/name', 'Ada');
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
17
38
|
export function setByPointer(model, pointer, value) {
|
|
18
39
|
const segments = parsePointer(pointer);
|
|
19
40
|
if (segments.length === 0)
|
|
@@ -30,6 +51,17 @@ export function setByPointer(model, pointer, value) {
|
|
|
30
51
|
}
|
|
31
52
|
return clone(model, segments, value);
|
|
32
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns a new model with the key at `pointer` removed.
|
|
56
|
+
*
|
|
57
|
+
* Empty string and `/` clear the whole model. Missing parent paths leave the
|
|
58
|
+
* input model unchanged.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* const next = deleteByPointer({ user: { name: 'Ada' } }, '/user/name');
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
33
65
|
export function deleteByPointer(model, pointer) {
|
|
34
66
|
const segments = parsePointer(pointer);
|
|
35
67
|
if (segments.length === 0)
|
package/src/lib/resolve.d.ts
CHANGED
|
@@ -2,5 +2,19 @@ export interface A2uiScope {
|
|
|
2
2
|
basePath: string;
|
|
3
3
|
item: unknown;
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Resolves an A2UI dynamic value against a client data model.
|
|
7
|
+
*
|
|
8
|
+
* Literal wrappers unwrap to their inner values, `{ path }` references read
|
|
9
|
+
* from the model by JSON-pointer path, arrays resolve recursively, and
|
|
10
|
+
* unrecognized plain values pass through unchanged.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const model = { customer: { name: 'Ada' } };
|
|
15
|
+
* resolveDynamic({ path: '/customer/name' }, model); // 'Ada'
|
|
16
|
+
* resolveDynamic({ literalString: 'Checkout' }, model); // 'Checkout'
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
5
19
|
export declare function resolveDynamic(value: unknown, model: Record<string, unknown>, scope?: A2uiScope): unknown;
|
|
6
20
|
//# sourceMappingURL=resolve.d.ts.map
|
package/src/lib/resolve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/resolve.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AA+BD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,CAAC,EAAE,SAAS,GAChB,OAAO,CAeT"}
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../../../libs/a2ui/src/lib/resolve.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AA+BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,CAAC,EAAE,SAAS,GAChB,OAAO,CAeT"}
|
package/src/lib/resolve.js
CHANGED
|
@@ -23,6 +23,20 @@ function resolvePathRef(ref, model, scope) {
|
|
|
23
23
|
return getByPointer(model, `${scope.basePath}/${path}`);
|
|
24
24
|
return getByPointer(model, '/' + path);
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves an A2UI dynamic value against a client data model.
|
|
28
|
+
*
|
|
29
|
+
* Literal wrappers unwrap to their inner values, `{ path }` references read
|
|
30
|
+
* from the model by JSON-pointer path, arrays resolve recursively, and
|
|
31
|
+
* unrecognized plain values pass through unchanged.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const model = { customer: { name: 'Ada' } };
|
|
36
|
+
* resolveDynamic({ path: '/customer/name' }, model); // 'Ada'
|
|
37
|
+
* resolveDynamic({ literalString: 'Checkout' }, model); // 'Checkout'
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
26
40
|
export function resolveDynamic(value, model, scope) {
|
|
27
41
|
if (value == null)
|
|
28
42
|
return value;
|