@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.
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +81 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +63 -2
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +82 -2
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +64 -3
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/types/Sprinkle/index.d.ts +6 -0
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +103 -2
- package/src/Sprinkle/index.ts +89 -3
|
@@ -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":"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","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
|
-
|
|
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) {
|