@ic-reactor/candid 3.0.12-beta.0 → 3.0.13-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/metadata-display-reactor.d.ts.map +1 -1
- package/dist/metadata-display-reactor.js +2 -2
- package/dist/metadata-display-reactor.js.map +1 -1
- package/dist/visitor/arguments/helpers.d.ts +40 -0
- package/dist/visitor/arguments/helpers.d.ts.map +1 -0
- package/dist/visitor/arguments/helpers.js +81 -0
- package/dist/visitor/arguments/helpers.js.map +1 -0
- package/dist/visitor/arguments/index.d.ts +8 -5
- package/dist/visitor/arguments/index.d.ts.map +1 -1
- package/dist/visitor/arguments/index.js +212 -17
- package/dist/visitor/arguments/index.js.map +1 -1
- package/dist/visitor/arguments/types.d.ts +282 -30
- package/dist/visitor/arguments/types.d.ts.map +1 -1
- package/dist/visitor/arguments/types.js +1 -40
- package/dist/visitor/arguments/types.js.map +1 -1
- package/package.json +2 -2
- package/src/metadata-display-reactor.ts +2 -2
- package/src/visitor/arguments/helpers.ts +104 -0
- package/src/visitor/arguments/index.test.ts +401 -2
- package/src/visitor/arguments/index.ts +251 -17
- package/src/visitor/arguments/schema.test.ts +3 -3
- package/src/visitor/arguments/types.ts +318 -52
- package/src/visitor/arguments/README.md +0 -230
|
@@ -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,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,UAAU,EACV,oBAAoB,EAEpB,WAAW,EACZ,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,CAA8B;IAGhD,OAAO,CAAC,MAAM,CAAC,UAAU,
|
|
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,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,UAAU,EACV,oBAAoB,EAEpB,WAAW,EACZ,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,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;IAoBxB;;;OAGG;IACI,eAAe,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAC9C,UAAU,EAAE,CAAC,GACZ,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;IAIlC;;;OAGG;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,kBAAkB,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3D;;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,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,UAAU,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC;CAY/C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CandidDisplayReactor } from "./display-reactor";
|
|
2
|
-
import {
|
|
2
|
+
import { FieldVisitor, } from "./visitor/arguments";
|
|
3
3
|
import { ResultFieldVisitor, } from "./visitor/returns";
|
|
4
4
|
export class MetadataDisplayReactor extends CandidDisplayReactor {
|
|
5
5
|
constructor(config) {
|
|
@@ -117,7 +117,7 @@ Object.defineProperty(MetadataDisplayReactor, "argVisitor", {
|
|
|
117
117
|
enumerable: true,
|
|
118
118
|
configurable: true,
|
|
119
119
|
writable: true,
|
|
120
|
-
value: new
|
|
120
|
+
value: new FieldVisitor()
|
|
121
121
|
});
|
|
122
122
|
Object.defineProperty(MetadataDisplayReactor, "resultVisitor", {
|
|
123
123
|
enumerable: true,
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"metadata-display-reactor.js","sourceRoot":"","sources":["../src/metadata-display-reactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ArgumentFieldType, CompoundField, Field, FieldByType, PrimitiveField, RecordField, TupleField, VariantField } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Type guard for checking specific field types.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* function FieldInput({ field }: { field: Field }) {
|
|
8
|
+
* if (isFieldType(field, 'record')) {
|
|
9
|
+
* // field is now typed as RecordField
|
|
10
|
+
* return <RecordInput field={field} />
|
|
11
|
+
* }
|
|
12
|
+
* if (isFieldType(field, 'text')) {
|
|
13
|
+
* // field is now typed as TextField
|
|
14
|
+
* return <TextInput field={field} />
|
|
15
|
+
* }
|
|
16
|
+
* // ...
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function isFieldType<T extends ArgumentFieldType>(field: Field, type: T): field is FieldByType<T>;
|
|
21
|
+
/** Check if a field is a compound type (contains other fields) */
|
|
22
|
+
export declare function isCompoundField(field: Field): field is CompoundField;
|
|
23
|
+
/** Check if a field is a primitive type */
|
|
24
|
+
export declare function isPrimitiveField(field: Field): field is PrimitiveField;
|
|
25
|
+
/** Check if a field has children (for iteration) */
|
|
26
|
+
export declare function hasChildFields(field: Field): field is RecordField | VariantField | TupleField;
|
|
27
|
+
/**
|
|
28
|
+
* Format a raw Candid label into a human-readable display label.
|
|
29
|
+
* Handles common patterns like "__arg0", "_0_", "snake_case", etc.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* formatLabel("__arg0") // "Arg 0"
|
|
34
|
+
* formatLabel("_0_") // "Item 0"
|
|
35
|
+
* formatLabel("created_at") // "Created At"
|
|
36
|
+
* formatLabel("userAddress") // "User Address"
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatLabel(label: string): string;
|
|
40
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,KAAK,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,YAAY,EACb,MAAM,SAAS,CAAA;AAEhB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,iBAAiB,EACrD,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,CAAC,GACN,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEzB;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,aAAa,CASpE;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,IAAI,cAAc,CAEtE;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,GACX,KAAK,IAAI,WAAW,GAAG,YAAY,GAAG,UAAU,CAElD;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BjD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard for checking specific field types.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```tsx
|
|
6
|
+
* function FieldInput({ field }: { field: Field }) {
|
|
7
|
+
* if (isFieldType(field, 'record')) {
|
|
8
|
+
* // field is now typed as RecordField
|
|
9
|
+
* return <RecordInput field={field} />
|
|
10
|
+
* }
|
|
11
|
+
* if (isFieldType(field, 'text')) {
|
|
12
|
+
* // field is now typed as TextField
|
|
13
|
+
* return <TextInput field={field} />
|
|
14
|
+
* }
|
|
15
|
+
* // ...
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function isFieldType(field, type) {
|
|
20
|
+
return field.type === type;
|
|
21
|
+
}
|
|
22
|
+
/** Check if a field is a compound type (contains other fields) */
|
|
23
|
+
export function isCompoundField(field) {
|
|
24
|
+
return [
|
|
25
|
+
"record",
|
|
26
|
+
"variant",
|
|
27
|
+
"tuple",
|
|
28
|
+
"optional",
|
|
29
|
+
"vector",
|
|
30
|
+
"recursive",
|
|
31
|
+
].includes(field.type);
|
|
32
|
+
}
|
|
33
|
+
/** Check if a field is a primitive type */
|
|
34
|
+
export function isPrimitiveField(field) {
|
|
35
|
+
return ["principal", "number", "text", "boolean", "null"].includes(field.type);
|
|
36
|
+
}
|
|
37
|
+
/** Check if a field has children (for iteration) */
|
|
38
|
+
export function hasChildFields(field) {
|
|
39
|
+
return "fields" in field && Array.isArray(field.fields);
|
|
40
|
+
}
|
|
41
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
42
|
+
// Label Formatting Utilities
|
|
43
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
44
|
+
/**
|
|
45
|
+
* Format a raw Candid label into a human-readable display label.
|
|
46
|
+
* Handles common patterns like "__arg0", "_0_", "snake_case", etc.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* formatLabel("__arg0") // "Arg 0"
|
|
51
|
+
* formatLabel("_0_") // "Item 0"
|
|
52
|
+
* formatLabel("created_at") // "Created At"
|
|
53
|
+
* formatLabel("userAddress") // "User Address"
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function formatLabel(label) {
|
|
57
|
+
// Handle argument labels: __arg0 -> Arg 0
|
|
58
|
+
if (label.startsWith("__arg")) {
|
|
59
|
+
const num = label.slice(5);
|
|
60
|
+
return `Arg ${num}`;
|
|
61
|
+
}
|
|
62
|
+
// Handle tuple index labels: _0_ -> Item 0
|
|
63
|
+
if (/^_\d+_$/.test(label)) {
|
|
64
|
+
const num = label.slice(1, -1);
|
|
65
|
+
return `Item ${num}`;
|
|
66
|
+
}
|
|
67
|
+
// Handle item labels for vectors: label_item -> Item
|
|
68
|
+
if (label.endsWith("_item")) {
|
|
69
|
+
return "Item";
|
|
70
|
+
}
|
|
71
|
+
// Convert snake_case or just clean up underscores
|
|
72
|
+
// and capitalize each word
|
|
73
|
+
return label
|
|
74
|
+
.replace(/^_+|_+$/g, "") // Remove leading/trailing underscores
|
|
75
|
+
.replace(/_/g, " ") // Replace underscores with spaces
|
|
76
|
+
.replace(/([a-z])([A-Z])/g, "$1 $2") // Add space before capitals (camelCase)
|
|
77
|
+
.split(" ")
|
|
78
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
79
|
+
.join(" ");
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,WAAW,CACzB,KAAY,EACZ,IAAO;IAEP,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,OAAO;QACL,QAAQ;QACR,SAAS;QACT,OAAO;QACP,UAAU;QACV,QAAQ;QACR,WAAW;KACZ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,gBAAgB,CAAC,KAAY;IAC3C,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAChF,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAC5B,KAAY;IAEZ,OAAO,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAE,KAAqB,CAAC,MAAM,CAAC,CAAA;AAC1E,CAAC;AAED,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,0CAA0C;IAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC1B,OAAO,OAAO,GAAG,EAAE,CAAA;IACrB,CAAC;IAED,2CAA2C;IAC3C,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,QAAQ,GAAG,EAAE,CAAA;IACtB,CAAC;IAED,qDAAqD;IACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAA;IACf,CAAC;IAED,kDAAkD;IAClD,2BAA2B;IAC3B,OAAO,KAAK;SACT,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,sCAAsC;SAC9D,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,kCAAkC;SACrD,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,wCAAwC;SAC5E,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { BaseActor, FunctionName } from "@ic-reactor/core";
|
|
|
4
4
|
import * as z from "zod";
|
|
5
5
|
export * from "./types";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* FieldVisitor generates metadata for form input fields from Candid IDL types.
|
|
8
8
|
*
|
|
9
9
|
* ## Design Principles
|
|
10
10
|
*
|
|
@@ -18,8 +18,11 @@ export * from "./types";
|
|
|
18
18
|
*
|
|
19
19
|
* Each field has:
|
|
20
20
|
* - `type`: The field type (record, variant, text, number, etc.)
|
|
21
|
-
* - `label`:
|
|
21
|
+
* - `label`: Raw label from Candid
|
|
22
|
+
* - `displayLabel`: Human-readable formatted label
|
|
22
23
|
* - `name`: TanStack Form compatible path (e.g., "[0]", "[0].owner", "tags[1]")
|
|
24
|
+
* - `component`: Suggested component type for rendering
|
|
25
|
+
* - `renderHint`: Hints for UI rendering strategy
|
|
23
26
|
* - `defaultValue`: Initial value for the form
|
|
24
27
|
* - `schema`: Zod schema for validation
|
|
25
28
|
* - Type-specific properties (options for variant, fields for record, etc.)
|
|
@@ -30,9 +33,9 @@ export * from "./types";
|
|
|
30
33
|
* @example
|
|
31
34
|
* ```typescript
|
|
32
35
|
* import { useForm } from '@tanstack/react-form'
|
|
33
|
-
* import {
|
|
36
|
+
* import { FieldVisitor } from '@ic-reactor/candid'
|
|
34
37
|
*
|
|
35
|
-
* const visitor = new
|
|
38
|
+
* const visitor = new FieldVisitor()
|
|
36
39
|
* const serviceMeta = service.accept(visitor, null)
|
|
37
40
|
* const methodMeta = serviceMeta["icrc1_transfer"]
|
|
38
41
|
*
|
|
@@ -52,7 +55,7 @@ export * from "./types";
|
|
|
52
55
|
* ))
|
|
53
56
|
* ```
|
|
54
57
|
*/
|
|
55
|
-
export declare class
|
|
58
|
+
export declare class FieldVisitor<A = BaseActor> extends IDL.Visitor<string, Field | ArgumentsMeta<A> | ArgumentsServiceMeta<A>> {
|
|
56
59
|
recursiveSchemas: Map<string, z.ZodTypeAny>;
|
|
57
60
|
private nameStack;
|
|
58
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visitor/arguments/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,85 @@ import { isQuery } from "../helpers";
|
|
|
2
2
|
import { IDL } from "@icp-sdk/core/candid";
|
|
3
3
|
import { Principal } from "@icp-sdk/core/principal";
|
|
4
4
|
import * as z from "zod";
|
|
5
|
+
import { formatLabel } from "./helpers";
|
|
5
6
|
export * from "./types";
|
|
7
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
8
|
+
// Render Hint Helpers
|
|
9
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
10
|
+
const COMPOUND_RENDER_HINT = {
|
|
11
|
+
isCompound: true,
|
|
12
|
+
isPrimitive: false,
|
|
13
|
+
};
|
|
14
|
+
const TEXT_RENDER_HINT = {
|
|
15
|
+
isCompound: false,
|
|
16
|
+
isPrimitive: true,
|
|
17
|
+
inputType: "text",
|
|
18
|
+
};
|
|
19
|
+
const NUMBER_RENDER_HINT = {
|
|
20
|
+
isCompound: false,
|
|
21
|
+
isPrimitive: true,
|
|
22
|
+
inputType: "number",
|
|
23
|
+
};
|
|
24
|
+
const CHECKBOX_RENDER_HINT = {
|
|
25
|
+
isCompound: false,
|
|
26
|
+
isPrimitive: true,
|
|
27
|
+
inputType: "checkbox",
|
|
28
|
+
};
|
|
29
|
+
const FILE_RENDER_HINT = {
|
|
30
|
+
isCompound: false,
|
|
31
|
+
isPrimitive: true,
|
|
32
|
+
inputType: "file",
|
|
33
|
+
};
|
|
34
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
35
|
+
// Blob Field Helpers
|
|
36
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
37
|
+
const DEFAULT_BLOB_LIMITS = {
|
|
38
|
+
maxHexBytes: 512,
|
|
39
|
+
maxFileBytes: 2 * 1024 * 1024, // 2MB
|
|
40
|
+
maxHexDisplayLength: 128,
|
|
41
|
+
};
|
|
42
|
+
function normalizeHex(input) {
|
|
43
|
+
// Remove 0x prefix and convert to lowercase
|
|
44
|
+
let hex = input.toLowerCase();
|
|
45
|
+
if (hex.startsWith("0x")) {
|
|
46
|
+
hex = hex.slice(2);
|
|
47
|
+
}
|
|
48
|
+
// Remove any whitespace
|
|
49
|
+
hex = hex.replace(/\s/g, "");
|
|
50
|
+
return hex;
|
|
51
|
+
}
|
|
52
|
+
function validateBlobInput(value, limits) {
|
|
53
|
+
if (value instanceof Uint8Array) {
|
|
54
|
+
if (value.length > limits.maxFileBytes) {
|
|
55
|
+
return {
|
|
56
|
+
valid: false,
|
|
57
|
+
error: `File size exceeds maximum of ${limits.maxFileBytes} bytes`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return { valid: true };
|
|
61
|
+
}
|
|
62
|
+
// String input (hex)
|
|
63
|
+
const normalized = normalizeHex(value);
|
|
64
|
+
if (normalized.length === 0) {
|
|
65
|
+
return { valid: true }; // Empty is valid
|
|
66
|
+
}
|
|
67
|
+
if (!/^[0-9a-f]*$/.test(normalized)) {
|
|
68
|
+
return { valid: false, error: "Invalid hex characters" };
|
|
69
|
+
}
|
|
70
|
+
if (normalized.length % 2 !== 0) {
|
|
71
|
+
return { valid: false, error: "Hex string must have even length" };
|
|
72
|
+
}
|
|
73
|
+
const byteLength = normalized.length / 2;
|
|
74
|
+
if (byteLength > limits.maxHexBytes) {
|
|
75
|
+
return {
|
|
76
|
+
valid: false,
|
|
77
|
+
error: `Hex input exceeds maximum of ${limits.maxHexBytes} bytes`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { valid: true };
|
|
81
|
+
}
|
|
6
82
|
/**
|
|
7
|
-
*
|
|
83
|
+
* FieldVisitor generates metadata for form input fields from Candid IDL types.
|
|
8
84
|
*
|
|
9
85
|
* ## Design Principles
|
|
10
86
|
*
|
|
@@ -18,8 +94,11 @@ export * from "./types";
|
|
|
18
94
|
*
|
|
19
95
|
* Each field has:
|
|
20
96
|
* - `type`: The field type (record, variant, text, number, etc.)
|
|
21
|
-
* - `label`:
|
|
97
|
+
* - `label`: Raw label from Candid
|
|
98
|
+
* - `displayLabel`: Human-readable formatted label
|
|
22
99
|
* - `name`: TanStack Form compatible path (e.g., "[0]", "[0].owner", "tags[1]")
|
|
100
|
+
* - `component`: Suggested component type for rendering
|
|
101
|
+
* - `renderHint`: Hints for UI rendering strategy
|
|
23
102
|
* - `defaultValue`: Initial value for the form
|
|
24
103
|
* - `schema`: Zod schema for validation
|
|
25
104
|
* - Type-specific properties (options for variant, fields for record, etc.)
|
|
@@ -30,9 +109,9 @@ export * from "./types";
|
|
|
30
109
|
* @example
|
|
31
110
|
* ```typescript
|
|
32
111
|
* import { useForm } from '@tanstack/react-form'
|
|
33
|
-
* import {
|
|
112
|
+
* import { FieldVisitor } from '@ic-reactor/candid'
|
|
34
113
|
*
|
|
35
|
-
* const visitor = new
|
|
114
|
+
* const visitor = new FieldVisitor()
|
|
36
115
|
* const serviceMeta = service.accept(visitor, null)
|
|
37
116
|
* const methodMeta = serviceMeta["icrc1_transfer"]
|
|
38
117
|
*
|
|
@@ -52,7 +131,7 @@ export * from "./types";
|
|
|
52
131
|
* ))
|
|
53
132
|
* ```
|
|
54
133
|
*/
|
|
55
|
-
export class
|
|
134
|
+
export class FieldVisitor extends IDL.Visitor {
|
|
56
135
|
constructor() {
|
|
57
136
|
super(...arguments);
|
|
58
137
|
Object.defineProperty(this, "recursiveSchemas", {
|
|
@@ -141,7 +220,10 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
141
220
|
return {
|
|
142
221
|
type: "record",
|
|
143
222
|
label,
|
|
223
|
+
displayLabel: formatLabel(label),
|
|
144
224
|
name,
|
|
225
|
+
component: "record-container",
|
|
226
|
+
renderHint: COMPOUND_RENDER_HINT,
|
|
145
227
|
fields,
|
|
146
228
|
fieldMap,
|
|
147
229
|
defaultValue,
|
|
@@ -176,10 +258,31 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
176
258
|
}
|
|
177
259
|
return { [option]: optField.defaultValue };
|
|
178
260
|
};
|
|
261
|
+
// Helper to get field for a specific option
|
|
262
|
+
const getField = (option) => {
|
|
263
|
+
const optField = optionMap.get(option);
|
|
264
|
+
if (!optField) {
|
|
265
|
+
throw new Error(`Unknown variant option: ${option}`);
|
|
266
|
+
}
|
|
267
|
+
return optField;
|
|
268
|
+
};
|
|
269
|
+
// Helper to get currently selected option from a value
|
|
270
|
+
const getSelectedOption = (value) => {
|
|
271
|
+
const validKeys = Object.keys(value).filter((k) => options.includes(k));
|
|
272
|
+
return validKeys[0] ?? defaultOption;
|
|
273
|
+
};
|
|
274
|
+
// Helper to get selected field from a value
|
|
275
|
+
const getSelectedField = (value) => {
|
|
276
|
+
const selectedOption = getSelectedOption(value);
|
|
277
|
+
return getField(selectedOption);
|
|
278
|
+
};
|
|
179
279
|
return {
|
|
180
280
|
type: "variant",
|
|
181
281
|
label,
|
|
282
|
+
displayLabel: formatLabel(label),
|
|
182
283
|
name,
|
|
284
|
+
component: "variant-select",
|
|
285
|
+
renderHint: COMPOUND_RENDER_HINT,
|
|
183
286
|
fields,
|
|
184
287
|
options,
|
|
185
288
|
defaultOption,
|
|
@@ -187,6 +290,9 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
187
290
|
defaultValue,
|
|
188
291
|
schema,
|
|
189
292
|
getOptionDefault,
|
|
293
|
+
getField,
|
|
294
|
+
getSelectedOption,
|
|
295
|
+
getSelectedField,
|
|
190
296
|
candidType: "variant",
|
|
191
297
|
};
|
|
192
298
|
}
|
|
@@ -206,7 +312,10 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
206
312
|
return {
|
|
207
313
|
type: "tuple",
|
|
208
314
|
label,
|
|
315
|
+
displayLabel: formatLabel(label),
|
|
209
316
|
name,
|
|
317
|
+
component: "tuple-container",
|
|
318
|
+
renderHint: COMPOUND_RENDER_HINT,
|
|
210
319
|
fields,
|
|
211
320
|
defaultValue,
|
|
212
321
|
schema,
|
|
@@ -226,14 +335,22 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
226
335
|
]);
|
|
227
336
|
// Helper to get the inner default when enabling the optional
|
|
228
337
|
const getInnerDefault = () => innerField.defaultValue;
|
|
338
|
+
// Helper to check if a value represents an enabled optional
|
|
339
|
+
const isEnabled = (value) => {
|
|
340
|
+
return value !== null && typeof value !== "undefined";
|
|
341
|
+
};
|
|
229
342
|
return {
|
|
230
343
|
type: "optional",
|
|
231
344
|
label,
|
|
345
|
+
displayLabel: formatLabel(label),
|
|
232
346
|
name,
|
|
347
|
+
component: "optional-toggle",
|
|
348
|
+
renderHint: COMPOUND_RENDER_HINT,
|
|
233
349
|
innerField,
|
|
234
350
|
defaultValue: null,
|
|
235
351
|
schema,
|
|
236
352
|
getInnerDefault,
|
|
353
|
+
isEnabled,
|
|
237
354
|
candidType: "opt",
|
|
238
355
|
};
|
|
239
356
|
}
|
|
@@ -249,28 +366,51 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
249
366
|
z.array(z.number()),
|
|
250
367
|
z.instanceof(Uint8Array),
|
|
251
368
|
]);
|
|
369
|
+
const limits = { ...DEFAULT_BLOB_LIMITS };
|
|
252
370
|
return {
|
|
253
371
|
type: "blob",
|
|
254
372
|
label,
|
|
373
|
+
displayLabel: formatLabel(label),
|
|
255
374
|
name,
|
|
375
|
+
component: "blob-upload",
|
|
376
|
+
renderHint: FILE_RENDER_HINT,
|
|
256
377
|
itemField,
|
|
257
378
|
defaultValue: "",
|
|
258
379
|
schema,
|
|
259
380
|
acceptedFormats: ["hex", "base64", "file"],
|
|
381
|
+
limits,
|
|
382
|
+
normalizeHex,
|
|
383
|
+
validateInput: (value) => validateBlobInput(value, limits),
|
|
260
384
|
candidType: "blob",
|
|
261
385
|
};
|
|
262
386
|
}
|
|
263
387
|
const schema = z.array(itemField.schema);
|
|
264
388
|
// Helper to get a new item with default values
|
|
265
389
|
const getItemDefault = () => itemField.defaultValue;
|
|
390
|
+
// Helper to create an item field for a specific index
|
|
391
|
+
const createItemField = (index, overrides) => {
|
|
392
|
+
// Replace [0] in template with actual index
|
|
393
|
+
const itemName = name ? `${name}[${index}]` : `[${index}]`;
|
|
394
|
+
const itemLabel = overrides?.label ?? `Item ${index}`;
|
|
395
|
+
return {
|
|
396
|
+
...itemField,
|
|
397
|
+
name: itemName,
|
|
398
|
+
label: itemLabel,
|
|
399
|
+
displayLabel: formatLabel(itemLabel),
|
|
400
|
+
};
|
|
401
|
+
};
|
|
266
402
|
return {
|
|
267
403
|
type: "vector",
|
|
268
404
|
label,
|
|
405
|
+
displayLabel: formatLabel(label),
|
|
269
406
|
name,
|
|
407
|
+
component: "vector-list",
|
|
408
|
+
renderHint: COMPOUND_RENDER_HINT,
|
|
270
409
|
itemField,
|
|
271
410
|
defaultValue: [],
|
|
272
411
|
schema,
|
|
273
412
|
getItemDefault,
|
|
413
|
+
createItemField,
|
|
274
414
|
candidType: "vec",
|
|
275
415
|
};
|
|
276
416
|
}
|
|
@@ -292,7 +432,10 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
292
432
|
return {
|
|
293
433
|
type: "recursive",
|
|
294
434
|
label,
|
|
435
|
+
displayLabel: formatLabel(label),
|
|
295
436
|
name,
|
|
437
|
+
component: "recursive-lazy",
|
|
438
|
+
renderHint: COMPOUND_RENDER_HINT,
|
|
296
439
|
typeName,
|
|
297
440
|
extract,
|
|
298
441
|
defaultValue: undefined,
|
|
@@ -321,40 +464,62 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
321
464
|
}, {
|
|
322
465
|
message: "Invalid Principal format",
|
|
323
466
|
});
|
|
467
|
+
const inputProps = {
|
|
468
|
+
type: "text",
|
|
469
|
+
placeholder: "aaaaa-aa or full principal ID",
|
|
470
|
+
minLength: 7,
|
|
471
|
+
maxLength: 64,
|
|
472
|
+
spellCheck: false,
|
|
473
|
+
autoComplete: "off",
|
|
474
|
+
};
|
|
324
475
|
return {
|
|
325
476
|
type: "principal",
|
|
326
477
|
label,
|
|
478
|
+
displayLabel: formatLabel(label),
|
|
327
479
|
name: this.currentName(),
|
|
480
|
+
component: "principal-input",
|
|
481
|
+
renderHint: TEXT_RENDER_HINT,
|
|
328
482
|
defaultValue: "",
|
|
329
483
|
maxLength: 64,
|
|
330
484
|
minLength: 7,
|
|
331
485
|
schema,
|
|
486
|
+
inputProps,
|
|
332
487
|
candidType: "principal",
|
|
333
|
-
ui: {
|
|
334
|
-
placeholder: "aaaaa-aa or full principal ID",
|
|
335
|
-
},
|
|
336
488
|
};
|
|
337
489
|
}
|
|
338
490
|
visitText(_t, label) {
|
|
491
|
+
const inputProps = {
|
|
492
|
+
type: "text",
|
|
493
|
+
placeholder: "Enter text...",
|
|
494
|
+
spellCheck: true,
|
|
495
|
+
};
|
|
339
496
|
return {
|
|
340
497
|
type: "text",
|
|
341
498
|
label,
|
|
499
|
+
displayLabel: formatLabel(label),
|
|
342
500
|
name: this.currentName(),
|
|
501
|
+
component: "text-input",
|
|
502
|
+
renderHint: TEXT_RENDER_HINT,
|
|
343
503
|
defaultValue: "",
|
|
344
504
|
schema: z.string().min(1, "Required"),
|
|
505
|
+
inputProps,
|
|
345
506
|
candidType: "text",
|
|
346
|
-
ui: {
|
|
347
|
-
placeholder: "Enter text...",
|
|
348
|
-
},
|
|
349
507
|
};
|
|
350
508
|
}
|
|
351
509
|
visitBool(_t, label) {
|
|
510
|
+
const inputProps = {
|
|
511
|
+
type: "checkbox",
|
|
512
|
+
};
|
|
352
513
|
return {
|
|
353
514
|
type: "boolean",
|
|
354
515
|
label,
|
|
516
|
+
displayLabel: formatLabel(label),
|
|
355
517
|
name: this.currentName(),
|
|
518
|
+
component: "boolean-checkbox",
|
|
519
|
+
renderHint: CHECKBOX_RENDER_HINT,
|
|
356
520
|
defaultValue: false,
|
|
357
521
|
schema: z.boolean(),
|
|
522
|
+
inputProps,
|
|
358
523
|
candidType: "bool",
|
|
359
524
|
};
|
|
360
525
|
}
|
|
@@ -362,7 +527,13 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
362
527
|
return {
|
|
363
528
|
type: "null",
|
|
364
529
|
label,
|
|
530
|
+
displayLabel: formatLabel(label),
|
|
365
531
|
name: this.currentName(),
|
|
532
|
+
component: "null-hidden",
|
|
533
|
+
renderHint: {
|
|
534
|
+
isCompound: false,
|
|
535
|
+
isPrimitive: true,
|
|
536
|
+
},
|
|
366
537
|
defaultValue: null,
|
|
367
538
|
schema: z.null(),
|
|
368
539
|
candidType: "null",
|
|
@@ -387,29 +558,47 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
387
558
|
const isBigInt = !options.isFloat && (!options.bits || options.bits > 32);
|
|
388
559
|
const type = isBigInt ? "text" : "number";
|
|
389
560
|
if (type === "text") {
|
|
561
|
+
const inputProps = {
|
|
562
|
+
type: "text",
|
|
563
|
+
placeholder: options.unsigned ? "e.g. 100000" : "e.g. -100000",
|
|
564
|
+
inputMode: "numeric",
|
|
565
|
+
pattern: options.unsigned ? "\\d+" : "-?\\d+",
|
|
566
|
+
spellCheck: false,
|
|
567
|
+
autoComplete: "off",
|
|
568
|
+
};
|
|
390
569
|
return {
|
|
391
570
|
type: "text",
|
|
392
571
|
label,
|
|
572
|
+
displayLabel: formatLabel(label),
|
|
393
573
|
name: this.currentName(),
|
|
574
|
+
component: "text-input",
|
|
575
|
+
renderHint: TEXT_RENDER_HINT,
|
|
394
576
|
defaultValue: "",
|
|
395
577
|
candidType,
|
|
396
578
|
schema,
|
|
397
|
-
|
|
398
|
-
placeholder: options.unsigned ? "e.g. 100000" : "e.g. -100000",
|
|
399
|
-
},
|
|
579
|
+
inputProps,
|
|
400
580
|
};
|
|
401
581
|
}
|
|
582
|
+
const inputProps = {
|
|
583
|
+
type: "number",
|
|
584
|
+
placeholder: options.isFloat ? "0.0" : "0",
|
|
585
|
+
inputMode: options.isFloat ? "decimal" : "numeric",
|
|
586
|
+
min: options.min,
|
|
587
|
+
max: options.max,
|
|
588
|
+
step: options.isFloat ? "any" : "1",
|
|
589
|
+
};
|
|
402
590
|
return {
|
|
403
591
|
type: "number",
|
|
404
592
|
label,
|
|
593
|
+
displayLabel: formatLabel(label),
|
|
405
594
|
name: this.currentName(),
|
|
595
|
+
component: "number-input",
|
|
596
|
+
renderHint: NUMBER_RENDER_HINT,
|
|
406
597
|
defaultValue: "",
|
|
407
598
|
candidType,
|
|
408
599
|
schema: schema,
|
|
600
|
+
inputProps,
|
|
409
601
|
...options,
|
|
410
|
-
ui: {
|
|
411
|
-
placeholder: options.isFloat ? "0.0" : "0",
|
|
412
|
-
},
|
|
413
602
|
};
|
|
414
603
|
}
|
|
415
604
|
visitInt(_t, label) {
|
|
@@ -460,7 +649,13 @@ export class ArgumentFieldVisitor extends IDL.Visitor {
|
|
|
460
649
|
return {
|
|
461
650
|
type: "unknown",
|
|
462
651
|
label,
|
|
652
|
+
displayLabel: formatLabel(label),
|
|
463
653
|
name: this.currentName(),
|
|
654
|
+
component: "unknown-fallback",
|
|
655
|
+
renderHint: {
|
|
656
|
+
isCompound: false,
|
|
657
|
+
isPrimitive: false,
|
|
658
|
+
},
|
|
464
659
|
defaultValue: undefined,
|
|
465
660
|
schema: z.any(),
|
|
466
661
|
};
|