@sundaeswap/sprinkles 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","module","select","input","sprinkle","schema","Object","placeholder","String","mockClear","mockResolvedValueOnce","result","FillInStruct","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","WalletSettingsSchema","mockSelect","mockInput","mockPassword","mockConfirm","module","select","input","password","confirm","sprinkle","schema","Object","placeholder","String","mockClear","mockResolvedValueOnce","result","FillInStruct","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","privateKey"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInput\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInput.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n mockInput\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelect.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelect.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPassword).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n test(\"full wallet settings schema with existing key\", async () => {\n // Select \"hot\" variant\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"abc123privatekey\");\n\n const result = await sprinkle.FillInStruct(WalletSettingsSchema);\n\n expect(result).toEqual({\n type: \"hot\",\n privateKey: \"abc123privatekey\",\n });\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAAe,UAAU;AAC1E,SAASC,QAAQ,EAAEC,IAAI,EAAEC,oBAAoB,QAAQ,aAAa;;AAElE;AACA,MAAMC,UAAU,GAAGL,IAAI,CAAC,CAAC;AACzB,MAAMM,SAAS,GAAGN,IAAI,CAAC,CAAC;AACxB,MAAMO,YAAY,GAAGP,IAAI,CAAC,CAAC;AAC3B,MAAMQ,WAAW,GAAGR,IAAI,CAAC,CAAC;AAE1BA,IAAI,CAACS,MAAM,CAAC,mBAAmB,EAAE,OAAO;EACtCC,MAAM,EAAEL,UAAU;EAClBM,KAAK,EAAEL,SAAS;EAChBM,QAAQ,EAAEL,YAAY;EACtBM,OAAO,EAAEL;AACX,CAAC,CAAC,CAAC;AAEHX,QAAQ,CAAC,cAAc,EAAE,MAAM;EAC7B,IAAIiB,QAAuB;EAE3Bb,UAAU,CAAC,MAAM;IACf,MAAMc,MAAM,GAAGZ,IAAI,CAACa,MAAM,CAAC;MAAEC,WAAW,EAAEd,IAAI,CAACe,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1DJ,QAAQ,GAAG,IAAIZ,QAAQ,CAACa,MAAM,EAAE,WAAW,CAAC;IAC5CV,UAAU,CAACc,SAAS,CAAC,CAAC;IACtBb,SAAS,CAACa,SAAS,CAAC,CAAC;EACvB,CAAC,CAAC;EAEFpB,IAAI,CAAC,6BAA6B,EAAE,YAAY;IAC9CO,SAAS,CAACc,qBAAqB,CAAC,OAAO,CAAC;IAExC,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IACzDpB,MAAM,CAACuB,MAAM,CAAC,CAACE,IAAI,CAAC,OAAO,CAAC;EAC9B,CAAC,CAAC;EAEFxB,IAAI,CAAC,qCAAqC,EAAE,YAAY;IACtDO,SAAS,CAACc,qBAAqB,CAAC,OAAO,CAAC;IAExC,MAAMN,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACe,MAAM,CAAC;MAAEM,KAAK,EAAE;IAAa,CAAC,CAAC,CAAC;IACjE1B,MAAM,CAACQ,SAAS,CAACN,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAACH,IAAI,CAAC,YAAY,CAAC;EAC/D,CAAC,CAAC;EAEFxB,IAAI,CAAC,sBAAsB,EAAE,YAAY;IACvCO,SAAS,CAACc,qBAAqB,CAAC,IAAI,CAAC;IAErC,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACwB,MAAM,CAAC,CAAC,CAAC;IACzD7B,MAAM,CAACuB,MAAM,CAAC,CAACE,IAAI,CAAC,GAAG,CAAC;EAC1B,CAAC,CAAC;EAEFxB,IAAI,CAAC,yCAAyC,EAAE,YAAY;IAC1D,MAAMsB,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACyB,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE9B,MAAM,CAACuB,MAAM,CAAC,CAACE,IAAI,CAAC,OAAO,CAAC;IAC5BzB,MAAM,CAACQ,SAAS,CAAC,CAACuB,GAAG,CAACC,gBAAgB,CAAC,CAAC;IACxChC,MAAM,CAACO,UAAU,CAAC,CAACwB,GAAG,CAACC,gBAAgB,CAAC,CAAC;EAC3C,CAAC,CAAC;EAEF/B,IAAI,CAAC,sCAAsC,EAAE,YAAY;IACvD,MAAMgB,MAAM,GAAGZ,IAAI,CAACa,MAAM,CAAC;MACzBe,IAAI,EAAE5B,IAAI,CAACe,MAAM,CAAC,CAAC;MACnBc,GAAG,EAAE7B,IAAI,CAACwB,MAAM,CAAC;IACnB,CAAC,CAAC;IAEFrB,SAAS,CACNc,qBAAqB,CAAC,OAAO,CAAC,CAC9BA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC;MAAEF,IAAI,EAAE,OAAO;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;EACrD,CAAC,CAAC;EAEFjC,IAAI,CAAC,sDAAsD,EAAE,YAAY;IACvE,MAAMgB,MAAM,GAAGZ,IAAI,CAAC+B,KAAK,CAAC,CACxB/B,IAAI,CAACa,MAAM,CAAC;MACVmB,IAAI,EAAEhC,IAAI,CAACyB,OAAO,CAAC,GAAG,CAAC;MACvBQ,KAAK,EAAEjC,IAAI,CAACe,MAAM,CAAC;IACrB,CAAC,CAAC,EACFf,IAAI,CAACa,MAAM,CAAC;MACVmB,IAAI,EAAEhC,IAAI,CAACyB,OAAO,CAAC,GAAG,CAAC;MACvBS,KAAK,EAAElC,IAAI,CAACwB,MAAM,CAAC;IACrB,CAAC,CAAC,CACH,CAAC;;IAEF;IACAtB,UAAU,CAACiC,sBAAsB,CAAC,MAAOC,IAAS,IAAK;MACrD,OAAOA,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC,CAACJ,KAAK;IAC9B,CAAC,CAAC;IACF9B,SAAS,CAACc,qBAAqB,CAAC,YAAY,CAAC;IAE7C,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC;MAAEE,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE;IAAa,CAAC,CAAC;EAC5D,CAAC,CAAC;EAEFrC,IAAI,CAAC,2BAA2B,EAAE,YAAY;IAC5C,MAAMgB,MAAM,GAAGZ,IAAI,CAACsC,KAAK,CAACtC,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IAExCZ,SAAS,CAACc,qBAAqB,CAAC,OAAO,CAAC;IACxCf,UAAU,CAACe,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxCd,SAAS,CAACc,qBAAqB,CAAC,QAAQ,CAAC;IACzCf,UAAU,CAACe,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;;IAEzC,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;EAC7C,CAAC,CAAC;EAEFlC,IAAI,CAAC,iCAAiC,EAAE,YAAY;IAClD,MAAMgB,MAAM,GAAGZ,IAAI,CAACsC,KAAK,CAACtC,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IAExCZ,SAAS,CAACc,qBAAqB,CAAC,MAAM,CAAC;IACvCf,UAAU,CAACe,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;;IAEzC,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;EAClC,CAAC,CAAC;EAEFlC,IAAI,CAAC,+BAA+B,EAAE,YAAY;IAChDO,SAAS,CAACc,qBAAqB,CAAC,cAAc,CAAC;IAE/C,MAAMN,QAAQ,CAACQ,YAAY,CACzBnB,IAAI,CAACe,MAAM,CAAC,CAAC,EACb,YACF,CAAC;IAEDpB,MAAM,CAACQ,SAAS,CAACN,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,YAAY,CAAC;EAC/D,CAAC,CAAC;EAEFxB,IAAI,CAAC,+BAA+B,EAAE,YAAY;IAChDO,SAAS,CAACc,qBAAqB,CAAC,IAAI,CAAC;IAErC,MAAMN,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACwB,MAAM,CAAC,CAAC,EAAE,GAAU,CAAC;IAEtD7B,MAAM,CAACQ,SAAS,CAACN,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,IAAI,CAAC;EACvD,CAAC,CAAC;EAEFxB,IAAI,CAAC,8BAA8B,EAAE,YAAY;IAC/CD,MAAM,CACJgB,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACwC,OAAO,CAAC,CAAQ,CAC7C,CAAC,CAACC,OAAO,CAACC,OAAO,CAAC,0BAA0B,CAAC;EAC/C,CAAC,CAAC;EAEF9C,IAAI,CAAC,sBAAsB,EAAE,YAAY;IACvC,MAAMgB,MAAM,GAAGZ,IAAI,CAACa,MAAM,CAAC;MACzB8B,KAAK,EAAE3C,IAAI,CAACa,MAAM,CAAC;QACjB+B,KAAK,EAAE5C,IAAI,CAACe,MAAM,CAAC;MACrB,CAAC;IACH,CAAC,CAAC;IAEFZ,SAAS,CAACc,qBAAqB,CAAC,YAAY,CAAC;IAE7C,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC;MAAEa,KAAK,EAAE;QAAEC,KAAK,EAAE;MAAa;IAAE,CAAC,CAAC;EAC5D,CAAC,CAAC;EAEFhD,IAAI,CAAC,wCAAwC,EAAE,YAAY;IACzDO,SAAS,CACNc,qBAAqB,CAAC,aAAa,CAAC,CACpCA,qBAAqB,CAAC,cAAc,CAAC;IAExC,MAAMN,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IAC1CpB,MAAM,CAACgB,QAAQ,CAACkC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAACzB,IAAI,CAAC,aAAa,CAAC;IAEvD,MAAMT,QAAQ,CAACQ,YAAY,CAACnB,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IAC1C;IACApB,MAAM,CAACQ,SAAS,CAACN,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,aAAa,CAAC;EAChE,CAAC,CAAC;EAEFxB,IAAI,CAAC,uCAAuC,EAAE,YAAY;IACxD,MAAMgB,MAAM,GAAGZ,IAAI,CAAC8C,KAAK,CAAC,CAAC9C,IAAI,CAACe,MAAM,CAAC,CAAC,EAAEf,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzDZ,SAAS,CACNc,qBAAqB,CAAC,UAAU,CAAC,CACjCA,qBAAqB,CAAC,WAAW,CAAC;IAErC,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;EACnD,CAAC,CAAC;EAEFlC,IAAI,CAAC,gCAAgC,EAAE,YAAY;IACjD,MAAMgB,MAAM,GAAGZ,IAAI,CAAC8C,KAAK,CAAC,CAAC9C,IAAI,CAACe,MAAM,CAAC,CAAC,EAAEf,IAAI,CAACwB,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzDrB,SAAS,CACNc,qBAAqB,CAAC,OAAO,CAAC,CAC9BA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;EACxC,CAAC,CAAC;EAEFlC,IAAI,CAAC,mCAAmC,EAAE,YAAY;IACpD,MAAMgB,MAAM,GAAGZ,IAAI,CAAC8C,KAAK,CAAC,CAAC9C,IAAI,CAACe,MAAM,CAAC,CAAC,EAAEf,IAAI,CAACwB,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzDrB,SAAS,CACNc,qBAAqB,CAAC,WAAW,CAAC,CAClCA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAMN,QAAQ,CAACQ,YAAY,CAACP,MAAM,EAAE,CAAC,eAAe,EAAE,GAAG,CAAQ,CAAC;IAElEjB,MAAM,CAACQ,SAAS,CAACN,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,eAAe,CAAC;IAChEzB,MAAM,CAACQ,SAAS,CAACN,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,IAAI,CAAC;EACvD,CAAC,CAAC;EAEFxB,IAAI,CAAC,mCAAmC,EAAE,YAAY;IACpD,MAAMgB,MAAM,GAAGZ,IAAI,CAACa,MAAM,CAAC;MACzBkC,KAAK,EAAE/C,IAAI,CAAC8C,KAAK,CAAC,CAAC9C,IAAI,CAACe,MAAM,CAAC,CAAC,EAAEf,IAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IAEFZ,SAAS,CACNc,qBAAqB,CAAC,WAAW,CAAC,CAClCA,qBAAqB,CAAC,UAAU,CAAC;IAEpC,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAClDjB,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC;MAAEiB,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU;IAAE,CAAC,CAAC;EAC9D,CAAC,CAAC;EAEFnD,IAAI,CAAC,2CAA2C,EAAE,YAAY;IAC5D,MAAMgB,MAAM,GAAGZ,IAAI,CAACe,MAAM,CAAC;MAAEM,KAAK,EAAE;IAAyB,CAAC,CAAC;;IAE/D;IACAnB,UAAU,CAACe,qBAAqB,CAAC,UAAU,CAAC;IAC5Cb,YAAY,CAACa,qBAAqB,CAAC,gBAAgB,CAAC;IAEpD,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;;IAElD;IACAjB,MAAM,CAACO,UAAU,CAACL,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAACH,IAAI,CAAC,mBAAmB,CAAC;IACrEzB,MAAM,CAACO,UAAU,CAACL,IAAI,CAACyB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACe,OAAO,CAAC,CAACP,OAAO,CAAC,CAClD;MAAEF,IAAI,EAAE,4BAA4B;MAAEK,KAAK,EAAE;IAAW,CAAC,EACzD;MAAEL,IAAI,EAAE,qBAAqB;MAAEK,KAAK,EAAE;IAAW,CAAC,CACnD,CAAC;IACFtC,MAAM,CAACuB,MAAM,CAAC,CAACE,IAAI,CAAC,gBAAgB,CAAC;EACvC,CAAC,CAAC;EAEFxB,IAAI,CAAC,8CAA8C,EAAE,YAAY;IAC/D,MAAMgB,MAAM,GAAGZ,IAAI,CAACe,MAAM,CAAC;MAAEM,KAAK,EAAE;IAAyB,CAAC,CAAC;IAE/DnB,UAAU,CAACe,qBAAqB,CAAC,UAAU,CAAC;IAC5Cb,YAAY,CAACa,qBAAqB,CAAC,cAAc,CAAC;IAElD,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAACP,MAAM,CAAC;IAElDjB,MAAM,CAACS,YAAY,CAAC,CAAC4C,oBAAoB,CAAC;MACxCzB,OAAO,EAAE;IACX,CAAC,CAAC;IACF5B,MAAM,CAACuB,MAAM,CAAC,CAACE,IAAI,CAAC,cAAc,CAAC;EACrC,CAAC,CAAC;EAEFxB,IAAI,CAAC,+CAA+C,EAAE,YAAY;IAChE;IACAM,UAAU,CAACiC,sBAAsB,CAAC,MAAOC,IAAS,IAAK;MACrD,OAAOA,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC,CAACJ,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IACF;IACA/B,UAAU,CAACe,qBAAqB,CAAC,UAAU,CAAC;IAC5Cb,YAAY,CAACa,qBAAqB,CAAC,kBAAkB,CAAC;IAEtD,MAAMC,MAAM,GAAG,MAAMP,QAAQ,CAACQ,YAAY,CAAClB,oBAAoB,CAAC;IAEhEN,MAAM,CAACuB,MAAM,CAAC,CAACY,OAAO,CAAC;MACrBE,IAAI,EAAE,KAAK;MACXiB,UAAU,EAAE;IACd,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -3,7 +3,7 @@ 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 { Blockfrost } from "@blaze-cardano/query";
5
5
  import { Blaze, ColdWallet, Core, HotWallet } from "@blaze-cardano/sdk";
