@ic-reactor/candid 3.0.2-beta.0 → 3.0.2

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.
Files changed (83) hide show
  1. package/README.md +33 -1
  2. package/dist/adapter.js +2 -1
  3. package/dist/adapter.js.map +1 -1
  4. package/dist/display-reactor.d.ts +4 -13
  5. package/dist/display-reactor.d.ts.map +1 -1
  6. package/dist/display-reactor.js +22 -8
  7. package/dist/display-reactor.js.map +1 -1
  8. package/dist/index.d.ts +3 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +3 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/metadata-display-reactor.d.ts +108 -0
  13. package/dist/metadata-display-reactor.d.ts.map +1 -0
  14. package/dist/metadata-display-reactor.js +141 -0
  15. package/dist/metadata-display-reactor.js.map +1 -0
  16. package/dist/reactor.d.ts +1 -1
  17. package/dist/reactor.d.ts.map +1 -1
  18. package/dist/reactor.js +10 -6
  19. package/dist/reactor.js.map +1 -1
  20. package/dist/types.d.ts +38 -7
  21. package/dist/types.d.ts.map +1 -1
  22. package/dist/utils.d.ts +4 -4
  23. package/dist/utils.d.ts.map +1 -1
  24. package/dist/utils.js +33 -10
  25. package/dist/utils.js.map +1 -1
  26. package/dist/visitor/arguments/helpers.d.ts +55 -0
  27. package/dist/visitor/arguments/helpers.d.ts.map +1 -0
  28. package/dist/visitor/arguments/helpers.js +123 -0
  29. package/dist/visitor/arguments/helpers.js.map +1 -0
  30. package/dist/visitor/arguments/index.d.ts +101 -0
  31. package/dist/visitor/arguments/index.d.ts.map +1 -0
  32. package/dist/visitor/arguments/index.js +780 -0
  33. package/dist/visitor/arguments/index.js.map +1 -0
  34. package/dist/visitor/arguments/types.d.ts +270 -0
  35. package/dist/visitor/arguments/types.d.ts.map +1 -0
  36. package/dist/visitor/arguments/types.js +26 -0
  37. package/dist/visitor/arguments/types.js.map +1 -0
  38. package/dist/visitor/constants.d.ts +4 -0
  39. package/dist/visitor/constants.d.ts.map +1 -0
  40. package/dist/visitor/constants.js +73 -0
  41. package/dist/visitor/constants.js.map +1 -0
  42. package/dist/visitor/helpers.d.ts +30 -0
  43. package/dist/visitor/helpers.d.ts.map +1 -0
  44. package/dist/visitor/helpers.js +204 -0
  45. package/dist/visitor/helpers.js.map +1 -0
  46. package/dist/visitor/index.d.ts +5 -0
  47. package/dist/visitor/index.d.ts.map +1 -0
  48. package/dist/visitor/index.js +5 -0
  49. package/dist/visitor/index.js.map +1 -0
  50. package/dist/visitor/returns/index.d.ts +38 -0
  51. package/dist/visitor/returns/index.d.ts.map +1 -0
  52. package/dist/visitor/returns/index.js +460 -0
  53. package/dist/visitor/returns/index.js.map +1 -0
  54. package/dist/visitor/returns/types.d.ts +202 -0
  55. package/dist/visitor/returns/types.d.ts.map +1 -0
  56. package/dist/visitor/returns/types.js +2 -0
  57. package/dist/visitor/returns/types.js.map +1 -0
  58. package/dist/visitor/types.d.ts +19 -0
  59. package/dist/visitor/types.d.ts.map +1 -0
  60. package/dist/visitor/types.js +2 -0
  61. package/dist/visitor/types.js.map +1 -0
  62. package/package.json +16 -7
  63. package/src/adapter.ts +446 -0
  64. package/src/constants.ts +11 -0
  65. package/src/display-reactor.ts +337 -0
  66. package/src/index.ts +8 -0
  67. package/src/metadata-display-reactor.ts +230 -0
  68. package/src/reactor.ts +199 -0
  69. package/src/types.ts +127 -0
  70. package/src/utils.ts +60 -0
  71. package/src/visitor/arguments/helpers.ts +153 -0
  72. package/src/visitor/arguments/index.test.ts +1439 -0
  73. package/src/visitor/arguments/index.ts +981 -0
  74. package/src/visitor/arguments/schema.test.ts +324 -0
  75. package/src/visitor/arguments/types.ts +387 -0
  76. package/src/visitor/constants.ts +76 -0
  77. package/src/visitor/helpers.test.ts +274 -0
  78. package/src/visitor/helpers.ts +223 -0
  79. package/src/visitor/index.ts +4 -0
  80. package/src/visitor/returns/index.test.ts +2377 -0
  81. package/src/visitor/returns/index.ts +658 -0
  82. package/src/visitor/returns/types.ts +302 -0
  83. package/src/visitor/types.ts +75 -0
