@ic-reactor/candid 3.0.3-beta.4 → 3.0.3
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 +33 -1
- package/dist/adapter.js +2 -1
- package/dist/adapter.js.map +1 -1
- package/dist/display-reactor.d.ts +4 -15
- package/dist/display-reactor.d.ts.map +1 -1
- package/dist/display-reactor.js +22 -8
- package/dist/display-reactor.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata-display-reactor.d.ts +108 -0
- package/dist/metadata-display-reactor.d.ts.map +1 -0
- package/dist/metadata-display-reactor.js +141 -0
- package/dist/metadata-display-reactor.js.map +1 -0
- package/dist/reactor.d.ts.map +1 -1
- package/dist/reactor.js +9 -5
- package/dist/reactor.js.map +1 -1
- package/dist/types.d.ts +38 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +4 -4
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -10
- package/dist/utils.js.map +1 -1
- package/dist/visitor/arguments/helpers.d.ts +55 -0
- package/dist/visitor/arguments/helpers.d.ts.map +1 -0
- package/dist/visitor/arguments/helpers.js +123 -0
- package/dist/visitor/arguments/helpers.js.map +1 -0
- package/dist/visitor/arguments/index.d.ts +101 -0
- package/dist/visitor/arguments/index.d.ts.map +1 -0
- package/dist/visitor/arguments/index.js +779 -0
- package/dist/visitor/arguments/index.js.map +1 -0
- package/dist/visitor/arguments/types.d.ts +268 -0
- package/dist/visitor/arguments/types.d.ts.map +1 -0
- package/dist/visitor/arguments/types.js +26 -0
- package/dist/visitor/arguments/types.js.map +1 -0
- package/dist/visitor/constants.d.ts +4 -0
- package/dist/visitor/constants.d.ts.map +1 -0
- package/dist/visitor/constants.js +73 -0
- package/dist/visitor/constants.js.map +1 -0
- package/dist/visitor/helpers.d.ts +30 -0
- package/dist/visitor/helpers.d.ts.map +1 -0
- package/dist/visitor/helpers.js +204 -0
- package/dist/visitor/helpers.js.map +1 -0
- package/dist/visitor/index.d.ts +5 -0
- package/dist/visitor/index.d.ts.map +1 -0
- package/dist/visitor/index.js +5 -0
- package/dist/visitor/index.js.map +1 -0
- package/dist/visitor/returns/index.d.ts +38 -0
- package/dist/visitor/returns/index.d.ts.map +1 -0
- package/dist/visitor/returns/index.js +460 -0
- package/dist/visitor/returns/index.js.map +1 -0
- package/dist/visitor/returns/types.d.ts +202 -0
- package/dist/visitor/returns/types.d.ts.map +1 -0
- package/dist/visitor/returns/types.js +2 -0
- package/dist/visitor/returns/types.js.map +1 -0
- package/dist/visitor/types.d.ts +19 -0
- package/dist/visitor/types.d.ts.map +1 -0
- package/dist/visitor/types.js +2 -0
- package/dist/visitor/types.js.map +1 -0
- package/package.json +16 -7
- package/src/adapter.ts +446 -0
- package/src/constants.ts +11 -0
- package/src/display-reactor.ts +337 -0
- package/src/index.ts +8 -0
- package/src/metadata-display-reactor.ts +230 -0
- package/src/reactor.ts +199 -0
- package/src/types.ts +127 -0
- package/src/utils.ts +60 -0
- package/src/visitor/arguments/helpers.ts +153 -0
- package/src/visitor/arguments/index.test.ts +1439 -0
- package/src/visitor/arguments/index.ts +980 -0
- package/src/visitor/arguments/schema.test.ts +324 -0
- package/src/visitor/arguments/types.ts +385 -0
- package/src/visitor/constants.ts +76 -0
- package/src/visitor/helpers.test.ts +274 -0
- package/src/visitor/helpers.ts +223 -0
- package/src/visitor/index.ts +4 -0
- package/src/visitor/returns/index.test.ts +2377 -0
- package/src/visitor/returns/index.ts +658 -0
- package/src/visitor/returns/types.ts +302 -0
- 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 { 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,13 +12,45 @@ export interface DynamicMethodOptions {
|
|
|
11
12
|
*/
|
|
12
13
|
candid: string;
|
|
13
14
|
}
|
|
14
|
-
export interface CandidReactorParameters extends Omit<ReactorParameters, "idlFactory"
|
|
15
|
+
export interface CandidReactorParameters extends Omit<ReactorParameters, "idlFactory"> {
|
|
15
16
|
/** The canister ID. */
|
|
16
|
-
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
|
|
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
|
+
};
|
|
21
54
|
}
|
|
22
55
|
/**
|
|
23
56
|
* Minimal interface for ClientManager that CandidAdapter depends on.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
15
|
-
const
|
|
16
|
-
//
|
|
17
|
-
|
|
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:
|
|
20
|
-
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":"
|
|
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":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,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,EAOrB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAGxB,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AA+FjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,qBAAa,YAAY,CAAC,CAAC,GAAG,SAAS,CAAE,SAAQ,GAAG,CAAC,OAAO,CAC1D,MAAM,EACN,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CACvD;IACQ,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAY;IAE9D,OAAO,CAAC,SAAS,CAAe;IAEhC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAShB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAQZ,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC;IAa1D,SAAS,CACd,CAAC,EAAE,GAAG,CAAC,SAAS,EAChB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,GAC5B,aAAa,CAAC,CAAC,CAAC;IA0CZ,WAAW,CAChB,EAAE,EAAE,GAAG,CAAC,WAAW,EACnB,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,EAClC,KAAK,EAAE,MAAM,GACZ,WAAW;IAgCP,YAAY,CACjB,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,EAClC,KAAK,EAAE,MAAM,GACZ,YAAY;IAqGR,UAAU,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,EACpC,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EACrB,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,EACtB,KAAK,EAAE,MAAM,GACZ,UAAU;IAiCN,QAAQ,CAAC,CAAC,EACf,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EACnB,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,MAAM,GACZ,aAAa;IAqCT,QAAQ,CAAC,CAAC,EACf,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EACnB,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,MAAM,GACZ,WAAW,GAAG,SAAS;IA6EnB,QAAQ,CAAC,CAAC,EACf,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EACnB,EAAE,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EACxB,KAAK,EAAE,MAAM,GACZ,cAAc;IAwCV,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc;IA6CrE,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;IAwB7D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6EzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAad,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;IAmBzD,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS;IAqB7D,OAAO,CAAC,eAAe;IAmFhB,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAOlE,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAOlE,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW;IAQzD,aAAa,CAClB,CAAC,EAAE,GAAG,CAAC,aAAa,EACpB,KAAK,EAAE,MAAM,GACZ,WAAW,GAAG,SAAS;IAenB,aAAa,CAClB,CAAC,EAAE,GAAG,CAAC,aAAa,EACpB,KAAK,EAAE,MAAM,GACZ,WAAW,GAAG,SAAS;IAcnB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY;CAgBlE"}
|