6
- import { CborSet, VkeyWitness, blake2b_256, TxCBOR } from "@blaze-cardano/core";
6
+ import { CborSet, VkeyWitness, blake2b_256, TxCBOR, wordlist } from "@blaze-cardano/core";
7
7
  import { confirm, input, password, search, select } from "@inquirer/prompts";
8
8
  import { Kind, Type, OptionalKind } from "@sinclair/typebox";
9
9
  import * as fs from "fs";
@@ -21,7 +21,7 @@ const isObject = t => t[Kind] === "Object";
21
21
  const isRef = t => t[Kind] === "Ref";
22
22
  const isString = t => t[Kind] === "String";
23
23
  const isThis = t => t[Kind] === "This";
24
- // const isTuple = (t: TSchema): t is TTuple => t[Kind] === "Tuple";
24
+ const isTuple = t => t[Kind] === "Tuple";
25
25
  const isUnion = t => t[Kind] === "Union";
26
26
  // const isAny = (t: TSchema): t is TAny => t[Kind] === "Any";
27
27
 
@@ -91,7 +91,8 @@ export const WalletSettingsSchema = Type.Union([Type.Object({
91
91
  type: Type.Literal("hot"),
92
92
  privateKey: Type.String({
93
93
  minLength: 1,
94
- title: "Hot Wallet Private Key"
94
+ title: "Hot Wallet Private Key",
95
+ sensitive: true
95
96
  })
96
97
  }), Type.Object({
97
98
  type: Type.Literal("cold"),
@@ -528,6 +529,35 @@ export class Sprinkle {
528
529
  const wallet = await Sprinkle.GetWallet(walletSettings, provider);
529
530
  return Blaze.from(provider, wallet);
530
531
  }
532
+
533
+ /**
534
+ * Generates a new wallet from a BIP39 mnemonic phrase.
535
+ * Displays the 24-word recovery phrase and requires user confirmation.
536
+ * @returns The Bip32PrivateKey hex string for storage
537
+ */
538
+ static async generateWalletFromMnemonic() {
539
+ const mnemonic = Core.generateMnemonic(wordlist, 256); // 24 words
540
+ const words = mnemonic.split(" ");
541
+ console.log("\n=== NEW WALLET GENERATED ===\n");
542
+ console.log("IMPORTANT: Save these 24 words in a secure location.");
543
+ console.log("This is the ONLY way to recover your wallet.\n");
544
+
545
+ // Display in 4 columns
546
+ for (let i = 0; i < 6; i++) {
547
+ console.log(`${(i + 1).toString().padStart(2)}. ${words[i].padEnd(12)} ` + `${(i + 7).toString().padStart(2)}. ${words[i + 6].padEnd(12)} ` + `${(i + 13).toString().padStart(2)}. ${words[i + 12].padEnd(12)} ` + `${(i + 19).toString().padStart(2)}. ${words[i + 18]}`);
548
+ }
549
+ console.log("");
550
+ const confirmed = await confirm({
551
+ message: "Have you saved your recovery phrase?",
552
+ default: false
553
+ });
554
+ if (!confirmed) {
555
+ throw new Error("Wallet generation cancelled - recovery phrase not saved");
556
+ }
557
+ const entropy = Core.mnemonicToEntropy(mnemonic, wordlist);
558
+ const masterKey = Core.Bip32PrivateKey.fromBip39Entropy(Buffer.from(entropy), "");
559
+ return masterKey.hex();
560
+ }
531
561
  static async SearchSelect(opts) {
532
562
  return search(opts);
533
563
  }
@@ -1067,6 +1097,27 @@ export class Sprinkle {
1067
1097
  return this._fillInStruct(selection, path, defs);
1068
1098
  }
1069
1099
  if (isString(type)) {
1100
+ // Special handling for hot wallet private key - offer generation option
1101
+ if (type.title === "Hot Wallet Private Key") {
1102
+ const choice = await select({
1103
+ message: "Hot wallet setup:",
1104
+ choices: [{
1105
+ name: "Enter existing private key",
1106
+ value: "existing"
1107
+ }, {
1108
+ name: "Generate new wallet",
1109
+ value: "generate"
1110
+ }]
1111
+ });
1112
+ if (choice === "generate") {
1113
+ return Sprinkle.generateWalletFromMnemonic();
1114
+ }
1115
+ // Fall through to password prompt for "existing" choice
1116
+ const answer = await password({
1117
+ message: "Enter your private key:"
1118
+ });
1119
+ return answer;
1120
+ }
1070
1121
  const defaultString = def ? def : this.defaults["string"];
1071
1122
  const message = Sprinkle.ExtractMessage(type, `Enter a string for ${path.join(".")}`);
1072
1123
  let answer;
@@ -1133,6 +1184,16 @@ export class Sprinkle {
1133
1184
  }
1134
1185
  return arr;
1135
1186
  }
1187
+ if (isTuple(type)) {
1188
+ const items = type.items ?? [];
1189
+ const result = [];
1190
+ for (let i = 0; i < items.length; i++) {
1191
+ const itemType = items[i];
1192
+ const value = await this._fillInStruct(itemType, path.concat([`[${i}]`]), defs, def ? def[i] : undefined);
1193
+ result.push(value);
1194
+ }
1195
+ return result;
1196
+ }
1136
1197
  throw new Error(`Unable to fill in struct for type at path ${path.join(".")}`);
1137
1198
  }
1138
1199
  resolveType(type, path, defs) {