@sundaeswap/sprinkles 0.2.1 → 0.4.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 +52 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +73 -1
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +53 -2
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +74 -2
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/types/Sprinkle/index.d.ts +11 -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 +55 -2
- package/src/Sprinkle/__tests__/settings-persistence.test.ts +108 -0
- package/src/Sprinkle/index.ts +100 -2
|
@@ -5,9 +5,13 @@ var _index = require("../index.js");
|
|
|
5
5
|
// Mock @inquirer/prompts
|
|
6
6
|
const mockSelect = (0, _bunTest.mock)();
|
|
7
7
|
const mockInput = (0, _bunTest.mock)();
|
|
8
|
+
const mockPassword = (0, _bunTest.mock)();
|
|
9
|
+
const mockConfirm = (0, _bunTest.mock)();
|
|
8
10
|
_bunTest.mock.module("@inquirer/prompts", () => ({
|
|
9
11
|
select: mockSelect,
|
|
10
|
-
input: mockInput
|
|
12
|
+
input: mockInput,
|
|
13
|
+
password: mockPassword,
|
|
14
|
+
confirm: mockConfirm
|
|
11
15
|
}));
|
|
12
16
|
(0, _bunTest.describe)("FillInStruct", () => {
|
|
13
17
|
let sprinkle;
|
|
@@ -156,5 +160,52 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
156
160
|
asset: ["policy123", "token456"]
|
|
157
161
|
});
|
|
158
162
|
});
|
|
163
|
+
(0, _bunTest.test)("hot wallet private key shows setup choice", async () => {
|
|
164
|
+
const schema = _index.Type.String({
|
|
165
|
+
title: "Hot Wallet Private Key"
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Select "existing" option
|
|
169
|
+
mockSelect.mockResolvedValueOnce("existing");
|
|
170
|
+
mockPassword.mockResolvedValueOnce("my-private-key");
|
|
171
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
172
|
+
|
|
173
|
+
// Verify select was called with correct options
|
|
174
|
+
(0, _bunTest.expect)(mockSelect.mock.calls[0][0].message).toBe("Hot wallet setup:");
|
|
175
|
+
(0, _bunTest.expect)(mockSelect.mock.calls[0][0].choices).toEqual([{
|
|
176
|
+
name: "Enter existing private key",
|
|
177
|
+
value: "existing"
|
|
178
|
+
}, {
|
|
179
|
+
name: "Generate new wallet",
|
|
180
|
+
value: "generate"
|
|
181
|
+
}]);
|
|
182
|
+
(0, _bunTest.expect)(result).toBe("my-private-key");
|
|
183
|
+
});
|
|
184
|
+
(0, _bunTest.test)("hot wallet existing key prompts for password", async () => {
|
|
185
|
+
const schema = _index.Type.String({
|
|
186
|
+
title: "Hot Wallet Private Key"
|
|
187
|
+
});
|
|
188
|
+
mockSelect.mockResolvedValueOnce("existing");
|
|
189
|
+
mockPassword.mockResolvedValueOnce("deadbeef1234");
|
|
190
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
191
|
+
(0, _bunTest.expect)(mockPassword).toHaveBeenCalledWith({
|
|
192
|
+
message: "Enter your private key:"
|
|
193
|
+
});
|
|
194
|
+
(0, _bunTest.expect)(result).toBe("deadbeef1234");
|
|
195
|
+
});
|
|
196
|
+
(0, _bunTest.test)("full wallet settings schema with existing key", async () => {
|
|
197
|
+
// Select "hot" variant
|
|
198
|
+
mockSelect.mockImplementationOnce(async opts => {
|
|
199
|
+
return opts.choices[0].value; // hot wallet object
|
|
200
|
+
});
|
|
201
|
+
// Select "existing" key option
|
|
202
|
+
mockSelect.mockResolvedValueOnce("existing");
|
|
203
|
+
mockPassword.mockResolvedValueOnce("abc123privatekey");
|
|
204
|
+
const result = await sprinkle.FillInStruct(_index.WalletSettingsSchema);
|
|
205
|
+
(0, _bunTest.expect)(result).toEqual({
|
|
206
|
+
type: "hot",
|
|
207
|
+
privateKey: "abc123privatekey"
|
|
208
|
+
});
|
|
209
|
+
});
|
|
159
210
|
});
|
|
160
211
|
//# sourceMappingURL=fill-in-struct.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","module","select","input","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","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"],"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 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"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","mockPassword","mockConfirm","module","select","input","password","confirm","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","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","WalletSettingsSchema","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":[]}
|
|
@@ -195,5 +195,125 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
195
195
|
});
|
|
196
196
|
(0, _bunTest.expect)(sprinkle.profileMeta.name).toBe("Default");
|
|
197
197
|
});
|
|
198
|
+
(0, _bunTest.describe)("currentProfile", () => {
|
|
199
|
+
(0, _bunTest.test)("returns null when no profile loaded", () => {
|
|
200
|
+
const schema = _index.Type.Object({
|
|
201
|
+
name: _index.Type.String()
|
|
202
|
+
});
|
|
203
|
+
const sprinkle = new _index.Sprinkle(schema, tmpDir);
|
|
204
|
+
(0, _bunTest.expect)(sprinkle.currentProfile).toBeNull();
|
|
205
|
+
});
|
|
206
|
+
(0, _bunTest.test)("returns profile info when loaded", () => {
|
|
207
|
+
const schema = _index.Type.Object({
|
|
208
|
+
name: _index.Type.String()
|
|
209
|
+
});
|
|
210
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
211
|
+
const profile = sprinkle.currentProfile;
|
|
212
|
+
(0, _bunTest.expect)(profile).not.toBeNull();
|
|
213
|
+
(0, _bunTest.expect)(profile.id).toBe("test");
|
|
214
|
+
(0, _bunTest.expect)(profile.name).toBe("Test");
|
|
215
|
+
(0, _bunTest.expect)(profile.createdAt).toBeDefined();
|
|
216
|
+
(0, _bunTest.expect)(profile.updatedAt).toBeDefined();
|
|
217
|
+
});
|
|
218
|
+
(0, _bunTest.test)("includes description when present", () => {
|
|
219
|
+
const schema = _index.Type.Object({
|
|
220
|
+
name: _index.Type.String()
|
|
221
|
+
});
|
|
222
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
223
|
+
sprinkle.profileMeta.description = "Test profile description";
|
|
224
|
+
const profile = sprinkle.currentProfile;
|
|
225
|
+
(0, _bunTest.expect)(profile.description).toBe("Test profile description");
|
|
226
|
+
});
|
|
227
|
+
(0, _bunTest.test)("has undefined description when not set", () => {
|
|
228
|
+
const schema = _index.Type.Object({
|
|
229
|
+
name: _index.Type.String()
|
|
230
|
+
});
|
|
231
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
232
|
+
delete sprinkle.profileMeta.description;
|
|
233
|
+
const profile = sprinkle.currentProfile;
|
|
234
|
+
(0, _bunTest.expect)(profile.description).toBeUndefined();
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
(0, _bunTest.describe)("getDisplaySettings", () => {
|
|
238
|
+
(0, _bunTest.test)("masks sensitive fields", () => {
|
|
239
|
+
const schema = _index.Type.Object({
|
|
240
|
+
name: _index.Type.String(),
|
|
241
|
+
secret: _index.Type.String({
|
|
242
|
+
sensitive: true
|
|
243
|
+
})
|
|
244
|
+
});
|
|
245
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
246
|
+
sprinkle.settings = {
|
|
247
|
+
name: "visible",
|
|
248
|
+
secret: "hidden"
|
|
249
|
+
};
|
|
250
|
+
const display = sprinkle.getDisplaySettings();
|
|
251
|
+
(0, _bunTest.expect)(display.name).toBe("visible");
|
|
252
|
+
(0, _bunTest.expect)(display.secret).toBe("********");
|
|
253
|
+
});
|
|
254
|
+
(0, _bunTest.test)("preserves non-sensitive fields", () => {
|
|
255
|
+
const schema = _index.Type.Object({
|
|
256
|
+
name: _index.Type.String(),
|
|
257
|
+
count: _index.Type.Number()
|
|
258
|
+
});
|
|
259
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
260
|
+
sprinkle.settings = {
|
|
261
|
+
name: "test",
|
|
262
|
+
count: 42
|
|
263
|
+
};
|
|
264
|
+
const display = sprinkle.getDisplaySettings();
|
|
265
|
+
(0, _bunTest.expect)(display.name).toBe("test");
|
|
266
|
+
(0, _bunTest.expect)(display.count).toBe(42);
|
|
267
|
+
});
|
|
268
|
+
(0, _bunTest.test)("preserves BigInt values", () => {
|
|
269
|
+
const schema = _index.Type.Object({
|
|
270
|
+
amount: _index.Type.BigInt(),
|
|
271
|
+
secret: _index.Type.String({
|
|
272
|
+
sensitive: true
|
|
273
|
+
})
|
|
274
|
+
});
|
|
275
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
276
|
+
sprinkle.settings = {
|
|
277
|
+
amount: 42n,
|
|
278
|
+
secret: "hidden"
|
|
279
|
+
};
|
|
280
|
+
const display = sprinkle.getDisplaySettings();
|
|
281
|
+
(0, _bunTest.expect)(display.amount).toBe(42n);
|
|
282
|
+
(0, _bunTest.expect)(display.secret).toBe("********");
|
|
283
|
+
});
|
|
284
|
+
(0, _bunTest.test)("masks nested sensitive fields", () => {
|
|
285
|
+
const schema = _index.Type.Object({
|
|
286
|
+
wallet: _index.Type.Object({
|
|
287
|
+
key: _index.Type.String({
|
|
288
|
+
sensitive: true
|
|
289
|
+
}),
|
|
290
|
+
address: _index.Type.String()
|
|
291
|
+
})
|
|
292
|
+
});
|
|
293
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
294
|
+
sprinkle.settings = {
|
|
295
|
+
wallet: {
|
|
296
|
+
key: "secret",
|
|
297
|
+
address: "addr1..."
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
const display = sprinkle.getDisplaySettings();
|
|
301
|
+
(0, _bunTest.expect)(display.wallet.key).toBe("********");
|
|
302
|
+
(0, _bunTest.expect)(display.wallet.address).toBe("addr1...");
|
|
303
|
+
});
|
|
304
|
+
(0, _bunTest.test)("does not mask empty sensitive fields", () => {
|
|
305
|
+
const schema = _index.Type.Object({
|
|
306
|
+
secret: _index.Type.String({
|
|
307
|
+
sensitive: true
|
|
308
|
+
})
|
|
309
|
+
});
|
|
310
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
311
|
+
sprinkle.settings = {
|
|
312
|
+
secret: ""
|
|
313
|
+
};
|
|
314
|
+
const display = sprinkle.getDisplaySettings();
|
|
315
|
+
(0, _bunTest.expect)(display.secret).toBe("");
|
|
316
|
+
});
|
|
317
|
+
});
|
|
198
318
|
});
|
|
199
319
|
//# sourceMappingURL=settings-persistence.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-persistence.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","test","result","Sprinkle","SettingsPath","expect","toBe","sep","nestedDir","schema","Type","name","String","sprinkle","withProfile","settings","saveSettings","existsSync","content","readFileSync","parsed","JSON","parse","defaults","toEqual","meta","amount","BigInt","raw","sprinkle2","loadProfile","string","user","score","profileMeta","profiles","scanProfiles","length","id","sanitizeProfileId","mkdirSync","writeFileSync","stringify","migrateIfNeeded"],"sources":["../../../../src/Sprinkle/__tests__/settings-persistence.test.ts"],"sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\ndescribe(\"Settings Persistence\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-test-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n test(\"SettingsPath returns correct path\", () => {\n const result = Sprinkle.SettingsPath(\"/some/path\");\n expect(result).toBe(`/some/path${path.sep}settings.json`);\n });\n\n test(\"saveSettings creates directory if missing\", () => {\n const nestedDir = path.join(tmpDir, \"nested\", \"deep\");\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, nestedDir));\n sprinkle.settings = { name: \"test\" } as any;\n\n sprinkle.saveSettings();\n\n expect(fs.existsSync(path.join(nestedDir, \"profiles\", \"test.json\"))).toBe(\n true,\n );\n });\n\n test(\"saveSettings writes valid JSON with profile format\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"hello\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"hello\");\n expect(parsed.defaults).toEqual({});\n expect(parsed.meta.name).toBe(\"Test\");\n });\n\n test(\"saveSettings serializes BigInt values\", () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const raw = JSON.parse(content);\n expect(raw.settings.amount).toBe(\"42n\");\n });\n\n test(\"saveSettings and loadProfile round-trip with BigInt\", async () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 99n } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ amount: 99n });\n });\n\n test(\"saveSettings preserves defaults\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"last-input\" };\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.defaults.string).toBe(\"last-input\");\n });\n\n test(\"loadProfile restores defaults\", async () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"remembered\" };\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.defaults).toEqual({ string: \"remembered\" });\n });\n\n test(\"round-trip with nested objects\", async () => {\n const schema = Type.Object({\n user: Type.Object({\n name: Type.String(),\n score: Type.BigInt(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { user: { name: \"alice\", score: 100n } } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({\n user: { name: \"alice\", score: 100n },\n });\n });\n\n test(\"scanProfiles returns profile entries\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir), \"alice\");\n sprinkle.profileMeta.name = \"Alice\";\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.saveSettings();\n\n const profiles = sprinkle.scanProfiles();\n expect(profiles.length).toBe(1);\n expect(profiles[0]!.id).toBe(\"alice\");\n expect(profiles[0]!.meta.name).toBe(\"Alice\");\n });\n\n test(\"sanitizeProfileId handles various inputs\", () => {\n expect(Sprinkle.sanitizeProfileId(\"Mainnet Alice\")).toBe(\"mainnet-alice\");\n expect(Sprinkle.sanitizeProfileId(\"test--profile\")).toBe(\"test-profile\");\n expect(Sprinkle.sanitizeProfileId(\"Hello World!@#$\")).toBe(\"hello-world\");\n expect(Sprinkle.sanitizeProfileId(\" \")).toBe(\"profile\");\n expect(Sprinkle.sanitizeProfileId(\"simple\")).toBe(\"simple\");\n });\n\n test(\"migration converts legacy settings.json to profile\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings.json\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({\n settings: { name: \"legacy\" },\n defaults: { string: \"old\" },\n }),\n );\n\n // Create sprinkle and trigger migration\n const sprinkle = new Sprinkle(schema, tmpDir);\n await (sprinkle as any).migrateIfNeeded();\n\n // Check profile was created\n expect(fs.existsSync(path.join(tmpDir, \"profiles\", \"default.json\"))).toBe(\n true,\n );\n // Check legacy file was backed up\n expect(fs.existsSync(path.join(tmpDir, \"settings.json.bak\"))).toBe(true);\n expect(fs.existsSync(path.join(tmpDir, \"settings.json\"))).toBe(false);\n\n // Load the migrated profile\n await sprinkle.loadProfile(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"legacy\" });\n expect(sprinkle.defaults).toEqual({ string: \"old\" });\n expect(sprinkle.profileMeta.name).toBe(\"Default\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"settings-persistence.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","test","result","Sprinkle","SettingsPath","expect","toBe","sep","nestedDir","schema","Type","name","String","sprinkle","withProfile","settings","saveSettings","existsSync","content","readFileSync","parsed","JSON","parse","defaults","toEqual","meta","amount","BigInt","raw","sprinkle2","loadProfile","string","user","score","profileMeta","profiles","scanProfiles","length","id","sanitizeProfileId","mkdirSync","writeFileSync","stringify","migrateIfNeeded","currentProfile","toBeNull","profile","not","createdAt","toBeDefined","updatedAt","description","toBeUndefined","secret","sensitive","display","getDisplaySettings","count","Number","wallet","key","address"],"sources":["../../../../src/Sprinkle/__tests__/settings-persistence.test.ts"],"sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\ndescribe(\"Settings Persistence\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-test-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n test(\"SettingsPath returns correct path\", () => {\n const result = Sprinkle.SettingsPath(\"/some/path\");\n expect(result).toBe(`/some/path${path.sep}settings.json`);\n });\n\n test(\"saveSettings creates directory if missing\", () => {\n const nestedDir = path.join(tmpDir, \"nested\", \"deep\");\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, nestedDir));\n sprinkle.settings = { name: \"test\" } as any;\n\n sprinkle.saveSettings();\n\n expect(fs.existsSync(path.join(nestedDir, \"profiles\", \"test.json\"))).toBe(\n true,\n );\n });\n\n test(\"saveSettings writes valid JSON with profile format\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"hello\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"hello\");\n expect(parsed.defaults).toEqual({});\n expect(parsed.meta.name).toBe(\"Test\");\n });\n\n test(\"saveSettings serializes BigInt values\", () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const raw = JSON.parse(content);\n expect(raw.settings.amount).toBe(\"42n\");\n });\n\n test(\"saveSettings and loadProfile round-trip with BigInt\", async () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 99n } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ amount: 99n });\n });\n\n test(\"saveSettings preserves defaults\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"last-input\" };\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.defaults.string).toBe(\"last-input\");\n });\n\n test(\"loadProfile restores defaults\", async () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"remembered\" };\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.defaults).toEqual({ string: \"remembered\" });\n });\n\n test(\"round-trip with nested objects\", async () => {\n const schema = Type.Object({\n user: Type.Object({\n name: Type.String(),\n score: Type.BigInt(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { user: { name: \"alice\", score: 100n } } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({\n user: { name: \"alice\", score: 100n },\n });\n });\n\n test(\"scanProfiles returns profile entries\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir), \"alice\");\n sprinkle.profileMeta.name = \"Alice\";\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.saveSettings();\n\n const profiles = sprinkle.scanProfiles();\n expect(profiles.length).toBe(1);\n expect(profiles[0]!.id).toBe(\"alice\");\n expect(profiles[0]!.meta.name).toBe(\"Alice\");\n });\n\n test(\"sanitizeProfileId handles various inputs\", () => {\n expect(Sprinkle.sanitizeProfileId(\"Mainnet Alice\")).toBe(\"mainnet-alice\");\n expect(Sprinkle.sanitizeProfileId(\"test--profile\")).toBe(\"test-profile\");\n expect(Sprinkle.sanitizeProfileId(\"Hello World!@#$\")).toBe(\"hello-world\");\n expect(Sprinkle.sanitizeProfileId(\" \")).toBe(\"profile\");\n expect(Sprinkle.sanitizeProfileId(\"simple\")).toBe(\"simple\");\n });\n\n test(\"migration converts legacy settings.json to profile\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings.json\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({\n settings: { name: \"legacy\" },\n defaults: { string: \"old\" },\n }),\n );\n\n // Create sprinkle and trigger migration\n const sprinkle = new Sprinkle(schema, tmpDir);\n await (sprinkle as any).migrateIfNeeded();\n\n // Check profile was created\n expect(fs.existsSync(path.join(tmpDir, \"profiles\", \"default.json\"))).toBe(\n true,\n );\n // Check legacy file was backed up\n expect(fs.existsSync(path.join(tmpDir, \"settings.json.bak\"))).toBe(true);\n expect(fs.existsSync(path.join(tmpDir, \"settings.json\"))).toBe(false);\n\n // Load the migrated profile\n await sprinkle.loadProfile(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"legacy\" });\n expect(sprinkle.defaults).toEqual({ string: \"old\" });\n expect(sprinkle.profileMeta.name).toBe(\"Default\");\n });\n\n describe(\"currentProfile\", () => {\n test(\"returns null when no profile loaded\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n expect(sprinkle.currentProfile).toBeNull();\n });\n\n test(\"returns profile info when loaded\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n\n const profile = sprinkle.currentProfile;\n expect(profile).not.toBeNull();\n expect(profile!.id).toBe(\"test\");\n expect(profile!.name).toBe(\"Test\");\n expect(profile!.createdAt).toBeDefined();\n expect(profile!.updatedAt).toBeDefined();\n });\n\n test(\"includes description when present\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.profileMeta.description = \"Test profile description\";\n\n const profile = sprinkle.currentProfile;\n expect(profile!.description).toBe(\"Test profile description\");\n });\n\n test(\"has undefined description when not set\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n delete sprinkle.profileMeta.description;\n\n const profile = sprinkle.currentProfile;\n expect(profile!.description).toBeUndefined();\n });\n });\n\n describe(\"getDisplaySettings\", () => {\n test(\"masks sensitive fields\", () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"visible\", secret: \"hidden\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.name).toBe(\"visible\");\n expect(display.secret).toBe(\"********\");\n });\n\n test(\"preserves non-sensitive fields\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Number(),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\", count: 42 } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.name).toBe(\"test\");\n expect(display.count).toBe(42);\n });\n\n test(\"preserves BigInt values\", () => {\n const schema = Type.Object({\n amount: Type.BigInt(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n, secret: \"hidden\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.amount).toBe(42n);\n expect(display.secret).toBe(\"********\");\n });\n\n test(\"masks nested sensitive fields\", () => {\n const schema = Type.Object({\n wallet: Type.Object({\n key: Type.String({ sensitive: true }),\n address: Type.String(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = {\n wallet: { key: \"secret\", address: \"addr1...\" },\n } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.wallet.key).toBe(\"********\");\n expect(display.wallet.address).toBe(\"addr1...\");\n });\n\n test(\"does not mask empty sensitive fields\", () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { secret: \"\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.secret).toBe(\"\");\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -116,7 +116,8 @@ const WalletSettingsSchema = exports.WalletSettingsSchema = _typebox.Type.Union(
|
|
|
116
116
|
type: _typebox.Type.Literal("hot"),
|
|
117
117
|
privateKey: _typebox.Type.String({
|
|
118
118
|
minLength: 1,
|
|
119
|
-
title: "Hot Wallet Private Key"
|
|
119
|
+
title: "Hot Wallet Private Key",
|
|
120
|
+
sensitive: true
|
|
120
121
|
})
|
|
121
122
|
}), _typebox.Type.Object({
|
|
122
123
|
type: _typebox.Type.Literal("cold"),
|
|
@@ -143,6 +144,16 @@ class Sprinkle {
|
|
|
143
144
|
this.options = options ?? {};
|
|
144
145
|
}
|
|
145
146
|
|
|
147
|
+
// --- Current Profile Accessor ---
|
|
148
|
+
|
|
149
|
+
get currentProfile() {
|
|
150
|
+
if (!this.profileId) return null;
|
|
151
|
+
return {
|
|
152
|
+
id: this.profileId,
|
|
153
|
+
...this.profileMeta
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
146
157
|
// --- Profile path helpers ---
|
|
147
158
|
|
|
148
159
|
static sanitizeProfileId(name) {
|
|
@@ -553,6 +564,35 @@ class Sprinkle {
|
|
|
553
564
|
const wallet = await Sprinkle.GetWallet(walletSettings, provider);
|
|
554
565
|
return _sdk.Blaze.from(provider, wallet);
|
|
555
566
|
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Generates a new wallet from a BIP39 mnemonic phrase.
|
|
570
|
+
* Displays the 24-word recovery phrase and requires user confirmation.
|
|
571
|
+
* @returns The Bip32PrivateKey hex string for storage
|
|
572
|
+
*/
|
|
573
|
+
static async generateWalletFromMnemonic() {
|
|
574
|
+
const mnemonic = _sdk.Core.generateMnemonic(_core.wordlist, 256); // 24 words
|
|
575
|
+
const words = mnemonic.split(" ");
|
|
576
|
+
console.log("\n=== NEW WALLET GENERATED ===\n");
|
|
577
|
+
console.log("IMPORTANT: Save these 24 words in a secure location.");
|
|
578
|
+
console.log("This is the ONLY way to recover your wallet.\n");
|
|
579
|
+
|
|
580
|
+
// Display in 4 columns
|
|
581
|
+
for (let i = 0; i < 6; i++) {
|
|
582
|
+
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]}`);
|
|
583
|
+
}
|
|
584
|
+
console.log("");
|
|
585
|
+
const confirmed = await (0, _prompts.confirm)({
|
|
586
|
+
message: "Have you saved your recovery phrase?",
|
|
587
|
+
default: false
|
|
588
|
+
});
|
|
589
|
+
if (!confirmed) {
|
|
590
|
+
throw new Error("Wallet generation cancelled - recovery phrase not saved");
|
|
591
|
+
}
|
|
592
|
+
const entropy = _sdk.Core.mnemonicToEntropy(mnemonic, _core.wordlist);
|
|
593
|
+
const masterKey = _sdk.Core.Bip32PrivateKey.fromBip39Entropy(Buffer.from(entropy), "");
|
|
594
|
+
return masterKey.hex();
|
|
595
|
+
}
|
|
556
596
|
static async SearchSelect(opts) {
|
|
557
597
|
return (0, _prompts.search)(opts);
|
|
558
598
|
}
|
|
@@ -643,6 +683,17 @@ class Sprinkle {
|
|
|
643
683
|
saveSettings() {
|
|
644
684
|
this.saveProfile();
|
|
645
685
|
}
|
|
686
|
+
getDisplaySettings() {
|
|
687
|
+
const clone = JSON.parse(JSON.stringify(this.settings, Sprinkle.bigIntReplacer), Sprinkle.bigIntReviver);
|
|
688
|
+
const sensitivePaths = Sprinkle.collectSensitivePaths(this.type);
|
|
689
|
+
for (const p of sensitivePaths) {
|
|
690
|
+
const value = Sprinkle.getNestedValue(clone, p);
|
|
691
|
+
if (typeof value === "string" && value.length > 0) {
|
|
692
|
+
Sprinkle.setNestedValue(clone, p, "********");
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
return clone;
|
|
696
|
+
}
|
|
646
697
|
|
|
647
698
|
// --- TxDialog Helpers ---
|
|
648
699
|
|
|
@@ -1092,6 +1143,27 @@ class Sprinkle {
|
|
|
1092
1143
|
return this._fillInStruct(selection, path, defs);
|
|
1093
1144
|
}
|
|
1094
1145
|
if (isString(type)) {
|
|
1146
|
+
// Special handling for hot wallet private key - offer generation option
|
|
1147
|
+
if (type.title === "Hot Wallet Private Key") {
|
|
1148
|
+
const choice = await (0, _prompts.select)({
|
|
1149
|
+
message: "Hot wallet setup:",
|
|
1150
|
+
choices: [{
|
|
1151
|
+
name: "Enter existing private key",
|
|
1152
|
+
value: "existing"
|
|
1153
|
+
}, {
|
|
1154
|
+
name: "Generate new wallet",
|
|
1155
|
+
value: "generate"
|
|
1156
|
+
}]
|
|
1157
|
+
});
|
|
1158
|
+
if (choice === "generate") {
|
|
1159
|
+
return Sprinkle.generateWalletFromMnemonic();
|
|
1160
|
+
}
|
|
1161
|
+
// Fall through to password prompt for "existing" choice
|
|
1162
|
+
const answer = await (0, _prompts.password)({
|
|
1163
|
+
message: "Enter your private key:"
|
|
1164
|
+
});
|
|
1165
|
+
return answer;
|
|
1166
|
+
}
|
|
1095
1167
|
const defaultString = def ? def : this.defaults["string"];
|
|
1096
1168
|
const message = Sprinkle.ExtractMessage(type, `Enter a string for ${path.join(".")}`);
|
|
1097
1169
|
let answer;
|