@sundaeswap/sprinkles 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/dist/cjs/Sprinkle/__tests__/bigint-reviver.test.js +40 -0
  4. package/dist/cjs/Sprinkle/__tests__/bigint-reviver.test.js.map +1 -0
  5. package/dist/cjs/Sprinkle/__tests__/encryption.test.js +267 -0
  6. package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -0
  7. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +147 -0
  8. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -0
  9. package/dist/cjs/Sprinkle/__tests__/extract-message.test.js +60 -0
  10. package/dist/cjs/Sprinkle/__tests__/extract-message.test.js.map +1 -0
  11. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +131 -0
  12. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -0
  13. package/dist/cjs/Sprinkle/__tests__/schemas.test.js +184 -0
  14. package/dist/cjs/Sprinkle/__tests__/schemas.test.js.map +1 -0
  15. package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +199 -0
  16. package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -0
  17. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +108 -0
  18. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -0
  19. package/dist/cjs/Sprinkle/__tests__/test-helpers.js +16 -0
  20. package/dist/cjs/Sprinkle/__tests__/test-helpers.js.map +1 -0
  21. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +271 -0
  22. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -0
  23. package/dist/cjs/Sprinkle/index.js +954 -0
  24. package/dist/cjs/Sprinkle/index.js.map +1 -0
  25. package/dist/cjs/index.js +17 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/esm/Sprinkle/__tests__/bigint-reviver.test.js +38 -0
  29. package/dist/esm/Sprinkle/__tests__/bigint-reviver.test.js.map +1 -0
  30. package/dist/esm/Sprinkle/__tests__/encryption.test.js +264 -0
  31. package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -0
  32. package/dist/esm/Sprinkle/__tests__/enhancements.test.js +145 -0
  33. package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -0
  34. package/dist/esm/Sprinkle/__tests__/extract-message.test.js +58 -0
  35. package/dist/esm/Sprinkle/__tests__/extract-message.test.js.map +1 -0
  36. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +130 -0
  37. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -0
  38. package/dist/esm/Sprinkle/__tests__/schemas.test.js +182 -0
  39. package/dist/esm/Sprinkle/__tests__/schemas.test.js.map +1 -0
  40. package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +196 -0
  41. package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -0
  42. package/dist/esm/Sprinkle/__tests__/show-menu.test.js +106 -0
  43. package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -0
  44. package/dist/esm/Sprinkle/__tests__/test-helpers.js +10 -0
  45. package/dist/esm/Sprinkle/__tests__/test-helpers.js.map +1 -0
  46. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +269 -0
  47. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -0
  48. package/dist/esm/Sprinkle/index.js +928 -0
  49. package/dist/esm/Sprinkle/index.js.map +1 -0
  50. package/dist/esm/index.js +2 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/types/Sprinkle/index.d.ts +205 -0
  53. package/dist/types/Sprinkle/index.d.ts.map +1 -0
  54. package/dist/types/index.d.ts +2 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/tsconfig.build.tsbuildinfo +1 -0
  57. package/package.json +85 -0
  58. package/src/Sprinkle/__tests__/bigint-reviver.test.ts +49 -0
  59. package/src/Sprinkle/__tests__/encryption.test.ts +266 -0
  60. package/src/Sprinkle/__tests__/enhancements.test.ts +154 -0
  61. package/src/Sprinkle/__tests__/extract-message.test.ts +60 -0
  62. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +159 -0
  63. package/src/Sprinkle/__tests__/schemas.test.ts +215 -0
  64. package/src/Sprinkle/__tests__/settings-persistence.test.ts +181 -0
  65. package/src/Sprinkle/__tests__/show-menu.test.ts +123 -0
  66. package/src/Sprinkle/__tests__/test-helpers.ts +14 -0
  67. package/src/Sprinkle/__tests__/tx-dialog.test.ts +293 -0
  68. package/src/Sprinkle/index.ts +1215 -0
  69. package/src/index.ts +1 -0
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+
3
+ var _bunTest = require("bun:test");
4
+ var _index = require("../index.js");
5
+ var fs = _interopRequireWildcard(require("fs"));
6
+ var path = _interopRequireWildcard(require("path"));
7
+ var os = _interopRequireWildcard(require("os"));
8
+ var _testHelpers = require("./test-helpers.js");
9
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
+ (0, _bunTest.describe)("Settings Persistence", () => {
11
+ let tmpDir;
12
+ (0, _bunTest.beforeEach)(() => {
13
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "sprinkles-test-"));
14
+ });
15
+ (0, _bunTest.afterEach)(() => {
16
+ fs.rmSync(tmpDir, {
17
+ recursive: true,
18
+ force: true
19
+ });
20
+ });
21
+ (0, _bunTest.test)("SettingsPath returns correct path", () => {
22
+ const result = _index.Sprinkle.SettingsPath("/some/path");
23
+ (0, _bunTest.expect)(result).toBe(`/some/path${path.sep}settings.json`);
24
+ });
25
+ (0, _bunTest.test)("saveSettings creates directory if missing", () => {
26
+ const nestedDir = path.join(tmpDir, "nested", "deep");
27
+ const schema = _index.Type.Object({
28
+ name: _index.Type.String()
29
+ });
30
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, nestedDir));
31
+ sprinkle.settings = {
32
+ name: "test"
33
+ };
34
+ sprinkle.saveSettings();
35
+ (0, _bunTest.expect)(fs.existsSync(path.join(nestedDir, "profiles", "test.json"))).toBe(true);
36
+ });
37
+ (0, _bunTest.test)("saveSettings writes valid JSON with profile format", () => {
38
+ const schema = _index.Type.Object({
39
+ name: _index.Type.String()
40
+ });
41
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
42
+ sprinkle.settings = {
43
+ name: "hello"
44
+ };
45
+ sprinkle.saveSettings();
46
+ const content = fs.readFileSync(path.join(tmpDir, "profiles", "test.json"), "utf-8");
47
+ const parsed = JSON.parse(content);
48
+ (0, _bunTest.expect)(parsed.settings.name).toBe("hello");
49
+ (0, _bunTest.expect)(parsed.defaults).toEqual({});
50
+ (0, _bunTest.expect)(parsed.meta.name).toBe("Test");
51
+ });
52
+ (0, _bunTest.test)("saveSettings serializes BigInt values", () => {
53
+ const schema = _index.Type.Object({
54
+ amount: _index.Type.BigInt()
55
+ });
56
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
57
+ sprinkle.settings = {
58
+ amount: 42n
59
+ };
60
+ sprinkle.saveSettings();
61
+ const content = fs.readFileSync(path.join(tmpDir, "profiles", "test.json"), "utf-8");
62
+ const raw = JSON.parse(content);
63
+ (0, _bunTest.expect)(raw.settings.amount).toBe("42n");
64
+ });
65
+ (0, _bunTest.test)("saveSettings and loadProfile round-trip with BigInt", async () => {
66
+ const schema = _index.Type.Object({
67
+ amount: _index.Type.BigInt()
68
+ });
69
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
70
+ sprinkle.settings = {
71
+ amount: 99n
72
+ };
73
+ sprinkle.saveSettings();
74
+ const sprinkle2 = new _index.Sprinkle(schema, tmpDir);
75
+ await sprinkle2.loadProfile("test");
76
+ (0, _bunTest.expect)(sprinkle2.settings).toEqual({
77
+ amount: 99n
78
+ });
79
+ });
80
+ (0, _bunTest.test)("saveSettings preserves defaults", () => {
81
+ const schema = _index.Type.Object({
82
+ name: _index.Type.String()
83
+ });
84
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
85
+ sprinkle.settings = {
86
+ name: "test"
87
+ };
88
+ sprinkle.defaults = {
89
+ string: "last-input"
90
+ };
91
+ sprinkle.saveSettings();
92
+ const content = fs.readFileSync(path.join(tmpDir, "profiles", "test.json"), "utf-8");
93
+ const parsed = JSON.parse(content);
94
+ (0, _bunTest.expect)(parsed.defaults.string).toBe("last-input");
95
+ });
96
+ (0, _bunTest.test)("loadProfile restores defaults", async () => {
97
+ const schema = _index.Type.Object({
98
+ name: _index.Type.String()
99
+ });
100
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
101
+ sprinkle.settings = {
102
+ name: "test"
103
+ };
104
+ sprinkle.defaults = {
105
+ string: "remembered"
106
+ };
107
+ sprinkle.saveSettings();
108
+ const sprinkle2 = new _index.Sprinkle(schema, tmpDir);
109
+ await sprinkle2.loadProfile("test");
110
+ (0, _bunTest.expect)(sprinkle2.defaults).toEqual({
111
+ string: "remembered"
112
+ });
113
+ });
114
+ (0, _bunTest.test)("round-trip with nested objects", async () => {
115
+ const schema = _index.Type.Object({
116
+ user: _index.Type.Object({
117
+ name: _index.Type.String(),
118
+ score: _index.Type.BigInt()
119
+ })
120
+ });
121
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
122
+ sprinkle.settings = {
123
+ user: {
124
+ name: "alice",
125
+ score: 100n
126
+ }
127
+ };
128
+ sprinkle.saveSettings();
129
+ const sprinkle2 = new _index.Sprinkle(schema, tmpDir);
130
+ await sprinkle2.loadProfile("test");
131
+ (0, _bunTest.expect)(sprinkle2.settings).toEqual({
132
+ user: {
133
+ name: "alice",
134
+ score: 100n
135
+ }
136
+ });
137
+ });
138
+ (0, _bunTest.test)("scanProfiles returns profile entries", () => {
139
+ const schema = _index.Type.Object({
140
+ name: _index.Type.String()
141
+ });
142
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir), "alice");
143
+ sprinkle.profileMeta.name = "Alice";
144
+ sprinkle.settings = {
145
+ name: "test"
146
+ };
147
+ sprinkle.saveSettings();
148
+ const profiles = sprinkle.scanProfiles();
149
+ (0, _bunTest.expect)(profiles.length).toBe(1);
150
+ (0, _bunTest.expect)(profiles[0].id).toBe("alice");
151
+ (0, _bunTest.expect)(profiles[0].meta.name).toBe("Alice");
152
+ });
153
+ (0, _bunTest.test)("sanitizeProfileId handles various inputs", () => {
154
+ (0, _bunTest.expect)(_index.Sprinkle.sanitizeProfileId("Mainnet Alice")).toBe("mainnet-alice");
155
+ (0, _bunTest.expect)(_index.Sprinkle.sanitizeProfileId("test--profile")).toBe("test-profile");
156
+ (0, _bunTest.expect)(_index.Sprinkle.sanitizeProfileId("Hello World!@#$")).toBe("hello-world");
157
+ (0, _bunTest.expect)(_index.Sprinkle.sanitizeProfileId(" ")).toBe("profile");
158
+ (0, _bunTest.expect)(_index.Sprinkle.sanitizeProfileId("simple")).toBe("simple");
159
+ });
160
+ (0, _bunTest.test)("migration converts legacy settings.json to profile", async () => {
161
+ const schema = _index.Type.Object({
162
+ name: _index.Type.String()
163
+ });
164
+
165
+ // Write legacy settings.json
166
+ fs.mkdirSync(tmpDir, {
167
+ recursive: true
168
+ });
169
+ fs.writeFileSync(path.join(tmpDir, "settings.json"), JSON.stringify({
170
+ settings: {
171
+ name: "legacy"
172
+ },
173
+ defaults: {
174
+ string: "old"
175
+ }
176
+ }));
177
+
178
+ // Create sprinkle and trigger migration
179
+ const sprinkle = new _index.Sprinkle(schema, tmpDir);
180
+ await sprinkle.migrateIfNeeded();
181
+
182
+ // Check profile was created
183
+ (0, _bunTest.expect)(fs.existsSync(path.join(tmpDir, "profiles", "default.json"))).toBe(true);
184
+ // Check legacy file was backed up
185
+ (0, _bunTest.expect)(fs.existsSync(path.join(tmpDir, "settings.json.bak"))).toBe(true);
186
+ (0, _bunTest.expect)(fs.existsSync(path.join(tmpDir, "settings.json"))).toBe(false);
187
+
188
+ // Load the migrated profile
189
+ await sprinkle.loadProfile("default");
190
+ (0, _bunTest.expect)(sprinkle.settings).toEqual({
191
+ name: "legacy"
192
+ });
193
+ (0, _bunTest.expect)(sprinkle.defaults).toEqual({
194
+ string: "old"
195
+ });
196
+ (0, _bunTest.expect)(sprinkle.profileMeta.name).toBe("Default");
197
+ });
198
+ });
199
+ //# sourceMappingURL=settings-persistence.test.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ var _bunTest = require("bun:test");
4
+ var _index = require("../index.js");
5
+ var _testHelpers = require("./test-helpers.js");
6
+ const mockSelect = (0, _bunTest.mock)();
7
+ const mockInput = (0, _bunTest.mock)();
8
+ _bunTest.mock.module("@inquirer/prompts", () => ({
9
+ select: mockSelect,
10
+ input: mockInput
11
+ }));
12
+ (0, _bunTest.describe)("showMenu", () => {
13
+ let sprinkle;
14
+ (0, _bunTest.beforeEach)(() => {
15
+ const schema = _index.Type.Object({
16
+ name: _index.Type.String()
17
+ });
18
+ sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, "/tmp/test"));
19
+ sprinkle.settings = {
20
+ name: "test"
21
+ };
22
+ mockSelect.mockClear();
23
+ mockInput.mockClear();
24
+ });
25
+ (0, _bunTest.test)("exits when Exit is selected on main menu", async () => {
26
+ mockSelect.mockResolvedValueOnce(-1);
27
+ const menu = {
28
+ title: "Test Menu",
29
+ items: [{
30
+ title: "Action 1",
31
+ action: async () => {}
32
+ }]
33
+ };
34
+ await sprinkle.showMenu(menu);
35
+ });
36
+ (0, _bunTest.test)("executes action and re-shows menu", async () => {
37
+ const actionFn = (0, _bunTest.mock)(async () => {});
38
+ mockSelect.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);
39
+ const menu = {
40
+ title: "Test Menu",
41
+ items: [{
42
+ title: "My Action",
43
+ action: actionFn
44
+ }]
45
+ };
46
+ await sprinkle.showMenu(menu);
47
+ (0, _bunTest.expect)(actionFn).toHaveBeenCalledTimes(1);
48
+ });
49
+ (0, _bunTest.test)("main menu includes Settings & Profiles submenu and Exit", async () => {
50
+ mockSelect.mockResolvedValueOnce(-1);
51
+ const menu = {
52
+ title: "Test",
53
+ items: [{
54
+ title: "Action",
55
+ action: async () => {}
56
+ }]
57
+ };
58
+ await sprinkle.showMenu(menu);
59
+ const choices = mockSelect.mock.calls[0][0].choices;
60
+ const names = choices.map(c => c.name);
61
+ (0, _bunTest.expect)(names).toContain("Settings & Profiles");
62
+ (0, _bunTest.expect)(names).toContain("Exit");
63
+ (0, _bunTest.expect)(names).not.toContain("Switch profile");
64
+ (0, _bunTest.expect)(names).not.toContain("Manage profiles");
65
+ (0, _bunTest.expect)(names).not.toContain("Edit settings");
66
+ });
67
+ (0, _bunTest.test)("submenu includes Back instead of Exit", async () => {
68
+ mockSelect.mockResolvedValueOnce(0).mockResolvedValueOnce(-1).mockResolvedValueOnce(-1);
69
+ const menu = {
70
+ title: "Main",
71
+ items: [{
72
+ title: "Sub",
73
+ items: [{
74
+ title: "Sub Action",
75
+ action: async () => {}
76
+ }]
77
+ }]
78
+ };
79
+ await sprinkle.showMenu(menu);
80
+ const subChoices = mockSelect.mock.calls[1][0].choices;
81
+ const subNames = subChoices.map(c => c.name);
82
+ (0, _bunTest.expect)(subNames).toContain("Back");
83
+ (0, _bunTest.expect)(subNames).not.toContain("Exit");
84
+ });
85
+ (0, _bunTest.test)("action returning sprinkle instance saves settings", async () => {
86
+ sprinkle.settings = {
87
+ name: "original"
88
+ };
89
+ mockSelect.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);
90
+ const menu = {
91
+ title: "Test",
92
+ items: [{
93
+ title: "Update",
94
+ action: async s => {
95
+ s.settings = {
96
+ name: "updated"
97
+ };
98
+ return s;
99
+ }
100
+ }]
101
+ };
102
+ await sprinkle.showMenu(menu);
103
+ (0, _bunTest.expect)(sprinkle.settings).toEqual({
104
+ name: "updated"
105
+ });
106
+ });
107
+ });
108
+ //# sourceMappingURL=show-menu.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-menu.test.js","names":["_bunTest","require","_index","_testHelpers","mockSelect","mock","mockInput","module","select","input","describe","sprinkle","beforeEach","schema","Type","Object","name","String","withProfile","Sprinkle","settings","mockClear","test","mockResolvedValueOnce","menu","title","items","action","showMenu","actionFn","expect","toHaveBeenCalledTimes","choices","calls","names","map","c","toContain","not","subChoices","subNames","s","toEqual"],"sources":["../../../../src/Sprinkle/__tests__/show-menu.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\nimport { withProfile } from \"./test-helpers.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n}));\n\ndescribe(\"showMenu\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = withProfile(new Sprinkle(schema, \"/tmp/test\"));\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"exits when Exit is selected on main menu\", async () => {\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test Menu\",\n items: [\n {\n title: \"Action 1\",\n action: async () => {},\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n });\n\n test(\"executes action and re-shows menu\", async () => {\n const actionFn = mock(async () => {});\n\n mockSelect.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test Menu\",\n items: [\n {\n title: \"My Action\",\n action: actionFn,\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n expect(actionFn).toHaveBeenCalledTimes(1);\n });\n\n test(\"main menu includes Settings & Profiles submenu and Exit\", 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\n const choices = mockSelect.mock.calls[0][0].choices;\n const names = choices.map((c: any) => c.name);\n expect(names).toContain(\"Settings & Profiles\");\n expect(names).toContain(\"Exit\");\n expect(names).not.toContain(\"Switch profile\");\n expect(names).not.toContain(\"Manage profiles\");\n expect(names).not.toContain(\"Edit settings\");\n });\n\n test(\"submenu includes Back instead of Exit\", async () => {\n mockSelect\n .mockResolvedValueOnce(0)\n .mockResolvedValueOnce(-1)\n .mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Main\",\n items: [\n {\n title: \"Sub\",\n items: [{ title: \"Sub Action\", action: async () => {} }],\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n\n const subChoices = mockSelect.mock.calls[1][0].choices;\n const subNames = subChoices.map((c: any) => c.name);\n expect(subNames).toContain(\"Back\");\n expect(subNames).not.toContain(\"Exit\");\n });\n\n test(\"action returning sprinkle instance saves settings\", async () => {\n sprinkle.settings = { name: \"original\" } as any;\n\n mockSelect.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [\n {\n title: \"Update\",\n action: async (s: Sprinkle<any>) => {\n s.settings = { name: \"updated\" } as any;\n return s;\n },\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n expect(sprinkle.settings).toEqual({ name: \"updated\" });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.withProfile = withProfile;
7
+ function withProfile(sprinkle, id = "test") {
8
+ sprinkle.profileId = id;
9
+ sprinkle.profileMeta = {
10
+ name: "Test",
11
+ createdAt: new Date().toISOString(),
12
+ updatedAt: new Date().toISOString()
13
+ };
14
+ return sprinkle;
15
+ }
16
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","names":["withProfile","sprinkle","id","profileId","profileMeta","name","createdAt","Date","toISOString","updatedAt"],"sources":["../../../../src/Sprinkle/__tests__/test-helpers.ts"],"sourcesContent":["import { Sprinkle } from \"../index.js\";\n\nexport function withProfile<S>(\n sprinkle: Sprinkle<S>,\n id: string = \"test\",\n): Sprinkle<S> {\n sprinkle.profileId = id;\n sprinkle.profileMeta = {\n name: \"Test\",\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n return sprinkle;\n}\n"],"mappings":";;;;;;AAEO,SAASA,WAAWA,CACzBC,QAAqB,EACrBC,EAAU,GAAG,MAAM,EACN;EACbD,QAAQ,CAACE,SAAS,GAAGD,EAAE;EACvBD,QAAQ,CAACG,WAAW,GAAG;IACrBC,IAAI,EAAE,MAAM;IACZC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IACnCC,SAAS,EAAE,IAAIF,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;EACpC,CAAC;EACD,OAAOP,QAAQ;AACjB","ignoreList":[]}
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+
3
+ var _bunTest = require("bun:test");
4
+ var _typebox = require("@sinclair/typebox");
5
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
6
+ // Track select calls
7
+ let selectCalls = [];
8
+ let selectResponses = [];
9
+
10
+ // Mock @inquirer/prompts
11
+ _bunTest.mock.module("@inquirer/prompts", () => ({
12
+ input: (0, _bunTest.mock)(async () => "test"),
13
+ password: (0, _bunTest.mock)(async () => "secret"),
14
+ select: (0, _bunTest.mock)(async opts => {
15
+ selectCalls.push(opts);
16
+ const response = selectResponses.shift();
17
+ if (response === undefined) {
18
+ // Default: return -1 (Back/Exit)
19
+ return -1;
20
+ }
21
+ return response;
22
+ }),
23
+ search: (0, _bunTest.mock)(async () => "result")
24
+ }));
25
+
26
+ // Mock clipboardy
27
+ let clipboardContent = "";
28
+ let clipboardShouldFail = false;
29
+ _bunTest.mock.module("clipboardy", () => ({
30
+ default: {
31
+ writeSync: content => {
32
+ if (clipboardShouldFail) throw new Error("clipboard not available");
33
+ clipboardContent = content;
34
+ }
35
+ }
36
+ }));
37
+ const {
38
+ Sprinkle
39
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require("../../index.js")));
40
+ const TestSchema = _typebox.Type.Object({
41
+ name: _typebox.Type.String()
42
+ });
43
+ (0, _bunTest.describe)("TxDialog (2.6)", () => {
44
+ (0, _bunTest.beforeEach)(() => {
45
+ selectCalls = [];
46
+ selectResponses = [];
47
+ clipboardContent = "";
48
+ clipboardShouldFail = false;
49
+ });
50
+ (0, _bunTest.test)("shows truncated CBOR by default", async () => {
51
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog");
52
+ const logs = [];
53
+ const origLog = console.log;
54
+ console.log = (...args) => logs.push(args.join(" "));
55
+
56
+ // Just exit immediately
57
+ selectResponses = [-1];
58
+ const mockTx = {
59
+ toCbor: () => "a".repeat(100),
60
+ body: () => ({
61
+ requiredSigners: () => null,
62
+ certs: () => null,
63
+ withdrawals: () => null
64
+ })
65
+ };
66
+ const mockBlaze = {
67
+ wallet: {
68
+ getUsedAddresses: async () => []
69
+ }
70
+ };
71
+ await sprinkle.TxDialog(mockBlaze, mockTx);
72
+ console.log = origLog;
73
+
74
+ // Should show truncated CBOR (50 chars + ...)
75
+ const cborLog = logs.find(l => l.includes("Transaction CBOR:"));
76
+ (0, _bunTest.expect)(cborLog).toBeDefined();
77
+ (0, _bunTest.expect)(cborLog.length).toBeLessThan(100);
78
+ (0, _bunTest.expect)(cborLog).toContain("...");
79
+ });
80
+ (0, _bunTest.test)("menu items for non-HotWallet include Expand, Copy, no Sign", async () => {
81
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog2");
82
+ const origLog = console.log;
83
+ console.log = () => {};
84
+ selectResponses = [-1];
85
+ const mockTx = {
86
+ toCbor: () => "deadbeef",
87
+ body: () => ({
88
+ requiredSigners: () => null,
89
+ certs: () => null,
90
+ withdrawals: () => null
91
+ })
92
+ };
93
+ const mockBlaze = {
94
+ wallet: {
95
+ getUsedAddresses: async () => []
96
+ }
97
+ };
98
+ await sprinkle.TxDialog(mockBlaze, mockTx);
99
+ console.log = origLog;
100
+
101
+ // Check the select call had Expand and Copy but not Sign
102
+ const menuCall = selectCalls[0];
103
+ (0, _bunTest.expect)(menuCall).toBeDefined();
104
+ const choiceNames = menuCall.choices.map(c => c.name);
105
+ (0, _bunTest.expect)(choiceNames).toContain("Expand CBOR");
106
+ (0, _bunTest.expect)(choiceNames).toContain("Copy CBOR to clipboard");
107
+ (0, _bunTest.expect)(choiceNames).not.toContain("Sign and submit transaction");
108
+ });
109
+ (0, _bunTest.test)("menu items for HotWallet include Sign", async () => {
110
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog3");
111
+ const origLog = console.log;
112
+ console.log = () => {};
113
+
114
+ // Need to import HotWallet to use instanceof
115
+ const {
116
+ HotWallet
117
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require("@blaze-cardano/sdk")));
118
+ selectResponses = [-1];
119
+ const mockTx = {
120
+ toCbor: () => "deadbeef",
121
+ body: () => ({
122
+ requiredSigners: () => null,
123
+ certs: () => null,
124
+ withdrawals: () => null
125
+ })
126
+ };
127
+
128
+ // Create a mock that passes instanceof HotWallet check
129
+ // We need to use Object.create to set the prototype
130
+ const hotWalletProto = HotWallet.prototype;
131
+ const mockWallet = Object.create(hotWalletProto);
132
+ mockWallet.getUsedAddresses = async () => [];
133
+ const mockBlaze = {
134
+ wallet: mockWallet
135
+ };
136
+ await sprinkle.TxDialog(mockBlaze, mockTx);
137
+ console.log = origLog;
138
+ const menuCall = selectCalls[0];
139
+ (0, _bunTest.expect)(menuCall).toBeDefined();
140
+ const choiceNames = menuCall.choices.map(c => c.name);
141
+ (0, _bunTest.expect)(choiceNames).toContain("Sign and submit transaction");
142
+ });
143
+ (0, _bunTest.test)("copy CBOR to clipboard works", async () => {
144
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog4");
145
+ const origLog = console.log;
146
+ const logs = [];
147
+ console.log = (...args) => logs.push(args.join(" "));
148
+
149
+ // Select "Copy CBOR to clipboard" (index 1), then Back (-1)
150
+ selectResponses = [1, -1];
151
+ const txCbor = "deadbeefcafebabe";
152
+ const mockTx = {
153
+ toCbor: () => txCbor,
154
+ body: () => ({
155
+ requiredSigners: () => null,
156
+ certs: () => null,
157
+ withdrawals: () => null
158
+ })
159
+ };
160
+ const mockBlaze = {
161
+ wallet: {
162
+ getUsedAddresses: async () => []
163
+ }
164
+ };
165
+ await sprinkle.TxDialog(mockBlaze, mockTx);
166
+ console.log = origLog;
167
+ (0, _bunTest.expect)(clipboardContent).toBe(txCbor);
168
+ (0, _bunTest.expect)(logs.some(l => l.includes("copied to clipboard"))).toBe(true);
169
+ });
170
+ (0, _bunTest.test)("clipboard failure falls back to expanded view", async () => {
171
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog5");
172
+ const origLog = console.log;
173
+ const logs = [];
174
+ console.log = (...args) => logs.push(args.join(" "));
175
+ clipboardShouldFail = true;
176
+
177
+ // Select "Copy CBOR to clipboard" (index 1),
178
+ // It will fail and call showDialog again with expanded=true
179
+ // Then Back (-1) from the expanded menu, then Back from outer
180
+ selectResponses = [1, -1, -1];
181
+ const txCbor = "a".repeat(100);
182
+ const mockTx = {
183
+ toCbor: () => txCbor,
184
+ body: () => ({
185
+ requiredSigners: () => null,
186
+ certs: () => null,
187
+ withdrawals: () => null
188
+ })
189
+ };
190
+ const mockBlaze = {
191
+ wallet: {
192
+ getUsedAddresses: async () => []
193
+ }
194
+ };
195
+ await sprinkle.TxDialog(mockBlaze, mockTx);
196
+ console.log = origLog;
197
+ (0, _bunTest.expect)(logs.some(l => l.includes("Failed to copy"))).toBe(true);
198
+ // After failure it should show the full CBOR without truncation
199
+ (0, _bunTest.expect)(logs.some(l => l.includes(txCbor) && !l.includes("..."))).toBe(true);
200
+ });
201
+ (0, _bunTest.test)("expand CBOR shows full content", async () => {
202
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog6");
203
+ const origLog = console.log;
204
+ const logs = [];
205
+ console.log = (...args) => logs.push(args.join(" "));
206
+
207
+ // Select "Expand CBOR" (index 0), then Back (-1) from expanded, then Back from outer
208
+ selectResponses = [0, -1, -1];
209
+ const txCbor = "b".repeat(100);
210
+ const mockTx = {
211
+ toCbor: () => txCbor,
212
+ body: () => ({
213
+ requiredSigners: () => null,
214
+ certs: () => null,
215
+ withdrawals: () => null
216
+ })
217
+ };
218
+ const mockBlaze = {
219
+ wallet: {
220
+ getUsedAddresses: async () => []
221
+ }
222
+ };
223
+ await sprinkle.TxDialog(mockBlaze, mockTx);
224
+ console.log = origLog;
225
+
226
+ // First call shows truncated, second shows full
227
+ const truncatedLog = logs.find(l => l.includes("...") && l.includes("Transaction CBOR:"));
228
+ const fullLog = logs.find(l => l.includes(txCbor) && !l.includes("..."));
229
+ (0, _bunTest.expect)(truncatedLog).toBeDefined();
230
+ (0, _bunTest.expect)(fullLog).toBeDefined();
231
+ });
232
+ (0, _bunTest.test)("beforeSign hook is called before signing", async () => {
233
+ const sprinkle = new Sprinkle(TestSchema, "/tmp/test-txdialog7");
234
+ const origLog = console.log;
235
+ const origWarn = console.warn;
236
+ console.log = () => {};
237
+ console.warn = () => {};
238
+ const {
239
+ HotWallet
240
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require("@blaze-cardano/sdk")));
241
+ let beforeSignCalled = false;
242
+
243
+ // Select "Sign and submit" (index 2 - after Expand and Copy), then Back
244
+ selectResponses = [2, -1];
245
+ const mockTx = {
246
+ toCbor: () => "deadbeef",
247
+ body: () => ({
248
+ requiredSigners: () => null,
249
+ certs: () => null,
250
+ withdrawals: () => null
251
+ })
252
+ };
253
+ const hotWalletProto = HotWallet.prototype;
254
+ const mockWallet = Object.create(hotWalletProto);
255
+ mockWallet.getUsedAddresses = async () => [];
256
+ const mockBlaze = {
257
+ wallet: mockWallet,
258
+ signTransaction: async tx => tx,
259
+ submitTransaction: async () => "txhash123"
260
+ };
261
+ await sprinkle.TxDialog(mockBlaze, mockTx, {
262
+ beforeSign: async () => {
263
+ beforeSignCalled = true;
264
+ }
265
+ });
266
+ console.log = origLog;
267
+ console.warn = origWarn;
268
+ (0, _bunTest.expect)(beforeSignCalled).toBe(true);
269
+ });
270
+ });
271
+ //# sourceMappingURL=tx-dialog.test.js.map