@ic-reactor/candid 3.0.7-beta.2 → 3.0.8-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/display-reactor.d.ts +3 -2
- package/dist/display-reactor.d.ts.map +1 -1
- package/dist/display-reactor.js +6 -0
- package/dist/display-reactor.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/metadata-display-reactor.d.ts +73 -0
- package/dist/metadata-display-reactor.d.ts.map +1 -0
- package/dist/metadata-display-reactor.js +128 -0
- package/dist/metadata-display-reactor.js.map +1 -0
- package/dist/visitor/arguments/index.d.ts +69 -0
- package/dist/visitor/arguments/index.d.ts.map +1 -0
- package/dist/visitor/arguments/index.js +277 -0
- package/dist/visitor/arguments/index.js.map +1 -0
- package/dist/visitor/arguments/types.d.ts +92 -0
- package/dist/visitor/arguments/types.d.ts.map +1 -0
- package/dist/visitor/arguments/types.js +2 -0
- package/dist/visitor/arguments/types.js.map +1 -0
- package/dist/visitor/constants.d.ts +4 -0
- package/dist/visitor/constants.d.ts.map +1 -0
- package/dist/visitor/constants.js +61 -0
- package/dist/visitor/constants.js.map +1 -0
- package/dist/visitor/helpers.d.ts +30 -0
- package/dist/visitor/helpers.d.ts.map +1 -0
- package/dist/visitor/helpers.js +200 -0
- package/dist/visitor/helpers.js.map +1 -0
- package/dist/visitor/returns/index.d.ts +76 -0
- package/dist/visitor/returns/index.d.ts.map +1 -0
- package/dist/visitor/returns/index.js +426 -0
- package/dist/visitor/returns/index.js.map +1 -0
- package/dist/visitor/returns/types.d.ts +143 -0
- package/dist/visitor/returns/types.d.ts.map +1 -0
- package/dist/visitor/returns/types.js +2 -0
- package/dist/visitor/returns/types.js.map +1 -0
- package/dist/visitor/types.d.ts +6 -0
- package/dist/visitor/types.d.ts.map +1 -0
- package/dist/visitor/types.js +3 -0
- package/dist/visitor/types.js.map +1 -0
- package/package.json +3 -2
- package/src/display-reactor.ts +10 -2
- package/src/index.ts +1 -0
- package/src/metadata-display-reactor.ts +184 -0
- package/src/visitor/arguments/index.test.ts +882 -0
- package/src/visitor/arguments/index.ts +405 -0
- package/src/visitor/arguments/types.ts +168 -0
- package/src/visitor/constants.ts +62 -0
- package/src/visitor/helpers.ts +221 -0
- package/src/visitor/returns/index.test.ts +2027 -0
- package/src/visitor/returns/index.ts +553 -0
- package/src/visitor/returns/types.ts +272 -0
- package/src/visitor/types.ts +29 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BaseActor } from "@ic-reactor/core";
|
|
1
|
+
import type { BaseActor, TransformKey } from "@ic-reactor/core";
|
|
2
2
|
import type { CandidDisplayReactorParameters, DynamicMethodOptions } from "./types";
|
|
3
3
|
import { DisplayReactor } from "@ic-reactor/core";
|
|
4
4
|
import { CandidAdapter } from "./adapter";
|
|
@@ -50,7 +50,8 @@ import { CandidAdapter } from "./adapter";
|
|
|
50
50
|
* })
|
|
51
51
|
* ```
|
|
52
52
|
*/
|
|
53
|
-
export declare class CandidDisplayReactor<A = BaseActor> extends DisplayReactor<A> {
|
|
53
|
+
export declare class CandidDisplayReactor<A = BaseActor, T extends TransformKey = "display"> extends DisplayReactor<A, T> {
|
|
54
|
+
readonly transform: T;
|
|
54
55
|
adapter: CandidAdapter;
|
|
55
56
|
private candidSource?;
|
|
56
57
|
constructor(config: CandidDisplayReactorParameters<A>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-reactor.d.ts","sourceRoot":"","sources":["../src/display-reactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"display-reactor.d.ts","sourceRoot":"","sources":["../src/display-reactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,YAAY,EACb,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EACV,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,cAAc,EAGf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAOzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,oBAAoB,CAC/B,CAAC,GAAG,SAAS,EACb,CAAC,SAAS,YAAY,GAAG,SAAS,CAClC,SAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5B,SAAgB,SAAS,EAAgB,CAAC,CAAA;IACnC,OAAO,EAAE,aAAa,CAAA;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAQ;gBAEjB,MAAM,EAAE,8BAA8B,CAAC,CAAC,CAAC;IAwBrD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;;;;;;;;;;;;;;;;;OAmBG;IACU,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzE;;;;;;;;;;OAUG;IACU,eAAe,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E;;OAEG;IACI,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAI/C;;OAEG;IACI,cAAc,IAAI,MAAM,EAAE;IAQjC;;;;;;;;;;;;OAYG;IACU,WAAW,CAAC,CAAC,GAAG,OAAO,EAClC,OAAO,EAAE,oBAAoB,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GACnD,OAAO,CAAC,CAAC,CAAC;IAQb;;;;;;;;;;;;;OAaG;IACU,YAAY,CAAC,CAAC,GAAG,OAAO,EACnC,OAAO,EAAE,oBAAoB,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GACnD,OAAO,CAAC,CAAC,CAAC;IAQb;;;;;;;;;;;;;;OAcG;IACU,iBAAiB,CAAC,CAAC,GAAG,OAAO,EACxC,OAAO,EAAE,oBAAoB,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GACnD,OAAO,CAAC,CAAC,CAAC;CAOd"}
|
package/dist/display-reactor.js
CHANGED
|
@@ -59,6 +59,12 @@ export class CandidDisplayReactor extends DisplayReactor {
|
|
|
59
59
|
superConfig.idlFactory = ({ IDL }) => IDL.Service({});
|
|
60
60
|
}
|
|
61
61
|
super(superConfig);
|
|
62
|
+
Object.defineProperty(this, "transform", {
|
|
63
|
+
enumerable: true,
|
|
64
|
+
configurable: true,
|
|
65
|
+
writable: true,
|
|
66
|
+
value: "display"
|
|
67
|
+
});
|
|
62
68
|
Object.defineProperty(this, "adapter", {
|
|
63
69
|
enumerable: true,
|
|
64
70
|
configurable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-reactor.js","sourceRoot":"","sources":["../src/display-reactor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"display-reactor.js","sourceRoot":"","sources":["../src/display-reactor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { ActorMethodReturnType, BaseActor, FunctionName } from "@ic-reactor/core";
|
|
2
|
+
import { CandidDisplayReactor } from "./display-reactor";
|
|
3
|
+
import type { CandidDisplayReactorParameters, DynamicMethodOptions } from "./types";
|
|
4
|
+
import { MethodArgumentsMeta, ServiceArgumentsMeta } from "./visitor/arguments";
|
|
5
|
+
import { MethodResultMeta, ResolvedMethodResult, ServiceResultMeta } from "./visitor/returns";
|
|
6
|
+
/**
|
|
7
|
+
* MetadataDisplayReactor combines visitor-based metadata generation
|
|
8
|
+
* for both input forms and result display.
|
|
9
|
+
*
|
|
10
|
+
* ## Architecture
|
|
11
|
+
*
|
|
12
|
+
* It extends the base Reactor and adds metadata generation capabilities.
|
|
13
|
+
* Unlike DisplayReactor, it does not use a separate codec for transformation.
|
|
14
|
+
* Instead, it uses the metadata visitor to resolve raw values into display-ready structures.
|
|
15
|
+
*/
|
|
16
|
+
declare module "@ic-reactor/core" {
|
|
17
|
+
interface TransformArgsRegistry<T> {
|
|
18
|
+
metadata: TransformArgsRegistry<T>["display"];
|
|
19
|
+
}
|
|
20
|
+
interface TransformReturnRegistry<T, A = BaseActor> {
|
|
21
|
+
metadata: ResolvedMethodResult<A>;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export declare class MetadataDisplayReactor<A = BaseActor> extends CandidDisplayReactor<A, "metadata"> {
|
|
25
|
+
readonly transform: "metadata";
|
|
26
|
+
private argumentMeta;
|
|
27
|
+
private resultMeta;
|
|
28
|
+
private static argVisitor;
|
|
29
|
+
private static resultVisitor;
|
|
30
|
+
constructor(config: CandidDisplayReactorParameters<A>);
|
|
31
|
+
/**
|
|
32
|
+
* Initializes the reactor by parsing Candid and generating all metadata.
|
|
33
|
+
*/
|
|
34
|
+
initialize(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Generate all metadata from the service interface using visitors.
|
|
37
|
+
*/
|
|
38
|
+
private generateMetadata;
|
|
39
|
+
/**
|
|
40
|
+
* Get argument field metadata for a method.
|
|
41
|
+
* Use this to generate input forms.
|
|
42
|
+
*/
|
|
43
|
+
getArgumentMeta<M extends FunctionName<A>>(methodName: M): MethodArgumentsMeta<A, M> | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Get result field metadata for a method.
|
|
46
|
+
* Use this to render results.
|
|
47
|
+
*/
|
|
48
|
+
getResultMeta<M extends FunctionName<A>>(methodName: M): MethodResultMeta<A, M> | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Get all argument metadata.
|
|
51
|
+
*/
|
|
52
|
+
getAllArgumentMeta(): ServiceArgumentsMeta<A> | null;
|
|
53
|
+
/**
|
|
54
|
+
* Get all result metadata.
|
|
55
|
+
*/
|
|
56
|
+
getAllResultMeta(): ServiceResultMeta<A> | null;
|
|
57
|
+
/**
|
|
58
|
+
* Register a dynamic method by its Candid signature.
|
|
59
|
+
* After registration, all DisplayReactor methods work with display type transformations.
|
|
60
|
+
*/
|
|
61
|
+
registerMethod(options: DynamicMethodOptions): Promise<void>;
|
|
62
|
+
protected transformResult<M extends FunctionName<A>>(methodName: M, result: ActorMethodReturnType<A[M]>): ResolvedMethodResult<A>;
|
|
63
|
+
/**
|
|
64
|
+
* Perform a dynamic call and return result with metadata.
|
|
65
|
+
*/
|
|
66
|
+
callDynamicWithMeta<T = unknown>(options: DynamicMethodOptions & {
|
|
67
|
+
args?: unknown[];
|
|
68
|
+
}): Promise<{
|
|
69
|
+
result: T;
|
|
70
|
+
meta: MethodResultMeta<A>;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=metadata-display-reactor.d.ts.map
|
|
@@ -0,0 +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,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EAEpB,iBAAiB,EAClB,MAAM,mBAAmB,CAAA;AAM1B;;;;;;;;;GASG;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,oBAAoB,CAAC,CAAC,CAAC,CAAA;KAClC;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,CAAoC;IAGtD,OAAO,CAAC,MAAM,CAAC,UAAU,CAA6B;IACtD,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;IAoBxB;;;OAGG;IACI,eAAe,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC9C,UAAU,EAAE,CAAC,GACZ,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIxC;;;OAGG;IACI,aAAa,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC5C,UAAU,EAAE,CAAC,GACZ,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIrC;;OAEG;IACI,kBAAkB,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3D;;OAEG;IACI,gBAAgB,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAOtD;;;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,oBAAoB,CAAC,CAAC,CAAC;IAU1B;;OAEG;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,gBAAgB,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC;CAYrD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { CandidDisplayReactor } from "./display-reactor";
|
|
2
|
+
import { ArgumentFieldVisitor, } from "./visitor/arguments";
|
|
3
|
+
import { ResultFieldVisitor, } from "./visitor/returns";
|
|
4
|
+
export class MetadataDisplayReactor extends CandidDisplayReactor {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
super(config);
|
|
7
|
+
Object.defineProperty(this, "transform", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true,
|
|
11
|
+
value: "metadata"
|
|
12
|
+
});
|
|
13
|
+
// Metadata storage
|
|
14
|
+
Object.defineProperty(this, "argumentMeta", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: null
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(this, "resultMeta", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value: null
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
28
|
+
// INITIALIZATION
|
|
29
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
30
|
+
/**
|
|
31
|
+
* Initializes the reactor by parsing Candid and generating all metadata.
|
|
32
|
+
*/
|
|
33
|
+
async initialize() {
|
|
34
|
+
await super.initialize();
|
|
35
|
+
// Generate metadata using visitors
|
|
36
|
+
this.generateMetadata();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate all metadata from the service interface using visitors.
|
|
40
|
+
*/
|
|
41
|
+
generateMetadata() {
|
|
42
|
+
const service = this.getServiceInterface();
|
|
43
|
+
if (!service)
|
|
44
|
+
return;
|
|
45
|
+
// Generate argument metadata
|
|
46
|
+
this.argumentMeta = service.accept(MetadataDisplayReactor.argVisitor, null);
|
|
47
|
+
// Generate result metadata
|
|
48
|
+
this.resultMeta = service.accept(MetadataDisplayReactor.resultVisitor, null);
|
|
49
|
+
}
|
|
50
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
51
|
+
// METADATA ACCESS
|
|
52
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
53
|
+
/**
|
|
54
|
+
* Get argument field metadata for a method.
|
|
55
|
+
* Use this to generate input forms.
|
|
56
|
+
*/
|
|
57
|
+
getArgumentMeta(methodName) {
|
|
58
|
+
return this.argumentMeta?.[methodName];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get result field metadata for a method.
|
|
62
|
+
* Use this to render results.
|
|
63
|
+
*/
|
|
64
|
+
getResultMeta(methodName) {
|
|
65
|
+
return this.resultMeta?.[methodName];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get all argument metadata.
|
|
69
|
+
*/
|
|
70
|
+
getAllArgumentMeta() {
|
|
71
|
+
return this.argumentMeta;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get all result metadata.
|
|
75
|
+
*/
|
|
76
|
+
getAllResultMeta() {
|
|
77
|
+
return this.resultMeta;
|
|
78
|
+
}
|
|
79
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
80
|
+
// DYNAMIC METHOD REGISTRATION
|
|
81
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
82
|
+
/**
|
|
83
|
+
* Register a dynamic method by its Candid signature.
|
|
84
|
+
* After registration, all DisplayReactor methods work with display type transformations.
|
|
85
|
+
*/
|
|
86
|
+
async registerMethod(options) {
|
|
87
|
+
await super.registerMethod(options);
|
|
88
|
+
// Regenerate metadata
|
|
89
|
+
this.generateMetadata();
|
|
90
|
+
}
|
|
91
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
92
|
+
// DYNAMIC CALL SHORTCUTS
|
|
93
|
+
// ══════════════════════════════════════════════════════════════════════════
|
|
94
|
+
transformResult(methodName, result) {
|
|
95
|
+
// Get metadata and generate resolved result
|
|
96
|
+
const meta = this.getResultMeta(methodName);
|
|
97
|
+
if (!meta) {
|
|
98
|
+
throw new Error(`No metadata found for method "${methodName}"`);
|
|
99
|
+
}
|
|
100
|
+
return meta.generateMetadata(result);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Perform a dynamic call and return result with metadata.
|
|
104
|
+
*/
|
|
105
|
+
async callDynamicWithMeta(options) {
|
|
106
|
+
await this.registerMethod(options);
|
|
107
|
+
const result = (await this.callMethod({
|
|
108
|
+
functionName: options.functionName,
|
|
109
|
+
args: options.args,
|
|
110
|
+
}));
|
|
111
|
+
const meta = this.getResultMeta(options.functionName);
|
|
112
|
+
return { result, meta };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Visitors (stateless, can be reused)
|
|
116
|
+
Object.defineProperty(MetadataDisplayReactor, "argVisitor", {
|
|
117
|
+
enumerable: true,
|
|
118
|
+
configurable: true,
|
|
119
|
+
writable: true,
|
|
120
|
+
value: new ArgumentFieldVisitor()
|
|
121
|
+
});
|
|
122
|
+
Object.defineProperty(MetadataDisplayReactor, "resultVisitor", {
|
|
123
|
+
enumerable: true,
|
|
124
|
+
configurable: true,
|
|
125
|
+
writable: true,
|
|
126
|
+
value: new ResultFieldVisitor()
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=metadata-display-reactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-display-reactor.js","sourceRoot":"","sources":["../src/metadata-display-reactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { IDL } from "../types";
|
|
2
|
+
import type { ArgumentField, RecordArgumentField, VariantArgumentField, TupleArgumentField, OptionalArgumentField, VectorArgumentField, BlobArgumentField, RecursiveArgumentField, PrincipalArgumentField, NumberArgumentField, BooleanArgumentField, NullArgumentField, TextArgumentField, UnknownArgumentField, MethodArgumentsMeta, ServiceArgumentsMeta } from "./types";
|
|
3
|
+
import { BaseActor, FunctionName } from "@ic-reactor/core";
|
|
4
|
+
export * from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* ArgumentFieldVisitor generates metadata for form input fields from Candid IDL types.
|
|
7
|
+
*
|
|
8
|
+
* ## Design Principles
|
|
9
|
+
*
|
|
10
|
+
* 1. **Works with raw IDL types** - generates metadata at initialization time
|
|
11
|
+
* 2. **No value dependencies** - metadata is independent of actual values
|
|
12
|
+
* 3. **Form-framework agnostic** - output can be used with TanStack, React Hook Form, etc.
|
|
13
|
+
* 4. **Efficient** - single traversal, no runtime type checking
|
|
14
|
+
*
|
|
15
|
+
* ## Output Structure
|
|
16
|
+
*
|
|
17
|
+
* Each field has:
|
|
18
|
+
* - `type`: The field type (record, variant, text, number, etc.)
|
|
19
|
+
* - `label`: Human-readable label from Candid
|
|
20
|
+
* - `path`: Dot-notation path for form binding (e.g., "0.owner")
|
|
21
|
+
* - `defaultValue`: Initial value for the form
|
|
22
|
+
* - Type-specific properties (options for variant, fields for record, etc.)
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const visitor = new ArgumentFieldVisitor()
|
|
27
|
+
* const serviceMeta = service.accept(visitor, null)
|
|
28
|
+
*
|
|
29
|
+
* // For a specific method
|
|
30
|
+
* const methodMeta = serviceMeta["icrc1_transfer"]
|
|
31
|
+
* // methodMeta.fields = [{ type: "record", fields: [...] }]
|
|
32
|
+
* // methodMeta.defaultValues = [{ to: "", amount: "" }]
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class ArgumentFieldVisitor<A = BaseActor> extends IDL.Visitor<string, ArgumentField | MethodArgumentsMeta<A> | ServiceArgumentsMeta<A>> {
|
|
36
|
+
private pathStack;
|
|
37
|
+
private withPath;
|
|
38
|
+
private currentPath;
|
|
39
|
+
private childPath;
|
|
40
|
+
visitService(t: IDL.ServiceClass): ServiceArgumentsMeta<A>;
|
|
41
|
+
visitFunc(t: IDL.FuncClass, functionName: FunctionName<A>): MethodArgumentsMeta<A>;
|
|
42
|
+
private extractDefaultValue;
|
|
43
|
+
visitRecord(_t: IDL.RecordClass, fields_: Array<[string, IDL.Type]>, label: string): RecordArgumentField;
|
|
44
|
+
visitVariant(_t: IDL.VariantClass, fields_: Array<[string, IDL.Type]>, label: string): VariantArgumentField;
|
|
45
|
+
visitTuple<T extends IDL.Type[]>(_t: IDL.TupleClass<T>, components: IDL.Type[], label: string): TupleArgumentField;
|
|
46
|
+
visitOpt<T>(_t: IDL.OptClass<T>, ty: IDL.Type<T>, label: string): OptionalArgumentField;
|
|
47
|
+
visitVec<T>(_t: IDL.VecClass<T>, ty: IDL.Type<T>, label: string): VectorArgumentField | BlobArgumentField;
|
|
48
|
+
visitRec<T>(_t: IDL.RecClass<T>, ty: IDL.ConstructType<T>, label: string): RecursiveArgumentField;
|
|
49
|
+
visitPrincipal(_t: IDL.PrincipalClass, label: string): PrincipalArgumentField;
|
|
50
|
+
visitText(_t: IDL.TextClass, label: string): TextArgumentField;
|
|
51
|
+
visitBool(_t: IDL.BoolClass, label: string): BooleanArgumentField;
|
|
52
|
+
visitNull(_t: IDL.NullClass, label: string): NullArgumentField;
|
|
53
|
+
private visitNumberType;
|
|
54
|
+
visitInt(_t: IDL.IntClass, label: string): NumberArgumentField;
|
|
55
|
+
visitNat(_t: IDL.NatClass, label: string): NumberArgumentField;
|
|
56
|
+
visitFloat(_t: IDL.FloatClass, label: string): NumberArgumentField;
|
|
57
|
+
visitFixedInt(t: IDL.FixedIntClass, label: string): NumberArgumentField;
|
|
58
|
+
visitFixedNat(t: IDL.FixedNatClass, label: string): NumberArgumentField;
|
|
59
|
+
visitType<T>(_t: IDL.Type<T>, label: string): UnknownArgumentField;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @deprecated Use ArgumentFieldVisitor instead
|
|
63
|
+
*/
|
|
64
|
+
export { ArgumentFieldVisitor as VisitTanstackField };
|
|
65
|
+
/**
|
|
66
|
+
* @deprecated Use ArgumentField instead
|
|
67
|
+
*/
|
|
68
|
+
export type { ArgumentField as TanstackAllArgTypes, MethodArgumentsMeta as TanstackMethodField, ServiceArgumentsMeta as TanstackServiceField, };
|
|
69
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { isQuery } from "../helpers";
|
|
2
|
+
import { IDL } from "../types";
|
|
3
|
+
export * from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* ArgumentFieldVisitor generates metadata for form input fields from Candid IDL types.
|
|
6
|
+
*
|
|
7
|
+
* ## Design Principles
|
|
8
|
+
*
|
|
9
|
+
* 1. **Works with raw IDL types** - generates metadata at initialization time
|
|
10
|
+
* 2. **No value dependencies** - metadata is independent of actual values
|
|
11
|
+
* 3. **Form-framework agnostic** - output can be used with TanStack, React Hook Form, etc.
|
|
12
|
+
* 4. **Efficient** - single traversal, no runtime type checking
|
|
13
|
+
*
|
|
14
|
+
* ## Output Structure
|
|
15
|
+
*
|
|
16
|
+
* Each field has:
|
|
17
|
+
* - `type`: The field type (record, variant, text, number, etc.)
|
|
18
|
+
* - `label`: Human-readable label from Candid
|
|
19
|
+
* - `path`: Dot-notation path for form binding (e.g., "0.owner")
|
|
20
|
+
* - `defaultValue`: Initial value for the form
|
|
21
|
+
* - Type-specific properties (options for variant, fields for record, etc.)
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const visitor = new ArgumentFieldVisitor()
|
|
26
|
+
* const serviceMeta = service.accept(visitor, null)
|
|
27
|
+
*
|
|
28
|
+
* // For a specific method
|
|
29
|
+
* const methodMeta = serviceMeta["icrc1_transfer"]
|
|
30
|
+
* // methodMeta.fields = [{ type: "record", fields: [...] }]
|
|
31
|
+
* // methodMeta.defaultValues = [{ to: "", amount: "" }]
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
35
|
+
constructor() {
|
|
36
|
+
super(...arguments);
|
|
37
|
+
Object.defineProperty(this, "pathStack", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
value: []
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
withPath(path, fn) {
|
|
45
|
+
this.pathStack.push(path);
|
|
46
|
+
try {
|
|
47
|
+
return fn();
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
this.pathStack.pop();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
currentPath() {
|
|
54
|
+
return this.pathStack[this.pathStack.length - 1] ?? "";
|
|
55
|
+
}
|
|
56
|
+
childPath(key) {
|
|
57
|
+
const parent = this.currentPath();
|
|
58
|
+
if (typeof key === "number") {
|
|
59
|
+
return parent ? `${parent}[${key}]` : String(key);
|
|
60
|
+
}
|
|
61
|
+
return parent ? `${parent}.${key}` : key;
|
|
62
|
+
}
|
|
63
|
+
// ════════════════════════════════════════════════════════════════════════
|
|
64
|
+
// Service & Function Level
|
|
65
|
+
// ════════════════════════════════════════════════════════════════════════
|
|
66
|
+
visitService(t) {
|
|
67
|
+
const result = {};
|
|
68
|
+
for (const [functionName, func] of t._fields) {
|
|
69
|
+
result[functionName] = func.accept(this, functionName);
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
visitFunc(t, functionName) {
|
|
74
|
+
const functionType = isQuery(t) ? "query" : "update";
|
|
75
|
+
const fields = t.argTypes.map((arg, index) => {
|
|
76
|
+
return this.withPath(`[${index}]`, () => arg.accept(this, `__arg${index}`));
|
|
77
|
+
});
|
|
78
|
+
const defaultValues = fields.map((field) => this.extractDefaultValue(field));
|
|
79
|
+
return {
|
|
80
|
+
functionType,
|
|
81
|
+
functionName,
|
|
82
|
+
fields,
|
|
83
|
+
defaultValues,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
extractDefaultValue(field) {
|
|
87
|
+
if ("defaultValue" in field) {
|
|
88
|
+
return field.defaultValue;
|
|
89
|
+
}
|
|
90
|
+
if ("defaultValues" in field) {
|
|
91
|
+
return field.defaultValues;
|
|
92
|
+
}
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
// ════════════════════════════════════════════════════════════════════════
|
|
96
|
+
// Compound Types
|
|
97
|
+
// ════════════════════════════════════════════════════════════════════════
|
|
98
|
+
visitRecord(_t, fields_, label) {
|
|
99
|
+
const path = this.currentPath();
|
|
100
|
+
const fields = [];
|
|
101
|
+
const defaultValues = {};
|
|
102
|
+
for (const [key, type] of fields_) {
|
|
103
|
+
const field = this.withPath(this.childPath(key), () => type.accept(this, key));
|
|
104
|
+
fields.push(field);
|
|
105
|
+
defaultValues[key] = this.extractDefaultValue(field);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
type: "record",
|
|
109
|
+
label,
|
|
110
|
+
path,
|
|
111
|
+
fields,
|
|
112
|
+
defaultValues,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
visitVariant(_t, fields_, label) {
|
|
116
|
+
const path = this.currentPath();
|
|
117
|
+
const fields = [];
|
|
118
|
+
const options = [];
|
|
119
|
+
for (const [key, type] of fields_) {
|
|
120
|
+
const field = this.withPath(this.childPath(key), () => type.accept(this, key));
|
|
121
|
+
fields.push(field);
|
|
122
|
+
options.push(key);
|
|
123
|
+
}
|
|
124
|
+
const defaultOption = options[0];
|
|
125
|
+
const defaultValues = {
|
|
126
|
+
[defaultOption]: this.extractDefaultValue(fields[0]),
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
type: "variant",
|
|
130
|
+
label,
|
|
131
|
+
path,
|
|
132
|
+
fields,
|
|
133
|
+
options,
|
|
134
|
+
defaultOption,
|
|
135
|
+
defaultValues,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
visitTuple(_t, components, label) {
|
|
139
|
+
const path = this.currentPath();
|
|
140
|
+
const fields = [];
|
|
141
|
+
const defaultValues = [];
|
|
142
|
+
for (let index = 0; index < components.length; index++) {
|
|
143
|
+
const type = components[index];
|
|
144
|
+
const field = this.withPath(this.childPath(index), () => type.accept(this, `_${index}_`));
|
|
145
|
+
fields.push(field);
|
|
146
|
+
defaultValues.push(this.extractDefaultValue(field));
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
type: "tuple",
|
|
150
|
+
label,
|
|
151
|
+
path,
|
|
152
|
+
fields,
|
|
153
|
+
defaultValues,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
visitOpt(_t, ty, label) {
|
|
157
|
+
const path = this.currentPath();
|
|
158
|
+
const innerField = this.withPath(this.childPath(0), () => ty.accept(this, label));
|
|
159
|
+
return {
|
|
160
|
+
type: "optional",
|
|
161
|
+
label,
|
|
162
|
+
path,
|
|
163
|
+
innerField,
|
|
164
|
+
defaultValue: null,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
visitVec(_t, ty, label) {
|
|
168
|
+
const path = this.currentPath();
|
|
169
|
+
// Check if it's blob (vec nat8)
|
|
170
|
+
const isBlob = ty instanceof IDL.FixedNatClass && ty._bits === 8;
|
|
171
|
+
const itemField = this.withPath(this.childPath(0), () => ty.accept(this, label));
|
|
172
|
+
if (isBlob) {
|
|
173
|
+
return {
|
|
174
|
+
type: "blob",
|
|
175
|
+
label,
|
|
176
|
+
path,
|
|
177
|
+
itemField,
|
|
178
|
+
defaultValue: "",
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
type: "vector",
|
|
183
|
+
label,
|
|
184
|
+
path,
|
|
185
|
+
itemField,
|
|
186
|
+
defaultValue: [],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
visitRec(_t, ty, label) {
|
|
190
|
+
const path = this.currentPath();
|
|
191
|
+
return {
|
|
192
|
+
type: "recursive",
|
|
193
|
+
label,
|
|
194
|
+
path,
|
|
195
|
+
// Lazy extraction to prevent infinite loops
|
|
196
|
+
extract: () => this.withPath(path, () => ty.accept(this, label)),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// ════════════════════════════════════════════════════════════════════════
|
|
200
|
+
// Primitive Types
|
|
201
|
+
// ════════════════════════════════════════════════════════════════════════
|
|
202
|
+
visitPrincipal(_t, label) {
|
|
203
|
+
return {
|
|
204
|
+
type: "principal",
|
|
205
|
+
label,
|
|
206
|
+
path: this.currentPath(),
|
|
207
|
+
defaultValue: "",
|
|
208
|
+
maxLength: 64,
|
|
209
|
+
minLength: 7,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
visitText(_t, label) {
|
|
213
|
+
return {
|
|
214
|
+
type: "text",
|
|
215
|
+
label,
|
|
216
|
+
path: this.currentPath(),
|
|
217
|
+
defaultValue: "",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
visitBool(_t, label) {
|
|
221
|
+
return {
|
|
222
|
+
type: "boolean",
|
|
223
|
+
label,
|
|
224
|
+
path: this.currentPath(),
|
|
225
|
+
defaultValue: false,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
visitNull(_t, label) {
|
|
229
|
+
return {
|
|
230
|
+
type: "null",
|
|
231
|
+
label,
|
|
232
|
+
path: this.currentPath(),
|
|
233
|
+
defaultValue: null,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
// Numbers - all use string for display format
|
|
237
|
+
visitNumberType(label, candidType) {
|
|
238
|
+
return {
|
|
239
|
+
type: "number",
|
|
240
|
+
label,
|
|
241
|
+
path: this.currentPath(),
|
|
242
|
+
defaultValue: "",
|
|
243
|
+
candidType,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
visitInt(_t, label) {
|
|
247
|
+
return this.visitNumberType(label, "int");
|
|
248
|
+
}
|
|
249
|
+
visitNat(_t, label) {
|
|
250
|
+
return this.visitNumberType(label, "nat");
|
|
251
|
+
}
|
|
252
|
+
visitFloat(_t, label) {
|
|
253
|
+
return this.visitNumberType(label, "float");
|
|
254
|
+
}
|
|
255
|
+
visitFixedInt(t, label) {
|
|
256
|
+
return this.visitNumberType(label, `int${t._bits}`);
|
|
257
|
+
}
|
|
258
|
+
visitFixedNat(t, label) {
|
|
259
|
+
return this.visitNumberType(label, `nat${t._bits}`);
|
|
260
|
+
}
|
|
261
|
+
visitType(_t, label) {
|
|
262
|
+
return {
|
|
263
|
+
type: "unknown",
|
|
264
|
+
label,
|
|
265
|
+
path: this.currentPath(),
|
|
266
|
+
defaultValue: undefined,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
271
|
+
// Legacy Exports (for backward compatibility)
|
|
272
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
273
|
+
/**
|
|
274
|
+
* @deprecated Use ArgumentFieldVisitor instead
|
|
275
|
+
*/
|
|
276
|
+
export { ArgumentFieldVisitor as VisitTanstackField };
|
|
277
|
+
//# sourceMappingURL=index.js.map
|