@ic-reactor/candid 3.0.14-beta.1 → 3.0.14-beta.3
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 +20 -5
- 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 +28 -27
- package/dist/visitor/arguments/index.js.map +1 -1
- package/dist/visitor/arguments/types.d.ts +102 -18
- 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/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 +94 -21
- 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 +48 -6
- package/src/visitor/arguments/index.test.ts +55 -55
- package/src/visitor/arguments/index.ts +36 -27
- package/src/visitor/arguments/schema.test.ts +3 -4
- package/src/visitor/arguments/types.ts +113 -21
- package/src/visitor/returns/index.test.ts +29 -29
- package/src/visitor/returns/index.ts +52 -21
- package/src/visitor/returns/types.ts +156 -35
|
@@ -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":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAKxD,OAAO,EACL,YAAY,EAGZ,aAAa,GACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAGL,kBAAkB,GAEnB,MAAM,mBAAmB,CAAA;AAmD1B,MAAM,OAAO,sBAAsC,SAAQ,oBAG1D;IAWC,YAAY,MAAyC;QACnD,KAAK,CAAC,MAAM,CAAC,CAAA;QAXU;;;;mBAAY,UAAmB;WAAA;QAExD,mBAAmB;QACX;;;;mBAA+C,IAAI;WAAA;QACnD;;;;mBAAoC,IAAI;WAAA;IAQhD,CAAC;IAED,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E;;OAEG;IACa,KAAK,CAAC,UAAU;QAC9B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,mCAAmC;QACnC,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,6BAA6B;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAChC,sBAAsB,CAAC,UAAU,EACjC,IAAW,CACe,CAAA;QAE5B,2BAA2B;QAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAC9B,sBAAsB,CAAC,aAAa,EACpC,IAAW,CACM,CAAA;IACrB,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E;;;;;;OAMG;IACI,YAAY,CACjB,UAAa;QAEb,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC;IAED;;;;;;OAMG;IACI,aAAa,CAClB,UAAa;QAEb,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;OAEG;IACI,gBAAgB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,6EAA6E;IAC7E,8BAA8B;IAC9B,6EAA6E;IAC7E;;;OAGG;IACa,KAAK,CAAC,cAAc,CAClC,OAA6B;QAE7B,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAEnC,sBAAsB;QACtB,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED,6EAA6E;IAC7E,yBAAyB;IACzB,6EAA6E;IAC1D,eAAe,CAChC,UAAa,EACb,MAAmC;QAEnC,4CAA4C;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,aAAa,CACrB,qCAAqC,EACrC,MAAM,CAAC,UAAU,CAAC,EAClB,QAAQ,CACT,CAAA;QACH,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,mBAAmB,CAC9B,OAAoD;QAEpD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAElC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC;YACpC,YAAY,EAAE,OAAO,CAAC,YAAmB;YACzC,IAAI,EAAE,OAAO,CAAC,IAAW;SAC1B,CAAC,CAAM,CAAA;QAER,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,YAAmB,CAAE,CAAA;QAE7D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACzB,CAAC;;AA7ID,sCAAsC;AACvB;;;;WAAa,IAAI,YAAY,EAAE;EAArB,CAAqB;AAC/B;;;;WAAgB,IAAI,kBAAkB,EAAE;EAA3B,CAA2B;AA8IzD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAI,OAAO,CAAC,CAAA;IACtD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;IAC1B,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { VisitorDataType, CompoundField, FieldNode, FieldByType, PrimitiveField,
|
|
|
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} />
|
|
@@ -18,12 +18,26 @@ import { VisitorDataType, CompoundField, FieldNode, FieldByType, PrimitiveField,
|
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
export declare function isFieldType<T extends VisitorDataType>(field: FieldNode, type: T): field is FieldByType<T>;
|
|
21
|
-
/**
|
|
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,eAAe,EACf,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,YAAY,EACb,MAAM,SAAS,CAAA;
|
|
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
|
// ════════════════════════════════════════════════════════════════════════
|
|
@@ -233,11 +234,11 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
233
234
|
}
|
|
234
235
|
visitVariant(_t, fields_, label) {
|
|
235
236
|
const name = this.currentName();
|
|
236
|
-
const
|
|
237
|
+
const options = [];
|
|
237
238
|
const variantSchemas = [];
|
|
238
239
|
for (const [key, type] of fields_) {
|
|
239
240
|
const field = this.withName(`.${key}`, () => type.accept(this, key));
|
|
240
|
-
|
|
241
|
+
options.push(field);
|
|
241
242
|
if (field.type === "null") {
|
|
242
243
|
variantSchemas.push(z.object({ _type: z.literal(key) }));
|
|
243
244
|
}
|
|
@@ -248,45 +249,45 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
248
249
|
}));
|
|
249
250
|
}
|
|
250
251
|
}
|
|
251
|
-
const
|
|
252
|
-
const defaultOption =
|
|
253
|
-
const defaultValue =
|
|
252
|
+
const firstOption = options[0];
|
|
253
|
+
const defaultOption = firstOption.label;
|
|
254
|
+
const defaultValue = firstOption.type === "null"
|
|
254
255
|
? { _type: defaultOption }
|
|
255
256
|
: {
|
|
256
257
|
_type: defaultOption,
|
|
257
|
-
[defaultOption]:
|
|
258
|
+
[defaultOption]: firstOption.defaultValue,
|
|
258
259
|
};
|
|
259
260
|
const schema = z.union(variantSchemas);
|
|
260
261
|
// Helper to get default value for any option
|
|
261
262
|
const getOptionDefault = (option) => {
|
|
262
|
-
const optField =
|
|
263
|
+
const optField = options.find((f) => f.label === option);
|
|
263
264
|
if (!optField) {
|
|
264
|
-
throw new
|
|
265
|
+
throw new MetadataError(`Unknown variant option: "${option}". Available: ${options.map((o) => o.label).join(", ")}`, name, "variant");
|
|
265
266
|
}
|
|
266
267
|
return optField.type === "null"
|
|
267
268
|
? { _type: option }
|
|
268
269
|
: { _type: option, [option]: optField.defaultValue };
|
|
269
270
|
};
|
|
270
271
|
// Helper to get field for a specific option
|
|
271
|
-
const
|
|
272
|
-
const optField =
|
|
272
|
+
const getOption = (option) => {
|
|
273
|
+
const optField = options.find((f) => f.label === option);
|
|
273
274
|
if (!optField) {
|
|
274
|
-
throw new
|
|
275
|
+
throw new MetadataError(`Unknown variant option: "${option}". Available: ${options.map((o) => o.label).join(", ")}`, name, "variant");
|
|
275
276
|
}
|
|
276
277
|
return optField;
|
|
277
278
|
};
|
|
278
|
-
// Helper to get currently selected option from a value
|
|
279
|
-
const
|
|
279
|
+
// Helper to get currently selected option key from a value
|
|
280
|
+
const getSelectedKey = (value) => {
|
|
280
281
|
if (value._type && typeof value._type === "string") {
|
|
281
282
|
return value._type;
|
|
282
283
|
}
|
|
283
|
-
const validKeys = Object.keys(value).filter((k) =>
|
|
284
|
+
const validKeys = Object.keys(value).filter((k) => options.some((f) => f.label === k));
|
|
284
285
|
return validKeys[0] ?? defaultOption;
|
|
285
286
|
};
|
|
286
|
-
// Helper to get
|
|
287
|
-
const
|
|
288
|
-
const
|
|
289
|
-
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);
|
|
290
291
|
};
|
|
291
292
|
return {
|
|
292
293
|
type: "variant",
|
|
@@ -295,14 +296,14 @@ export class FieldVisitor extends IDL.Visitor {
|
|
|
295
296
|
name,
|
|
296
297
|
component: "variant-select",
|
|
297
298
|
renderHint: COMPOUND_RENDER_HINT,
|
|
298
|
-
|
|
299
|
+
options,
|
|
299
300
|
defaultOption,
|
|
300
301
|
defaultValue,
|
|
301
302
|
schema,
|
|
302
303
|
getOptionDefault,
|
|
303
|
-
|
|
304
|
+
getOption,
|
|
305
|
+
getSelectedKey,
|
|
304
306
|
getSelectedOption,
|
|
305
|
-
getSelectedField,
|
|
306
307
|
candidType: "variant",
|
|
307
308
|
};
|
|
308
309
|
}
|