@sundaeswap/sprinkles 0.3.0 → 0.5.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__/encryption.test.js +20 -8
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +41 -16
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
- 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/__tests__/show-menu.test.js +93 -7
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +21 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/cjs/Sprinkle/encryption.js +131 -0
- package/dist/cjs/Sprinkle/encryption.js.map +1 -0
- package/dist/cjs/Sprinkle/index.js +318 -352
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/prompts.js +393 -0
- package/dist/cjs/Sprinkle/prompts.js.map +1 -0
- package/dist/cjs/Sprinkle/schemas.js +97 -0
- package/dist/cjs/Sprinkle/schemas.js.map +1 -0
- package/dist/cjs/Sprinkle/tx-dialog.js +101 -0
- package/dist/cjs/Sprinkle/tx-dialog.js.map +1 -0
- package/dist/cjs/Sprinkle/type-guards.js +42 -0
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -0
- package/dist/cjs/Sprinkle/types.js +49 -0
- package/dist/cjs/Sprinkle/types.js.map +1 -0
- package/dist/cjs/Sprinkle/wallet.js +98 -0
- package/dist/cjs/Sprinkle/wallet.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +20 -8
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +41 -16
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
- 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/__tests__/show-menu.test.js +94 -8
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +21 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/esm/Sprinkle/encryption.js +117 -0
- package/dist/esm/Sprinkle/encryption.js.map +1 -0
- package/dist/esm/Sprinkle/index.js +172 -337
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/prompts.js +385 -0
- package/dist/esm/Sprinkle/prompts.js.map +1 -0
- package/dist/esm/Sprinkle/schemas.js +91 -0
- package/dist/esm/Sprinkle/schemas.js.map +1 -0
- package/dist/esm/Sprinkle/tx-dialog.js +90 -0
- package/dist/esm/Sprinkle/tx-dialog.js.map +1 -0
- package/dist/esm/Sprinkle/type-guards.js +24 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -0
- package/dist/esm/Sprinkle/types.js +42 -0
- package/dist/esm/Sprinkle/types.js.map +1 -0
- package/dist/esm/Sprinkle/wallet.js +90 -0
- package/dist/esm/Sprinkle/wallet.js.map +1 -0
- package/dist/types/Sprinkle/encryption.d.ts +43 -0
- package/dist/types/Sprinkle/encryption.d.ts.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +13 -174
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/prompts.d.ts +94 -0
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -0
- package/dist/types/Sprinkle/schemas.d.ts +125 -0
- package/dist/types/Sprinkle/schemas.d.ts.map +1 -0
- package/dist/types/Sprinkle/tx-dialog.d.ts +37 -0
- package/dist/types/Sprinkle/tx-dialog.d.ts.map +1 -0
- package/dist/types/Sprinkle/type-guards.d.ts +22 -0
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -0
- package/dist/types/Sprinkle/types.d.ts +62 -0
- package/dist/types/Sprinkle/types.d.ts.map +1 -0
- package/dist/types/Sprinkle/wallet.d.ts +27 -0
- package/dist/types/Sprinkle/wallet.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/encryption.test.ts +21 -8
- package/src/Sprinkle/__tests__/enhancements.test.ts +41 -15
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +104 -38
- package/src/Sprinkle/__tests__/settings-persistence.test.ts +108 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +96 -8
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +21 -0
- package/src/Sprinkle/encryption.ts +130 -0
- package/src/Sprinkle/index.ts +265 -478
- package/src/Sprinkle/prompts.ts +481 -0
- package/src/Sprinkle/schemas.ts +111 -0
- package/src/Sprinkle/tx-dialog.ts +100 -0
- package/src/Sprinkle/type-guards.ts +51 -0
- package/src/Sprinkle/types.ts +73 -0
- package/src/Sprinkle/wallet.ts +133 -0
|
@@ -3,12 +3,23 @@ import { Sprinkle, Type } from "../index.js";
|
|
|
3
3
|
const mockSelect = mock();
|
|
4
4
|
const mockInput = mock();
|
|
5
5
|
const mockPassword = mock();
|
|
6
|
-
const
|
|
6
|
+
const mockSelectCancellable = mock();
|
|
7
|
+
const mockInputCancellable = mock();
|
|
8
|
+
const mockPasswordCancellable = mock();
|
|
9
|
+
const mockConfirmCancellable = mock();
|
|
10
|
+
const mockSearchCancellable = mock();
|
|
7
11
|
mock.module("@inquirer/prompts", () => ({
|
|
8
12
|
select: mockSelect,
|
|
9
13
|
input: mockInput,
|
|
10
|
-
password: mockPassword
|
|
11
|
-
|
|
14
|
+
password: mockPassword
|
|
15
|
+
}));
|
|
16
|
+
mock.module("../prompts.js", () => ({
|
|
17
|
+
selectCancellable: mockSelectCancellable,
|
|
18
|
+
inputCancellable: mockInputCancellable,
|
|
19
|
+
passwordCancellable: mockPasswordCancellable,
|
|
20
|
+
confirmCancellable: mockConfirmCancellable,
|
|
21
|
+
searchCancellable: mockSearchCancellable,
|
|
22
|
+
select: mockSelectCancellable
|
|
12
23
|
}));
|
|
13
24
|
describe("beforeShow hook (2.2)", () => {
|
|
14
25
|
let sprinkle;
|
|
@@ -21,13 +32,14 @@ describe("beforeShow hook (2.2)", () => {
|
|
|
21
32
|
name: "test"
|
|
22
33
|
};
|
|
23
34
|
mockSelect.mockClear();
|
|
35
|
+
mockSelectCancellable.mockClear();
|
|
24
36
|
});
|
|
25
37
|
test("calls beforeShow before rendering menu", async () => {
|
|
26
38
|
const callOrder = [];
|
|
27
39
|
const beforeShowFn = mock(async () => {
|
|
28
40
|
callOrder.push("beforeShow");
|
|
29
41
|
});
|
|
30
|
-
|
|
42
|
+
mockSelectCancellable.mockImplementation(async () => {
|
|
31
43
|
callOrder.push("select");
|
|
32
44
|
return -1; // exit
|
|
33
45
|
});
|
|
@@ -46,7 +58,7 @@ describe("beforeShow hook (2.2)", () => {
|
|
|
46
58
|
});
|
|
47
59
|
test("passes sprinkle instance to beforeShow", async () => {
|
|
48
60
|
let receivedSprinkle;
|
|
49
|
-
|
|
61
|
+
mockSelectCancellable.mockResolvedValueOnce(-1);
|
|
50
62
|
const menu = {
|
|
51
63
|
title: "Test",
|
|
52
64
|
beforeShow: async s => {
|
|
@@ -61,7 +73,7 @@ describe("beforeShow hook (2.2)", () => {
|
|
|
61
73
|
expect(receivedSprinkle).toBe(sprinkle);
|
|
62
74
|
});
|
|
63
75
|
test("menu works without beforeShow", async () => {
|
|
64
|
-
|
|
76
|
+
mockSelectCancellable.mockResolvedValueOnce(-1);
|
|
65
77
|
const menu = {
|
|
66
78
|
title: "Test",
|
|
67
79
|
items: [{
|
|
@@ -75,10 +87,10 @@ describe("beforeShow hook (2.2)", () => {
|
|
|
75
87
|
});
|
|
76
88
|
describe("SearchSelect (2.3)", () => {
|
|
77
89
|
beforeEach(() => {
|
|
78
|
-
|
|
90
|
+
mockSearchCancellable.mockClear();
|
|
79
91
|
});
|
|
80
92
|
test("delegates to search prompt", async () => {
|
|
81
|
-
|
|
93
|
+
mockSearchCancellable.mockResolvedValueOnce("selected-value");
|
|
82
94
|
const result = await Sprinkle.SearchSelect({
|
|
83
95
|
message: "Pick one",
|
|
84
96
|
source: () => [{
|
|
@@ -90,20 +102,31 @@ describe("SearchSelect (2.3)", () => {
|
|
|
90
102
|
}]
|
|
91
103
|
});
|
|
92
104
|
expect(result).toBe("selected-value");
|
|
93
|
-
expect(
|
|
94
|
-
expect(
|
|
105
|
+
expect(mockSearchCancellable).toHaveBeenCalledTimes(1);
|
|
106
|
+
expect(mockSearchCancellable.mock.calls[0][0].message).toBe("Pick one");
|
|
95
107
|
});
|
|
96
108
|
test("passes source function through", async () => {
|
|
97
109
|
const sourceFn = mock(() => [{
|
|
98
110
|
name: "X",
|
|
99
111
|
value: "x"
|
|
100
112
|
}]);
|
|
101
|
-
|
|
113
|
+
mockSearchCancellable.mockResolvedValueOnce("x");
|
|
102
114
|
await Sprinkle.SearchSelect({
|
|
103
115
|
message: "Search",
|
|
104
116
|
source: sourceFn
|
|
105
117
|
});
|
|
106
|
-
expect(
|
|
118
|
+
expect(mockSearchCancellable.mock.calls[0][0].source).toBe(sourceFn);
|
|
119
|
+
});
|
|
120
|
+
test("returns null when cancelled", async () => {
|
|
121
|
+
mockSearchCancellable.mockResolvedValueOnce(null);
|
|
122
|
+
const result = await Sprinkle.SearchSelect({
|
|
123
|
+
message: "Pick one",
|
|
124
|
+
source: () => [{
|
|
125
|
+
name: "A",
|
|
126
|
+
value: "a"
|
|
127
|
+
}]
|
|
128
|
+
});
|
|
129
|
+
expect(result).toBeNull();
|
|
107
130
|
});
|
|
108
131
|
});
|
|
109
132
|
describe("Optional type support (2.4)", () => {
|
|
@@ -115,14 +138,16 @@ describe("Optional type support (2.4)", () => {
|
|
|
115
138
|
sprinkle = new Sprinkle(schema, "/tmp/test");
|
|
116
139
|
mockSelect.mockClear();
|
|
117
140
|
mockInput.mockClear();
|
|
141
|
+
mockSelectCancellable.mockClear();
|
|
142
|
+
mockInputCancellable.mockClear();
|
|
118
143
|
});
|
|
119
144
|
test("skips optional field when user selects Skip", async () => {
|
|
120
145
|
const schema = Type.Object({
|
|
121
146
|
name: Type.String(),
|
|
122
147
|
nickname: Type.Optional(Type.String())
|
|
123
148
|
});
|
|
124
|
-
|
|
125
|
-
|
|
149
|
+
mockInputCancellable.mockResolvedValueOnce("Alice"); // name
|
|
150
|
+
mockSelectCancellable.mockResolvedValueOnce(false); // skip nickname
|
|
126
151
|
|
|
127
152
|
const result = await sprinkle.FillInStruct(schema);
|
|
128
153
|
expect(result.name).toBe("Alice");
|
|
@@ -133,9 +158,9 @@ describe("Optional type support (2.4)", () => {
|
|
|
133
158
|
name: Type.String(),
|
|
134
159
|
nickname: Type.Optional(Type.String())
|
|
135
160
|
});
|
|
136
|
-
|
|
161
|
+
mockInputCancellable.mockResolvedValueOnce("Alice") // name
|
|
137
162
|
.mockResolvedValueOnce("Ali"); // nickname
|
|
138
|
-
|
|
163
|
+
mockSelectCancellable.mockResolvedValueOnce(true); // fill nickname
|
|
139
164
|
|
|
140
165
|
const result = await sprinkle.FillInStruct(schema);
|
|
141
166
|
expect(result.name).toBe("Alice");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancements.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","mockPassword","mockSearch","module","select","input","password","search","sprinkle","schema","Object","name","String","settings","mockClear","callOrder","beforeShowFn","push","mockImplementation","menu","title","beforeShow","items","action","showMenu","toHaveBeenCalledTimes","toBe","receivedSprinkle","mockResolvedValueOnce","s","result","SearchSelect","message","source","value","calls","sourceFn","placeholder","nickname","Optional","FillInStruct","toBeUndefined"],"sources":["../../../../src/Sprinkle/__tests__/enhancements.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockSearch = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n search: mockSearch,\n}));\n\ndescribe(\"beforeShow hook (2.2)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n });\n\n test(\"calls beforeShow before rendering menu\", async () => {\n const callOrder: string[] = [];\n\n const beforeShowFn = mock(async () => {\n callOrder.push(\"beforeShow\");\n });\n\n mockSelect.mockImplementation(async () => {\n callOrder.push(\"select\");\n return -1; // exit\n });\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: beforeShowFn,\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n expect(beforeShowFn).toHaveBeenCalledTimes(1);\n expect(callOrder[0]).toBe(\"beforeShow\");\n expect(callOrder[1]).toBe(\"select\");\n });\n\n test(\"passes sprinkle instance to beforeShow\", async () => {\n let receivedSprinkle: any;\n\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: async (s) => {\n receivedSprinkle = s;\n },\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n expect(receivedSprinkle).toBe(sprinkle);\n });\n\n test(\"menu works without beforeShow\", async () => {\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n // Should complete without error\n });\n});\n\ndescribe(\"SearchSelect (2.3)\", () => {\n beforeEach(() => {\n mockSearch.mockClear();\n });\n\n test(\"delegates to search prompt\", async () => {\n mockSearch.mockResolvedValueOnce(\"selected-value\");\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [\n { name: \"Option A\", value: \"a\" },\n { name: \"Option B\", value: \"b\" },\n ],\n });\n\n expect(result).toBe(\"selected-value\");\n expect(mockSearch).toHaveBeenCalledTimes(1);\n expect(mockSearch.mock.calls[0][0].message).toBe(\"Pick one\");\n });\n\n test(\"passes source function through\", async () => {\n const sourceFn = mock(() => [{ name: \"X\", value: \"x\" }]);\n mockSearch.mockResolvedValueOnce(\"x\");\n\n await Sprinkle.SearchSelect({\n message: \"Search\",\n source: sourceFn,\n });\n\n expect(mockSearch.mock.calls[0][0].source).toBe(sourceFn);\n });\n});\n\ndescribe(\"Optional type support (2.4)\", () => {\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(\"skips optional field when user selects Skip\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInput.mockResolvedValueOnce(\"Alice\"); // name\n mockSelect.mockResolvedValueOnce(false); // skip nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBeUndefined();\n });\n\n test(\"fills optional field when user selects Yes\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\") // name\n .mockResolvedValueOnce(\"Ali\"); // nickname\n mockSelect.mockResolvedValueOnce(true); // fill nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBe(\"Ali\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"enhancements.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","mockPassword","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","mockSearchCancellable","module","select","input","password","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","searchCancellable","sprinkle","schema","Object","name","String","settings","mockClear","callOrder","beforeShowFn","push","mockImplementation","menu","title","beforeShow","items","action","showMenu","toHaveBeenCalledTimes","toBe","receivedSprinkle","mockResolvedValueOnce","s","result","SearchSelect","message","source","value","calls","sourceFn","toBeNull","placeholder","nickname","Optional","FillInStruct","toBeUndefined"],"sources":["../../../../src/Sprinkle/__tests__/enhancements.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = mock();\nconst mockConfirmCancellable = mock();\nconst mockSearchCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mockPasswordCancellable,\n confirmCancellable: mockConfirmCancellable,\n searchCancellable: mockSearchCancellable,\n select: mockSelectCancellable,\n}));\n\ndescribe(\"beforeShow hook (2.2)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n mockSelectCancellable.mockClear();\n });\n\n test(\"calls beforeShow before rendering menu\", async () => {\n const callOrder: string[] = [];\n\n const beforeShowFn = mock(async () => {\n callOrder.push(\"beforeShow\");\n });\n\n mockSelectCancellable.mockImplementation(async () => {\n callOrder.push(\"select\");\n return -1; // exit\n });\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: beforeShowFn,\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n expect(beforeShowFn).toHaveBeenCalledTimes(1);\n expect(callOrder[0]).toBe(\"beforeShow\");\n expect(callOrder[1]).toBe(\"select\");\n });\n\n test(\"passes sprinkle instance to beforeShow\", async () => {\n let receivedSprinkle: any;\n\n mockSelectCancellable.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: async (s) => {\n receivedSprinkle = s;\n },\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n expect(receivedSprinkle).toBe(sprinkle);\n });\n\n test(\"menu works without beforeShow\", async () => {\n mockSelectCancellable.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n // Should complete without error\n });\n});\n\ndescribe(\"SearchSelect (2.3)\", () => {\n beforeEach(() => {\n mockSearchCancellable.mockClear();\n });\n\n test(\"delegates to search prompt\", async () => {\n mockSearchCancellable.mockResolvedValueOnce(\"selected-value\");\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [\n { name: \"Option A\", value: \"a\" },\n { name: \"Option B\", value: \"b\" },\n ],\n });\n\n expect(result).toBe(\"selected-value\");\n expect(mockSearchCancellable).toHaveBeenCalledTimes(1);\n expect(mockSearchCancellable.mock.calls[0][0].message).toBe(\"Pick one\");\n });\n\n test(\"passes source function through\", async () => {\n const sourceFn = mock(() => [{ name: \"X\", value: \"x\" }]);\n mockSearchCancellable.mockResolvedValueOnce(\"x\");\n\n await Sprinkle.SearchSelect({\n message: \"Search\",\n source: sourceFn,\n });\n\n expect(mockSearchCancellable.mock.calls[0][0].source).toBe(sourceFn);\n });\n\n test(\"returns null when cancelled\", async () => {\n mockSearchCancellable.mockResolvedValueOnce(null);\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [{ name: \"A\", value: \"a\" }],\n });\n\n expect(result).toBeNull();\n });\n});\n\ndescribe(\"Optional type support (2.4)\", () => {\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 mockSelectCancellable.mockClear();\n mockInputCancellable.mockClear();\n });\n\n test(\"skips optional field when user selects Skip\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInputCancellable.mockResolvedValueOnce(\"Alice\"); // name\n mockSelectCancellable.mockResolvedValueOnce(false); // skip nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBeUndefined();\n });\n\n test(\"fills optional field when user selects Yes\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\") // name\n .mockResolvedValueOnce(\"Ali\"); // nickname\n mockSelectCancellable.mockResolvedValueOnce(true); // fill nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBe(\"Ali\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import { describe, expect, test, mock, beforeEach } from "bun:test";
|
|
2
2
|
import { Sprinkle, Type, WalletSettingsSchema } from "../index.js";
|
|
3
|
+
import { UserCancelledError } from "../types.js";
|
|
3
4
|
|
|
4
5
|
// Mock @inquirer/prompts
|
|
5
6
|
const mockSelect = mock();
|
|
6
7
|
const mockInput = mock();
|
|
7
8
|
const mockPassword = mock();
|
|
8
9
|
const mockConfirm = mock();
|
|
10
|
+
const mockSelectCancellable = mock();
|
|
11
|
+
const mockInputCancellable = mock();
|
|
12
|
+
const mockPasswordCancellable = mock();
|
|
13
|
+
const mockConfirmCancellable = mock();
|
|
9
14
|
mock.module("@inquirer/prompts", () => ({
|
|
10
15
|
select: mockSelect,
|
|
11
16
|
input: mockInput,
|
|
12
17
|
password: mockPassword,
|
|
13
18
|
confirm: mockConfirm
|
|
14
19
|
}));
|
|
20
|
+
mock.module("../prompts.js", () => ({
|
|
21
|
+
selectCancellable: mockSelectCancellable,
|
|
22
|
+
inputCancellable: mockInputCancellable,
|
|
23
|
+
passwordCancellable: mockPasswordCancellable,
|
|
24
|
+
confirmCancellable: mockConfirmCancellable
|
|
25
|
+
}));
|
|
15
26
|
describe("FillInStruct", () => {
|
|
16
27
|
let sprinkle;
|
|
17
28
|
beforeEach(() => {
|
|
@@ -21,36 +32,42 @@ describe("FillInStruct", () => {
|
|
|
21
32
|
sprinkle = new Sprinkle(schema, "/tmp/test");
|
|
22
33
|
mockSelect.mockClear();
|
|
23
34
|
mockInput.mockClear();
|
|
35
|
+
mockPassword.mockClear();
|
|
36
|
+
mockConfirm.mockClear();
|
|
37
|
+
mockSelectCancellable.mockClear();
|
|
38
|
+
mockInputCancellable.mockClear();
|
|
39
|
+
mockPasswordCancellable.mockClear();
|
|
40
|
+
mockConfirmCancellable.mockClear();
|
|
24
41
|
});
|
|
25
42
|
test("fills a simple string field", async () => {
|
|
26
|
-
|
|
43
|
+
mockInputCancellable.mockResolvedValueOnce("hello");
|
|
27
44
|
const result = await sprinkle.FillInStruct(Type.String());
|
|
28
45
|
expect(result).toBe("hello");
|
|
29
46
|
});
|
|
30
47
|
test("fills a string with title as prompt", async () => {
|
|
31
|
-
|
|
48
|
+
mockInputCancellable.mockResolvedValueOnce("world");
|
|
32
49
|
await sprinkle.FillInStruct(Type.String({
|
|
33
50
|
title: "Enter name"
|
|
34
51
|
}));
|
|
35
|
-
expect(
|
|
52
|
+
expect(mockInputCancellable.mock.calls[0][0].message).toBe("Enter name");
|
|
36
53
|
});
|
|
37
54
|
test("fills a bigint field", async () => {
|
|
38
|
-
|
|
55
|
+
mockInputCancellable.mockResolvedValueOnce("42");
|
|
39
56
|
const result = await sprinkle.FillInStruct(Type.BigInt());
|
|
40
57
|
expect(result).toBe(42n);
|
|
41
58
|
});
|
|
42
59
|
test("fills a literal field without prompting", async () => {
|
|
43
60
|
const result = await sprinkle.FillInStruct(Type.Literal("fixed"));
|
|
44
61
|
expect(result).toBe("fixed");
|
|
45
|
-
expect(
|
|
46
|
-
expect(
|
|
62
|
+
expect(mockInputCancellable).not.toHaveBeenCalled();
|
|
63
|
+
expect(mockSelectCancellable).not.toHaveBeenCalled();
|
|
47
64
|
});
|
|
48
65
|
test("fills an object with multiple fields", async () => {
|
|
49
66
|
const schema = Type.Object({
|
|
50
67
|
name: Type.String(),
|
|
51
68
|
age: Type.BigInt()
|
|
52
69
|
});
|
|
53
|
-
|
|
70
|
+
mockInputCancellable.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
|
|
54
71
|
const result = await sprinkle.FillInStruct(schema);
|
|
55
72
|
expect(result).toEqual({
|
|
56
73
|
name: "Alice",
|
|
@@ -67,10 +84,10 @@ describe("FillInStruct", () => {
|
|
|
67
84
|
})]);
|
|
68
85
|
|
|
69
86
|
// Select first variant (the Object with type "a")
|
|
70
|
-
|
|
87
|
+
mockSelectCancellable.mockImplementationOnce(async opts => {
|
|
71
88
|
return opts.choices[0].value;
|
|
72
89
|
});
|
|
73
|
-
|
|
90
|
+
mockInputCancellable.mockResolvedValueOnce("test-value");
|
|
74
91
|
const result = await sprinkle.FillInStruct(schema);
|
|
75
92
|
expect(result).toEqual({
|
|
76
93
|
type: "a",
|
|
@@ -79,31 +96,31 @@ describe("FillInStruct", () => {
|
|
|
79
96
|
});
|
|
80
97
|
test("fills an array with items", async () => {
|
|
81
98
|
const schema = Type.Array(Type.String());
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
99
|
+
mockInputCancellable.mockResolvedValueOnce("first");
|
|
100
|
+
mockSelectCancellable.mockResolvedValueOnce(true); // add another
|
|
101
|
+
mockInputCancellable.mockResolvedValueOnce("second");
|
|
102
|
+
mockSelectCancellable.mockResolvedValueOnce(false); // stop
|
|
86
103
|
|
|
87
104
|
const result = await sprinkle.FillInStruct(schema);
|
|
88
105
|
expect(result).toEqual(["first", "second"]);
|
|
89
106
|
});
|
|
90
107
|
test("fills an array with single item", async () => {
|
|
91
108
|
const schema = Type.Array(Type.String());
|
|
92
|
-
|
|
93
|
-
|
|
109
|
+
mockInputCancellable.mockResolvedValueOnce("only");
|
|
110
|
+
mockSelectCancellable.mockResolvedValueOnce(false); // stop
|
|
94
111
|
|
|
95
112
|
const result = await sprinkle.FillInStruct(schema);
|
|
96
113
|
expect(result).toEqual(["only"]);
|
|
97
114
|
});
|
|
98
115
|
test("uses default value for string", async () => {
|
|
99
|
-
|
|
116
|
+
mockInputCancellable.mockResolvedValueOnce("used-default");
|
|
100
117
|
await sprinkle.FillInStruct(Type.String(), "my-default");
|
|
101
|
-
expect(
|
|
118
|
+
expect(mockInputCancellable.mock.calls[0][0].default).toBe("my-default");
|
|
102
119
|
});
|
|
103
120
|
test("uses default value for bigint", async () => {
|
|
104
|
-
|
|
121
|
+
mockInputCancellable.mockResolvedValueOnce("99");
|
|
105
122
|
await sprinkle.FillInStruct(Type.BigInt(), 99n);
|
|
106
|
-
expect(
|
|
123
|
+
expect(mockInputCancellable.mock.calls[0][0].default).toBe("99");
|
|
107
124
|
});
|
|
108
125
|
test("throws for unsupported types", async () => {
|
|
109
126
|
expect(sprinkle.FillInStruct(Type.Boolean())).rejects.toThrow("Unable to fill in struct");
|
|
@@ -114,7 +131,7 @@ describe("FillInStruct", () => {
|
|
|
114
131
|
inner: Type.String()
|
|
115
132
|
})
|
|
116
133
|
});
|
|
117
|
-
|
|
134
|
+
mockInputCancellable.mockResolvedValueOnce("deep-value");
|
|
118
135
|
const result = await sprinkle.FillInStruct(schema);
|
|
119
136
|
expect(result).toEqual({
|
|
120
137
|
outer: {
|
|
@@ -123,37 +140,37 @@ describe("FillInStruct", () => {
|
|
|
123
140
|
});
|
|
124
141
|
});
|
|
125
142
|
test("remembers last string input as default", async () => {
|
|
126
|
-
|
|
143
|
+
mockInputCancellable.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
|
|
127
144
|
await sprinkle.FillInStruct(Type.String());
|
|
128
145
|
expect(sprinkle.defaults["string"]).toBe("first-input");
|
|
129
146
|
await sprinkle.FillInStruct(Type.String());
|
|
130
147
|
// Second call should have the first input as default
|
|
131
|
-
expect(
|
|
148
|
+
expect(mockInputCancellable.mock.calls[1][0].default).toBe("first-input");
|
|
132
149
|
});
|
|
133
150
|
test("fills a tuple with same-type elements", async () => {
|
|
134
151
|
const schema = Type.Tuple([Type.String(), Type.String()]);
|
|
135
|
-
|
|
152
|
+
mockInputCancellable.mockResolvedValueOnce("policyId").mockResolvedValueOnce("assetName");
|
|
136
153
|
const result = await sprinkle.FillInStruct(schema);
|
|
137
154
|
expect(result).toEqual(["policyId", "assetName"]);
|
|
138
155
|
});
|
|
139
156
|
test("fills a tuple with mixed types", async () => {
|
|
140
157
|
const schema = Type.Tuple([Type.String(), Type.BigInt()]);
|
|
141
|
-
|
|
158
|
+
mockInputCancellable.mockResolvedValueOnce("label").mockResolvedValueOnce("42");
|
|
142
159
|
const result = await sprinkle.FillInStruct(schema);
|
|
143
160
|
expect(result).toEqual(["label", 42n]);
|
|
144
161
|
});
|
|
145
162
|
test("fills a tuple with default values", async () => {
|
|
146
163
|
const schema = Type.Tuple([Type.String(), Type.BigInt()]);
|
|
147
|
-
|
|
164
|
+
mockInputCancellable.mockResolvedValueOnce("new-label").mockResolvedValueOnce("99");
|
|
148
165
|
await sprinkle.FillInStruct(schema, ["default-label", 50n]);
|
|
149
|
-
expect(
|
|
150
|
-
expect(
|
|
166
|
+
expect(mockInputCancellable.mock.calls[0][0].default).toBe("default-label");
|
|
167
|
+
expect(mockInputCancellable.mock.calls[1][0].default).toBe("50");
|
|
151
168
|
});
|
|
152
169
|
test("fills a tuple nested in an object", async () => {
|
|
153
170
|
const schema = Type.Object({
|
|
154
171
|
asset: Type.Tuple([Type.String(), Type.String()])
|
|
155
172
|
});
|
|
156
|
-
|
|
173
|
+
mockInputCancellable.mockResolvedValueOnce("policy123").mockResolvedValueOnce("token456");
|
|
157
174
|
const result = await sprinkle.FillInStruct(schema);
|
|
158
175
|
expect(result).toEqual({
|
|
159
176
|
asset: ["policy123", "token456"]
|
|
@@ -165,13 +182,13 @@ describe("FillInStruct", () => {
|
|
|
165
182
|
});
|
|
166
183
|
|
|
167
184
|
// Select "existing" option
|
|
168
|
-
|
|
169
|
-
|
|
185
|
+
mockSelectCancellable.mockResolvedValueOnce("existing");
|
|
186
|
+
mockPasswordCancellable.mockResolvedValueOnce("my-private-key");
|
|
170
187
|
const result = await sprinkle.FillInStruct(schema);
|
|
171
188
|
|
|
172
189
|
// Verify select was called with correct options
|
|
173
|
-
expect(
|
|
174
|
-
expect(
|
|
190
|
+
expect(mockSelectCancellable.mock.calls[0][0].message).toBe("Hot wallet setup:");
|
|
191
|
+
expect(mockSelectCancellable.mock.calls[0][0].choices).toEqual([{
|
|
175
192
|
name: "Enter existing private key",
|
|
176
193
|
value: "existing"
|
|
177
194
|
}, {
|
|
@@ -184,27 +201,57 @@ describe("FillInStruct", () => {
|
|
|
184
201
|
const schema = Type.String({
|
|
185
202
|
title: "Hot Wallet Private Key"
|
|
186
203
|
});
|
|
187
|
-
|
|
188
|
-
|
|
204
|
+
mockSelectCancellable.mockResolvedValueOnce("existing");
|
|
205
|
+
mockPasswordCancellable.mockResolvedValueOnce("deadbeef1234");
|
|
189
206
|
const result = await sprinkle.FillInStruct(schema);
|
|
190
|
-
expect(
|
|
207
|
+
expect(mockPasswordCancellable).toHaveBeenCalledWith({
|
|
191
208
|
message: "Enter your private key:"
|
|
192
209
|
});
|
|
193
210
|
expect(result).toBe("deadbeef1234");
|
|
194
211
|
});
|
|
195
212
|
test("full wallet settings schema with existing key", async () => {
|
|
196
213
|
// Select "hot" variant
|
|
197
|
-
|
|
214
|
+
mockSelectCancellable.mockImplementationOnce(async opts => {
|
|
198
215
|
return opts.choices[0].value; // hot wallet object
|
|
199
216
|
});
|
|
200
217
|
// Select "existing" key option
|
|
201
|
-
|
|
202
|
-
|
|
218
|
+
mockSelectCancellable.mockResolvedValueOnce("existing");
|
|
219
|
+
mockPasswordCancellable.mockResolvedValueOnce("abc123privatekey");
|
|
203
220
|
const result = await sprinkle.FillInStruct(WalletSettingsSchema);
|
|
204
221
|
expect(result).toEqual({
|
|
205
222
|
type: "hot",
|
|
206
223
|
privateKey: "abc123privatekey"
|
|
207
224
|
});
|
|
208
225
|
});
|
|
226
|
+
test("throws UserCancelledError when input prompt is cancelled", async () => {
|
|
227
|
+
mockInputCancellable.mockResolvedValueOnce(null);
|
|
228
|
+
await expect(sprinkle.FillInStruct(Type.String())).rejects.toThrow(UserCancelledError);
|
|
229
|
+
});
|
|
230
|
+
test("throws UserCancelledError when select prompt is cancelled", async () => {
|
|
231
|
+
const schema = Type.Union([Type.Object({
|
|
232
|
+
type: Type.Literal("a")
|
|
233
|
+
}), Type.Object({
|
|
234
|
+
type: Type.Literal("b")
|
|
235
|
+
})]);
|
|
236
|
+
mockSelectCancellable.mockResolvedValueOnce(null);
|
|
237
|
+
await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(UserCancelledError);
|
|
238
|
+
});
|
|
239
|
+
test("throws UserCancelledError when nested prompt is cancelled", async () => {
|
|
240
|
+
const schema = Type.Object({
|
|
241
|
+
name: Type.String(),
|
|
242
|
+
age: Type.BigInt()
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// First field succeeds, second is cancelled
|
|
246
|
+
mockInputCancellable.mockResolvedValueOnce("Alice").mockResolvedValueOnce(null);
|
|
247
|
+
await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(UserCancelledError);
|
|
248
|
+
});
|
|
249
|
+
test("throws UserCancelledError when array add-another prompt is cancelled", async () => {
|
|
250
|
+
const schema = Type.Array(Type.String());
|
|
251
|
+
mockInputCancellable.mockResolvedValueOnce("first");
|
|
252
|
+
mockSelectCancellable.mockResolvedValueOnce(null); // cancel on "add another?"
|
|
253
|
+
|
|
254
|
+
await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(UserCancelledError);
|
|
255
|
+
});
|
|
209
256
|
});
|
|
210
257
|
//# sourceMappingURL=fill-in-struct.test.js.map
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
1
|
+
{"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","WalletSettingsSchema","UserCancelledError","mockSelect","mockInput","mockPassword","mockConfirm","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","module","select","input","password","confirm","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","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\";\nimport { UserCancelledError } from \"../types.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = mock();\nconst mockConfirmCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mockPasswordCancellable,\n confirmCancellable: mockConfirmCancellable,\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 mockPassword.mockClear();\n mockConfirm.mockClear();\n mockSelectCancellable.mockClear();\n mockInputCancellable.mockClear();\n mockPasswordCancellable.mockClear();\n mockConfirmCancellable.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInputCancellable.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 mockInputCancellable.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInputCancellable.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInputCancellable.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(mockInputCancellable).not.toHaveBeenCalled();\n expect(mockSelectCancellable).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 mockInputCancellable\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 mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInputCancellable.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 mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(true); // add another\n mockInputCancellable.mockResolvedValueOnce(\"second\");\n mockSelectCancellable.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 mockInputCancellable.mockResolvedValueOnce(\"only\");\n mockSelectCancellable.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 mockInputCancellable.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInputCancellable.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 mockInputCancellable.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 mockInputCancellable\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(mockInputCancellable.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 mockInputCancellable\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 mockInputCancellable\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 mockInputCancellable\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInputCancellable.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 mockInputCancellable\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 mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelectCancellable.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelectCancellable.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 mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPasswordCancellable).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 mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.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 test(\"throws UserCancelledError when input prompt is cancelled\", async () => {\n mockInputCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(Type.String())).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when select prompt is cancelled\", async () => {\n const schema = Type.Union([\n Type.Object({ type: Type.Literal(\"a\") }),\n Type.Object({ type: Type.Literal(\"b\") }),\n ]);\n\n mockSelectCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when nested prompt is cancelled\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n // First field succeeds, second is cancelled\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when array add-another prompt is cancelled\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(null); // cancel on \"add another?\"\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
|