package/dist/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { HttpAgent, Identity } from "@icp-sdk/core/agent";
2
2
  import type { IDL } from "@icp-sdk/core/candid";
3
- import type { BaseActor, CanisterId, ReactorParameters } from "@ic-reactor/core";
3
+ import type { BaseActor, CanisterId, DisplayReactorParameters, ReactorParameters } from "@ic-reactor/core";
4
+ import type { CandidAdapter } from "./adapter";
4
5
  export interface DynamicMethodOptions {
5
6
  /** The method name to register. */
6
7
  functionName: string;
@@ -11,15 +12,45 @@ export interface DynamicMethodOptions {
11
12
  */
12
13
  candid: string;
13
14
  }
14
- export interface CandidReactorParameters<A = BaseActor> extends Omit<ReactorParameters<A>, "idlFactory" | "actor"> {
15
+ export interface CandidReactorParameters extends Omit<ReactorParameters, "idlFactory"> {
15
16
  /** The canister ID. */
16
- canisterId: CanisterId;
17
- /** The Candid source code. */
17
+ canisterId?: CanisterId;
18
+ /** The Candid source code. If not provided, the canister's Candid will be fetched. */
18
19
  candid?: string;
19
20
  /** The IDL interface factory. */
20
- idlFactory?: IDL.InterfaceFactory;
21
- /** The actor instance. */
22
- actor?: A;
21
+ idlFactory?: (IDL: any) => any;
22
+ /** The Candid adapter. */
23
+ adapter?: CandidAdapter;
24
+ }
25
+ export interface CandidDisplayReactorParameters<A = BaseActor> extends Omit<DisplayReactorParameters<A>, "idlFactory"> {
26
+ /** The canister ID. */
27
+ canisterId?: CanisterId;
28
+ /** The Candid source code. If not provided, the canister's Candid will be fetched. */
29
+ candid?: string;
30
+ /** The IDL interface factory. */
31
+ idlFactory?: (IDL: any) => any;
32
+ /** The Candid adapter. */
33
+ adapter?: CandidAdapter;
34
+ /**
35
+ * An IDL.FuncClass to register as a single-method service.
36
+ * Use this to create a reactor for a funcRecord callback.
37
+ * When provided, the reactor is ready to use immediately (no `initialize()` needed).
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const archiveReactor = new CandidDisplayReactor({
42
+ * canisterId: archived.canisterId,
43
+ * clientManager,
44
+ * funcClass: { methodName: "get_blocks", func: archiveFuncClass },
45
+ * })
46
+ * ```
47
+ */
48
+ funcClass?: {
49
+ /** The method name to register */
50
+ methodName: string;
51
+ /** The IDL.FuncClass describing the function signature */
52
+ func: import("@icp-sdk/core/candid").IDL.FuncClass;
53
+ };
23
54
  }
24
55
  /**
25
56
  * Minimal interface for ClientManager that CandidAdapter depends on.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEhF,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,SAAS,CAAE,SAAQ,IAAI,CAClE,iBAAiB,CAAC,CAAC,CAAC,EACpB,YAAY,GAAG,OAAO,CACvB;IACC,uBAAuB;IACvB,UAAU,EAAE,UAAU,CAAA;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iCAAiC;IACjC,UAAU,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAA;IACjC,0BAA0B;IAC1B,KAAK,CAAC,EAAE,CAAC,CAAA;CACV;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,KAAK,EAAE,SAAS,CAAA;IAChB,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kEAAkE;IAClE,aAAa,EAAE,mBAAmB,CAAA;IAClC,gFAAgF;IAChF,eAAe,CAAC,EAAE,UAAU,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAA;IAChC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,OAAO,GAAG,CAAA;KAAE,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B;;;;OAIG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IACrC;;;;OAIG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CACnD,iBAAiB,EACjB,YAAY,CACb;IACC,uBAAuB;IACvB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iCAAiC;IACjC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAA;IAC9B,0BAA0B;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB;AAMD,MAAM,WAAW,8BAA8B,CAAC,CAAC,GAAG,SAAS,CAAE,SAAQ,IAAI,CACzE,wBAAwB,CAAC,CAAC,CAAC,EAC3B,YAAY,CACb;IACC,uBAAuB;IACvB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iCAAiC;IACjC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAA;IAC9B,0BAA0B;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE;QACV,kCAAkC;QAClC,UAAU,EAAE,MAAM,CAAA;QAClB,0DAA0D;QAC1D,IAAI,EAAE,OAAO,sBAAsB,EAAE,GAAG,CAAC,SAAS,CAAA;KACnD,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,KAAK,EAAE,SAAS,CAAA;IAChB,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kEAAkE;IAClE,aAAa,EAAE,mBAAmB,CAAA;IAClC,gFAAgF;IAChF,eAAe,CAAC,EAAE,UAAU,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAA;IAChC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,OAAO,GAAG,CAAA;KAAE,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B;;;;OAIG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IACrC;;;;OAIG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3C"}
package/dist/utils.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import type { CandidDefinition } from "./types";
2
- /**
3
- * A no-operation function placeholder.
4
- */
5
- export declare const noop: () => void;
6
2
  /**
7
3
  * Imports and evaluates a Candid definition from JavaScript code.
8
4
  *
5
+ * This function evaluates JavaScript code in a controlled manner to extract
6
+ * the idlFactory and init exports. The evaluation is done using Function constructor
7
+ * which is safer than dynamic imports with data URLs and more CSP-friendly.
8
+ *
9
9
  * @param candidJs - The JavaScript code containing the Candid definition.
10
10
  * @returns A promise that resolves to the CandidDefinition.
11
11
  * @throws Error if the import fails.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,IAAI,YAAW,CAAA;AAE5B;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAgB3B"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAG/C;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CA2C3B"}
package/dist/utils.js CHANGED
@@ -1,23 +1,46 @@
1
- /**
2
- * A no-operation function placeholder.
3
- */
4
- export const noop = () => { };
1
+ import { IDL } from "@icp-sdk/core/candid";
5
2
  /**
6
3
  * Imports and evaluates a Candid definition from JavaScript code.
7
4
  *
5
+ * This function evaluates JavaScript code in a controlled manner to extract
6
+ * the idlFactory and init exports. The evaluation is done using Function constructor
7
+ * which is safer than dynamic imports with data URLs and more CSP-friendly.
8
+ *
8
9
  * @param candidJs - The JavaScript code containing the Candid definition.
9
10
  * @returns A promise that resolves to the CandidDefinition.
10
11
  * @throws Error if the import fails.
11
12
  */
12
13
  export async function importCandidDefinition(candidJs) {
13
14
  try {
14
- // Create a data URL with the JavaScript code
15
- const dataUri = "data:text/javascript;charset=utf-8," + encodeURIComponent(candidJs);
16
- // Dynamically import the module
17
- const module = await import(/* webpackIgnore: true */ dataUri);
15
+ // Create a module exports object
16
+ const exports = {};
17
+ // Transform ES6 export statements to assignments
18
+ // This is safe because we're only transforming the syntax pattern,
19
+ // not evaluating arbitrary code
20
+ const transformedJs = candidJs
21
+ // Replace 'export const name = value' with 'const name = value; exports.name = name'
22
+ .replace(/export\s+const\s+(\w+)\s*=/g, "const $1 =")
23
+ // Replace 'export function name' with 'function name'
24
+ .replace(/export\s+function\s+(\w+)/g, "function $1");
25
+ // Create a safe evaluation context with necessary globals
26
+ // We provide IDL from the trusted @icp-sdk/core/candid package
27
+ const evalFunction = new Function("exports", "IDL", `
28
+ ${transformedJs}
29
+
30
+ // Capture exports
31
+ if (typeof idlFactory !== 'undefined') {
32
+ exports.idlFactory = idlFactory;
33
+ }
34
+ if (typeof init !== 'undefined') {
35
+ exports.init = init;
36
+ }
37
+ return exports;
38
+ `);
39
+ // Execute the function with the exports object and IDL
40
+ const result = evalFunction(exports, IDL);
18
41
  return {
19
- idlFactory: module.idlFactory,
20
- init: module.init,
42
+ idlFactory: result.idlFactory,
43
+ init: result.init,
21
44
  };
22
45
  }
23
46
  catch (error) {
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;AAE5B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB;IAEhB,IAAI,CAAC;QACH,6CAA6C;QAC7C,MAAM,OAAO,GACX,qCAAqC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QAEtE,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAA;QAE9D,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAA;IACjE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAgB;IAEhB,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,OAAO,GAA4B,EAAE,CAAA;QAE3C,iDAAiD;QACjD,mEAAmE;QACnE,gCAAgC;QAChC,MAAM,aAAa,GAAG,QAAQ;YAC5B,qFAAqF;aACpF,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC;YACrD,sDAAsD;aACrD,OAAO,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAA;QAEvD,0DAA0D;QAC1D,+DAA+D;QAC/D,MAAM,YAAY,GAAG,IAAI,QAAQ,CAC/B,SAAS,EACT,KAAK,EACL;QACE,aAAa;;;;;;;;;;OAUd,CACF,CAAA;QAED,uDAAuD;QACvD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAEzC,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,UAA4C;YAC/D,IAAI,EAAE,MAAM,CAAC,IAAgC;SAC9C,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAA;IACjE,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { VisitorDataType, 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: FieldNode }) {
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 VisitorDataType>(field: FieldNode, type: T): field is FieldByType<T>;
21
+ /**
22
+ * Check if a field is a compound type (contains other fields).
23
+ * Compound types: record, variant, tuple, optional, vector, recursive
24
+ */
25
+ export declare function isCompoundField(field: FieldNode): field is CompoundField;
26
+ /**
27
+ * Check if a field is a primitive type.
28
+ * Primitive types: principal, number, text, boolean, null
29
+ */
30
+ export declare function isPrimitiveField(field: FieldNode): field is PrimitiveField;
31
+ /**
32
+ * Check if a field has child fields array (for iteration).
33
+ * Applies to: record (fields), tuple (fields)
34
+ */
35
+ export declare function hasChildFields(field: FieldNode): field is RecordField | TupleField;
36
+ /**
37
+ * Check if a field has variant options (for iteration).
38
+ * Applies to: variant (options)
39
+ */
40
+ export declare function hasOptions(field: FieldNode): field is VariantField;
41
+ /**
42
+ * Format a raw Candid label into a human-readable display label.
43
+ * Handles common patterns like "__arg0", "_0_", "snake_case", etc.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * formatLabel("__arg0") // "Arg 0"
48
+ * formatLabel("_0_") // "Item 0"
49
+ * formatLabel("created_at") // "Created At"
50
+ * formatLabel("userAddress") // "User Address"
51
+ * formatLabel("__ret0") // "Result 0"
52
+ * ```
53
+ */
54
+ export declare function formatLabel(label: string): string;
55
+ //# 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,eAAe,EACf,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,YAAY,EACb,MAAM,SAAS,CAAA;AAMhB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,EACnD,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,CAAC,GACN,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,aAAa,CASxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,cAAc,CAE1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,GACf,KAAK,IAAI,WAAW,GAAG,UAAU,CAMnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,YAAY,CAMlE;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8CjD"}
@@ -0,0 +1,123 @@
1
+ // ════════════════════════════════════════════════════════════════════════════
2
+ // Type Guards
3
+ // ════════════════════════════════════════════════════════════════════════════
4
+ /**
5
+ * Type guard for checking specific field types.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * function FieldInput({ field }: { field: FieldNode }) {
10
+ * if (isFieldType(field, 'record')) {
11
+ * // field is now typed as RecordField
12
+ * return <RecordInput field={field} />
13
+ * }
14
+ * if (isFieldType(field, 'text')) {
15
+ * // field is now typed as TextField
16
+ * return <TextInput field={field} />
17
+ * }
18
+ * // ...
19
+ * }
20
+ * ```
21
+ */
22
+ export function isFieldType(field, type) {
23
+ return field.type === type;
24
+ }
25
+ /**
26
+ * Check if a field is a compound type (contains other fields).
27
+ * Compound types: record, variant, tuple, optional, vector, recursive
28
+ */
29
+ export function isCompoundField(field) {
30
+ return [
31
+ "record",
32
+ "variant",
33
+ "tuple",
34
+ "optional",
35
+ "vector",
36
+ "recursive",
37
+ ].includes(field.type);
38
+ }
39
+ /**
40
+ * Check if a field is a primitive type.
41
+ * Primitive types: principal, number, text, boolean, null
42
+ */
43
+ export function isPrimitiveField(field) {
44
+ return ["principal", "number", "text", "boolean", "null"].includes(field.type);
45
+ }
46
+ /**
47
+ * Check if a field has child fields array (for iteration).
48
+ * Applies to: record (fields), tuple (fields)
49
+ */
50
+ export function hasChildFields(field) {
51
+ return ((field.type === "record" || field.type === "tuple") &&
52
+ "fields" in field &&
53
+ Array.isArray(field.fields));
54
+ }
55
+ /**
56
+ * Check if a field has variant options (for iteration).
57
+ * Applies to: variant (options)
58
+ */
59
+ export function hasOptions(field) {
60
+ return (field.type === "variant" &&
61
+ "options" in field &&
62
+ Array.isArray(field.options));
63
+ }
64
+ // ════════════════════════════════════════════════════════════════════════════
65
+ // Label Formatting Utilities
66
+ // ════════════════════════════════════════════════════════════════════════════
67
+ /**
68
+ * Format a raw Candid label into a human-readable display label.
69
+ * Handles common patterns like "__arg0", "_0_", "snake_case", etc.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * formatLabel("__arg0") // "Arg 0"
74
+ * formatLabel("_0_") // "Item 0"
75
+ * formatLabel("created_at") // "Created At"
76
+ * formatLabel("userAddress") // "User Address"
77
+ * formatLabel("__ret0") // "Result 0"
78
+ * ```
79
+ */
80
+ export function formatLabel(label) {
81
+ // Handle argument labels: __arg0 -> Arg 0
82
+ if (label.startsWith("__arg")) {
83
+ const num = label.slice(5);
84
+ return `Arg ${num}`;
85
+ }
86
+ // Handle return labels: __ret0 -> Result 0
87
+ if (label.startsWith("__ret")) {
88
+ const num = label.slice(5);
89
+ return `Result ${num}`;
90
+ }
91
+ // Handle tuple index labels: _0_ -> Item 0
92
+ if (/^_\d+_$/.test(label)) {
93
+ const num = label.slice(1, -1);
94
+ return `Item ${num}`;
95
+ }
96
+ // Handle simple index labels: _0 -> Item 0
97
+ if (/^_\d+$/.test(label)) {
98
+ const num = label.slice(1);
99
+ return `Item ${num}`;
100
+ }
101
+ // Handle item labels for vectors: label_item -> Item
102
+ if (label.endsWith("_item")) {
103
+ return "Item";
104
+ }
105
+ // Convert snake_case or just clean up underscores
106
+ // and capitalize each word
107
+ const trimmed = (() => {
108
+ let start = 0;
109
+ let end = label.length;
110
+ while (start < end && label[start] === "_")
111
+ start++;
112
+ while (end > start && label[end - 1] === "_")
113
+ end--;
114
+ return label.slice(start, end);
115
+ })();
116
+ return trimmed
117
+ .replace(/_/g, " ") // Replace underscores with spaces
118
+ .replace(/([a-z])([A-Z])/g, "$1 $2") // Add space before capitals (camelCase)
119
+ .split(" ")
120
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
121
+ .join(" ");
122
+ }
123
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/visitor/arguments/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { FieldNode, RecordField, VariantField, TupleField, OptionalField, VectorField, BlobField, RecursiveField, PrincipalField, NumberField, BooleanField, NullField, TextField, UnknownField, ArgumentsMeta, ArgumentsServiceMeta } from "./types";
2
+ import { IDL } from "@icp-sdk/core/candid";
3
+ import { BaseActor, FunctionName } from "@ic-reactor/core";
4
+ import * as z from "zod";
5
+ export * from "./types";
6
+ export * from "./helpers";
7
+ export { checkTextFormat, checkNumberFormat } from "../constants";
8
+ /**
9
+ * FieldVisitor generates metadata for form input fields from Candid IDL types.
10
+ *
11
+ * ## Design Principles
12
+ *
13
+ * 1. **Works with raw IDL types** - generates metadata at initialization time
14
+ * 2. **No value dependencies** - metadata is independent of actual values
15
+ * 3. **Form-framework agnostic** - output can be used with TanStack, React Hook Form, etc.
16
+ * 4. **Efficient** - single traversal, no runtime type checking
17
+ * 5. **TanStack Form optimized** - name paths compatible with TanStack Form patterns
18
+ *
19
+ * ## Output Structure
20
+ *
21
+ * Each field has:
22
+ * - `type`: The field type (record, variant, text, number, etc.)
23
+ * - `label`: Raw label from Candid
24
+ * - `displayLabel`: Human-readable formatted label
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
28
+ * - `defaultValue`: Initial value for the form
29
+ * - `schema`: Zod schema for validation
30
+ * - Type-specific properties (options for variant, fields for record, etc.)
31
+ * - Helper methods for dynamic forms (getOptionDefault, getItemDefault, etc.)
32
+ *
33
+ * ## Usage with TanStack Form
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * import { useForm } from '@tanstack/react-form'
38
+ * import { FieldVisitor } from '@ic-reactor/candid'
39
+ *
40
+ * const visitor = new FieldVisitor()
41
+ * const serviceMeta = service.accept(visitor, null)
42
+ * const methodMeta = serviceMeta["icrc1_transfer"]
43
+ *
44
+ * const form = useForm({
45
+ * defaultValues: methodMeta.defaultValue,
46
+ * validators: { onBlur: methodMeta.schema },
47
+ * onSubmit: async ({ value }) => {
48
+ * await actor.icrc1_transfer(...value)
49
+ * }
50
+ * })
51
+ *
52
+ * // Render fields dynamically
53
+ * methodMeta.fields.map((field, index) => (
54
+ * <form.Field key={index} name={field.name}>
55
+ * {(fieldApi) => <DynamicInput field={field} fieldApi={fieldApi} />}
56
+ * </form.Field>
57
+ * ))
58
+ * ```
59
+ */
60
+ export declare class FieldVisitor<A = BaseActor> extends IDL.Visitor<string, FieldNode | ArgumentsMeta<A> | ArgumentsServiceMeta<A>> {
61
+ recursiveSchemas: Map<string, z.ZodTypeAny>;
62
+ private nameStack;
63
+ /**
64
+ * Execute function with a name segment pushed onto the stack.
65
+ * Automatically manages stack cleanup.
66
+ */
67
+ private withName;
68
+ /**
69
+ * Get the current full name path for form binding.
70
+ * Returns empty string for root level.
71
+ */
72
+ private currentName;
73
+ visitService(t: IDL.ServiceClass): ArgumentsServiceMeta<A>;
74
+ visitFunc(t: IDL.FuncClass, functionName: FunctionName<A>): ArgumentsMeta<A>;
75
+ visitRecord(_t: IDL.RecordClass, fields_: Array<[string, IDL.Type]>, label: string): RecordField;
76
+ visitVariant(_t: IDL.VariantClass, fields_: Array<[string, IDL.Type]>, label: string): VariantField;
77
+ visitTuple<T extends IDL.Type[]>(_t: IDL.TupleClass<T>, components: IDL.Type[], label: string): TupleField;
78
+ visitOpt<T>(_t: IDL.OptClass<T>, ty: IDL.Type<T>, label: string): OptionalField;
79
+ visitVec<T>(_t: IDL.VecClass<T>, ty: IDL.Type<T>, label: string): VectorField | BlobField;
80
+ visitRec<T>(_t: IDL.RecClass<T>, ty: IDL.ConstructType<T>, label: string): RecursiveField;
81
+ visitPrincipal(_t: IDL.PrincipalClass, label: string): PrincipalField;
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;
91
+ visitBool(_t: IDL.BoolClass, label: string): BooleanField;
92
+ visitNull(_t: IDL.NullClass, label: string): NullField;
93
+ private visitNumberType;
94
+ visitInt(_t: IDL.IntClass, label: string): NumberField | TextField;
95
+ visitNat(_t: IDL.NatClass, label: string): NumberField | TextField;
96
+ visitFloat(t: IDL.FloatClass, label: string): NumberField;
97
+ visitFixedInt(t: IDL.FixedIntClass, label: string): NumberField | TextField;
98
+ visitFixedNat(t: IDL.FixedNatClass, label: string): NumberField | TextField;
99
+ visitType<T>(_t: IDL.Type<T>, label: string): UnknownField;
100
+ }
101
+ //# 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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"}