@sundaeswap/sprinkles 0.6.0 → 0.7.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 (158) hide show
  1. package/dist/cjs/Sprinkle/__tests__/action-integration.test.js +590 -0
  2. package/dist/cjs/Sprinkle/__tests__/action-integration.test.js.map +1 -0
  3. package/dist/cjs/Sprinkle/__tests__/action-registry.test.js +193 -0
  4. package/dist/cjs/Sprinkle/__tests__/action-registry.test.js.map +1 -0
  5. package/dist/cjs/Sprinkle/__tests__/action-runner.test.js +304 -0
  6. package/dist/cjs/Sprinkle/__tests__/action-runner.test.js.map +1 -0
  7. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +1110 -0
  8. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
  9. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +722 -0
  10. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
  11. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +138 -0
  12. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  13. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +713 -0
  14. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
  15. package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js +334 -0
  16. package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
  17. package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js +749 -0
  18. package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
  19. package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js +61 -0
  20. package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
  21. package/dist/cjs/Sprinkle/actions/builtin/index.js +117 -0
  22. package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -0
  23. package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js +202 -0
  24. package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
  25. package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js +87 -0
  26. package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
  27. package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js +345 -0
  28. package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
  29. package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js +212 -0
  30. package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
  31. package/dist/cjs/Sprinkle/actions/cli-adapter.js +372 -0
  32. package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -0
  33. package/dist/cjs/Sprinkle/actions/index.js +127 -0
  34. package/dist/cjs/Sprinkle/actions/index.js.map +1 -0
  35. package/dist/cjs/Sprinkle/actions/mcp-adapter.js +415 -0
  36. package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -0
  37. package/dist/cjs/Sprinkle/actions/registry.js +92 -0
  38. package/dist/cjs/Sprinkle/actions/registry.js.map +1 -0
  39. package/dist/cjs/Sprinkle/actions/runner.js +190 -0
  40. package/dist/cjs/Sprinkle/actions/runner.js.map +1 -0
  41. package/dist/cjs/Sprinkle/actions/tui-helpers.js +96 -0
  42. package/dist/cjs/Sprinkle/actions/tui-helpers.js.map +1 -0
  43. package/dist/cjs/Sprinkle/actions/types.js +68 -0
  44. package/dist/cjs/Sprinkle/actions/types.js.map +1 -0
  45. package/dist/cjs/Sprinkle/index.js +451 -4
  46. package/dist/cjs/Sprinkle/index.js.map +1 -1
  47. package/dist/cjs/Sprinkle/prompts.js +12 -7
  48. package/dist/cjs/Sprinkle/prompts.js.map +1 -1
  49. package/dist/cjs/Sprinkle/type-guards.js +7 -1
  50. package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
  51. package/dist/esm/Sprinkle/__tests__/action-integration.test.js +588 -0
  52. package/dist/esm/Sprinkle/__tests__/action-integration.test.js.map +1 -0
  53. package/dist/esm/Sprinkle/__tests__/action-registry.test.js +192 -0
  54. package/dist/esm/Sprinkle/__tests__/action-registry.test.js.map +1 -0
  55. package/dist/esm/Sprinkle/__tests__/action-runner.test.js +302 -0
  56. package/dist/esm/Sprinkle/__tests__/action-runner.test.js.map +1 -0
  57. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +1107 -0
  58. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
  59. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +720 -0
  60. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
  61. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +138 -0
  62. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  63. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +712 -0
  64. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
  65. package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js +332 -0
  66. package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
  67. package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js +747 -0
  68. package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
  69. package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js +55 -0
  70. package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
  71. package/dist/esm/Sprinkle/actions/builtin/index.js +32 -0
  72. package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -0
  73. package/dist/esm/Sprinkle/actions/builtin/profile-actions.js +197 -0
  74. package/dist/esm/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
  75. package/dist/esm/Sprinkle/actions/builtin/settings-actions.js +81 -0
  76. package/dist/esm/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
  77. package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js +340 -0
  78. package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
  79. package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js +207 -0
  80. package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
  81. package/dist/esm/Sprinkle/actions/cli-adapter.js +361 -0
  82. package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -0
  83. package/dist/esm/Sprinkle/actions/index.js +12 -0
  84. package/dist/esm/Sprinkle/actions/index.js.map +1 -0
  85. package/dist/esm/Sprinkle/actions/mcp-adapter.js +407 -0
  86. package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -0
  87. package/dist/esm/Sprinkle/actions/registry.js +85 -0
  88. package/dist/esm/Sprinkle/actions/registry.js.map +1 -0
  89. package/dist/esm/Sprinkle/actions/runner.js +182 -0
  90. package/dist/esm/Sprinkle/actions/runner.js.map +1 -0
  91. package/dist/esm/Sprinkle/actions/tui-helpers.js +91 -0
  92. package/dist/esm/Sprinkle/actions/tui-helpers.js.map +1 -0
  93. package/dist/esm/Sprinkle/actions/types.js +61 -0
  94. package/dist/esm/Sprinkle/actions/types.js.map +1 -0
  95. package/dist/esm/Sprinkle/index.js +299 -4
  96. package/dist/esm/Sprinkle/index.js.map +1 -1
  97. package/dist/esm/Sprinkle/prompts.js +12 -7
  98. package/dist/esm/Sprinkle/prompts.js.map +1 -1
  99. package/dist/esm/Sprinkle/type-guards.js +3 -0
  100. package/dist/esm/Sprinkle/type-guards.js.map +1 -1
  101. package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts +39 -0
  102. package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts.map +1 -0
  103. package/dist/types/Sprinkle/actions/builtin/index.d.ts +26 -0
  104. package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -0
  105. package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts +55 -0
  106. package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts.map +1 -0
  107. package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts +32 -0
  108. package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts.map +1 -0
  109. package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts +70 -0
  110. package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts.map +1 -0
  111. package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts +50 -0
  112. package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts.map +1 -0
  113. package/dist/types/Sprinkle/actions/cli-adapter.d.ts +104 -0
  114. package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -0
  115. package/dist/types/Sprinkle/actions/index.d.ts +12 -0
  116. package/dist/types/Sprinkle/actions/index.d.ts.map +1 -0
  117. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +92 -0
  118. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -0
  119. package/dist/types/Sprinkle/actions/registry.d.ts +42 -0
  120. package/dist/types/Sprinkle/actions/registry.d.ts.map +1 -0
  121. package/dist/types/Sprinkle/actions/runner.d.ts +45 -0
  122. package/dist/types/Sprinkle/actions/runner.d.ts.map +1 -0
  123. package/dist/types/Sprinkle/actions/tui-helpers.d.ts +53 -0
  124. package/dist/types/Sprinkle/actions/tui-helpers.d.ts.map +1 -0
  125. package/dist/types/Sprinkle/actions/types.d.ts +76 -0
  126. package/dist/types/Sprinkle/actions/types.d.ts.map +1 -0
  127. package/dist/types/Sprinkle/index.d.ts +81 -1
  128. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  129. package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
  130. package/dist/types/Sprinkle/type-guards.d.ts +4 -1
  131. package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
  132. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  133. package/package.json +9 -2
  134. package/src/Sprinkle/__tests__/action-integration.test.ts +558 -0
  135. package/src/Sprinkle/__tests__/action-registry.test.ts +187 -0
  136. package/src/Sprinkle/__tests__/action-runner.test.ts +324 -0
  137. package/src/Sprinkle/__tests__/builtin-actions.test.ts +1022 -0
  138. package/src/Sprinkle/__tests__/cli-adapter.test.ts +715 -0
  139. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +144 -0
  140. package/src/Sprinkle/__tests__/mcp-adapter.test.ts +718 -0
  141. package/src/Sprinkle/__tests__/tui-helpers.test.ts +325 -0
  142. package/src/Sprinkle/__tests__/wallet-transaction-actions.test.ts +695 -0
  143. package/src/Sprinkle/actions/builtin/blaze-helper.ts +89 -0
  144. package/src/Sprinkle/actions/builtin/index.ts +86 -0
  145. package/src/Sprinkle/actions/builtin/profile-actions.ts +229 -0
  146. package/src/Sprinkle/actions/builtin/settings-actions.ts +99 -0
  147. package/src/Sprinkle/actions/builtin/transaction-actions.ts +381 -0
  148. package/src/Sprinkle/actions/builtin/wallet-actions.ts +233 -0
  149. package/src/Sprinkle/actions/cli-adapter.ts +430 -0
  150. package/src/Sprinkle/actions/index.ts +32 -0
  151. package/src/Sprinkle/actions/mcp-adapter.ts +463 -0
  152. package/src/Sprinkle/actions/registry.ts +97 -0
  153. package/src/Sprinkle/actions/runner.ts +200 -0
  154. package/src/Sprinkle/actions/tui-helpers.ts +114 -0
  155. package/src/Sprinkle/actions/types.ts +91 -0
  156. package/src/Sprinkle/index.ts +395 -3
  157. package/src/Sprinkle/prompts.ts +118 -72
  158. package/src/Sprinkle/type-guards.ts +9 -0
