@ic-reactor/candid 3.0.7-beta.2 → 3.0.8-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.
Files changed (53) hide show
  1. package/dist/display-reactor.d.ts +3 -2
  2. package/dist/display-reactor.d.ts.map +1 -1
  3. package/dist/display-reactor.js +6 -0
  4. package/dist/display-reactor.js.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/metadata-display-reactor.d.ts +73 -0
  10. package/dist/metadata-display-reactor.d.ts.map +1 -0
  11. package/dist/metadata-display-reactor.js +128 -0
  12. package/dist/metadata-display-reactor.js.map +1 -0
  13. package/dist/visitor/arguments/index.d.ts +69 -0
  14. package/dist/visitor/arguments/index.d.ts.map +1 -0
  15. package/dist/visitor/arguments/index.js +277 -0
  16. package/dist/visitor/arguments/index.js.map +1 -0
  17. package/dist/visitor/arguments/types.d.ts +92 -0
  18. package/dist/visitor/arguments/types.d.ts.map +1 -0
  19. package/dist/visitor/arguments/types.js +2 -0
  20. package/dist/visitor/arguments/types.js.map +1 -0
  21. package/dist/visitor/constants.d.ts +4 -0
  22. package/dist/visitor/constants.d.ts.map +1 -0
  23. package/dist/visitor/constants.js +61 -0
  24. package/dist/visitor/constants.js.map +1 -0
  25. package/dist/visitor/helpers.d.ts +30 -0
  26. package/dist/visitor/helpers.d.ts.map +1 -0
  27. package/dist/visitor/helpers.js +200 -0
  28. package/dist/visitor/helpers.js.map +1 -0
  29. package/dist/visitor/returns/index.d.ts +76 -0
  30. package/dist/visitor/returns/index.d.ts.map +1 -0
  31. package/dist/visitor/returns/index.js +425 -0
  32. package/dist/visitor/returns/index.js.map +1 -0
  33. package/dist/visitor/returns/types.d.ts +142 -0
  34. package/dist/visitor/returns/types.d.ts.map +1 -0
  35. package/dist/visitor/returns/types.js +2 -0
  36. package/dist/visitor/returns/types.js.map +1 -0
  37. package/dist/visitor/types.d.ts +6 -0
  38. package/dist/visitor/types.d.ts.map +1 -0
  39. package/dist/visitor/types.js +3 -0
  40. package/dist/visitor/types.js.map +1 -0
  41. package/package.json +3 -2
  42. package/src/display-reactor.ts +10 -2
  43. package/src/index.ts +1 -0
  44. package/src/metadata-display-reactor.ts +184 -0
  45. package/src/visitor/arguments/index.test.ts +882 -0
  46. package/src/visitor/arguments/index.ts +405 -0
  47. package/src/visitor/arguments/types.ts +168 -0
  48. package/src/visitor/constants.ts +62 -0
  49. package/src/visitor/helpers.ts +221 -0
  50. package/src/visitor/returns/index.test.ts +2027 -0
  51. package/src/visitor/returns/index.ts +545 -0
  52. package/src/visitor/returns/types.ts +271 -0
  53. package/src/visitor/types.ts +29 -0
