@ic-reactor/candid 3.0.14-beta.0 → 3.0.14-beta.2
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/dist/metadata-display-reactor.d.ts +66 -11
- package/dist/metadata-display-reactor.d.ts.map +1 -1
- package/dist/metadata-display-reactor.js +48 -12
- package/dist/metadata-display-reactor.js.map +1 -1
- package/dist/visitor/arguments/helpers.d.ts +22 -7
- package/dist/visitor/arguments/helpers.d.ts.map +1 -1
- package/dist/visitor/arguments/helpers.js +39 -5
- package/dist/visitor/arguments/helpers.js.map +1 -1
- package/dist/visitor/arguments/index.d.ts.map +1 -1
- package/dist/visitor/arguments/index.js +26 -34
- package/dist/visitor/arguments/index.js.map +1 -1
- package/dist/visitor/arguments/types.d.ts +120 -132
- package/dist/visitor/arguments/types.d.ts.map +1 -1
- package/dist/visitor/arguments/types.js +25 -1
- package/dist/visitor/arguments/types.js.map +1 -1
- package/dist/visitor/constants.d.ts.map +1 -1
- package/dist/visitor/constants.js +19 -17
- package/dist/visitor/constants.js.map +1 -1
- package/dist/visitor/returns/index.d.ts.map +1 -1
- package/dist/visitor/returns/index.js +24 -13
- package/dist/visitor/returns/index.js.map +1 -1
- package/dist/visitor/returns/types.d.ts +48 -10
- package/dist/visitor/returns/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/metadata-display-reactor.ts +86 -14
- package/src/visitor/arguments/helpers.ts +50 -8
- package/src/visitor/arguments/index.test.ts +105 -61
- package/src/visitor/arguments/index.ts +38 -36
- package/src/visitor/arguments/types.ts +211 -220
- package/src/visitor/constants.ts +24 -15
- package/src/visitor/returns/index.test.ts +30 -30
- package/src/visitor/returns/index.ts +52 -21
- package/src/visitor/returns/types.ts +60 -17
|
@@ -2,7 +2,7 @@ import type { ActorMethodReturnType, BaseActor, FunctionName } from "@ic-reactor
|
|
|
2
2
|
import { CandidDisplayReactor } from "./display-reactor";
|
|
3
3
|
import type { CandidDisplayReactorParameters, DynamicMethodOptions } from "./types";
|
|
4
4
|
import { ArgumentsMeta, ArgumentsServiceMeta } from "./visitor/arguments";
|
|
5
|
-
import { MethodMeta,
|
|
5
|
+
import { MethodMeta, MethodResult, ServiceMeta } from "./visitor/returns";
|
|
6
6
|
/**
|
|
7
7
|
* MetadataDisplayReactor combines visitor-based metadata generation
|
|
8
8
|
* for both input forms and result display.
|
|
@@ -12,13 +12,39 @@ import { MethodMeta, ResolvedMethodResult, ServiceMeta } from "./visitor/returns
|
|
|
12
12
|
* It extends the base Reactor and adds metadata generation capabilities.
|
|
13
13
|
* Unlike DisplayReactor, it does not use a separate codec for transformation.
|
|
14
14
|
* Instead, it uses the metadata visitor to resolve raw values into display-ready structures.
|
|
15
|
+
*
|
|
16
|
+
* ## Usage
|
|
17
|
+
*
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const reactor = new MetadataDisplayReactor({
|
|
20
|
+
* canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
21
|
+
* clientManager,
|
|
22
|
+
* name: "ICPLedger",
|
|
23
|
+
* })
|
|
24
|
+
*
|
|
25
|
+
* await reactor.initialize()
|
|
26
|
+
*
|
|
27
|
+
* // Get form metadata
|
|
28
|
+
* const argMeta = reactor.getInputMeta("icrc1_transfer")
|
|
29
|
+
* console.log(argMeta.args) // Field descriptors
|
|
30
|
+
* console.log(argMeta.defaults) // Default values
|
|
31
|
+
*
|
|
32
|
+
* // Get result metadata
|
|
33
|
+
* const resultMeta = reactor.getOutputMeta("icrc1_transfer")
|
|
34
|
+
*
|
|
35
|
+
* // Call with display types
|
|
36
|
+
* const result = await reactor.callMethod({
|
|
37
|
+
* functionName: "icrc1_transfer",
|
|
38
|
+
* args: [{ to: { owner: "aaaaa-aa" }, amount: "1000000" }]
|
|
39
|
+
* })
|
|
40
|
+
* ```
|
|
15
41
|
*/
|
|
16
42
|
declare module "@ic-reactor/core" {
|
|
17
43
|
interface TransformArgsRegistry<T> {
|
|
18
44
|
metadata: TransformArgsRegistry<T>["display"];
|
|
19
45
|
}
|
|
20
46
|
interface TransformReturnRegistry<T, A = BaseActor> {
|
|
21
|
-
metadata:
|
|
47
|
+
metadata: MethodResult<A>;
|
|
22
48
|
}
|
|
23
49
|
}
|
|
24
50
|
export declare class MetadataDisplayReactor<A = BaseActor> extends CandidDisplayReactor<A, "metadata"> {
|
|
@@ -37,31 +63,40 @@ export declare class MetadataDisplayReactor<A = BaseActor> extends CandidDisplay
|
|
|
37
63
|
*/
|
|
38
64
|
private generateMetadata;
|
|
39
65
|
/**
|
|
40
|
-
* Get
|
|
66
|
+
* Get input field metadata for a method.
|
|
41
67
|
* Use this to generate input forms.
|
|
68
|
+
*
|
|
69
|
+
* @param methodName The method name to get metadata for
|
|
70
|
+
* @returns ArgumentsMeta containing args, defaults, and validation schema
|
|
42
71
|
*/
|
|
43
|
-
|
|
72
|
+
getInputMeta<M extends FunctionName<A>>(methodName: M): ArgumentsMeta<A, M> | undefined;
|
|
44
73
|
/**
|
|
45
|
-
* Get
|
|
74
|
+
* Get output field metadata for a method.
|
|
46
75
|
* Use this to render results.
|
|
76
|
+
*
|
|
77
|
+
* @param methodName The method name to get metadata for
|
|
78
|
+
* @returns MethodMeta containing return schema and resolve function
|
|
47
79
|
*/
|
|
48
|
-
|
|
80
|
+
getOutputMeta<M extends FunctionName<A>>(methodName: M): MethodMeta<A, M> | undefined;
|
|
49
81
|
/**
|
|
50
|
-
* Get all
|
|
82
|
+
* Get all input metadata for all methods.
|
|
51
83
|
*/
|
|
52
|
-
|
|
84
|
+
getAllInputMeta(): ArgumentsServiceMeta<A> | null;
|
|
53
85
|
/**
|
|
54
|
-
* Get all
|
|
86
|
+
* Get all output metadata for all methods.
|
|
55
87
|
*/
|
|
56
|
-
|
|
88
|
+
getAllOutputMeta(): ServiceMeta<A> | null;
|
|
57
89
|
/**
|
|
58
90
|
* Register a dynamic method by its Candid signature.
|
|
59
91
|
* After registration, all DisplayReactor methods work with display type transformations.
|
|
60
92
|
*/
|
|
61
93
|
registerMethod(options: DynamicMethodOptions): Promise<void>;
|
|
62
|
-
protected transformResult<M extends FunctionName<A>>(methodName: M, result: ActorMethodReturnType<A[M]>):
|
|
94
|
+
protected transformResult<M extends FunctionName<A>>(methodName: M, result: ActorMethodReturnType<A[M]>): MethodResult<A>;
|
|
63
95
|
/**
|
|
64
96
|
* Perform a dynamic call and return result with metadata.
|
|
97
|
+
*
|
|
98
|
+
* @param options Method registration and call options
|
|
99
|
+
* @returns Object containing the result and metadata
|
|
65
100
|
*/
|
|
66
101
|
callDynamicWithMeta<T = unknown>(options: DynamicMethodOptions & {
|
|
67
102
|
args?: unknown[];
|
|
@@ -70,4 +105,24 @@ export declare class MetadataDisplayReactor<A = BaseActor> extends CandidDisplay
|
|
|
70
105
|
meta: MethodMeta<A>;
|
|
71
106
|
}>;
|
|
72
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Create and initialize a MetadataDisplayReactor.
|
|
110
|
+
* This is a convenience function that creates the reactor and calls initialize().
|
|
111
|
+
*
|
|
112
|
+
* @param options Reactor configuration options
|
|
113
|
+
* @returns Initialized MetadataDisplayReactor
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* const reactor = await createMetadataReactor({
|
|
118
|
+
* canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
119
|
+
* clientManager,
|
|
120
|
+
* name: "ICPLedger",
|
|
121
|
+
* })
|
|
122
|
+
*
|
|
123
|
+
* // Reactor is ready to use
|
|
124
|
+
* const methods = reactor.getMethodNames()
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function createMetadataReactor<A = BaseActor>(options: CandidDisplayReactorParameters<A>): Promise<MetadataDisplayReactor<A>>;
|
|
73
128
|
//# sourceMappingURL=metadata-display-reactor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-display-reactor.d.ts","sourceRoot":"","sources":["../src/metadata-display-reactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,SAAS,EACT,YAAY,EACb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EACV,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAChB,OAAO,EAEL,aAAa,EACb,oBAAoB,
|
|
1
|
+
{"version":3,"file":"metadata-display-reactor.d.ts","sourceRoot":"","sources":["../src/metadata-display-reactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,SAAS,EACT,YAAY,EACb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EACV,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAChB,OAAO,EAEL,aAAa,EACb,oBAAoB,EAErB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,UAAU,EACV,YAAY,EAEZ,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAM1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,QAAQ,kBAAkB,CAAC;IAChC,UAAU,qBAAqB,CAAC,CAAC;QAC/B,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;KAC9C;IACD,UAAU,uBAAuB,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS;QAChD,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;KAC1B;CACF;AAED,qBAAa,sBAAsB,CAAC,CAAC,GAAG,SAAS,CAAE,SAAQ,oBAAoB,CAC7E,CAAC,EACD,UAAU,CACX;IACC,SAAyB,SAAS,EAAG,UAAU,CAAS;IAGxD,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAA8B;IAGhD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqB;IAC9C,OAAO,CAAC,MAAM,CAAC,aAAa,CAA2B;gBAE3C,MAAM,EAAE,8BAA8B,CAAC,CAAC,CAAC;IAQrD;;OAEG;IACmB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;;;;OAMG;IACI,YAAY,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC3C,UAAU,EAAE,CAAC,GACZ,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIlC;;;;;;OAMG;IACI,aAAa,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC5C,UAAU,EAAE,CAAC,GACZ,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAI/B;;OAEG;IACI,eAAe,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIxD;;OAEG;IACI,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAOhD;;;OAGG;IACmB,cAAc,CAClC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC;cAUG,eAAe,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC1D,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAClC,YAAY,CAAC,CAAC,CAAC;IAclB;;;;;OAKG;IACU,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAC1C,OAAO,EAAE,oBAAoB,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GACnD,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC;CAY/C;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,GAAG,SAAS,EACvD,OAAO,EAAE,8BAA8B,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAIpC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CandidDisplayReactor } from "./display-reactor";
|
|
2
|
-
import { FieldVisitor, } from "./visitor/arguments";
|
|
2
|
+
import { FieldVisitor, MetadataError, } from "./visitor/arguments";
|
|
3
3
|
import { ResultFieldVisitor, } from "./visitor/returns";
|
|
4
4
|
export class MetadataDisplayReactor extends CandidDisplayReactor {
|
|
5
5
|
constructor(config) {
|
|
@@ -51,29 +51,35 @@ export class MetadataDisplayReactor extends CandidDisplayReactor {
|
|
|
51
51
|
// METADATA ACCESS
|
|
52
52
|
// ══════════════════════════════════════════════════════════════════════════
|
|
53
53
|
/**
|
|
54
|
-
* Get
|
|
54
|
+
* Get input field metadata for a method.
|
|
55
55
|
* Use this to generate input forms.
|
|
56
|
+
*
|
|
57
|
+
* @param methodName The method name to get metadata for
|
|
58
|
+
* @returns ArgumentsMeta containing args, defaults, and validation schema
|
|
56
59
|
*/
|
|
57
|
-
|
|
60
|
+
getInputMeta(methodName) {
|
|
58
61
|
return this.argumentMeta?.[methodName];
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
61
|
-
* Get
|
|
64
|
+
* Get output field metadata for a method.
|
|
62
65
|
* Use this to render results.
|
|
66
|
+
*
|
|
67
|
+
* @param methodName The method name to get metadata for
|
|
68
|
+
* @returns MethodMeta containing return schema and resolve function
|
|
63
69
|
*/
|
|
64
|
-
|
|
70
|
+
getOutputMeta(methodName) {
|
|
65
71
|
return this.resultMeta?.[methodName];
|
|
66
72
|
}
|
|
67
73
|
/**
|
|
68
|
-
* Get all
|
|
74
|
+
* Get all input metadata for all methods.
|
|
69
75
|
*/
|
|
70
|
-
|
|
76
|
+
getAllInputMeta() {
|
|
71
77
|
return this.argumentMeta;
|
|
72
78
|
}
|
|
73
79
|
/**
|
|
74
|
-
* Get all
|
|
80
|
+
* Get all output metadata for all methods.
|
|
75
81
|
*/
|
|
76
|
-
|
|
82
|
+
getAllOutputMeta() {
|
|
77
83
|
return this.resultMeta;
|
|
78
84
|
}
|
|
79
85
|
// ══════════════════════════════════════════════════════════════════════════
|
|
@@ -93,14 +99,17 @@ export class MetadataDisplayReactor extends CandidDisplayReactor {
|
|
|
93
99
|
// ══════════════════════════════════════════════════════════════════════════
|
|
94
100
|
transformResult(methodName, result) {
|
|
95
101
|
// Get metadata and generate resolved result
|
|
96
|
-
const meta = this.
|
|
102
|
+
const meta = this.getOutputMeta(methodName);
|
|
97
103
|
if (!meta) {
|
|
98
|
-
throw new
|
|
104
|
+
throw new MetadataError(`No output metadata found for method`, String(methodName), "method");
|
|
99
105
|
}
|
|
100
106
|
return meta.resolve(result);
|
|
101
107
|
}
|
|
102
108
|
/**
|
|
103
109
|
* Perform a dynamic call and return result with metadata.
|
|
110
|
+
*
|
|
111
|
+
* @param options Method registration and call options
|
|
112
|
+
* @returns Object containing the result and metadata
|
|
104
113
|
*/
|
|
105
114
|
async callDynamicWithMeta(options) {
|
|
106
115
|
await this.registerMethod(options);
|
|
@@ -108,7 +117,7 @@ export class MetadataDisplayReactor extends CandidDisplayReactor {
|
|
|
108
117
|
functionName: options.functionName,
|
|
109
118
|
args: options.args,
|
|
110
119
|
}));
|
|
111
|
-
const meta = this.
|
|
120
|
+
const meta = this.getOutputMeta(options.functionName);
|
|
112
121
|
return { result, meta };
|
|
113
122
|
}
|
|
114
123
|
}
|
|
@@ -125,4 +134,31 @@ Object.defineProperty(MetadataDisplayReactor, "resultVisitor", {
|
|
|
125
134
|
writable: true,
|
|
126
135
|
value: new ResultFieldVisitor()
|
|
127
136
|
});
|
|
137
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
138
|
+
// Factory Function
|
|
139
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
140
|
+
/**
|
|
141
|
+
* Create and initialize a MetadataDisplayReactor.
|
|
142
|
+
* This is a convenience function that creates the reactor and calls initialize().
|
|
143
|
+
*
|
|
144
|
+
* @param options Reactor configuration options
|
|
145
|
+
* @returns Initialized MetadataDisplayReactor
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* const reactor = await createMetadataReactor({
|
|
150
|
+
* canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai",
|
|
151
|
+
* clientManager,
|
|
152
|
+
* name: "ICPLedger",
|
|
153
|
+
* })
|
|
154
|
+
*
|
|
155
|
+
* // Reactor is ready to use
|
|
156
|
+
* const methods = reactor.getMethodNames()
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export async function createMetadataReactor(options) {
|
|
160
|
+
const reactor = new MetadataDisplayReactor(options);
|
|
161
|
+
await reactor.initialize();
|
|
162
|
+
return reactor;
|
|
163
|
+
}
|
|
128
164
|
//# sourceMappingURL=metadata-display-reactor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-display-reactor.js","sourceRoot":"","sources":["../src/metadata-display-reactor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAKxD,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"metadata-display-reactor.js","sourceRoot":"","sources":["../src/metadata-display-reactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { VisitorDataType, CompoundField, FieldNode, FieldByType, PrimitiveField, RecordField, TupleField, VariantField } from "./types";
|
|
2
2
|
/**
|
|
3
3
|
* Type guard for checking specific field types.
|
|
4
4
|
*
|
|
5
5
|
* @example
|
|
6
6
|
* ```tsx
|
|
7
|
-
* function FieldInput({ field }: { field:
|
|
7
|
+
* function FieldInput({ field }: { field: FieldNode }) {
|
|
8
8
|
* if (isFieldType(field, 'record')) {
|
|
9
9
|
* // field is now typed as RecordField
|
|
10
10
|
* return <RecordInput field={field} />
|
|
@@ -17,13 +17,27 @@ import { ArgumentFieldType, CompoundField, FieldNode, FieldByType, PrimitiveFiel
|
|
|
17
17
|
* }
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
|
-
export declare function isFieldType<T extends
|
|
21
|
-
/**
|
|
20
|
+
export declare function isFieldType<T extends VisitorDataType>(field: FieldNode, type: T): field is FieldByType<T>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a field is a compound type (contains other fields).
|
|
23
|
+
* Compound types: record, variant, tuple, optional, vector, recursive
|
|
24
|
+
*/
|
|
22
25
|
export declare function isCompoundField(field: FieldNode): field is CompoundField;
|
|
23
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* Check if a field is a primitive type.
|
|
28
|
+
* Primitive types: principal, number, text, boolean, null
|
|
29
|
+
*/
|
|
24
30
|
export declare function isPrimitiveField(field: FieldNode): field is PrimitiveField;
|
|
25
|
-
/**
|
|
26
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Check if a field has child fields array (for iteration).
|
|
33
|
+
* Applies to: record (fields), tuple (fields)
|
|
34
|
+
*/
|
|
35
|
+
export declare function hasChildFields(field: FieldNode): field is RecordField | TupleField;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a field has variant options (for iteration).
|
|
38
|
+
* Applies to: variant (options)
|
|
39
|
+
*/
|
|
40
|
+
export declare function hasOptions(field: FieldNode): field is VariantField;
|
|
27
41
|
/**
|
|
28
42
|
* Format a raw Candid label into a human-readable display label.
|
|
29
43
|
* Handles common patterns like "__arg0", "_0_", "snake_case", etc.
|
|
@@ -34,6 +48,7 @@ export declare function hasChildFields(field: FieldNode): field is RecordField |
|
|
|
34
48
|
* formatLabel("_0_") // "Item 0"
|
|
35
49
|
* formatLabel("created_at") // "Created At"
|
|
36
50
|
* formatLabel("userAddress") // "User Address"
|
|
51
|
+
* formatLabel("__ret0") // "Result 0"
|
|
37
52
|
* ```
|
|
38
53
|
*/
|
|
39
54
|
export declare function formatLabel(label: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,YAAY,EACb,MAAM,SAAS,CAAA;AAMhB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,EACnD,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,CAAC,GACN,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,aAAa,CASxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,cAAc,CAE1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,GACf,KAAK,IAAI,WAAW,GAAG,UAAU,CAMnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,YAAY,CAMlE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuCjD"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// Type Guards
|
|
3
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
1
4
|
/**
|
|
2
5
|
* Type guard for checking specific field types.
|
|
3
6
|
*
|
|
4
7
|
* @example
|
|
5
8
|
* ```tsx
|
|
6
|
-
* function FieldInput({ field }: { field:
|
|
9
|
+
* function FieldInput({ field }: { field: FieldNode }) {
|
|
7
10
|
* if (isFieldType(field, 'record')) {
|
|
8
11
|
* // field is now typed as RecordField
|
|
9
12
|
* return <RecordInput field={field} />
|
|
@@ -19,7 +22,10 @@
|
|
|
19
22
|
export function isFieldType(field, type) {
|
|
20
23
|
return field.type === type;
|
|
21
24
|
}
|
|
22
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Check if a field is a compound type (contains other fields).
|
|
27
|
+
* Compound types: record, variant, tuple, optional, vector, recursive
|
|
28
|
+
*/
|
|
23
29
|
export function isCompoundField(field) {
|
|
24
30
|
return [
|
|
25
31
|
"record",
|
|
@@ -30,13 +36,30 @@ export function isCompoundField(field) {
|
|
|
30
36
|
"recursive",
|
|
31
37
|
].includes(field.type);
|
|
32
38
|
}
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Check if a field is a primitive type.
|
|
41
|
+
* Primitive types: principal, number, text, boolean, null
|
|
42
|
+
*/
|
|
34
43
|
export function isPrimitiveField(field) {
|
|
35
44
|
return ["principal", "number", "text", "boolean", "null"].includes(field.type);
|
|
36
45
|
}
|
|
37
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Check if a field has child fields array (for iteration).
|
|
48
|
+
* Applies to: record (fields), tuple (fields)
|
|
49
|
+
*/
|
|
38
50
|
export function hasChildFields(field) {
|
|
39
|
-
return "
|
|
51
|
+
return ((field.type === "record" || field.type === "tuple") &&
|
|
52
|
+
"fields" in field &&
|
|
53
|
+
Array.isArray(field.fields));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if a field has variant options (for iteration).
|
|
57
|
+
* Applies to: variant (options)
|
|
58
|
+
*/
|
|
59
|
+
export function hasOptions(field) {
|
|
60
|
+
return (field.type === "variant" &&
|
|
61
|
+
"options" in field &&
|
|
62
|
+
Array.isArray(field.options));
|
|
40
63
|
}
|
|
41
64
|
// ════════════════════════════════════════════════════════════════════════════
|
|
42
65
|
// Label Formatting Utilities
|
|
@@ -51,6 +74,7 @@ export function hasChildFields(field) {
|
|
|
51
74
|
* formatLabel("_0_") // "Item 0"
|
|
52
75
|
* formatLabel("created_at") // "Created At"
|
|
53
76
|
* formatLabel("userAddress") // "User Address"
|
|
77
|
+
* formatLabel("__ret0") // "Result 0"
|
|
54
78
|
* ```
|
|
55
79
|
*/
|
|
56
80
|
export function formatLabel(label) {
|
|
@@ -59,11 +83,21 @@ export function formatLabel(label) {
|
|
|
59
83
|
const num = label.slice(5);
|
|
60
84
|
return `Arg ${num}`;
|
|
61
85
|
}
|
|
86
|
+
// Handle return labels: __ret0 -> Result 0
|
|
87
|
+
if (label.startsWith("__ret")) {
|
|
88
|
+
const num = label.slice(5);
|
|
89
|
+
return `Result ${num}`;
|
|
90
|
+
}
|
|
62
91
|
// Handle tuple index labels: _0_ -> Item 0
|
|
63
92
|
if (/^_\d+_$/.test(label)) {
|
|
64
93
|
const num = label.slice(1, -1);
|
|
65
94
|
return `Item ${num}`;
|
|
66
95
|
}
|
|
96
|
+
// Handle simple index labels: _0 -> Item 0
|
|
97
|
+
if (/^_\d+$/.test(label)) {
|
|
98
|
+
const num = label.slice(1);
|
|
99
|
+
return `Item ${num}`;
|
|
100
|
+
}
|
|
67
101
|
// Handle item labels for vectors: label_item -> Item
|
|
68
102
|
if (label.endsWith("_item")) {
|
|
69
103
|
return "Item";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CACzB,KAAgB,EAChB,IAAO;IAEP,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isQuery } from "../helpers";
|
|
2
2
|
import { checkTextFormat, checkNumberFormat } from "../constants";
|
|
3
|
+
import { MetadataError } from "./types";
|
|
3
4
|
import { IDL } from "@icp-sdk/core/candid";
|
|
4
5
|
import { Principal } from "@icp-sdk/core/principal";
|
|
5
6
|
import * as z from "zod";
|
|
@@ -183,24 +184,24 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
183
184
|
visitFunc(t, functionName) {
|
|
184
185
|
const functionType = isQuery(t) ? "query" : "update";
|
|
185
186
|
const argCount = t.argTypes.length;
|
|
186
|
-
const
|
|
187
|
+
const args = t.argTypes.map((arg, index) => {
|
|
187
188
|
return this.withName(`[${index}]`, () => arg.accept(this, `__arg${index}`));
|
|
188
189
|
});
|
|
189
|
-
const
|
|
190
|
+
const defaults = args.map((field) => field.defaultValue);
|
|
190
191
|
// Handle empty args case for schema
|
|
191
192
|
// For no-arg functions, use an empty array schema
|
|
192
193
|
// For functions with args, use a proper tuple schema
|
|
193
194
|
const schema = argCount === 0
|
|
194
195
|
? z.tuple([])
|
|
195
|
-
: z.tuple(
|
|
196
|
+
: z.tuple(args.map((field) => field.schema));
|
|
196
197
|
return {
|
|
197
198
|
functionType,
|
|
198
199
|
functionName,
|
|
199
|
-
|
|
200
|
-
|
|
200
|
+
args,
|
|
201
|
+
defaults,
|
|
201
202
|
schema,
|
|
202
203
|
argCount,
|
|
203
|
-
|
|
204
|
+
isEmpty: argCount === 0,
|
|
204
205
|
};
|
|
205
206
|
}
|
|
206
207
|
// ════════════════════════════════════════════════════════════════════════
|
|
@@ -209,13 +210,11 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
209
210
|
visitRecord(_t, fields_, label) {
|
|
210
211
|
const name = this.currentName();
|
|
211
212
|
const fields = [];
|
|
212
|
-
const fieldMap = new Map();
|
|
213
213
|
const defaultValue = {};
|
|
214
214
|
const schemaShape = {};
|
|
215
215
|
for (const [key, type] of fields_) {
|
|
216
216
|
const field = this.withName(name ? `.${key}` : key, () => type.accept(this, key));
|
|
217
217
|
fields.push(field);
|
|
218
|
-
fieldMap.set(key, field);
|
|
219
218
|
defaultValue[key] = field.defaultValue;
|
|
220
219
|
schemaShape[key] = field.schema;
|
|
221
220
|
}
|
|
@@ -228,7 +227,6 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
228
227
|
component: "record-container",
|
|
229
228
|
renderHint: COMPOUND_RENDER_HINT,
|
|
230
229
|
fields,
|
|
231
|
-
fieldMap,
|
|
232
230
|
defaultValue,
|
|
233
231
|
schema,
|
|
234
232
|
candidType: "record",
|
|
@@ -236,15 +234,11 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
236
234
|
}
|
|
237
235
|
visitVariant(_t, fields_, label) {
|
|
238
236
|
const name = this.currentName();
|
|
239
|
-
const fields = [];
|
|
240
237
|
const options = [];
|
|
241
|
-
const optionMap = new Map();
|
|
242
238
|
const variantSchemas = [];
|
|
243
239
|
for (const [key, type] of fields_) {
|
|
244
240
|
const field = this.withName(`.${key}`, () => type.accept(this, key));
|
|
245
|
-
|
|
246
|
-
options.push(key);
|
|
247
|
-
optionMap.set(key, field);
|
|
241
|
+
options.push(field);
|
|
248
242
|
if (field.type === "null") {
|
|
249
243
|
variantSchemas.push(z.object({ _type: z.literal(key) }));
|
|
250
244
|
}
|
|
@@ -255,45 +249,45 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
255
249
|
}));
|
|
256
250
|
}
|
|
257
251
|
}
|
|
258
|
-
const
|
|
259
|
-
const
|
|
260
|
-
const defaultValue =
|
|
252
|
+
const firstOption = options[0];
|
|
253
|
+
const defaultOption = firstOption.label;
|
|
254
|
+
const defaultValue = firstOption.type === "null"
|
|
261
255
|
? { _type: defaultOption }
|
|
262
256
|
: {
|
|
263
257
|
_type: defaultOption,
|
|
264
|
-
[defaultOption]:
|
|
258
|
+
[defaultOption]: firstOption.defaultValue,
|
|
265
259
|
};
|
|
266
260
|
const schema = z.union(variantSchemas);
|
|
267
261
|
// Helper to get default value for any option
|
|
268
262
|
const getOptionDefault = (option) => {
|
|
269
|
-
const optField =
|
|
263
|
+
const optField = options.find((f) => f.label === option);
|
|
270
264
|
if (!optField) {
|
|
271
|
-
throw new
|
|
265
|
+
throw new MetadataError(`Unknown variant option: "${option}". Available: ${options.map((o) => o.label).join(", ")}`, name, "variant");
|
|
272
266
|
}
|
|
273
267
|
return optField.type === "null"
|
|
274
268
|
? { _type: option }
|
|
275
269
|
: { _type: option, [option]: optField.defaultValue };
|
|
276
270
|
};
|
|
277
271
|
// Helper to get field for a specific option
|
|
278
|
-
const
|
|
279
|
-
const optField =
|
|
272
|
+
const getOption = (option) => {
|
|
273
|
+
const optField = options.find((f) => f.label === option);
|
|
280
274
|
if (!optField) {
|
|
281
|
-
throw new
|
|
275
|
+
throw new MetadataError(`Unknown variant option: "${option}". Available: ${options.map((o) => o.label).join(", ")}`, name, "variant");
|
|
282
276
|
}
|
|
283
277
|
return optField;
|
|
284
278
|
};
|
|
285
|
-
// Helper to get currently selected option from a value
|
|
286
|
-
const
|
|
279
|
+
// Helper to get currently selected option key from a value
|
|
280
|
+
const getSelectedKey = (value) => {
|
|
287
281
|
if (value._type && typeof value._type === "string") {
|
|
288
282
|
return value._type;
|
|
289
283
|
}
|
|
290
|
-
const validKeys = Object.keys(value).filter((k) => options.
|
|
284
|
+
const validKeys = Object.keys(value).filter((k) => options.some((f) => f.label === k));
|
|
291
285
|
return validKeys[0] ?? defaultOption;
|
|
292
286
|
};
|
|
293
|
-
// Helper to get
|
|
294
|
-
const
|
|
295
|
-
const
|
|
296
|
-
return
|
|
287
|
+
// Helper to get the field for the currently selected option
|
|
288
|
+
const getSelectedOption = (value) => {
|
|
289
|
+
const selectedKey = getSelectedKey(value);
|
|
290
|
+
return getOption(selectedKey);
|
|
297
291
|
};
|
|
298
292
|
return {
|
|
299
293
|
type: "variant",
|
|
@@ -302,16 +296,14 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
302
296
|
name,
|
|
303
297
|
component: "variant-select",
|
|
304
298
|
renderHint: COMPOUND_RENDER_HINT,
|
|
305
|
-
fields,
|
|
306
299
|
options,
|
|
307
300
|
defaultOption,
|
|
308
|
-
optionMap,
|
|
309
301
|
defaultValue,
|
|
310
302
|
schema,
|
|
311
303
|
getOptionDefault,
|
|
312
|
-
|
|
304
|
+
getOption,
|
|
305
|
+
getSelectedKey,
|
|
313
306
|
getSelectedOption,
|
|
314
|
-
getSelectedField,
|
|
315
307
|
candidType: "variant",
|
|
316
308
|
};
|
|
317
309
|
}
|