@@ -150,6 +150,150 @@ describe("FillInStruct", () => {
150
150
  );
151
151
  });
152
152
 
153
+ test("discriminated union propagates default when variant matches", async () => {
154
+ // When default has type "a" and user selects variant A, the default values
155
+ // for non-literal fields should be pre-populated (field starts as "set" status).
156
+ // Submitting without editing should return the default values.
157
+ const schema = Type.Union([
158
+ Type.Object({
159
+ type: Type.Literal("a"),
160
+ value: Type.String(),
161
+ }),
162
+ Type.Object({
163
+ type: Type.Literal("b"),
164
+ count: Type.BigInt(),
165
+ }),
166
+ ]);
167
+
168
+ const defaultValue = { type: "a" as const, value: "existing-value" };
169
+
170
+ // Select the first variant (type "a") - matches the default
171
+ mockSelectCancellable.mockImplementationOnce(async (opts: any) => {
172
+ return opts.choices[0].value;
173
+ });
174
+ // Both fields are "set" (type auto-filled, value pre-populated from default).
175
+ // allRequiredFieldsFilled is true so Submit is enabled. Submit immediately.
176
+ mockSelectCancellable.mockResolvedValueOnce("submit");
177
+
178
+ const result = await sprinkle.FillInStruct(schema, defaultValue as any);
179
+
180
+ // The default value for the "value" field should be included in the result
181
+ expect(result).toEqual({ type: "a", value: "existing-value" });
182
+ });
183
+
184
+ test("discriminated union with nested object propagates nested defaults", async () => {
185
+ // When a discriminated union default has a nested settings object, the nested
186
+ // fields should also be pre-populated from the default.
187
+ const schema = Type.Union([
188
+ Type.Object({
189
+ type: Type.Literal("config"),
190
+ settings: Type.Object({
191
+ timeout: Type.BigInt(),
192
+ retries: Type.BigInt(),
193
+ }),
194
+ }),
195
+ Type.Object({
196
+ type: Type.Literal("other"),
197
+ name: Type.String(),
198
+ }),
199
+ ]);
200
+
201
+ const defaultValue = {
202
+ type: "config" as const,
203
+ settings: { timeout: 30n, retries: 3n },
204
+ };
205
+
206
+ // Select the first variant (type "config") - matches the default
207
+ mockSelectCancellable.mockImplementationOnce(async (opts: any) => {
208
+ return opts.choices[0].value;
209
+ });
210
+ // Outer object: "type" is auto-filled literal, "settings" is pre-populated from default.
211
+ // Both required fields are "set", so Submit is available.
212
+ mockSelectCancellable.mockResolvedValueOnce("submit");
213
+
214
+ const result = await sprinkle.FillInStruct(schema, defaultValue as any);
215
+
216
+ // Both the outer and nested default values should be returned
217
+ expect(result).toEqual({
218
+ type: "config",
219
+ settings: { timeout: 30n, retries: 3n },
220
+ });
221
+ });
222
+
223
+ test("discriminated union does not propagate default when variant does not match", async () => {
224
+ // When default has type "a" but user selects variant B, no default should be passed.
225
+ // The variant B field should start as "unset" and require user input.
226
+ const schema = Type.Union([
227
+ Type.Object({
228
+ type: Type.Literal("a"),
229
+ value: Type.String(),
230
+ }),
231
+ Type.Object({
232
+ type: Type.Literal("b"),
233
+ name: Type.String(),
234
+ }),
235
+ ]);
236
+
237
+ // Default has type "a" but user selects variant "b"
238
+ const defaultValue = { type: "a" as const, value: "should-not-appear" };
239
+
240
+ // Select the second variant (type "b") - does NOT match the default
241
+ mockSelectCancellable.mockImplementationOnce(async (opts: any) => {
242
+ return opts.choices[1].value;
243
+ });
244
+ // Variant B: "type" is auto-filled, "name" starts as unset (no default propagated).
245
+ // Select "name" field and fill it in.
246
+ mockSelectCancellable.mockResolvedValueOnce("field:name");
247
+ mockInputCancellable.mockResolvedValueOnce("new-name");
248
+ mockSelectCancellable.mockResolvedValueOnce("submit");
249
+
250
+ const result = await sprinkle.FillInStruct(schema, defaultValue as any);
251
+
252
+ expect(result).toEqual({ type: "b", name: "new-name" });
253
+ // The input prompt for "name" should have no default (default from variant A was not passed)
254
+ expect(mockInputCancellable.mock.calls[0][0].default).toBeUndefined();
255
+ });
256
+
257
+ test("non-discriminated union propagates default when value structurally matches selected variant", async () => {
258
+ // For a union of simple types, when the default matches the selected variant
259
+ // structurally (via Value.Check), it should be passed through.
260
+ const schema = Type.Union([Type.String(), Type.BigInt()]);
261
+
262
+ const defaultValue = "default-string";
263
+
264
+ // Select the first variant (String)
265
+ mockSelectCancellable.mockImplementationOnce(async (opts: any) => {
266
+ return opts.choices[0].value;
267
+ });
268
+ mockInputCancellable.mockResolvedValueOnce("new-value");
269
+
270
+ await sprinkle.FillInStruct(schema, defaultValue as any);
271
+
272
+ // The input prompt should show the string default
273
+ expect(mockInputCancellable.mock.calls[0][0].default).toBe("default-string");
274
+ });
275
+
276
+ test("non-discriminated union does not propagate default when value does not match selected variant", async () => {
277
+ // When a string default is provided but BigInt variant is selected,
278
+ // the default must not be passed (it would fail structural validation).
279
+ const schema = Type.Union([Type.String(), Type.BigInt()]);
280
+
281
+ // Default is a string but user selects BigInt variant
282
+ const defaultValue = "not-a-bigint";
283
+
284
+ // Select the second variant (BigInt)
285
+ mockSelectCancellable.mockImplementationOnce(async (opts: any) => {
286
+ return opts.choices[1].value;
287
+ });
288
+ mockInputCancellable.mockResolvedValueOnce("42");
289
+
290
+ const result = await sprinkle.FillInStruct(schema, defaultValue as any);
291
+
292
+ expect(result).toBe(42n);
293
+ // The string default must not be passed to the BigInt prompt
294
+ expect(mockInputCancellable.mock.calls[0][0].default).toBeUndefined();
295
+ });
296
+
153
297
  // --- Object types (menu-based) ---
154
298
 
155
299
  test("fills an object with multiple fields", async () => {