@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.
@@ -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,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,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
+ {"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 { ArgumentFieldVisitor, } from "./visitor/arguments";
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 ArgumentFieldVisitor()
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,oBAAoB,GAGrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAGL,kBAAkB,GAEnB,MAAM,mBAAmB,CAAA;AAyB1B,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;IAC7E;;;OAGG;IACI,eAAe,CACpB,UAAa;QAEb,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC;IAED;;;OAGG;IACI,aAAa,CAClB,UAAa;QAEb,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACI,kBAAkB;QACvB,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,KAAK,CAAC,iCAAiC,UAAU,GAAG,CAAC,CAAA;QACjE,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;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;;AA/HD,sCAAsC;AACvB;;;;WAAa,IAAI,oBAAoB,EAAE;EAA7B,CAA6B;AACvC;;;;WAAgB,IAAI,kBAAkB,EAAE;EAA3B,CAA2B"}
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
- * ArgumentFieldVisitor generates metadata for form input fields from Candid IDL types.
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`: Human-readable label from Candid
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 { ArgumentFieldVisitor } from '@ic-reactor/candid'
36
+ * import { FieldVisitor } from '@ic-reactor/candid'
34
37
  *
35
- * const visitor = new ArgumentFieldVisitor()
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 ArgumentFieldVisitor<A = BaseActor> extends IDL.Visitor<string, Field | ArgumentsMeta<A> | ArgumentsServiceMeta<A>> {
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":"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"}
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
- * ArgumentFieldVisitor generates metadata for form input fields from Candid IDL types.
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`: Human-readable label from Candid
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 { ArgumentFieldVisitor } from '@ic-reactor/candid'
112
+ * import { FieldVisitor } from '@ic-reactor/candid'
34
113
  *
35
- * const visitor = new ArgumentFieldVisitor()
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 ArgumentFieldVisitor extends IDL.Visitor {
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
- ui: {
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
  };