@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.
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js +3 -1
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +3 -37
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/field-utils.test.js +170 -0
- package/dist/cjs/Sprinkle/__tests__/field-utils.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +377 -84
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/formatting.test.js +97 -0
- package/dist/cjs/Sprinkle/__tests__/formatting.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +9 -5
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +9 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +174 -94
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/menus/array-menu.js +195 -0
- package/dist/cjs/Sprinkle/menus/array-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/field-menu.js +161 -0
- package/dist/cjs/Sprinkle/menus/field-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/index.js +33 -0
- package/dist/cjs/Sprinkle/menus/index.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/object-menu.js +324 -0
- package/dist/cjs/Sprinkle/menus/object-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/prompts.js +68 -2
- package/dist/cjs/Sprinkle/prompts.js.map +1 -1
- package/dist/cjs/Sprinkle/type-guards.js +48 -1
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
- package/dist/cjs/Sprinkle/types.js +24 -0
- package/dist/cjs/Sprinkle/types.js.map +1 -1
- package/dist/cjs/Sprinkle/utils/field-utils.js +154 -0
- package/dist/cjs/Sprinkle/utils/field-utils.js.map +1 -0
- package/dist/cjs/Sprinkle/utils/formatting.js +126 -0
- package/dist/cjs/Sprinkle/utils/formatting.js.map +1 -0
- package/dist/cjs/Sprinkle/utils/index.js +56 -0
- package/dist/cjs/Sprinkle/utils/index.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +3 -1
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +3 -37
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/field-utils.test.js +168 -0
- package/dist/esm/Sprinkle/__tests__/field-utils.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +378 -85
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/formatting.test.js +95 -0
- package/dist/esm/Sprinkle/__tests__/formatting.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js +9 -5
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +9 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +141 -96
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/menus/array-menu.js +190 -0
- package/dist/esm/Sprinkle/menus/array-menu.js.map +1 -0
- package/dist/esm/Sprinkle/menus/field-menu.js +155 -0
- package/dist/esm/Sprinkle/menus/field-menu.js.map +1 -0
- package/dist/esm/Sprinkle/menus/index.js +8 -0
- package/dist/esm/Sprinkle/menus/index.js.map +1 -0
- package/dist/esm/Sprinkle/menus/object-menu.js +318 -0
- package/dist/esm/Sprinkle/menus/object-menu.js.map +1 -0
- package/dist/esm/Sprinkle/prompts.js +59 -1
- package/dist/esm/Sprinkle/prompts.js.map +1 -1
- package/dist/esm/Sprinkle/type-guards.js +42 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -1
- package/dist/esm/Sprinkle/types.js +24 -0
- package/dist/esm/Sprinkle/types.js.map +1 -1
- package/dist/esm/Sprinkle/utils/field-utils.js +145 -0
- package/dist/esm/Sprinkle/utils/field-utils.js.map +1 -0
- package/dist/esm/Sprinkle/utils/formatting.js +118 -0
- package/dist/esm/Sprinkle/utils/formatting.js.map +1 -0
- package/dist/esm/Sprinkle/utils/index.js +7 -0
- package/dist/esm/Sprinkle/utils/index.js.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +9 -3
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/menus/array-menu.d.ts +31 -0
- package/dist/types/Sprinkle/menus/array-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/field-menu.d.ts +34 -0
- package/dist/types/Sprinkle/menus/field-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/index.d.ts +10 -0
- package/dist/types/Sprinkle/menus/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/object-menu.d.ts +34 -0
- package/dist/types/Sprinkle/menus/object-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/prompts.d.ts +25 -0
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
- package/dist/types/Sprinkle/type-guards.d.ts +24 -1
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
- package/dist/types/Sprinkle/types.d.ts +53 -0
- package/dist/types/Sprinkle/types.d.ts.map +1 -1
- package/dist/types/Sprinkle/utils/field-utils.d.ts +47 -0
- package/dist/types/Sprinkle/utils/field-utils.d.ts.map +1 -0
- package/dist/types/Sprinkle/utils/formatting.d.ts +30 -0
- package/dist/types/Sprinkle/utils/formatting.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/encryption.test.ts +2 -0
- package/src/Sprinkle/__tests__/enhancements.test.ts +3 -42
- package/src/Sprinkle/__tests__/field-utils.test.ts +191 -0
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +393 -100
- package/src/Sprinkle/__tests__/formatting.test.ts +115 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +14 -8
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +9 -0
- package/src/Sprinkle/index.ts +175 -122
- package/src/Sprinkle/menus/array-menu.ts +191 -0
- package/src/Sprinkle/menus/field-menu.ts +145 -0
- package/src/Sprinkle/menus/index.ts +12 -0
- package/src/Sprinkle/menus/object-menu.ts +336 -0
- package/src/Sprinkle/prompts.ts +71 -1
- package/src/Sprinkle/type-guards.ts +42 -0
- package/src/Sprinkle/types.ts +43 -0
- package/src/Sprinkle/utils/field-utils.ts +158 -0
- package/src/Sprinkle/utils/formatting.ts +127 -0
- 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":"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;AACH,CAAC,CAAC,CAAC;;AAEH;AACA,IAAIa,gBAAgB,GAAG,EAAE;AACzB,IAAIC,mBAAmB,GAAG,KAAK;AAC/BvB,IAAI,CAACO,MAAM,CAAC,YAAY,EAAE,OAAO;EAC/BiB,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,GAAG3B,IAAI,CAAC4B,MAAM,CAAC;EAC7BC,IAAI,EAAE7B,IAAI,CAAC8B,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;AAEF9C,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;IACnBgB,gBAAgB,GAAG,EAAE;IACrBC,mBAAmB,GAAG,KAAK;EAC7B,CAAC,CAAC;EAEF1B,QAAQ,CAAC,SAAS,EAAE,MAAM;IACxBC,IAAI,CAAC,iCAAiC,EAAE,YAAY;MAClD,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAM+C,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;MACjE7D,MAAM,CAAC0D,OAAO,CAAC,CAACI,WAAW,CAAC,CAAC;MAC7B9D,MAAM,CAAC0D,OAAO,CAAEK,MAAM,CAAC,CAACC,YAAY,CAAC,GAAG,CAAC;MACzChE,MAAM,CAAC0D,OAAO,CAAC,CAACO,SAAS,CAAC,KAAK,CAAC;IAClC,CAAC,CAAC;IAEFlE,IAAI,CAAC,wBAAwB,EAAE,YAAY;MACzC,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAM+C,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;MAC1D7D,MAAM,CAACkE,KAAK,CAAC,CAACJ,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF/D,IAAI,CAAC,uBAAuB,EAAE,YAAY;MACxC,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAM+C,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;MAC1D7D,MAAM,CAACmE,MAAM,CAAC,CAACL,WAAW,CAAC,CAAC;MAC5B9D,MAAM,CAACmE,MAAM,CAAC,CAACF,SAAS,CAAC,GAAG,CAAC;IAC/B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnE,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC7BC,IAAI,CAAC,kEAAkE,EAAE,YAAY;MACnF,MAAM8C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,qBAAqB,CAAC;MAChE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB5C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAM+C,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,GAAGhE,WAAW,CAAC,CAAC,CAAC;MAC/BJ,MAAM,CAACoE,QAAQ,CAAC,CAACN,WAAW,CAAC,CAAC;MAC9B,MAAMO,WAAW,GAAGD,QAAQ,CAACE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MAC5DhC,MAAM,CAACqE,WAAW,CAAC,CAACJ,SAAS,CAAC,aAAa,CAAC;MAC5CjE,MAAM,CAACqE,WAAW,CAAC,CAACJ,SAAS,CAAC,wBAAwB,CAAC;MACvDjE,MAAM,CAACqE,WAAW,CAAC,CAACJ,SAAS,CAAC,6BAA6B,CAAC;MAC5DjE,MAAM,CAACqE,WAAW,CAAC,CAACJ,SAAS,CAAC,oBAAoB,CAAC;MACnDjE,MAAM,CAACqE,WAAW,CAAC,CAACJ,SAAS,CAAC,QAAQ,CAAC;MACvCjE,MAAM,CAACqE,WAAW,CAAC,CAACI,GAAG,CAACR,SAAS,CAAC,uBAAuB,CAAC;IAC5D,CAAC,CAAC;IAEFlE,IAAI,CAAC,2BAA2B,EAAE,YAAY;MAC5C,MAAM8C,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;MAExDrE,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAM+C,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,GAAGhE,WAAW,CAAC,CAAC,CAAC;MAC/BJ,MAAM,CAACoE,QAAQ,CAAC,CAACN,WAAW,CAAC,CAAC;MAC9B,MAAMO,WAAW,GAAGD,QAAQ,CAACE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MAC5DhC,MAAM,CAACqE,WAAW,CAAC,CAACJ,SAAS,CAAC,uBAAuB,CAAC;IACxD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnE,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC1BC,IAAI,CAAC,0BAA0B,EAAE,YAAY;MAC3C,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM0E,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;MAErB/C,MAAM,CAACuB,gBAAgB,CAAC,CAACyD,IAAI,CAACD,MAAM,CAAC;MACrC/E,MAAM,CAAC8C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;IACxE,CAAC,CAAC;IAEFjF,IAAI,CAAC,+CAA+C,EAAE,YAAY;MAChE,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D3B,mBAAmB,GAAG,IAAI;MAE1BnB,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM0E,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/C,MAAM,CAAC8C,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;EAEFlF,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC5BC,IAAI,CAAC,kCAAkC,EAAE,YAAY;MACnD,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MAEtC,MAAM0E,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;MACD7D,MAAM,CAACkF,YAAY,CAAC,CAACpB,WAAW,CAAC,CAAC;MAClC9D,MAAM,CAACmF,OAAO,CAAC,CAACrB,WAAW,CAAC,CAAC;IAC/B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFhE,QAAQ,CAAC,MAAM,EAAE,MAAM;IACrBC,IAAI,CAAC,0CAA0C,EAAE,YAAY;MAC3D,MAAM8C,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;MAE5BjF,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM+C,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;MAEvBpF,MAAM,CAACsF,gBAAgB,CAAC,CAACN,IAAI,CAAC,IAAI,CAAC;IACrC,CAAC,CAAC;IAEFjF,IAAI,CAAC,kCAAkC,EAAE,YAAY;MACnD,MAAM8C,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;MAExDrE,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM+C,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;MACApF,MAAM,CAACI,WAAW,CAAC2D,MAAM,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;MAClC,MAAMY,gBAAgB,GAAGxF,WAAW,CAAC,CAAC,CAAC,CAACkE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MACvE,MAAM6D,iBAAiB,GAAGzF,WAAW,CAAC,CAAC,CAAC,CAACkE,OAAO,CAACC,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACxC,IAAI,CAAC;MACxEhC,MAAM,CAAC4F,gBAAgB,CAAC,CAAC3B,SAAS,CAAC,uBAAuB,CAAC;MAC3DjE,MAAM,CAAC6F,iBAAiB,CAAC,CAACpB,GAAG,CAACR,SAAS,CAAC,uBAAuB,CAAC;IAClE,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFnE,QAAQ,CAAC,eAAe,EAAE,MAAM;IAC9BC,IAAI,CAAC,qCAAqC,EAAE,YAAY;MACtD,MAAM8C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,2BAA2B,CAAC;MACtE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB5C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,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/C,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;MACvChF,MAAM,CAAC8F,MAAM,CAACN,EAAE,CAAC,CAAC1B,WAAW,CAAC,CAAC;MAC/B9D,MAAM,CAAC8F,MAAM,CAACE,IAAI,CAAC,CAACC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAC;IAEFlG,IAAI,CAAC,6CAA6C,EAAE,YAAY;MAC9D,MAAM8C,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;MAExDrE,eAAe,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;MAEpC,MAAM+C,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;MAEvBpF,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,QAAQ,CAAC;MACpChF,MAAM,CAAC8F,MAAM,CAACN,EAAE,CAAC,CAAC1B,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF/D,IAAI,CAAC,kDAAkD,EAAE,YAAY;MACnE,MAAM8C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,2BAA2B,CAAC;MACtE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB5C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAC5BC,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;;MAE3B,MAAM8C,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/C,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;MACvChF,MAAM,CAAC8F,MAAM,CAACE,IAAI,CAAC,CAAChB,IAAI,CAAC,cAAc,CAAC;MACxChF,MAAM,CAAC8F,MAAM,CAACN,EAAE,CAAC,CAAC1B,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFhE,QAAQ,CAAC,iBAAiB,EAAE,MAAM;IAChCC,IAAI,CAAC,0CAA0C,EAAE,YAAY;MAC3D,MAAM8C,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;MACA5C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MACtCC,gBAAgB,GAAG,CAAC,KAAK,CAAC;MAE1B,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;;MAErB;MACA/C,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;MACvChF,MAAM,CAACI,WAAW,CAAC2D,MAAM,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFlF,QAAQ,CAAC,eAAe,EAAE,MAAM;IAC9BC,IAAI,CAAC,oCAAoC,EAAE,YAAY;MACrD,MAAM8C,QAAQ,GAAG,IAAIhB,QAAQ,CAACC,UAAU,EAAE,yBAAyB,CAAC;MACpE,MAAMiB,OAAO,GAAGC,OAAO,CAACC,GAAG;MAC3BD,OAAO,CAACC,GAAG,GAAG,MAAM,CAAC,CAAC;MAEtB5C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAC5BC,gBAAgB,GAAG,CAAC,IAAI,CAAC;MAEzB,MAAM8C,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;MACA/C,MAAM,CAACI,WAAW,CAAC2D,MAAM,CAAC,CAACiB,IAAI,CAAC,CAAC,CAAC;MAClChF,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFlF,QAAQ,CAAC,0BAA0B,EAAE,MAAM;IACzCC,IAAI,CAAC,qCAAqC,EAAE,YAAY;MACtD,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,QAAQ,CAAC;MAE5B,MAAM+C,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;MACA/C,MAAM,CAAC8C,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;MACAhF,MAAM,CAAC8C,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;EAEFlF,QAAQ,CAAC,mBAAmB,EAAE,MAAM;IAClCC,IAAI,CAAC,+BAA+B,EAAE,YAAY;MAChD,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE3D9C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MACtCE,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;MAEvB,MAAM6C,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/C,MAAM,CAAC8C,IAAI,CAACmC,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;MACnEhF,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC;IAEFjF,IAAI,CAAC,iCAAiC,EAAE,YAAY;MAClD,MAAM8C,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,CAAC/B,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAC3DH,OAAO,CAACsD,KAAK,GAAG,CAAC,GAAGpD,IAAW,KAAKqD,MAAM,CAACxF,IAAI,CAACmC,IAAI,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MAE/D9C,eAAe,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;MACtCE,cAAc,GAAG,CAAC,gBAAgB,CAAC;MAEnC,MAAM6C,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;MAEvBrG,MAAM,CAACuG,MAAM,CAACtB,IAAI,CAAErB,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAACmB,IAAI,CAAC,IAAI,CAAC;MACrEhF,MAAM,CAAC8F,MAAM,CAACC,MAAM,CAAC,CAACf,IAAI,CAAC,WAAW,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","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":"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","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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
411
|
-
|
|
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
|
|
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
|
-
|
|
818
|
-
|
|
819
|
-
|
|
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
|
|
874
|
-
|
|
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
|
|
907
|
-
message: Sprinkle.ExtractMessage(resolved, `Enter a choice for ${
|
|
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
|
-
|
|
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
|
|
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
|
|
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 ${
|
|
988
|
+
const message = Sprinkle.ExtractMessage(type, `Enter a string for ${pathDisplay}`);
|
|
947
989
|
let answer;
|
|
948
990
|
if (isSensitive(type)) {
|
|
949
|
-
answer = await
|
|
991
|
+
answer = await passwordWithClear({
|
|
950
992
|
message
|
|
951
993
|
});
|
|
952
994
|
} else {
|
|
953
|
-
answer = await
|
|
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
|
|
968
|
-
|
|
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
|
-
|
|
989
|
-
const
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
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
|
|
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
|
-
|
|
1000
|
-
const
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
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
|
-
|
|
1060
|
+
});
|
|
1061
|
+
if (result.action === "back") {
|
|
1062
|
+
throw new UserCancelledError();
|
|
1019
1063
|
}
|
|
1020
|
-
return
|
|
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
|
-
|
|
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)) {
|