@@ -0,0 +1,184 @@
1
+ import type {
2
+ ActorMethodReturnType,
3
+ BaseActor,
4
+ FunctionName,
5
+ } from "@ic-reactor/core"
6
+ import { CandidDisplayReactor } from "./display-reactor"
7
+ import type {
8
+ CandidDisplayReactorParameters,
9
+ DynamicMethodOptions,
10
+ } from "./types"
11
+ import {
12
+ ArgumentFieldVisitor,
13
+ MethodArgumentsMeta,
14
+ ServiceArgumentsMeta,
15
+ } from "./visitor/arguments"
16
+ import {
17
+ MethodResultMeta,
18
+ ResolvedMethodResult,
19
+ ResultFieldVisitor,
20
+ ServiceResultMeta,
21
+ } from "./visitor/returns"
22
+
23
+ // ============================================================================
24
+ // MetadataDisplayReactor
25
+ // ============================================================================
26
+
27
+ /**
28
+ * MetadataDisplayReactor combines visitor-based metadata generation
29
+ * for both input forms and result display.
30
+ *
31
+ * ## Architecture
32
+ *
33
+ * It extends the base Reactor and adds metadata generation capabilities.
34
+ * Unlike DisplayReactor, it does not use a separate codec for transformation.
35
+ * Instead, it uses the metadata visitor to resolve raw values into display-ready structures.
36
+ */
37
+ declare module "@ic-reactor/core" {
38
+ interface TransformArgsRegistry<T> {
39
+ metadata: TransformArgsRegistry<T>["display"]
40
+ }
41
+ interface TransformReturnRegistry<T, A = BaseActor> {
42
+ metadata: ResolvedMethodResult<A>
43
+ }
44
+ }
45
+
46
+ export class MetadataDisplayReactor<A = BaseActor> extends CandidDisplayReactor<
47
+ A,
48
+ "metadata"
49
+ > {
50
+ public override readonly transform = "metadata" as const
51
+
52
+ // Metadata storage
53
+ private argumentMeta: ServiceArgumentsMeta<A> | null = null
54
+ private resultMeta: ServiceResultMeta<A> | null = null
55
+
56
+ // Visitors (stateless, can be reused)
57
+ private static argVisitor = new ArgumentFieldVisitor()
58
+ private static resultVisitor = new ResultFieldVisitor()
59
+
60
+ constructor(config: CandidDisplayReactorParameters<A>) {
61
+ super(config)
62
+ }
63
+
64
+ // ══════════════════════════════════════════════════════════════════════════
65
+ // INITIALIZATION
66
+ // ══════════════════════════════════════════════════════════════════════════
67
+
68
+ /**
69
+ * Initializes the reactor by parsing Candid and generating all metadata.
70
+ */
71
+ public override async initialize(): Promise<void> {
72
+ await super.initialize()
73
+
74
+ // Generate metadata using visitors
75
+ this.generateMetadata()
76
+ }
77
+
78
+ /**
79
+ * Generate all metadata from the service interface using visitors.
80
+ */
81
+ private generateMetadata(): void {
82
+ const service = this.getServiceInterface()
83
+ if (!service) return
84
+
85
+ // Generate argument metadata
86
+ this.argumentMeta = service.accept(
87
+ MetadataDisplayReactor.argVisitor,
88
+ null as any
89
+ ) as ServiceArgumentsMeta<A>
90
+
91
+ // Generate result metadata
92
+ this.resultMeta = service.accept(
93
+ MetadataDisplayReactor.resultVisitor,
94
+ null as any
95
+ ) as ServiceResultMeta<A>
96
+ }
97
+
98
+ // ══════════════════════════════════════════════════════════════════════════
99
+ // METADATA ACCESS
100
+ // ══════════════════════════════════════════════════════════════════════════
101
+ /**
102
+ * Get argument field metadata for a method.
103
+ * Use this to generate input forms.
104
+ */
105
+ public getArgumentMeta<M extends FunctionName<A>>(
106
+ methodName: M
107
+ ): MethodArgumentsMeta<A, M> | undefined {
108
+ return this.argumentMeta?.[methodName]
109
+ }
110
+
111
+ /**
112
+ * Get result field metadata for a method.
113
+ * Use this to render results.
114
+ */
115
+ public getResultMeta<M extends FunctionName<A>>(
116
+ methodName: M
117
+ ): MethodResultMeta<A, M> | undefined {
118
+ return this.resultMeta?.[methodName]
119
+ }
120
+
121
+ /**
122
+ * Get all argument metadata.
123
+ */
124
+ public getAllArgumentMeta(): ServiceArgumentsMeta<A> | null {
125
+ return this.argumentMeta
126
+ }
127
+
128
+ /**
129
+ * Get all result metadata.
130
+ */
131
+ public getAllResultMeta(): ServiceResultMeta<A> | null {
132
+ return this.resultMeta
133
+ }
134
+
135
+ // ══════════════════════════════════════════════════════════════════════════
136
+ // DYNAMIC METHOD REGISTRATION
137
+ // ══════════════════════════════════════════════════════════════════════════
138
+ /**
139
+ * Register a dynamic method by its Candid signature.
140
+ * After registration, all DisplayReactor methods work with display type transformations.
141
+ */
142
+ public override async registerMethod(
143
+ options: DynamicMethodOptions
144
+ ): Promise<void> {
145
+ await super.registerMethod(options)
146
+
147
+ // Regenerate metadata
148
+ this.generateMetadata()
149
+ }
150
+
151
+ // ══════════════════════════════════════════════════════════════════════════
152
+ // DYNAMIC CALL SHORTCUTS
153
+ // ══════════════════════════════════════════════════════════════════════════
154
+ protected override transformResult<M extends FunctionName<A>>(
155
+ methodName: M,
156
+ result: ActorMethodReturnType<A[M]>
157
+ ): ResolvedMethodResult<A> {
158
+ // Get metadata and generate resolved result
159
+ const meta = this.getResultMeta(methodName)
160
+ if (!meta) {
161
+ throw new Error(`No metadata found for method "${methodName}"`)
162
+ }
163
+
164
+ return meta.generateMetadata(result) as ResolvedMethodResult<A>
165
+ }
166
+
167
+ /**
168
+ * Perform a dynamic call and return result with metadata.
169
+ */
170
+ public async callDynamicWithMeta<T = unknown>(
171
+ options: DynamicMethodOptions & { args?: unknown[] }
172
+ ): Promise<{ result: T; meta: MethodResultMeta<A> }> {
173
+ await this.registerMethod(options)
174
+
175
+ const result = (await this.callMethod({
176
+ functionName: options.functionName as any,
177
+ args: options.args as any,
178
+ })) as T
179
+
180
+ const meta = this.getResultMeta(options.functionName as any)!
181
+
182
+ return { result, meta }
183
+ }
184
+ }