@sundaeswap/sprinkles 0.5.0 → 0.6.1

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 (112) hide show
  1. package/dist/cjs/Sprinkle/__tests__/encryption.test.js +3 -1
  2. package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
  3. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +3 -37
  4. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
  5. package/dist/cjs/Sprinkle/__tests__/field-utils.test.js +170 -0
  6. package/dist/cjs/Sprinkle/__tests__/field-utils.test.js.map +1 -0
  7. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +377 -84
  8. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  9. package/dist/cjs/Sprinkle/__tests__/formatting.test.js +97 -0
  10. package/dist/cjs/Sprinkle/__tests__/formatting.test.js.map +1 -0
  11. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +9 -5
  12. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
  13. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +9 -0
  14. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
  15. package/dist/cjs/Sprinkle/index.js +174 -94
  16. package/dist/cjs/Sprinkle/index.js.map +1 -1
  17. package/dist/cjs/Sprinkle/menus/array-menu.js +195 -0
  18. package/dist/cjs/Sprinkle/menus/array-menu.js.map +1 -0
  19. package/dist/cjs/Sprinkle/menus/field-menu.js +161 -0
  20. package/dist/cjs/Sprinkle/menus/field-menu.js.map +1 -0
  21. package/dist/cjs/Sprinkle/menus/index.js +33 -0
  22. package/dist/cjs/Sprinkle/menus/index.js.map +1 -0
  23. package/dist/cjs/Sprinkle/menus/object-menu.js +324 -0
  24. package/dist/cjs/Sprinkle/menus/object-menu.js.map +1 -0
  25. package/dist/cjs/Sprinkle/prompts.js +68 -2
  26. package/dist/cjs/Sprinkle/prompts.js.map +1 -1
  27. package/dist/cjs/Sprinkle/type-guards.js +48 -1
  28. package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
  29. package/dist/cjs/Sprinkle/types.js +24 -0
  30. package/dist/cjs/Sprinkle/types.js.map +1 -1
  31. package/dist/cjs/Sprinkle/utils/field-utils.js +154 -0
  32. package/dist/cjs/Sprinkle/utils/field-utils.js.map +1 -0
  33. package/dist/cjs/Sprinkle/utils/formatting.js +126 -0
  34. package/dist/cjs/Sprinkle/utils/formatting.js.map +1 -0
  35. package/dist/cjs/Sprinkle/utils/index.js +56 -0
  36. package/dist/cjs/Sprinkle/utils/index.js.map +1 -0
  37. package/dist/esm/Sprinkle/__tests__/encryption.test.js +3 -1
  38. package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
  39. package/dist/esm/Sprinkle/__tests__/enhancements.test.js +3 -37
  40. package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
  41. package/dist/esm/Sprinkle/__tests__/field-utils.test.js +168 -0
  42. package/dist/esm/Sprinkle/__tests__/field-utils.test.js.map +1 -0
  43. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +378 -85
  44. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  45. package/dist/esm/Sprinkle/__tests__/formatting.test.js +95 -0
  46. package/dist/esm/Sprinkle/__tests__/formatting.test.js.map +1 -0
  47. package/dist/esm/Sprinkle/__tests__/show-menu.test.js +9 -5
  48. package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
  49. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +9 -0
  50. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
  51. package/dist/esm/Sprinkle/index.js +141 -96
  52. package/dist/esm/Sprinkle/index.js.map +1 -1
  53. package/dist/esm/Sprinkle/menus/array-menu.js +190 -0
  54. package/dist/esm/Sprinkle/menus/array-menu.js.map +1 -0
  55. package/dist/esm/Sprinkle/menus/field-menu.js +155 -0
  56. package/dist/esm/Sprinkle/menus/field-menu.js.map +1 -0
  57. package/dist/esm/Sprinkle/menus/index.js +8 -0
  58. package/dist/esm/Sprinkle/menus/index.js.map +1 -0
  59. package/dist/esm/Sprinkle/menus/object-menu.js +318 -0
  60. package/dist/esm/Sprinkle/menus/object-menu.js.map +1 -0
  61. package/dist/esm/Sprinkle/prompts.js +59 -1
  62. package/dist/esm/Sprinkle/prompts.js.map +1 -1
  63. package/dist/esm/Sprinkle/type-guards.js +42 -0
  64. package/dist/esm/Sprinkle/type-guards.js.map +1 -1
  65. package/dist/esm/Sprinkle/types.js +24 -0
  66. package/dist/esm/Sprinkle/types.js.map +1 -1
  67. package/dist/esm/Sprinkle/utils/field-utils.js +145 -0
  68. package/dist/esm/Sprinkle/utils/field-utils.js.map +1 -0
  69. package/dist/esm/Sprinkle/utils/formatting.js +118 -0
  70. package/dist/esm/Sprinkle/utils/formatting.js.map +1 -0
  71. package/dist/esm/Sprinkle/utils/index.js +7 -0
  72. package/dist/esm/Sprinkle/utils/index.js.map +1 -0
  73. package/dist/types/Sprinkle/index.d.ts +9 -3
  74. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  75. package/dist/types/Sprinkle/menus/array-menu.d.ts +31 -0
  76. package/dist/types/Sprinkle/menus/array-menu.d.ts.map +1 -0
  77. package/dist/types/Sprinkle/menus/field-menu.d.ts +34 -0
  78. package/dist/types/Sprinkle/menus/field-menu.d.ts.map +1 -0
  79. package/dist/types/Sprinkle/menus/index.d.ts +10 -0
  80. package/dist/types/Sprinkle/menus/index.d.ts.map +1 -0
  81. package/dist/types/Sprinkle/menus/object-menu.d.ts +34 -0
  82. package/dist/types/Sprinkle/menus/object-menu.d.ts.map +1 -0
  83. package/dist/types/Sprinkle/prompts.d.ts +25 -0
  84. package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
  85. package/dist/types/Sprinkle/type-guards.d.ts +24 -1
  86. package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
  87. package/dist/types/Sprinkle/types.d.ts +53 -0
  88. package/dist/types/Sprinkle/types.d.ts.map +1 -1
  89. package/dist/types/Sprinkle/utils/field-utils.d.ts +47 -0
  90. package/dist/types/Sprinkle/utils/field-utils.d.ts.map +1 -0
  91. package/dist/types/Sprinkle/utils/formatting.d.ts +30 -0
  92. package/dist/types/Sprinkle/utils/formatting.d.ts.map +1 -0
  93. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  94. package/package.json +1 -1
  95. package/src/Sprinkle/__tests__/encryption.test.ts +2 -0
  96. package/src/Sprinkle/__tests__/enhancements.test.ts +3 -42
  97. package/src/Sprinkle/__tests__/field-utils.test.ts +191 -0
  98. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +393 -100
  99. package/src/Sprinkle/__tests__/formatting.test.ts +115 -0
  100. package/src/Sprinkle/__tests__/show-menu.test.ts +14 -8
  101. package/src/Sprinkle/__tests__/tx-dialog.test.ts +9 -0
  102. package/src/Sprinkle/index.ts +175 -122
  103. package/src/Sprinkle/menus/array-menu.ts +191 -0
  104. package/src/Sprinkle/menus/field-menu.ts +145 -0
  105. package/src/Sprinkle/menus/index.ts +12 -0
  106. package/src/Sprinkle/menus/object-menu.ts +336 -0
  107. package/src/Sprinkle/prompts.ts +71 -1
  108. package/src/Sprinkle/type-guards.ts +42 -0
  109. package/src/Sprinkle/types.ts +43 -0
  110. package/src/Sprinkle/utils/field-utils.ts +158 -0
  111. package/src/Sprinkle/utils/formatting.ts +127 -0
  112. package/src/Sprinkle/utils/index.ts +17 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tx-dialog.test.js","names":["describe","test","expect","mock","beforeEach","Type","selectCalls","selectResponses","confirmResponses","inputResponses","module","input","response","shift","password","select","opts","push","undefined","confirm","search","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","clipboardContent","clipboardShouldFail","default","writeSync","content","Error","Sprinkle","TestSchema","Object","name","String","createMockTx","cbor","toCbor","body","requiredSigners","certs","withdrawals","witnessSet","vkeys","setVkeys","setWitnessSet","sprinkle","logs","origLog","console","log","args","join","mockTx","repeat","mockBlaze","wallet","getUsedAddresses","TxDialog","cborLog","find","l","includes","toBeDefined","length","toBeLessThan","toContain","txLog","sigLog","menuCall","choiceNames","choices","map","c","not","HotWallet","hotWalletProto","prototype","mockWallet","create","txCbor","toBe","some","truncatedLog","fullLog","origWarn","warn","beforeSignCalled","signTransaction","tx","size","toCore","beforeSign","firstMenuChoices","secondMenuChoices","result","action","txId","toBeUndefined","submitTransaction","values","toString","origErr","error","errors"],"sources":["../../../../src/Sprinkle/__tests__/tx-dialog.test.ts"],"sourcesContent":["import { describe, test, expect, mock, beforeEach } from \"bun:test\";\nimport { Type } from \"@sinclair/typebox\";\n\n// Track calls and responses\nlet selectCalls: any[] = [];\nlet selectResponses: string[] = [];\nlet confirmResponses: boolean[] = [];\nlet inputResponses: string[] = [];\n\n// Mock @inquirer/prompts\nmock.module(\"@inquirer/prompts\", () => ({\n input: mock(async () => {\n const response = inputResponses.shift();\n return response ?? \"\";\n }),\n password: mock(async () => \"secret\"),\n select: mock(async (opts: any) => {\n selectCalls.push(opts);\n const response = selectResponses.shift();\n if (response === undefined) {\n return \"cancel\";\n }\n return response;\n }),\n confirm: mock(async () => {\n const response = confirmResponses.shift();\n return response ?? false;\n }),\n search: mock(async () => \"result\"),\n}));\n\n// Mock cancellable prompts (used by TxDialog and other methods)\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mock(async (opts: any) => {\n selectCalls.push(opts);\n const response = selectResponses.shift();\n if (response === undefined) {\n return \"cancel\";\n }\n return response;\n }),\n inputCancellable: mock(async () => {\n const response = inputResponses.shift();\n return response ?? \"\";\n }),\n passwordCancellable: mock(async () => \"secret\"),\n confirmCancellable: mock(async () => {\n const response = confirmResponses.shift();\n return response ?? false;\n }),\n}));\n\n// Mock clipboardy\nlet clipboardContent = \"\";\nlet clipboardShouldFail = false;\nmock.module(\"clipboardy\", () => ({\n default: {\n writeSync: (content: string) => {\n if (clipboardShouldFail) throw new Error(\"clipboard not available\");\n clipboardContent = content;\n },\n },\n}));\n\nconst { Sprinkle } = await import(\"../../index.js\");\n\nconst TestSchema = Type.Object({\n name: Type.String(),\n});\n\n// Helper to create a mock transaction\nconst createMockTx = (cbor = \"deadbeef\") => ({\n toCbor: () => cbor,\n body: () => ({\n toCbor: () => cbor,\n requiredSigners: () => null,\n certs: () => null,\n withdrawals: () => null,\n }),\n witnessSet: () => ({\n vkeys: () => null,\n setVkeys: () => {},\n }),\n setWitnessSet: () => {},\n});\n\ndescribe(\"TxDialog\", () => {\n beforeEach(() => {\n selectCalls = [];\n selectResponses = [];\n confirmResponses = [];\n inputResponses = [];\n clipboardContent = \"\";\n clipboardShouldFail = false;\n });\n\n describe(\"Display\", () => {\n test(\"shows truncated CBOR by default\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx(\"a\".repeat(100));\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const cborLog = logs.find((l) => l.includes(\"Transaction CBOR:\"));\n expect(cborLog).toBeDefined();\n expect(cborLog!.length).toBeLessThan(100);\n expect(cborLog).toContain(\"...\");\n });\n\n test(\"shows transaction hash\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-hash\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const txLog = logs.find((l) => l.includes(\"Transaction:\"));\n expect(txLog).toBeDefined();\n });\n\n test(\"shows signature count\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-sigs\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const sigLog = logs.find((l) => l.includes(\"Signatures:\"));\n expect(sigLog).toBeDefined();\n expect(sigLog).toContain(\"0\");\n });\n });\n\n describe(\"Menu options\", () => {\n test(\"non-HotWallet has Expand, Copy, Import, Submit, Cancel - no Sign\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog2\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const menuCall = selectCalls[0];\n expect(menuCall).toBeDefined();\n const choiceNames = menuCall.choices.map((c: any) => c.name);\n expect(choiceNames).toContain(\"Expand CBOR\");\n expect(choiceNames).toContain(\"Copy CBOR to clipboard\");\n expect(choiceNames).toContain(\"Import signatures from CBOR\");\n expect(choiceNames).toContain(\"Submit transaction\");\n expect(choiceNames).toContain(\"Cancel\");\n expect(choiceNames).not.toContain(\"Sign with this wallet\");\n });\n\n test(\"HotWallet has Sign option\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog3\");\n const origLog = console.log;\n console.log = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const menuCall = selectCalls[0];\n expect(menuCall).toBeDefined();\n const choiceNames = menuCall.choices.map((c: any) => c.name);\n expect(choiceNames).toContain(\"Sign with this wallet\");\n });\n });\n\n describe(\"Copy CBOR\", () => {\n test(\"copies CBOR to clipboard\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog4\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"copy\", \"cancel\"];\n\n const txCbor = \"deadbeefcafebabe\";\n const mockTx = createMockTx(txCbor);\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(clipboardContent).toBe(txCbor);\n expect(logs.some((l) => l.includes(\"copied to clipboard\"))).toBe(true);\n });\n\n test(\"clipboard failure falls back to expanded view\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog5\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n clipboardShouldFail = true;\n\n selectResponses = [\"copy\", \"cancel\"];\n\n const txCbor = \"a\".repeat(100);\n const mockTx = createMockTx(txCbor);\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(logs.some((l) => l.includes(\"Failed to copy\"))).toBe(true);\n });\n });\n\n describe(\"Expand CBOR\", () => {\n test(\"shows full content when expanded\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog6\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"expand\", \"cancel\"];\n\n const txCbor = \"b\".repeat(100);\n const mockTx = createMockTx(txCbor);\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // First shows truncated, second shows full\n const truncatedLog = logs.find(\n (l) => l.includes(\"...\") && l.includes(\"Transaction CBOR:\"),\n );\n const fullLog = logs.find(\n (l) => l.includes(txCbor) && !l.includes(\"...\"),\n );\n expect(truncatedLog).toBeDefined();\n expect(fullLog).toBeDefined();\n });\n });\n\n describe(\"Sign\", () => {\n test(\"beforeSign hook is called before signing\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog7\");\n const origLog = console.log;\n const origWarn = console.warn;\n console.log = () => {};\n console.warn = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n let beforeSignCalled = false;\n\n selectResponses = [\"sign\", \"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n signTransaction: async (tx: any) => ({\n witnessSet: () => ({\n vkeys: () => ({\n size: () => 1,\n toCore: () => [[\"vkey123\", \"sig123\"]],\n }),\n }),\n }),\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any, {\n beforeSign: async () => {\n beforeSignCalled = true;\n },\n });\n console.log = origLog;\n console.warn = origWarn;\n\n expect(beforeSignCalled).toBe(true);\n });\n\n test(\"Sign option hidden after signing\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-signed\");\n const origLog = console.log;\n const origWarn = console.warn;\n console.log = () => {};\n console.warn = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n selectResponses = [\"sign\", \"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n signTransaction: async (tx: any) => ({\n witnessSet: () => ({\n vkeys: () => ({\n size: () => 1,\n toCore: () => [[\"vkey123\", \"sig123\"]],\n }),\n }),\n }),\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n console.warn = origWarn;\n\n // First menu should have Sign, second should not\n expect(selectCalls.length).toBe(2);\n const firstMenuChoices = selectCalls[0].choices.map((c: any) => c.name);\n const secondMenuChoices = selectCalls[1].choices.map((c: any) => c.name);\n expect(firstMenuChoices).toContain(\"Sign with this wallet\");\n expect(secondMenuChoices).not.toContain(\"Sign with this wallet\");\n });\n });\n\n describe(\"Return values\", () => {\n test(\"returns cancelled when user cancels\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-cancel\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(result.action).toBe(\"cancelled\");\n expect(result.tx).toBeDefined();\n expect(result.txId).toBeUndefined();\n });\n\n test(\"returns signed when user signs then cancels\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-signed2\");\n const origLog = console.log;\n const origWarn = console.warn;\n console.log = () => {};\n console.warn = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n selectResponses = [\"sign\", \"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n signTransaction: async (tx: any) => ({\n witnessSet: () => ({\n vkeys: () => ({\n size: () => 1,\n toCore: () => [[\"vkey123\", \"sig123\"]],\n }),\n }),\n }),\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n console.warn = origWarn;\n\n expect(result.action).toBe(\"signed\");\n expect(result.tx).toBeDefined();\n });\n\n test(\"returns submitted with txId on successful submit\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-submit\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"submit\"];\n confirmResponses = [true]; // Confirm submit with no signatures\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n submitTransaction: async () => \"txhash123456\",\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(result.action).toBe(\"submitted\");\n expect(result.txId).toBe(\"txhash123456\");\n expect(result.tx).toBeDefined();\n });\n });\n\n describe(\"Submit warnings\", () => {\n test(\"warns when submitting with no signatures\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-warn\");\n const origLog = console.log;\n console.log = () => {};\n\n // First try to submit, decline warning, then cancel\n selectResponses = [\"submit\", \"cancel\"];\n confirmResponses = [false];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // Should have returned to menu, then cancelled\n expect(result.action).toBe(\"cancelled\");\n expect(selectCalls.length).toBe(2);\n });\n });\n\n describe(\"Exit behavior\", () => {\n test(\"exits loop after successful submit\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-exit\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"submit\"];\n confirmResponses = [true];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n submitTransaction: async () => \"txhash789\",\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // Should only have one menu call - no loop after submit\n expect(selectCalls.length).toBe(1);\n expect(result.action).toBe(\"submitted\");\n });\n });\n\n describe(\"Required signers display\", () => {\n test(\"shows required signers when present\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-req\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = {\n toCbor: () => \"deadbeef\",\n body: () => ({\n toCbor: () => \"deadbeef\",\n requiredSigners: () => ({\n values: () => [\n { toString: () => \"abc123def456\" },\n { toString: () => \"789ghi012jkl\" },\n ],\n }),\n certs: () => null,\n withdrawals: () => null,\n }),\n witnessSet: () => ({\n vkeys: () => null,\n }),\n };\n\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // Should show \"X of Y required\" format\n expect(logs.some((l) => l.includes(\"of\") && l.includes(\"required\"))).toBe(\n true,\n );\n // Should show required signers list\n expect(logs.some((l) => l.includes(\"Required signers:\"))).toBe(true);\n });\n });\n\n describe(\"Import signatures\", () => {\n test(\"continues on empty CBOR input\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-import1\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"import\", \"cancel\"];\n inputResponses = [\"\"]; // Empty input\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(logs.some((l) => l.includes(\"No CBOR provided\"))).toBe(true);\n expect(result.action).toBe(\"cancelled\");\n });\n\n test(\"handles invalid CBOR gracefully\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-import2\");\n const origLog = console.log;\n const origErr = console.error;\n const logs: string[] = [];\n const errors: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n console.error = (...args: any[]) => errors.push(args.join(\" \"));\n\n selectResponses = [\"import\", \"cancel\"];\n inputResponses = [\"not-valid-cbor\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n console.error = origErr;\n\n expect(errors.some((l) => l.includes(\"Failed to import\"))).toBe(true);\n expect(result.action).toBe(\"cancelled\");\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"tx-dialog.test.js","names":["describe","test","expect","mock","beforeEach","Type","selectCalls","selectResponses","confirmResponses","inputResponses","module","input","response","shift","password","select","opts","push","undefined","confirm","search","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","searchCancellable","clipboardContent","clipboardShouldFail","default","writeSync","content","Error","Sprinkle","TestSchema","Object","name","String","createMockTx","cbor","toCbor","body","requiredSigners","certs","withdrawals","witnessSet","vkeys","setVkeys","setWitnessSet","sprinkle","logs","origLog","console","log","args","join","mockTx","repeat","mockBlaze","wallet","getUsedAddresses","TxDialog","cborLog","find","l","includes","toBeDefined","length","toBeLessThan","toContain","txLog","sigLog","menuCall","choiceNames","choices","map","c","not","HotWallet","hotWalletProto","prototype","mockWallet","create","txCbor","toBe","some","truncatedLog","fullLog","origWarn","warn","beforeSignCalled","signTransaction","tx","size","toCore","beforeSign","firstMenuChoices","secondMenuChoices","result","action","txId","toBeUndefined","submitTransaction","values","toString","origErr","error","errors"],"sources":["../../../../src/Sprinkle/__tests__/tx-dialog.test.ts"],"sourcesContent":["import { describe, test, expect, mock, beforeEach } from \"bun:test\";\nimport { Type } from \"@sinclair/typebox\";\n\n// Track calls and responses\nlet selectCalls: any[] = [];\nlet selectResponses: string[] = [];\nlet confirmResponses: boolean[] = [];\nlet inputResponses: string[] = [];\n\n// Mock @inquirer/prompts\nmock.module(\"@inquirer/prompts\", () => ({\n input: mock(async () => {\n const response = inputResponses.shift();\n return response ?? \"\";\n }),\n password: mock(async () => \"secret\"),\n select: mock(async (opts: any) => {\n selectCalls.push(opts);\n const response = selectResponses.shift();\n if (response === undefined) {\n return \"cancel\";\n }\n return response;\n }),\n confirm: mock(async () => {\n const response = confirmResponses.shift();\n return response ?? false;\n }),\n search: mock(async () => \"result\"),\n}));\n\n// Mock cancellable prompts (used by TxDialog and other methods)\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mock(async (opts: any) => {\n selectCalls.push(opts);\n const response = selectResponses.shift();\n if (response === undefined) {\n return \"cancel\";\n }\n return response;\n }),\n inputCancellable: mock(async () => {\n const response = inputResponses.shift();\n return response ?? \"\";\n }),\n passwordCancellable: mock(async () => \"secret\"),\n confirmCancellable: mock(async () => {\n const response = confirmResponses.shift();\n return response ?? false;\n }),\n searchCancellable: mock(async () => \"result\"),\n select: mock(async (opts: any) => {\n selectCalls.push(opts);\n const response = selectResponses.shift();\n if (response === undefined) {\n return \"cancel\";\n }\n return response;\n }),\n}));\n\n// Mock clipboardy\nlet clipboardContent = \"\";\nlet clipboardShouldFail = false;\nmock.module(\"clipboardy\", () => ({\n default: {\n writeSync: (content: string) => {\n if (clipboardShouldFail) throw new Error(\"clipboard not available\");\n clipboardContent = content;\n },\n },\n}));\n\nconst { Sprinkle } = await import(\"../../index.js\");\n\nconst TestSchema = Type.Object({\n name: Type.String(),\n});\n\n// Helper to create a mock transaction\nconst createMockTx = (cbor = \"deadbeef\") => ({\n toCbor: () => cbor,\n body: () => ({\n toCbor: () => cbor,\n requiredSigners: () => null,\n certs: () => null,\n withdrawals: () => null,\n }),\n witnessSet: () => ({\n vkeys: () => null,\n setVkeys: () => {},\n }),\n setWitnessSet: () => {},\n});\n\ndescribe(\"TxDialog\", () => {\n beforeEach(() => {\n selectCalls = [];\n selectResponses = [];\n confirmResponses = [];\n inputResponses = [];\n clipboardContent = \"\";\n clipboardShouldFail = false;\n });\n\n describe(\"Display\", () => {\n test(\"shows truncated CBOR by default\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx(\"a\".repeat(100));\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const cborLog = logs.find((l) => l.includes(\"Transaction CBOR:\"));\n expect(cborLog).toBeDefined();\n expect(cborLog!.length).toBeLessThan(100);\n expect(cborLog).toContain(\"...\");\n });\n\n test(\"shows transaction hash\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-hash\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const txLog = logs.find((l) => l.includes(\"Transaction:\"));\n expect(txLog).toBeDefined();\n });\n\n test(\"shows signature count\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-sigs\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const sigLog = logs.find((l) => l.includes(\"Signatures:\"));\n expect(sigLog).toBeDefined();\n expect(sigLog).toContain(\"0\");\n });\n });\n\n describe(\"Menu options\", () => {\n test(\"non-HotWallet has Expand, Copy, Import, Submit, Cancel - no Sign\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog2\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const menuCall = selectCalls[0];\n expect(menuCall).toBeDefined();\n const choiceNames = menuCall.choices.map((c: any) => c.name);\n expect(choiceNames).toContain(\"Expand CBOR\");\n expect(choiceNames).toContain(\"Copy CBOR to clipboard\");\n expect(choiceNames).toContain(\"Import signatures from CBOR\");\n expect(choiceNames).toContain(\"Submit transaction\");\n expect(choiceNames).toContain(\"Cancel\");\n expect(choiceNames).not.toContain(\"Sign with this wallet\");\n });\n\n test(\"HotWallet has Sign option\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog3\");\n const origLog = console.log;\n console.log = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n const menuCall = selectCalls[0];\n expect(menuCall).toBeDefined();\n const choiceNames = menuCall.choices.map((c: any) => c.name);\n expect(choiceNames).toContain(\"Sign with this wallet\");\n });\n });\n\n describe(\"Copy CBOR\", () => {\n test(\"copies CBOR to clipboard\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog4\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"copy\", \"cancel\"];\n\n const txCbor = \"deadbeefcafebabe\";\n const mockTx = createMockTx(txCbor);\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(clipboardContent).toBe(txCbor);\n expect(logs.some((l) => l.includes(\"copied to clipboard\"))).toBe(true);\n });\n\n test(\"clipboard failure falls back to expanded view\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog5\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n clipboardShouldFail = true;\n\n selectResponses = [\"copy\", \"cancel\"];\n\n const txCbor = \"a\".repeat(100);\n const mockTx = createMockTx(txCbor);\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(logs.some((l) => l.includes(\"Failed to copy\"))).toBe(true);\n });\n });\n\n describe(\"Expand CBOR\", () => {\n test(\"shows full content when expanded\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog6\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"expand\", \"cancel\"];\n\n const txCbor = \"b\".repeat(100);\n const mockTx = createMockTx(txCbor);\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // First shows truncated, second shows full\n const truncatedLog = logs.find(\n (l) => l.includes(\"...\") && l.includes(\"Transaction CBOR:\"),\n );\n const fullLog = logs.find(\n (l) => l.includes(txCbor) && !l.includes(\"...\"),\n );\n expect(truncatedLog).toBeDefined();\n expect(fullLog).toBeDefined();\n });\n });\n\n describe(\"Sign\", () => {\n test(\"beforeSign hook is called before signing\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog7\");\n const origLog = console.log;\n const origWarn = console.warn;\n console.log = () => {};\n console.warn = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n let beforeSignCalled = false;\n\n selectResponses = [\"sign\", \"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n signTransaction: async (tx: any) => ({\n witnessSet: () => ({\n vkeys: () => ({\n size: () => 1,\n toCore: () => [[\"vkey123\", \"sig123\"]],\n }),\n }),\n }),\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any, {\n beforeSign: async () => {\n beforeSignCalled = true;\n },\n });\n console.log = origLog;\n console.warn = origWarn;\n\n expect(beforeSignCalled).toBe(true);\n });\n\n test(\"Sign option hidden after signing\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-signed\");\n const origLog = console.log;\n const origWarn = console.warn;\n console.log = () => {};\n console.warn = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n selectResponses = [\"sign\", \"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n signTransaction: async (tx: any) => ({\n witnessSet: () => ({\n vkeys: () => ({\n size: () => 1,\n toCore: () => [[\"vkey123\", \"sig123\"]],\n }),\n }),\n }),\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n console.warn = origWarn;\n\n // First menu should have Sign, second should not\n expect(selectCalls.length).toBe(2);\n const firstMenuChoices = selectCalls[0].choices.map((c: any) => c.name);\n const secondMenuChoices = selectCalls[1].choices.map((c: any) => c.name);\n expect(firstMenuChoices).toContain(\"Sign with this wallet\");\n expect(secondMenuChoices).not.toContain(\"Sign with this wallet\");\n });\n });\n\n describe(\"Return values\", () => {\n test(\"returns cancelled when user cancels\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-cancel\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"cancel\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(result.action).toBe(\"cancelled\");\n expect(result.tx).toBeDefined();\n expect(result.txId).toBeUndefined();\n });\n\n test(\"returns signed when user signs then cancels\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-signed2\");\n const origLog = console.log;\n const origWarn = console.warn;\n console.log = () => {};\n console.warn = () => {};\n\n const { HotWallet } = await import(\"@blaze-cardano/sdk\");\n\n selectResponses = [\"sign\", \"cancel\"];\n\n const mockTx = createMockTx();\n\n const hotWalletProto = HotWallet.prototype;\n const mockWallet = Object.create(hotWalletProto);\n mockWallet.getUsedAddresses = async () => [];\n\n const mockBlaze = {\n wallet: mockWallet,\n signTransaction: async (tx: any) => ({\n witnessSet: () => ({\n vkeys: () => ({\n size: () => 1,\n toCore: () => [[\"vkey123\", \"sig123\"]],\n }),\n }),\n }),\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n console.warn = origWarn;\n\n expect(result.action).toBe(\"signed\");\n expect(result.tx).toBeDefined();\n });\n\n test(\"returns submitted with txId on successful submit\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-submit\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"submit\"];\n confirmResponses = [true]; // Confirm submit with no signatures\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n submitTransaction: async () => \"txhash123456\",\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(result.action).toBe(\"submitted\");\n expect(result.txId).toBe(\"txhash123456\");\n expect(result.tx).toBeDefined();\n });\n });\n\n describe(\"Submit warnings\", () => {\n test(\"warns when submitting with no signatures\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-warn\");\n const origLog = console.log;\n console.log = () => {};\n\n // First try to submit, decline warning, then cancel\n selectResponses = [\"submit\", \"cancel\"];\n confirmResponses = [false];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // Should have returned to menu, then cancelled\n expect(result.action).toBe(\"cancelled\");\n expect(selectCalls.length).toBe(2);\n });\n });\n\n describe(\"Exit behavior\", () => {\n test(\"exits loop after successful submit\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-exit\");\n const origLog = console.log;\n console.log = () => {};\n\n selectResponses = [\"submit\"];\n confirmResponses = [true];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n submitTransaction: async () => \"txhash789\",\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // Should only have one menu call - no loop after submit\n expect(selectCalls.length).toBe(1);\n expect(result.action).toBe(\"submitted\");\n });\n });\n\n describe(\"Required signers display\", () => {\n test(\"shows required signers when present\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-req\");\n const logs: string[] = [];\n const origLog = console.log;\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"cancel\"];\n\n const mockTx = {\n toCbor: () => \"deadbeef\",\n body: () => ({\n toCbor: () => \"deadbeef\",\n requiredSigners: () => ({\n values: () => [\n { toString: () => \"abc123def456\" },\n { toString: () => \"789ghi012jkl\" },\n ],\n }),\n certs: () => null,\n withdrawals: () => null,\n }),\n witnessSet: () => ({\n vkeys: () => null,\n }),\n };\n\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n // Should show \"X of Y required\" format\n expect(logs.some((l) => l.includes(\"of\") && l.includes(\"required\"))).toBe(\n true,\n );\n // Should show required signers list\n expect(logs.some((l) => l.includes(\"Required signers:\"))).toBe(true);\n });\n });\n\n describe(\"Import signatures\", () => {\n test(\"continues on empty CBOR input\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-import1\");\n const origLog = console.log;\n const logs: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n\n selectResponses = [\"import\", \"cancel\"];\n inputResponses = [\"\"]; // Empty input\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n\n expect(logs.some((l) => l.includes(\"No CBOR provided\"))).toBe(true);\n expect(result.action).toBe(\"cancelled\");\n });\n\n test(\"handles invalid CBOR gracefully\", async () => {\n const sprinkle = new Sprinkle(TestSchema, \"/tmp/test-txdialog-import2\");\n const origLog = console.log;\n const origErr = console.error;\n const logs: string[] = [];\n const errors: string[] = [];\n console.log = (...args: any[]) => logs.push(args.join(\" \"));\n console.error = (...args: any[]) => errors.push(args.join(\" \"));\n\n selectResponses = [\"import\", \"cancel\"];\n inputResponses = [\"not-valid-cbor\"];\n\n const mockTx = createMockTx();\n const mockBlaze = {\n wallet: { getUsedAddresses: async () => [] },\n };\n\n const result = await sprinkle.TxDialog(mockBlaze as any, mockTx as any);\n console.log = origLog;\n console.error = origErr;\n\n expect(errors.some((l) => l.includes(\"Failed to import\"))).toBe(true);\n expect(result.action).toBe(\"cancelled\");\n });\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,IAAI,EAAEC,MAAM,EAAEC,IAAI,EAAEC,UAAU,QAAQ,UAAU;AACnE,SAASC,IAAI,QAAQ,mBAAmB;;AAExC;AACA,IAAIC,WAAkB,GAAG,EAAE;AAC3B,IAAIC,eAAyB,GAAG,EAAE;AAClC,IAAIC,gBAA2B,GAAG,EAAE;AACpC,IAAIC,cAAwB,GAAG,EAAE;;AAEjC;AACAN,IAAI,CAACO,MAAM,CAAC,mBAAmB,EAAE,OAAO;EACtCC,KAAK,EAAER,IAAI,CAAC,YAAY;IACtB,MAAMS,QAAQ,GAAGH,cAAc,CAACI,KAAK,CAAC,CAAC;IACvC,OAAOD,QAAQ,IAAI,EAAE;EACvB,CAAC,CAAC;EACFE,QAAQ,EAAEX,IAAI,CAAC,YAAY,QAAQ,CAAC;EACpCY,MAAM,EAAEZ,IAAI,CAAC,MAAOa,IAAS,IAAK;IAChCV,WAAW,CAACW,IAAI,CAACD,IAAI,CAAC;IACtB,MAAMJ,QAAQ,GAAGL,eAAe,CAACM,KAAK,CAAC,CAAC;IACxC,IAAID,QAAQ,KAAKM,SAAS,EAAE;MAC1B,OAAO,QAAQ;IACjB;IACA,OAAON,QAAQ;EACjB,CAAC,CAAC;EACFO,OAAO,EAAEhB,IAAI,CAAC,YAAY;IACxB,MAAMS,QAAQ,GAAGJ,gBAAgB,CAACK,KAAK,CAAC,CAAC;IACzC,OAAOD,QAAQ,IAAI,KAAK;EAC1B,CAAC,CAAC;EACFQ,MAAM,EAAEjB,IAAI,CAAC,YAAY,QAAQ;AACnC,CAAC,CAAC,CAAC;;AAEH;AACAA,IAAI,CAACO,MAAM,CAAC,eAAe,EAAE,OAAO;EAClCW,iBAAiB,EAAElB,IAAI,CAAC,MAAOa,IAAS,IAAK;IAC3CV,WAAW,CAACW,IAAI,CAACD,IAAI,CAAC;IACtB,MAAMJ,QAAQ,GAAGL,eAAe,CAACM,KAAK,CAAC,CAAC;IACxC,IAAID,QAAQ,KAAKM,SAAS,EAAE;MAC1B,OAAO,QAAQ;IACjB;IACA,OAAON,QAAQ;EACjB,CAAC,CAAC;EACFU,gBAAgB,EAAEnB,IAAI,CAAC,YAAY;IACjC,MAAMS,QAAQ,GAAGH,cAAc,CAACI,KAAK,CAAC,CAAC;IACvC,OAAOD,QAAQ,IAAI,EAAE;EACvB,CAAC,CAAC;EACFW,mBAAmB,EAAEpB,IAAI,CAAC,YAAY,QAAQ,CAAC;EAC/CqB,kBAAkB,EAAErB,IAAI,CAAC,YAAY;IACnC,MAAMS,QAAQ,GAAGJ,gBAAgB,CAACK,KAAK,CAAC,CAAC;IACzC,OAAOD,QAAQ,IAAI,KAAK;EAC1B,CAAC,CAAC;EACFa,iBAAiB,EAAEtB,IAAI,CAAC,YAAY,QAAQ,CAAC;EAC7CY,MAAM,EAAEZ,IAAI,CAAC,MAAOa,IAAS,IAAK;IAChCV,WAAW,CAACW,IAAI,CAACD,IAAI,CAAC;IACtB,MAAMJ,QAAQ,GAAGL,eAAe,CAACM,KAAK,CAAC,CAAC;IACxC,IAAID,QAAQ,KAAKM,SAAS,EAAE;MAC1B,OAAO,QAAQ;IACjB;IACA,OAAON,QAAQ;EACjB,CAAC;AACH,CAAC,CAAC,CAAC;;AAEH;AACA,IAAIc,gBAAgB,GAAG,EAAE;AACzB,IAAIC,mBAAmB,GAAG,KAAK;AAC/BxB,IAAI,CAACO,MAAM,CAAC,YAAY,EAAE,OAAO;EAC/BkB,OAAO,EAAE;IACPC,SAAS,EAAGC,OAAe,IAAK;MAC9B,IAAIH,mBAAmB,EAAE,MAAM,IAAII,KAAK,CAAC,yBAAyB,CAAC;MACnEL,gBAAgB,GAAGI,OAAO;IAC5B;EACF;AACF,CAAC,CAAC,CAAC;AAEH,MAAM;EAAEE;AAAS,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;AAEnD,MAAMC,UAAU,GAAG5B,IAAI,CAAC6B,MAAM,CAAC;EAC7BC,IAAI,EAAE9B,IAAI,CAAC+B,MAAM,CAAC;AACpB,CAAC,CAAC;;AAEF;AACA,MAAMC,YAAY,GAAGA,CAACC,IAAI,GAAG,UAAU,MAAM;EAC3CC,MAAM,EAAEA,CAAA,KAAMD,IAAI;EAClBE,IAAI,EAAEA,CAAA,MAAO;IACXD,MAAM,EAAEA,CAAA,KAAMD,IAAI;IAClBG,eAAe,EAAEA,CAAA,KAAM,IAAI;IAC3BC,KAAK,EAAEA,CAAA,KAAM,IAAI;IACjBC,WAAW,EAAEA,CAAA,KAAM;EACrB,CAAC,CAAC;EACFC,UAAU,EAAEA,CAAA,MAAO;IACjBC,KAAK,EAAEA,CAAA,KAAM,IAAI;IACjBC,QAAQ,EAAEA,CAAA,KAAM,CAAC;EACnB,CAAC,CAAC;EACFC,aAAa,EAAEA,CAAA,KAAM,CAAC;AACxB,CAAC,CAAC;AAEF/C,QAAQ,CAAC,UAAU,EAAE,MAAM;EACzBI,UAAU,CAAC,MAAM;IACfE,WAAW,GAAG,EAAE;IAChBC,eAAe,GAAG,EAAE;IACpBC,gBAAgB,GAAG,EAAE;IACrBC,cAAc,GAAG,EAAE;IACnBiB,gBAAgB,GAAG,EAAE;IACrBC,mBAAmB,GAAG,KAAK;EAC7B,CAAC,CAAC;EAEF3B,QAAQ,CAAC,SAAS,EAAE,MAAM;IACxBC,IAAI,CAAC,iCAAiC,EAAE,YAAY;MAClD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,oBAAoB,CAAC;MAC/D,MAAMgB,IAAc,GAAG,EAAE;MACzB,MAAMC,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,GAAG,CAACmB,MAAM,CAAC,GAAG,CAAC,CAAC;MAC5C,MAAMC,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErB,MAAMW,OAAO,GAAGZ,IAAI,CAACa,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;MACjE9D,MAAM,CAAC2D,OAAO,CAAC,CAACI,WAAW,CAAC,CAAC;MAC7B/D,MAAM,CAAC2D,OAAO,CAAEK,MAAM,CAAC,CAACC,YAAY,CAAC,GAAG,CAAC;MACzCjE,MAAM,CAAC2D,OAAO,CAAC,CAACO,SAAS,CAAC,KAAK,CAAC;IAClC,CAAC,CAAC;IAEFnE,IAAI,CAAC,wBAAwB,EAAE,YAAY;MACzC,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,yBAAyB,CAAC;MACpE,MAAMgB,IAAc,GAAG,EAAE;MACzB,MAAMC,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErB,MAAMmB,KAAK,GAAGpB,IAAI,CAACa,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,cAAc,CAAC,CAAC;MAC1D9D,MAAM,CAACmE,KAAK,CAAC,CAACJ,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEFhE,IAAI,CAAC,uBAAuB,EAAE,YAAY;MACxC,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,yBAAyB,CAAC;MACpE,MAAMgB,IAAc,GAAG,EAAE;MACzB,MAAMC,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErB,MAAMoB,MAAM,GAAGrB,IAAI,CAACa,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,aAAa,CAAC,CAAC;MAC1D9D,MAAM,CAACoE,MAAM,CAAC,CAACL,WAAW,CAAC,CAAC;MAC5B/D,MAAM,CAACoE,MAAM,CAAC,CAACF,SAAS,CAAC,GAAG,CAAC;IAC/B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFpE,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC7BC,IAAI,CAAC,kEAAkE,EAAE,YAAY;MACnF,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB7C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErB,MAAMqB,QAAQ,GAAGjE,WAAW,CAAC,CAAC,CAAC;MAC/BJ,MAAM,CAACqE,QAAQ,CAAC,CAACN,WAAW,CAAC,CAAC;MAC9B,MAAMO,WAAW,GAAGD,QAAQ,CAACE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MAC5DjC,MAAM,CAACsE,WAAW,CAAC,CAACJ,SAAS,CAAC,aAAa,CAAC;MAC5ClE,MAAM,CAACsE,WAAW,CAAC,CAACJ,SAAS,CAAC,wBAAwB,CAAC;MACvDlE,MAAM,CAACsE,WAAW,CAAC,CAACJ,SAAS,CAAC,6BAA6B,CAAC;MAC5DlE,MAAM,CAACsE,WAAW,CAAC,CAACJ,SAAS,CAAC,oBAAoB,CAAC;MACnDlE,MAAM,CAACsE,WAAW,CAAC,CAACJ,SAAS,CAAC,QAAQ,CAAC;MACvClE,MAAM,CAACsE,WAAW,CAAC,CAACI,GAAG,CAACR,SAAS,CAAC,uBAAuB,CAAC;IAC5D,CAAC,CAAC;IAEFnE,IAAI,CAAC,2BAA2B,EAAE,YAAY;MAC5C,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB,MAAM;QAAEyB;MAAU,CAAC,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC;MAExDtE,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAE7B,MAAMyC,cAAc,GAAGD,SAAS,CAACE,SAAS;MAC1C,MAAMC,UAAU,GAAG9C,MAAM,CAAC+C,MAAM,CAACH,cAAc,CAAC;MAChDE,UAAU,CAACrB,gBAAgB,GAAG,YAAY,EAAE;MAE5C,MAAMF,SAAS,GAAG;QAChBC,MAAM,EAAEsB;MACV,CAAC;MAED,MAAMhC,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErB,MAAMqB,QAAQ,GAAGjE,WAAW,CAAC,CAAC,CAAC;MAC/BJ,MAAM,CAACqE,QAAQ,CAAC,CAACN,WAAW,CAAC,CAAC;MAC9B,MAAMO,WAAW,GAAGD,QAAQ,CAACE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MAC5DjC,MAAM,CAACsE,WAAW,CAAC,CAACJ,SAAS,CAAC,uBAAuB,CAAC;IACxD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFpE,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC1BC,IAAI,CAAC,0BAA0B,EAAE,YAAY;MAC3C,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMH,IAAc,GAAG,EAAE;MACzBE,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM2E,MAAM,GAAG,kBAAkB;MACjC,MAAM3B,MAAM,GAAGlB,YAAY,CAAC6C,MAAM,CAAC;MACnC,MAAMzB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErBhD,MAAM,CAACwB,gBAAgB,CAAC,CAACyD,IAAI,CAACD,MAAM,CAAC;MACrChF,MAAM,CAAC+C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;IACxE,CAAC,CAAC;IAEFlF,IAAI,CAAC,+CAA+C,EAAE,YAAY;MAChE,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMH,IAAc,GAAG,EAAE;MACzBE,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D3B,mBAAmB,GAAG,IAAI;MAE1BpB,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM2E,MAAM,GAAG,GAAG,CAAC1B,MAAM,CAAC,GAAG,CAAC;MAC9B,MAAMD,MAAM,GAAGlB,YAAY,CAAC6C,MAAM,CAAC;MACnC,MAAMzB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErBhD,MAAM,CAAC+C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;IACnE,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnF,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC5BC,IAAI,CAAC,kCAAkC,EAAE,YAAY;MACnD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMH,IAAc,GAAG,EAAE;MACzBE,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MAEtC,MAAM2E,MAAM,GAAG,GAAG,CAAC1B,MAAM,CAAC,GAAG,CAAC;MAC9B,MAAMD,MAAM,GAAGlB,YAAY,CAAC6C,MAAM,CAAC;MACnC,MAAMzB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;;MAErB;MACA,MAAMmC,YAAY,GAAGpC,IAAI,CAACa,IAAI,CAC3BC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,KAAK,CAAC,IAAID,CAAC,CAACC,QAAQ,CAAC,mBAAmB,CAC5D,CAAC;MACD,MAAMsB,OAAO,GAAGrC,IAAI,CAACa,IAAI,CACtBC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAACkB,MAAM,CAAC,IAAI,CAACnB,CAAC,CAACC,QAAQ,CAAC,KAAK,CAChD,CAAC;MACD9D,MAAM,CAACmF,YAAY,CAAC,CAACpB,WAAW,CAAC,CAAC;MAClC/D,MAAM,CAACoF,OAAO,CAAC,CAACrB,WAAW,CAAC,CAAC;IAC/B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFjE,QAAQ,CAAC,MAAM,EAAE,MAAM;IACrBC,IAAI,CAAC,0CAA0C,EAAE,YAAY;MAC3D,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMmC,QAAQ,GAAGpC,OAAO,CAACqC,IAAI;MAC7BrC,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MACtBD,OAAO,CAACqC,IAAI,GAAG,MAAM,CAAC,CAAC;MAEvB,MAAM;QAAEX;MAAU,CAAC,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC;MAExD,IAAIY,gBAAgB,GAAG,KAAK;MAE5BlF,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAE7B,MAAMyC,cAAc,GAAGD,SAAS,CAACE,SAAS;MAC1C,MAAMC,UAAU,GAAG9C,MAAM,CAAC+C,MAAM,CAACH,cAAc,CAAC;MAChDE,UAAU,CAACrB,gBAAgB,GAAG,YAAY,EAAE;MAE5C,MAAMF,SAAS,GAAG;QAChBC,MAAM,EAAEsB,UAAU;QAClBU,eAAe,EAAE,MAAOC,EAAO,KAAM;UACnC/C,UAAU,EAAEA,CAAA,MAAO;YACjBC,KAAK,EAAEA,CAAA,MAAO;cACZ+C,IAAI,EAAEA,CAAA,KAAM,CAAC;cACbC,MAAM,EAAEA,CAAA,KAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC;YACtC,CAAC;UACH,CAAC;QACH,CAAC;MACH,CAAC;MAED,MAAM7C,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAM,EAAS;QACvDuC,UAAU,EAAE,MAAAA,CAAA,KAAY;UACtBL,gBAAgB,GAAG,IAAI;QACzB;MACF,CAAC,CAAC;MACFtC,OAAO,CAACC,GAAG,GAAGF,OAAO;MACrBC,OAAO,CAACqC,IAAI,GAAGD,QAAQ;MAEvBrF,MAAM,CAACuF,gBAAgB,CAAC,CAACN,IAAI,CAAC,IAAI,CAAC;IACrC,CAAC,CAAC;IAEFlF,IAAI,CAAC,kCAAkC,EAAE,YAAY;MACnD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,2BAA2B,CAAC;MACtE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMmC,QAAQ,GAAGpC,OAAO,CAACqC,IAAI;MAC7BrC,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MACtBD,OAAO,CAACqC,IAAI,GAAG,MAAM,CAAC,CAAC;MAEvB,MAAM;QAAEX;MAAU,CAAC,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC;MAExDtE,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAE7B,MAAMyC,cAAc,GAAGD,SAAS,CAACE,SAAS;MAC1C,MAAMC,UAAU,GAAG9C,MAAM,CAAC+C,MAAM,CAACH,cAAc,CAAC;MAChDE,UAAU,CAACrB,gBAAgB,GAAG,YAAY,EAAE;MAE5C,MAAMF,SAAS,GAAG;QAChBC,MAAM,EAAEsB,UAAU;QAClBU,eAAe,EAAE,MAAOC,EAAO,KAAM;UACnC/C,UAAU,EAAEA,CAAA,MAAO;YACjBC,KAAK,EAAEA,CAAA,MAAO;cACZ+C,IAAI,EAAEA,CAAA,KAAM,CAAC;cACbC,MAAM,EAAEA,CAAA,KAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC;YACtC,CAAC;UACH,CAAC;QACH,CAAC;MACH,CAAC;MAED,MAAM7C,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MACrBC,OAAO,CAACqC,IAAI,GAAGD,QAAQ;;MAEvB;MACArF,MAAM,CAACI,WAAW,CAAC4D,MAAM,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;MAClC,MAAMY,gBAAgB,GAAGzF,WAAW,CAAC,CAAC,CAAC,CAACmE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MACvE,MAAM6D,iBAAiB,GAAG1F,WAAW,CAAC,CAAC,CAAC,CAACmE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MACxEjC,MAAM,CAAC6F,gBAAgB,CAAC,CAAC3B,SAAS,CAAC,uBAAuB,CAAC;MAC3DlE,MAAM,CAAC8F,iBAAiB,CAAC,CAACpB,GAAG,CAACR,SAAS,CAAC,uBAAuB,CAAC;IAClE,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFpE,QAAQ,CAAC,eAAe,EAAE,MAAM;IAC9BC,IAAI,CAAC,qCAAqC,EAAE,YAAY;MACtD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,2BAA2B,CAAC;MACtE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB7C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMsC,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErBhD,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;MACvCjF,MAAM,CAAC+F,MAAM,CAACN,EAAE,CAAC,CAAC1B,WAAW,CAAC,CAAC;MAC/B/D,MAAM,CAAC+F,MAAM,CAACE,IAAI,CAAC,CAACC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAC;IAEFnG,IAAI,CAAC,6CAA6C,EAAE,YAAY;MAC9D,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,4BAA4B,CAAC;MACvE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMmC,QAAQ,GAAGpC,OAAO,CAACqC,IAAI;MAC7BrC,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MACtBD,OAAO,CAACqC,IAAI,GAAG,MAAM,CAAC,CAAC;MAEvB,MAAM;QAAEX;MAAU,CAAC,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC;MAExDtE,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAMgD,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAE7B,MAAMyC,cAAc,GAAGD,SAAS,CAACE,SAAS;MAC1C,MAAMC,UAAU,GAAG9C,MAAM,CAAC+C,MAAM,CAACH,cAAc,CAAC;MAChDE,UAAU,CAACrB,gBAAgB,GAAG,YAAY,EAAE;MAE5C,MAAMF,SAAS,GAAG;QAChBC,MAAM,EAAEsB,UAAU;QAClBU,eAAe,EAAE,MAAOC,EAAO,KAAM;UACnC/C,UAAU,EAAEA,CAAA,MAAO;YACjBC,KAAK,EAAEA,CAAA,MAAO;cACZ+C,IAAI,EAAEA,CAAA,KAAM,CAAC;cACbC,MAAM,EAAEA,CAAA,KAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC;YACtC,CAAC;UACH,CAAC;QACH,CAAC;MACH,CAAC;MAED,MAAMI,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MACrBC,OAAO,CAACqC,IAAI,GAAGD,QAAQ;MAEvBrF,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,QAAQ,CAAC;MACpCjF,MAAM,CAAC+F,MAAM,CAACN,EAAE,CAAC,CAAC1B,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;IAEFhE,IAAI,CAAC,kDAAkD,EAAE,YAAY;MACnE,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,2BAA2B,CAAC;MACtE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB7C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAC5BC,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;;MAE3B,MAAM+C,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG,CAAC;QAC5C0C,iBAAiB,EAAE,MAAAA,CAAA,KAAY;MACjC,CAAC;MAED,MAAMJ,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErBhD,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;MACvCjF,MAAM,CAAC+F,MAAM,CAACE,IAAI,CAAC,CAAChB,IAAI,CAAC,cAAc,CAAC;MACxCjF,MAAM,CAAC+F,MAAM,CAACN,EAAE,CAAC,CAAC1B,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFjE,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCC,IAAI,CAAC,0CAA0C,EAAE,YAAY;MAC3D,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,yBAAyB,CAAC;MACpE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;;MAEtB;MACA7C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MACtCC,gBAAgB,GAAG,CAAC,KAAK,CAAC;MAE1B,MAAM+C,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMsC,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;;MAErB;MACAhD,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;MACvCjF,MAAM,CAACI,WAAW,CAAC4D,MAAM,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnF,QAAQ,CAAC,eAAe,EAAE,MAAM;IAC9BC,IAAI,CAAC,oCAAoC,EAAE,YAAY;MACrD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,yBAAyB,CAAC;MACpE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB7C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAC5BC,gBAAgB,GAAG,CAAC,IAAI,CAAC;MAEzB,MAAM+C,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG,CAAC;QAC5C0C,iBAAiB,EAAE,MAAAA,CAAA,KAAY;MACjC,CAAC;MAED,MAAMJ,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;;MAErB;MACAhD,MAAM,CAACI,WAAW,CAAC4D,MAAM,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;MAClCjF,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnF,QAAQ,CAAC,0BAA0B,EAAE,MAAM;IACzCC,IAAI,CAAC,qCAAqC,EAAE,YAAY;MACtD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,wBAAwB,CAAC;MACnE,MAAMgB,IAAc,GAAG,EAAE;MACzB,MAAMC,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAMgD,MAAM,GAAG;QACbhB,MAAM,EAAEA,CAAA,KAAM,UAAU;QACxBC,IAAI,EAAEA,CAAA,MAAO;UACXD,MAAM,EAAEA,CAAA,KAAM,UAAU;UACxBE,eAAe,EAAEA,CAAA,MAAO;YACtB6D,MAAM,EAAEA,CAAA,KAAM,CACZ;cAAEC,QAAQ,EAAEA,CAAA,KAAM;YAAe,CAAC,EAClC;cAAEA,QAAQ,EAAEA,CAAA,KAAM;YAAe,CAAC;UAEtC,CAAC,CAAC;UACF7D,KAAK,EAAEA,CAAA,KAAM,IAAI;UACjBC,WAAW,EAAEA,CAAA,KAAM;QACrB,CAAC,CAAC;QACFC,UAAU,EAAEA,CAAA,MAAO;UACjBC,KAAK,EAAEA,CAAA,KAAM;QACf,CAAC;MACH,CAAC;MAED,MAAMY,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMX,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACxDJ,OAAO,CAACC,GAAG,GAAGF,OAAO;;MAErB;MACAhD,MAAM,CAAC+C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,IAAI,CAAC,IAAID,CAAC,CAACC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAACmB,IAAI,CACvE,IACF,CAAC;MACD;MACAjF,MAAM,CAAC+C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;IACtE,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnF,QAAQ,CAAC,mBAAmB,EAAE,MAAM;IAClCC,IAAI,CAAC,+BAA+B,EAAE,YAAY;MAChD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,4BAA4B,CAAC;MACvE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMH,IAAc,GAAG,EAAE;MACzBE,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D/C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MACtCE,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;MAEvB,MAAM8C,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMsC,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MAErBhD,MAAM,CAAC+C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;MACnEjF,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC;IAEFlF,IAAI,CAAC,iCAAiC,EAAE,YAAY;MAClD,MAAM+C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,4BAA4B,CAAC;MACvE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3B,MAAMoD,OAAO,GAAGrD,OAAO,CAACsD,KAAK;MAC7B,MAAMxD,IAAc,GAAG,EAAE;MACzB,MAAMyD,MAAgB,GAAG,EAAE;MAC3BvD,OAAO,CAACC,GAAG,GAAG,CAAC,GAAGC,IAAW,KAAKJ,IAAI,CAAChC,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAC3DH,OAAO,CAACsD,KAAK,GAAG,CAAC,GAAGpD,IAAW,KAAKqD,MAAM,CAACzF,IAAI,CAACoC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE/D/C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MACtCE,cAAc,GAAG,CAAC,gBAAgB,CAAC;MAEnC,MAAM8C,MAAM,GAAGlB,YAAY,CAAC,CAAC;MAC7B,MAAMoB,SAAS,GAAG;QAChBC,MAAM,EAAE;UAAEC,gBAAgB,EAAE,MAAAA,CAAA,KAAY;QAAG;MAC7C,CAAC;MAED,MAAMsC,MAAM,GAAG,MAAMjD,QAAQ,CAACY,QAAQ,CAACH,SAAS,EAASF,MAAa,CAAC;MACvEJ,OAAO,CAACC,GAAG,GAAGF,OAAO;MACrBC,OAAO,CAACsD,KAAK,GAAGD,OAAO;MAEvBtG,MAAM,CAACwG,MAAM,CAACtB,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;MACrEjF,MAAM,CAAC+F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -3,8 +3,10 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
3
3
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
4
  import { Core, HotWallet } from "@blaze-cardano/sdk";
5
5
  import { CborSet, VkeyWitness, TxCBOR } from "@blaze-cardano/core";
6
- import { selectCancellable, inputCancellable, passwordCancellable, confirmCancellable, searchCancellable } from "./prompts.js";
6
+ import { selectCancellable, selectWithClear, inputCancellable, inputWithClear, passwordWithClear, confirmCancellable, searchCancellable } from "./prompts.js";
7
+ import colors from "yoctocolors-cjs";
7
8
  import { OptionalKind } from "@sinclair/typebox";
9
+ import { Value } from "@sinclair/typebox/value";
8
10
  import * as fs from "fs";
9
11
  import * as path from "path";
10
12
  export * from "@sinclair/typebox";
@@ -18,7 +20,7 @@ import { UserCancelledError } from "./types.js";
18
20
  export { NetworkSchema, MultisigScriptModule, MultisigScript, ProviderSettingsSchema, WalletSettingsSchema } from "./schemas.js";
19
21
  // Import and re-export type guards
20
22
  import { isOptional, isImport, isArray, isBigInt, isLiteral, isObject, isRef, isString, isThis, isTuple, isUnion, isSensitive } from "./type-guards.js";
21
- export { isOptional, isImport, isArray, isBigInt, isLiteral, isObject, isRef, isString, isThis, isTuple, isUnion, isSensitive } from "./type-guards.js";
23
+ export { isOptional, isImport, isArray, isBigInt, isLiteral, isObject, isRef, isString, isThis, isTuple, isUnion, isSensitive, isNull, isNullable, unwrapNullable, hasDefault, getDefault } from "./type-guards.js";
22
24
 
23
25
  // Import schemas for use in this file
24
26
 
@@ -31,6 +33,10 @@ import { bigIntReplacer, bigIntReviver, encryptSensitiveFields, decryptSensitive
31
33
 
32
34
  // Import tx-dialog utilities
33
35
  import { countSignatures, getRequiredSigners, getTxBodyHash, formatHash, mergeSignatures } from "./tx-dialog.js";
36
+
37
+ // Import menu modules
38
+ import { promptObject, promptArray } from "./menus/index.js";
39
+ import { formatPath } from "./utils/formatting.js";
34
40
  export class Sprinkle {
35
41
  constructor(type, storagePath, options) {
36
42
  _defineProperty(this, "storagePath", void 0);
@@ -353,9 +359,13 @@ export class Sprinkle {
353
359
  // --- Menu ---
354
360
 
355
361
  async showMenu(menu) {
356
- return this._showMenu(menu, true);
362
+ return this._showMenu(menu, true, [menu.title]);
357
363
  }
358
- async _showMenu(menu, main) {
364
+ async _showMenu(menu, main, path, clearPrevious = false) {
365
+ // Clear previous breadcrumb if coming back from action/submenu
366
+ if (clearPrevious) {
367
+ process.stdout.write("\x1b[1A\x1b[2K\x1b[G");
368
+ }
359
369
  if (menu.beforeShow) {
360
370
  await menu.beforeShow(this);
361
371
  }
@@ -387,11 +397,16 @@ export class Sprinkle {
387
397
  value: -1
388
398
  });
389
399
  }
390
- const selectionResult = await selectCancellable({
400
+
401
+ // Show breadcrumb
402
+ const breadcrumb = path.join(" > ");
403
+ console.log(colors.dim("🍞 " + breadcrumb));
404
+ const selectionResult = await selectWithClear({
391
405
  message: "Select an option:",
392
406
  choices: choices
393
407
  });
394
408
  // Handle escape (null) as Back
409
+ // Don't clear here - let the caller's clearPrevious handle it
395
410
  if (selectionResult === null) {
396
411
  return;
397
412
  }
@@ -402,13 +417,34 @@ export class Sprinkle {
402
417
  items: [{
403
418
  title: "View settings",
404
419
  action: async () => {
405
- console.log(JSON.stringify(this.getDisplaySettings(), bigIntReplacer, 2));
420
+ const jsonStr = JSON.stringify(this.getDisplaySettings(), bigIntReplacer, 2);
421
+ const jsonLines = jsonStr.split("\n").length;
422
+ console.log(jsonStr);
423
+
424
+ // Wait for user to press Enter
425
+ await selectWithClear({
426
+ message: "Press Enter to continue...",
427
+ choices: [{
428
+ name: "Continue",
429
+ value: "continue"
430
+ }]
431
+ });
432
+
433
+ // Clear the JSON output
434
+ process.stdout.write("\x1b[1A\x1b[2K".repeat(jsonLines) + "\x1b[G");
406
435
  }
407
436
  }, {
408
437
  title: "Edit settings",
409
438
  action: async () => {
410
- this.settings = await this.EditStruct(this.type, this.settings);
411
- this.saveSettings();
439
+ try {
440
+ this.settings = await this.EditStruct(this.type, this.settings);
441
+ this.saveSettings();
442
+ } catch (e) {
443
+ if (e instanceof UserCancelledError) {
444
+ return; // User cancelled, return to menu
445
+ }
446
+ throw e;
447
+ }
412
448
  }
413
449
  }, {
414
450
  title: "Switch profile",
@@ -443,24 +479,28 @@ export class Sprinkle {
443
479
  }
444
480
  }]
445
481
  };
446
- await this._showMenu(settingsMenu, false);
447
- await this._showMenu(menu, main);
482
+ await this._showMenu(settingsMenu, false, [...path, "Settings & Profiles"], true);
483
+ await this._showMenu(menu, main, path, true);
448
484
  return;
449
485
  }
450
486
  if (selection === -1) {
487
+ // Don't clear here - let the caller's clearPrevious handle it
451
488
  return;
452
489
  }
453
490
  const selectedItem = menu.items[selection];
454
491
  if ("action" in selectedItem) {
492
+ // Update breadcrumb to show current action
493
+ process.stdout.write("\x1b[1A\x1b[2K\x1b[G");
494
+ console.log(colors.dim("🍞 " + [...path, selectedItem.title].join(" > ")));
455
495
  const result = await selectedItem.action(this);
456
496
  if (result instanceof Sprinkle) {
457
497
  this.settings = result.settings;
458
498
  this.saveSettings();
459
499
  }
460
- await this._showMenu(menu, main);
500
+ await this._showMenu(menu, main, path, true);
461
501
  } else {
462
- await this._showMenu(selectedItem, false);
463
- await this._showMenu(menu, main);
502
+ await this._showMenu(selectedItem, false, [...path, selectedItem.title], true);
503
+ await this._showMenu(menu, main, path, true);
464
504
  }
465
505
  return;
466
506
  }
@@ -615,7 +655,7 @@ export class Sprinkle {
615
655
  name: "Cancel",
616
656
  value: "cancel"
617
657
  });
618
- const selection = await selectCancellable({
658
+ const selection = await selectWithClear({
619
659
  message: "Select an option:",
620
660
  choices
621
661
  });
@@ -813,46 +853,18 @@ export class Sprinkle {
813
853
  }
814
854
  }
815
855
  }
856
+
857
+ /**
858
+ * Edit an existing struct value using a menu-based interface.
859
+ * This is now unified with FillInStruct - both use the same menu system.
860
+ * @param type - The TypeBox schema
861
+ * @param current - The current value to edit
862
+ * @returns The edited value
863
+ */
816
864
  async EditStruct(type, current) {
817
- return this._editStruct(type, ["root"], current);
818
- }
819
- async _editStruct(type, path, current) {
820
- if (isObject(type)) {
821
- const obj = {};
822
- const fields = type["properties"];
823
- const menuItems = [];
824
- const currentRecord = current;
825
- for (const [field, fieldType] of Object.entries(fields)) {
826
- if (current && field in currentRecord) {
827
- obj[field] = currentRecord[field];
828
- }
829
- const menuTitle = Sprinkle.ExtractMessage(fieldType, `Edit ${field} at ${path.join(".")}`);
830
- if (isOptional(fieldType) && current && currentRecord[field] !== undefined) {
831
- menuItems.push({
832
- title: `Clear ${field}`,
833
- action: async sprinkle => {
834
- obj[field] = undefined;
835
- return sprinkle;
836
- }
837
- });
838
- }
839
- menuItems.push({
840
- title: menuTitle,
841
- action: async sprinkle => {
842
- const fieldValue = await sprinkle._editStruct(fieldType, path.concat([field]), current && field in currentRecord ? currentRecord[field] : undefined);
843
- obj[field] = fieldValue;
844
- return sprinkle;
845
- }
846
- });
847
- }
848
- const editMenu = {
849
- title: "Test",
850
- items: menuItems
851
- };
852
- await this._showMenu(editMenu, false);
853
- return obj;
854
- }
855
- return this._fillInStruct(type, path, {}, current);
865
+ // Use FillInStruct with current values as defaults
866
+ // The menu system will show existing values and allow editing
867
+ return this.FillInStruct(type, current);
856
868
  }
857
869
  async FillInStruct(type, def) {
858
870
  return this._fillInStruct(type, ["root"], {}, def);
@@ -870,8 +882,9 @@ export class Sprinkle {
870
882
  return this._fillInStruct(resolvedType, path, defs, def);
871
883
  }
872
884
  if (isOptional(type)) {
873
- const shouldSet = await selectCancellable({
874
- message: Sprinkle.ExtractMessage(type, `Set value for ${path.join(".")}?`),
885
+ const pathDisplay = formatPath(path) || "value";
886
+ const shouldSet = await selectWithClear({
887
+ message: Sprinkle.ExtractMessage(type, `Set value for ${pathDisplay}?`),
875
888
  choices: [{
876
889
  name: "Yes",
877
890
  value: true
@@ -895,6 +908,7 @@ export class Sprinkle {
895
908
  return this._fillInStruct(innerType, path, defs, def);
896
909
  }
897
910
  if (isUnion(type)) {
911
+ const pathDisplay = formatPath(path) || "value";
898
912
  const choices = [];
899
913
  const resolved = this.resolveType(type, path, defs);
900
914
  for (const variant of resolved.anyOf) {
@@ -903,21 +917,48 @@ export class Sprinkle {
903
917
  value: variant
904
918
  });
905
919
  }
906
- const selectionResult = await selectCancellable({
907
- message: Sprinkle.ExtractMessage(resolved, `Enter a choice for ${path.join(".")}`),
908
- choices: choices,
909
- default: def ? `${def}` : undefined
920
+ const selectionResult = await selectWithClear({
921
+ message: Sprinkle.ExtractMessage(resolved, `Enter a choice for ${pathDisplay}`),
922
+ choices: choices
910
923
  });
911
924
  if (selectionResult === null) {
912
925
  throw new UserCancelledError();
913
926
  }
914
927
  const selection = selectionResult;
915
- return this._fillInStruct(selection, path, defs);
928
+ // Determine if the provided default value matches the selected variant.
929
+ // For discriminated unions (objects with literal fields like `type`), check
930
+ // if the literal field values in the selected variant match those in `def`.
931
+ // For non-discriminated unions, fall back to structural matching with Value.Check.
932
+ let matchedDef = undefined;
933
+ if (def !== undefined) {
934
+ if (isObject(selection)) {
935
+ // Check if all literal fields in the selected variant match def
936
+ const literalFields = Object.entries(selection.properties ?? {}).filter(([, fieldSchema]) => isLiteral(fieldSchema));
937
+ if (literalFields.length > 0) {
938
+ const defRecord = def;
939
+ const allLiteralsMatch = literalFields.every(([fieldName, fieldSchema]) => defRecord[fieldName] === fieldSchema.const);
940
+ if (allLiteralsMatch) {
941
+ matchedDef = def;
942
+ }
943
+ } else {
944
+ // No literal discriminators - use structural check
945
+ if (Value.Check(selection, def)) {
946
+ matchedDef = def;
947
+ }
948
+ }
949
+ } else {
950
+ // Non-object variant - use structural check
951
+ if (Value.Check(selection, def)) {
952
+ matchedDef = def;
953
+ }
954
+ }
955
+ }
956
+ return this._fillInStruct(selection, path, defs, matchedDef);
916
957
  }
917
958
  if (isString(type)) {
918
959
  // Special handling for hot wallet private key - offer generation option
919
960
  if (type.title === "Hot Wallet Private Key") {
920
- const choice = await selectCancellable({
961
+ const choice = await selectWithClear({
921
962
  message: "Hot wallet setup:",
922
963
  choices: [{
923
964
  name: "Enter existing private key",
@@ -934,7 +975,7 @@ export class Sprinkle {
934
975
  return Sprinkle.generateWalletFromMnemonic();
935
976
  }
936
977
  // Fall through to password prompt for "existing" choice
937
- const answer = await passwordCancellable({
978
+ const answer = await passwordWithClear({
938
979
  message: "Enter your private key:"
939
980
  });
940
981
  if (answer === null) {
@@ -942,15 +983,16 @@ export class Sprinkle {
942
983
  }
943
984
  return answer;
944
985
  }
986
+ const pathDisplay = formatPath(path) || "value";
945
987
  const defaultString = def ? def : this.defaults["string"];
946
- const message = Sprinkle.ExtractMessage(type, `Enter a string for ${path.join(".")}`);
988
+ const message = Sprinkle.ExtractMessage(type, `Enter a string for ${pathDisplay}`);
947
989
  let answer;
948
990
  if (isSensitive(type)) {
949
- answer = await passwordCancellable({
991
+ answer = await passwordWithClear({
950
992
  message
951
993
  });
952
994
  } else {
953
- answer = await inputCancellable({
995
+ answer = await inputWithClear({
954
996
  message,
955
997
  default: defaultString
956
998
  });
@@ -964,8 +1006,9 @@ export class Sprinkle {
964
1006
  return answer;
965
1007
  }
966
1008
  if (isBigInt(type)) {
967
- const answer = await inputCancellable({
968
- message: Sprinkle.ExtractMessage(type, `Enter a bigint for ${path.join(".")}`),
1009
+ const pathDisplay = formatPath(path) || "value";
1010
+ const answer = await inputWithClear({
1011
+ message: Sprinkle.ExtractMessage(type, `Enter a bigint for ${pathDisplay}`),
969
1012
  default: def ? def.toString() : undefined,
970
1013
  validate: s => {
971
1014
  try {
@@ -985,39 +1028,40 @@ export class Sprinkle {
985
1028
  return type.const;
986
1029
  }
987
1030
  if (isObject(type)) {
988
- const obj = {};
989
- const fields = type["properties"];
990
- for (const [field, fieldType] of Object.entries(fields)) {
991
- const fieldValue = await this._fillInStruct(fieldType, path.concat([field]), defs, def ? def[field] : undefined);
992
- obj[field] = fieldValue;
1031
+ // Use menu-based editing for objects
1032
+ const defaults = def;
1033
+ const sprinkle = this;
1034
+ const result = await promptObject({
1035
+ type,
1036
+ path,
1037
+ defs,
1038
+ defaults,
1039
+ fillField: async (fieldType, fieldPath, fieldDefs, fieldDef) => {
1040
+ return sprinkle._fillInStruct(fieldType, fieldPath, fieldDefs, fieldDef);
1041
+ }
1042
+ });
1043
+ if (result.action === "cancel") {
1044
+ throw new UserCancelledError();
993
1045
  }
994
- return obj;
1046
+ return result.value;
995
1047
  }
996
-
997
- //TODO: support starting with default values for arrays and allow removal of items
998
1048
  if (isArray(type)) {
999
- const arr = [];
1000
- const itemType = type.items;
1001
- let addMore = true;
1002
- while (addMore) {
1003
- const itemValue = await this._fillInStruct(itemType, path.concat([`[${arr.length}]`]), defs);
1004
- arr.push(itemValue);
1005
- const continueAnswer = await selectCancellable({
1006
- message: `Add another item to ${path.join(".")}?`,
1007
- choices: [{
1008
- name: "Yes",
1009
- value: true
1010
- }, {
1011
- name: "No",
1012
- value: false
1013
- }]
1014
- });
1015
- if (continueAnswer === null) {
1016
- throw new UserCancelledError();
1049
+ // Use menu-based editing for arrays
1050
+ const defaults = def;
1051
+ const sprinkle = this;
1052
+ const result = await promptArray({
1053
+ type,
1054
+ path,
1055
+ defs,
1056
+ defaults,
1057
+ fillField: async (itemType, itemPath, itemDefs, itemDef) => {
1058
+ return sprinkle._fillInStruct(itemType, itemPath, itemDefs, itemDef);
1017
1059
  }
1018
- addMore = continueAnswer;
1060
+ });
1061
+ if (result.action === "back") {
1062
+ throw new UserCancelledError();
1019
1063
  }
1020
- return arr;
1064
+ return result.value;
1021
1065
  }
1022
1066
  if (isTuple(type)) {
1023
1067
  const items = type.items ?? [];
@@ -1029,7 +1073,8 @@ export class Sprinkle {
1029
1073
  }
1030
1074
  return result;
1031
1075
  }
1032
- throw new Error(`Unable to fill in struct for type at path ${path.join(".")}`);
1076
+ const pathDisplay = formatPath(path) || "root";
1077
+ throw new Error(`Unable to fill in struct for type at path ${pathDisplay}`);
1033
1078
  }
1034
1079
  resolveType(type, path, defs) {
1035
1080
  if (isRef(type) || isThis(type) || isImport(type)) {