@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
@@ -0,0 +1,302 @@
1
+ import type {
2
+ BaseActor,
3
+ FunctionName,
4
+ FunctionType,
5
+ ActorMethodReturnType,
6
+ } from "@ic-reactor/core"
7
+ import type { IDL } from "@icp-sdk/core/candid"
8
+ import type { VisitorDataType, TextFormat, NumberFormat } from "../types"
9
+
10
+ export type { VisitorDataType, TextFormat, NumberFormat }
11
+
12
+ // ════════════════════════════════════════════════════════════════════════════
13
+ // Core Types & Formats
14
+ // ════════════════════════════════════════════════════════════════════════════
15
+
16
+ /**
17
+ * The display type category after transformation.
18
+ * Maps Candid types to JavaScript-friendly display types.
19
+ */
20
+ export type DisplayType =
21
+ | "string"
22
+ | "number"
23
+ | "boolean"
24
+ | "null"
25
+ | "object"
26
+ | "array"
27
+ | "variant"
28
+ | "variant-null"
29
+ | "result"
30
+ | "nullable"
31
+ | "recursive"
32
+ | "blob"
33
+ | "func"
34
+ | "func-record"
35
+ | "unknown"
36
+
37
+ // ════════════════════════════════════════════════════════════════════════════
38
+ // Unified Result Node - Single Structure for Schema & Resolved Data
39
+ // ════════════════════════════════════════════════════════════════════════════
40
+
41
+ /**
42
+ * Base properties shared by all result nodes.
43
+ */
44
+ interface ResultNodeBase<T extends VisitorDataType = VisitorDataType> {
45
+ /** The Candid type category */
46
+ type: T
47
+ /** Raw label from Candid definition */
48
+ label: string
49
+ /** Human-readable formatted label for display */
50
+ displayLabel: string
51
+ /** Original Candid type name */
52
+ candidType: string
53
+ /** What it becomes after display transformation */
54
+ displayType: DisplayType
55
+ /** Original raw value before transformation (present after resolution) */
56
+ raw?: unknown
57
+ /** Value after display transformation (present after resolution) */
58
+ value?: unknown
59
+ /** Resolve this node with a value, returning a new resolved node */
60
+ resolve(data: unknown): ResolvedNode<T>
61
+ }
62
+
63
+ // ════════════════════════════════════════════════════════════════════════════
64
+ // Type-Specific Extras (embedded directly in node)
65
+ // For compound types, children are stored directly in their respective fields
66
+ // ════════════════════════════════════════════════════════════════════════════
67
+
68
+ interface RecordNodeExtras {
69
+ /** Child fields of the record */
70
+ fields: Record<string, ResultNode>
71
+ }
72
+
73
+ interface VariantNodeExtras {
74
+ /** All variant options as schema */
75
+ options: Record<string, ResultNode>
76
+ /** The resolved selected option value */
77
+ selectedValue: ResultNode
78
+ /** The selected option key (populated after resolution) */
79
+ selected?: string
80
+ }
81
+
82
+ interface TupleNodeExtras {
83
+ /** Tuple element fields */
84
+ items: ResultNode[]
85
+ }
86
+
87
+ interface VectorNodeExtras {
88
+ /** Vector element fields */
89
+ items: ResultNode[]
90
+ }
91
+
92
+ interface OptionalNodeExtras {
93
+ /** The inner value, or null if not enabled */
94
+ value: ResultNode | null
95
+ }
96
+
97
+ interface RecursiveNodeExtras {
98
+ /** The resolved recursive inner type */
99
+ inner: ResultNode
100
+ }
101
+
102
+ interface BlobNodeExtras {
103
+ /** The blob value as hex/base64 or Uint8Array */
104
+ value: string | Uint8Array
105
+ /** Hash of the blob content */
106
+ hash: string
107
+ /** Length in bytes */
108
+ length: number
109
+ }
110
+
111
+ interface NumberNodeExtras {
112
+ /** Detected number format */
113
+ format: NumberFormat
114
+ /** The numeric value */
115
+ value: string | number
116
+ }
117
+
118
+ interface TextNodeExtras {
119
+ /** Detected text format */
120
+ format: TextFormat
121
+ /** The text value */
122
+ value: string
123
+ }
124
+
125
+ interface PrincipalNodeExtras {
126
+ /** Detected text format */
127
+ format: TextFormat
128
+ /** The principal value as string */
129
+ value: string
130
+ }
131
+
132
+ interface BooleanNodeExtras {
133
+ /** The boolean value */
134
+ value: boolean
135
+ }
136
+
137
+ interface NullNodeExtras {
138
+ /** The null value */
139
+ value: null
140
+ }
141
+
142
+ interface UnknownNodeExtras {
143
+ /** The unknown value */
144
+ value: unknown
145
+ }
146
+
147
+ interface FuncNodeExtras {
148
+ /** The canister principal of the function reference */
149
+ canisterId: string
150
+ /** The method name of the function reference */
151
+ methodName: string
152
+ }
153
+
154
+ interface FuncRecordNodeExtras {
155
+ /** The canister principal extracted from the func reference */
156
+ canisterId: string
157
+ /** The method name extracted from the func reference */
158
+ methodName: string
159
+ /** Whether the referenced function is "query" or "update" */
160
+ funcType: "query" | "update"
161
+ /** The raw IDL.FuncClass for encoding/decoding calls */
162
+ funcClass: IDL.FuncClass
163
+ /** The key of the func field in the record */
164
+ funcFieldKey: string
165
+ /** The func field node */
166
+ funcField: ResultNode<"func">
167
+ /** Non-func fields — the default arguments for invoking the callback */
168
+ argFields: Record<string, ResultNode>
169
+ /** All fields including the func field (superset of argFields + funcField) */
170
+ fields: Record<string, ResultNode>
171
+ /**
172
+ * The display-type argument values extracted from argFields, ready to pass
173
+ * to `callMethod({ args: defaultArgs })`. Populated after `resolve()`.
174
+ *
175
+ * For a func that takes `(record { start: nat; length: nat })`, this would
176
+ * be `[{ start: "100", length: "50" }]` (display strings for BigInt fields).
177
+ *
178
+ * `undefined` before resolve.
179
+ */
180
+ defaultArgs?: unknown[]
181
+ }
182
+
183
+ type NodeTypeExtras<T extends VisitorDataType> = T extends "record"
184
+ ? RecordNodeExtras
185
+ : T extends "funcRecord"
186
+ ? FuncRecordNodeExtras
187
+ : T extends "variant"
188
+ ? VariantNodeExtras
189
+ : T extends "tuple"
190
+ ? TupleNodeExtras
191
+ : T extends "vector"
192
+ ? VectorNodeExtras
193
+ : T extends "optional"
194
+ ? OptionalNodeExtras
195
+ : T extends "recursive"
196
+ ? RecursiveNodeExtras
197
+ : T extends "blob"
198
+ ? BlobNodeExtras
199
+ : T extends "number"
200
+ ? NumberNodeExtras
201
+ : T extends "text"
202
+ ? TextNodeExtras
203
+ : T extends "principal"
204
+ ? PrincipalNodeExtras
205
+ : T extends "boolean"
206
+ ? BooleanNodeExtras
207
+ : T extends "null"
208
+ ? NullNodeExtras
209
+ : T extends "func"
210
+ ? FuncNodeExtras
211
+ : T extends "unknown"
212
+ ? UnknownNodeExtras
213
+ : {}
214
+
215
+ /**
216
+ * A unified result node that contains both schema and resolved value.
217
+ * When used as schema only, `raw` is undefined.
218
+ * When resolved, `raw` contains the original data.
219
+ *
220
+ * Compound types (record, variant, tuple, optional, vector) store
221
+ * resolved children directly in their structure fields.
222
+ * Primitive types store the display value in `value`.
223
+ */
224
+ export type ResultNode<T extends VisitorDataType = VisitorDataType> =
225
+ T extends any ? ResultNodeBase<T> & NodeTypeExtras<T> : never
226
+
227
+ /**
228
+ * A resolved node has `raw` populated and children resolved.
229
+ */
230
+ export type ResolvedNode<T extends VisitorDataType = VisitorDataType> =
231
+ ResultNode<T> & {
232
+ raw: unknown
233
+ }
234
+
235
+ // ════════════════════════════════════════════════════════════════════════════
236
+ // Convenience Type Aliases
237
+ // ════════════════════════════════════════════════════════════════════════════
238
+
239
+ export type RecordNode = ResultNode<"record">
240
+ export type FuncRecordNode = ResultNode<"funcRecord">
241
+ export type VariantNode = ResultNode<"variant">
242
+ export type TupleNode = ResultNode<"tuple">
243
+ export type OptionalNode = ResultNode<"optional">
244
+ export type VectorNode = ResultNode<"vector">
245
+ export type BlobNode = ResultNode<"blob">
246
+ export type RecursiveNode = ResultNode<"recursive">
247
+ export type PrincipalNode = ResultNode<"principal">
248
+ export type NumberNode = ResultNode<"number">
249
+ export type TextNode = ResultNode<"text">
250
+ export type BooleanNode = ResultNode<"boolean">
251
+ export type NullNode = ResultNode<"null">
252
+ export type FuncNode = ResultNode<"func">
253
+ export type UnknownNode = ResultNode<"unknown">
254
+
255
+ // ════════════════════════════════════════════════════════════════════════════
256
+ // Method & Service Level
257
+ // ════════════════════════════════════════════════════════════════════════════
258
+
259
+ /**
260
+ * Metadata for a single method's return values.
261
+ * Use this to render method results.
262
+ */
263
+ export interface MethodMeta<
264
+ A = BaseActor,
265
+ Name extends FunctionName<A> = FunctionName<A>,
266
+ > {
267
+ /** Whether this is a "query" or "update" call */
268
+ functionType: FunctionType
269
+ /** The method name as defined in the Candid interface */
270
+ functionName: Name
271
+ /** Array of result node descriptors, one per return value */
272
+ returns: ResultNode[]
273
+ /** Number of return values */
274
+ returnCount: number
275
+ /**
276
+ * Resolve the method result schema with actual return data.
277
+ * @param data The raw return data from the canister
278
+ * @returns A resolved result with display-friendly values
279
+ */
280
+ resolve(data: ActorMethodReturnType<A[Name]>): MethodResult<A>
281
+ }
282
+
283
+ /**
284
+ * A resolved method result with display-friendly values.
285
+ */
286
+ export interface MethodResult<A = BaseActor> {
287
+ /** Whether this is a "query" or "update" call */
288
+ functionType: FunctionType
289
+ /** The method name */
290
+ functionName: FunctionName<A>
291
+ /** Resolved return values */
292
+ results: ResolvedNode[]
293
+ /** Original raw data from the canister */
294
+ raw: ActorMethodReturnType<A[FunctionName<A>]>
295
+ }
296
+
297
+ /**
298
+ * Service-level metadata mapping method names to their return metadata.
299
+ */
300
+ export type ServiceMeta<A = BaseActor> = {
301
+ [K in FunctionName<A>]: MethodMeta<A, K>
302
+ }
@@ -0,0 +1,75 @@
1
+ export type FieldType =
2
+ | "functionRecord"
3
+ | "function"
4
+ | "record"
5
+ | "variant"
6
+ | "tuple"
7
+ | "optional"
8
+ | "vector"
9
+ | "table"
10
+ | "blob"
11
+ | "blob-large"
12
+ | "recursive"
13
+ | "unknown"
14
+ | "text"
15
+ | "number"
16
+ | "principal"
17
+ | "boolean"
18
+ | "null"
19
+
20
+ export type { Principal } from "@icp-sdk/core/principal"
21
+
22
+ import type { IDL } from "@icp-sdk/core/candid"
23
+ export type AllNumberTypes =
24
+ | IDL.NatClass
25
+ | IDL.IntClass
26
+ | IDL.FixedNatClass
27
+ | IDL.FixedIntClass
28
+ | IDL.FloatClass
29
+
30
+ // ════════════════════════════════════════════════════════════════════════════
31
+ // Shared Types for Visitors (Arguments & Returns)
32
+ // ════════════════════════════════════════════════════════════════════════════
33
+
34
+ /**
35
+ * The core Candid type category used across visitors.
36
+ */
37
+ export type VisitorDataType =
38
+ | "record"
39
+ | "funcRecord"
40
+ | "variant"
41
+ | "tuple"
42
+ | "optional"
43
+ | "vector"
44
+ | "blob"
45
+ | "recursive"
46
+ | "principal"
47
+ | "number"
48
+ | "text"
49
+ | "boolean"
50
+ | "null"
51
+ | "func"
52
+ | "unknown"
53
+
54
+ /**
55
+ * Detected format for text fields based on label heuristics.
56
+ * Used to provide format-specific validation and display.
57
+ */
58
+ export type TextFormat =
59
+ | "plain"
60
+ | "timestamp"
61
+ | "uuid"
62
+ | "url"
63
+ | "email"
64
+ | "phone"
65
+ | "btc"
66
+ | "eth"
67
+ | "account-id"
68
+ | "principal"
69
+ | "cycle"
70
+
71
+ /**
72
+ * Detected format for number fields based on label heuristics.
73
+ * Used to provide format-specific validation and display.
74
+ */
75
+ export type NumberFormat = "timestamp" | "cycle" | "value" | "token" | "normal"