@ic-reactor/candid 3.0.12-beta.0 → 3.0.14-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/README.md +28 -0
- 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 +19 -6
- package/dist/visitor/arguments/index.d.ts.map +1 -1
- package/dist/visitor/arguments/index.js +343 -24
- package/dist/visitor/arguments/index.js.map +1 -1
- package/dist/visitor/arguments/types.d.ts +183 -178
- 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/dist/visitor/returns/types.d.ts +3 -4
- package/dist/visitor/returns/types.d.ts.map +1 -1
- package/dist/visitor/types.d.ts +14 -0
- package/dist/visitor/types.d.ts.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 +443 -23
- package/src/visitor/arguments/index.ts +410 -41
- package/src/visitor/arguments/schema.test.ts +117 -7
- package/src/visitor/arguments/types.ts +284 -284
- package/src/visitor/returns/types.ts +4 -27
- package/src/visitor/types.ts +45 -0
- package/src/visitor/arguments/README.md +0 -230
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@ Lightweight adapter for fetching and parsing Candid definitions from Internet Co
|
|
|
9
9
|
- **Local Parsing**: Use the optional WASM-based parser for fast, offline Candid compilation
|
|
10
10
|
- **Remote Fallback**: Falls back to the didjs canister for Candid-to-JavaScript compilation
|
|
11
11
|
- **Dynamic Reactor**: Includes `CandidReactor` for dynamic IDL fetching and interaction
|
|
12
|
+
- **Dynamic Forms**: Generate rich form metadata with validation schemas using `FieldVisitor`
|
|
12
13
|
- **Lightweight**: Uses raw `agent.query` calls - no Actor overhead
|
|
13
14
|
- **ClientManager Compatible**: Seamlessly integrates with `@ic-reactor/core`
|
|
14
15
|
|
|
@@ -171,6 +172,33 @@ const cachedBalance = await reactor.fetchQueryDynamic({
|
|
|
171
172
|
})
|
|
172
173
|
```
|
|
173
174
|
|
|
175
|
+
### FieldVisitor (Dynamic Forms)
|
|
176
|
+
|
|
177
|
+
Generate type-safe, enhanced metadata for dynamic forms from Candid definitions.
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { FieldVisitor } from "@ic-reactor/candid"
|
|
181
|
+
|
|
182
|
+
const visitor = new FieldVisitor()
|
|
183
|
+
const serviceMeta = service.accept(visitor, null)
|
|
184
|
+
|
|
185
|
+
// Access method metadata
|
|
186
|
+
const methodMeta = serviceMeta["icrc1_transfer"]
|
|
187
|
+
|
|
188
|
+
// Detected field formats detected automatically
|
|
189
|
+
const amountField = methodMeta.fields[1] // e.g. "amount"
|
|
190
|
+
console.log(amountField.format) // "token"
|
|
191
|
+
console.log(amountField.inputProps)
|
|
192
|
+
// { type: "text", inputMode: "numeric", pattern: "\\d+", ... }
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Features:**
|
|
196
|
+
|
|
197
|
+
- **Auto-Format Detection**: Identifies `email`, `url`, `uuid`, `timestamp`, `cycle`, `principal`, etc. based on labels.
|
|
198
|
+
- **Enhanced Schemas**: Generates Zod schemas with specific validation (e.g., `z.string().email()`).
|
|
199
|
+
- **Input Props**: Provides ready-to-use HTML attributes (`type="email"`, `pattern`, `min`, `max`) for primitive fields.
|
|
200
|
+
- **Component Hints**: Suggests UI components (`variant-select`, `vector-list`, `blob-upload`).
|
|
201
|
+
|
|
174
202
|
### Fetch Raw Candid Source
|
|
175
203
|
|
|
176
204
|
```typescript
|
|
@@ -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, FieldNode, 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: FieldNode, type: T): field is FieldByType<T>;
|
|
21
|
+
/** Check if a field is a compound type (contains other fields) */
|
|
22
|
+
export declare function isCompoundField(field: FieldNode): field is CompoundField;
|
|
23
|
+
/** Check if a field is a primitive type */
|
|
24
|
+
export declare function isPrimitiveField(field: FieldNode): field is PrimitiveField;
|
|
25
|
+
/** Check if a field has children (for iteration) */
|
|
26
|
+
export declare function hasChildFields(field: FieldNode): 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,SAAS,EACT,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,SAAS,EAChB,IAAI,EAAE,CAAC,GACN,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEzB;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,aAAa,CASxE;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,cAAc,CAE1E;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,GACf,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,KAAgB,EAChB,IAAO;IAEP,OAAO,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;AAC5B,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,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,KAAgB;IAC/C,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,KAAgB;IAEhB,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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FieldNode, RecordField, VariantField, TupleField, OptionalField, VectorField, BlobField, RecursiveField, PrincipalField, NumberField, BooleanField, NullField, TextField, UnknownField, ArgumentsMeta, ArgumentsServiceMeta } from "./types";
|
|
2
2
|
import { IDL } from "@icp-sdk/core/candid";
|
|
3
3
|
import { BaseActor, FunctionName } from "@ic-reactor/core";
|
|
4
4
|
import * as z from "zod";
|
|
5
5
|
export * from "./types";
|
|
6
|
+
export * from "./helpers";
|
|
7
|
+
export { checkTextFormat, checkNumberFormat } from "../constants";
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
9
|
+
* FieldVisitor generates metadata for form input fields from Candid IDL types.
|
|
8
10
|
*
|
|
9
11
|
* ## Design Principles
|
|
10
12
|
*
|
|
@@ -18,8 +20,11 @@ export * from "./types";
|
|
|
18
20
|
*
|
|
19
21
|
* Each field has:
|
|
20
22
|
* - `type`: The field type (record, variant, text, number, etc.)
|
|
21
|
-
* - `label`:
|
|
23
|
+
* - `label`: Raw label from Candid
|
|
24
|
+
* - `displayLabel`: Human-readable formatted label
|
|
22
25
|
* - `name`: TanStack Form compatible path (e.g., "[0]", "[0].owner", "tags[1]")
|
|
26
|
+
* - `component`: Suggested component type for rendering
|
|
27
|
+
* - `renderHint`: Hints for UI rendering strategy
|
|
23
28
|
* - `defaultValue`: Initial value for the form
|
|
24
29
|
* - `schema`: Zod schema for validation
|
|
25
30
|
* - Type-specific properties (options for variant, fields for record, etc.)
|
|
@@ -30,9 +35,9 @@ export * from "./types";
|
|
|
30
35
|
* @example
|
|
31
36
|
* ```typescript
|
|
32
37
|
* import { useForm } from '@tanstack/react-form'
|
|
33
|
-
* import {
|
|
38
|
+
* import { FieldVisitor } from '@ic-reactor/candid'
|
|
34
39
|
*
|
|
35
|
-
* const visitor = new
|
|
40
|
+
* const visitor = new FieldVisitor()
|
|
36
41
|
* const serviceMeta = service.accept(visitor, null)
|
|
37
42
|
* const methodMeta = serviceMeta["icrc1_transfer"]
|
|
38
43
|
*
|
|
@@ -52,7 +57,7 @@ export * from "./types";
|
|
|
52
57
|
* ))
|
|
53
58
|
* ```
|
|
54
59
|
*/
|
|
55
|
-
export declare class
|
|
60
|
+
export declare class FieldVisitor<A = BaseActor> extends IDL.Visitor<string, FieldNode | ArgumentsMeta<A> | ArgumentsServiceMeta<A>> {
|
|
56
61
|
recursiveSchemas: Map<string, z.ZodTypeAny>;
|
|
57
62
|
private nameStack;
|
|
58
63
|
/**
|
|
@@ -75,6 +80,14 @@ export declare class ArgumentFieldVisitor<A = BaseActor> extends IDL.Visitor<str
|
|
|
75
80
|
visitRec<T>(_t: IDL.RecClass<T>, ty: IDL.ConstructType<T>, label: string): RecursiveField;
|
|
76
81
|
visitPrincipal(_t: IDL.PrincipalClass, label: string): PrincipalField;
|
|
77
82
|
visitText(_t: IDL.TextClass, label: string): TextField;
|
|
83
|
+
/**
|
|
84
|
+
* Generate format-specific input props for text fields.
|
|
85
|
+
*/
|
|
86
|
+
private getTextInputProps;
|
|
87
|
+
/**
|
|
88
|
+
* Generate format-specific zod schema for text fields.
|
|
89
|
+
*/
|
|
90
|
+
private getTextSchema;
|
|
78
91
|
visitBool(_t: IDL.BoolClass, label: string): BooleanField;
|
|
79
92
|
visitNull(_t: IDL.NullClass, label: string): NullField;
|
|
80
93
|
private visitNumberType;
|
|
@@ -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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"}
|