@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.
Files changed (88) hide show
  1. package/dist/cjs/Sprinkle/__tests__/encryption.test.js +20 -8
  2. package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
  3. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +41 -16
  4. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
  5. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
  6. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  7. package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +120 -0
  8. package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
  9. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +93 -7
  10. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
  11. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +21 -0
  12. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
  13. package/dist/cjs/Sprinkle/encryption.js +131 -0
  14. package/dist/cjs/Sprinkle/encryption.js.map +1 -0
  15. package/dist/cjs/Sprinkle/index.js +318 -352
  16. package/dist/cjs/Sprinkle/index.js.map +1 -1
  17. package/dist/cjs/Sprinkle/prompts.js +393 -0
  18. package/dist/cjs/Sprinkle/prompts.js.map +1 -0
  19. package/dist/cjs/Sprinkle/schemas.js +97 -0
  20. package/dist/cjs/Sprinkle/schemas.js.map +1 -0
  21. package/dist/cjs/Sprinkle/tx-dialog.js +101 -0
  22. package/dist/cjs/Sprinkle/tx-dialog.js.map +1 -0
  23. package/dist/cjs/Sprinkle/type-guards.js +42 -0
  24. package/dist/cjs/Sprinkle/type-guards.js.map +1 -0
  25. package/dist/cjs/Sprinkle/types.js +49 -0
  26. package/dist/cjs/Sprinkle/types.js.map +1 -0
  27. package/dist/cjs/Sprinkle/wallet.js +98 -0
  28. package/dist/cjs/Sprinkle/wallet.js.map +1 -0
  29. package/dist/esm/Sprinkle/__tests__/encryption.test.js +20 -8
  30. package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
  31. package/dist/esm/Sprinkle/__tests__/enhancements.test.js +41 -16
  32. package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
  33. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
  34. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  35. package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +120 -0
  36. package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
  37. package/dist/esm/Sprinkle/__tests__/show-menu.test.js +94 -8
  38. package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
  39. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +21 -0
  40. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
  41. package/dist/esm/Sprinkle/encryption.js +117 -0
  42. package/dist/esm/Sprinkle/encryption.js.map +1 -0
  43. package/dist/esm/Sprinkle/index.js +172 -337
  44. package/dist/esm/Sprinkle/index.js.map +1 -1
  45. package/dist/esm/Sprinkle/prompts.js +385 -0
  46. package/dist/esm/Sprinkle/prompts.js.map +1 -0
  47. package/dist/esm/Sprinkle/schemas.js +91 -0
  48. package/dist/esm/Sprinkle/schemas.js.map +1 -0
  49. package/dist/esm/Sprinkle/tx-dialog.js +90 -0
  50. package/dist/esm/Sprinkle/tx-dialog.js.map +1 -0
  51. package/dist/esm/Sprinkle/type-guards.js +24 -0
  52. package/dist/esm/Sprinkle/type-guards.js.map +1 -0
  53. package/dist/esm/Sprinkle/types.js +42 -0
  54. package/dist/esm/Sprinkle/types.js.map +1 -0
  55. package/dist/esm/Sprinkle/wallet.js +90 -0
  56. package/dist/esm/Sprinkle/wallet.js.map +1 -0
  57. package/dist/types/Sprinkle/encryption.d.ts +43 -0
  58. package/dist/types/Sprinkle/encryption.d.ts.map +1 -0
  59. package/dist/types/Sprinkle/index.d.ts +13 -174
  60. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  61. package/dist/types/Sprinkle/prompts.d.ts +94 -0
  62. package/dist/types/Sprinkle/prompts.d.ts.map +1 -0
  63. package/dist/types/Sprinkle/schemas.d.ts +125 -0
  64. package/dist/types/Sprinkle/schemas.d.ts.map +1 -0
  65. package/dist/types/Sprinkle/tx-dialog.d.ts +37 -0
  66. package/dist/types/Sprinkle/tx-dialog.d.ts.map +1 -0
  67. package/dist/types/Sprinkle/type-guards.d.ts +22 -0
  68. package/dist/types/Sprinkle/type-guards.d.ts.map +1 -0
  69. package/dist/types/Sprinkle/types.d.ts +62 -0
  70. package/dist/types/Sprinkle/types.d.ts.map +1 -0
  71. package/dist/types/Sprinkle/wallet.d.ts +27 -0
  72. package/dist/types/Sprinkle/wallet.d.ts.map +1 -0
  73. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  74. package/package.json +1 -1
  75. package/src/Sprinkle/__tests__/encryption.test.ts +21 -8
  76. package/src/Sprinkle/__tests__/enhancements.test.ts +41 -15
  77. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +104 -38
  78. package/src/Sprinkle/__tests__/settings-persistence.test.ts +108 -0
  79. package/src/Sprinkle/__tests__/show-menu.test.ts +96 -8
  80. package/src/Sprinkle/__tests__/tx-dialog.test.ts +21 -0
  81. package/src/Sprinkle/encryption.ts +130 -0
  82. package/src/Sprinkle/index.ts +265 -478
  83. package/src/Sprinkle/prompts.ts +481 -0
  84. package/src/Sprinkle/schemas.ts +111 -0
  85. package/src/Sprinkle/tx-dialog.ts +100 -0
  86. package/src/Sprinkle/type-guards.ts +51 -0
  87. package/src/Sprinkle/types.ts +73 -0
  88. package/src/Sprinkle/wallet.ts +133 -0
@@ -2,17 +2,28 @@
2
2
 
3
3
  var _bunTest = require("bun:test");
4
4
  var _index = require("../index.js");
5
+ var _types = require("../types.js");
5
6
  // Mock @inquirer/prompts
6
7
  const mockSelect = (0, _bunTest.mock)();
7
8
  const mockInput = (0, _bunTest.mock)();
8
9
  const mockPassword = (0, _bunTest.mock)();
9
10
  const mockConfirm = (0, _bunTest.mock)();
11
+ const mockSelectCancellable = (0, _bunTest.mock)();
12
+ const mockInputCancellable = (0, _bunTest.mock)();
13
+ const mockPasswordCancellable = (0, _bunTest.mock)();
14
+ const mockConfirmCancellable = (0, _bunTest.mock)();
10
15
  _bunTest.mock.module("@inquirer/prompts", () => ({
11
16
  select: mockSelect,
12
17
  input: mockInput,
13
18
  password: mockPassword,
14
19
  confirm: mockConfirm
15
20
  }));
21
+ _bunTest.mock.module("../prompts.js", () => ({
22
+ selectCancellable: mockSelectCancellable,
23
+ inputCancellable: mockInputCancellable,
24
+ passwordCancellable: mockPasswordCancellable,
25
+ confirmCancellable: mockConfirmCancellable
26
+ }));
16
27
  (0, _bunTest.describe)("FillInStruct", () => {
17
28
  let sprinkle;
18
29
  (0, _bunTest.beforeEach)(() => {
@@ -22,36 +33,42 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
22
33
  sprinkle = new _index.Sprinkle(schema, "/tmp/test");
23
34
  mockSelect.mockClear();
24
35
  mockInput.mockClear();
36
+ mockPassword.mockClear();
37
+ mockConfirm.mockClear();
38
+ mockSelectCancellable.mockClear();
39
+ mockInputCancellable.mockClear();
40
+ mockPasswordCancellable.mockClear();
41
+ mockConfirmCancellable.mockClear();
25
42
  });
26
43
  (0, _bunTest.test)("fills a simple string field", async () => {
27
- mockInput.mockResolvedValueOnce("hello");
44
+ mockInputCancellable.mockResolvedValueOnce("hello");
28
45
  const result = await sprinkle.FillInStruct(_index.Type.String());
29
46
  (0, _bunTest.expect)(result).toBe("hello");
30
47
  });
31
48
  (0, _bunTest.test)("fills a string with title as prompt", async () => {
32
- mockInput.mockResolvedValueOnce("world");
49
+ mockInputCancellable.mockResolvedValueOnce("world");
33
50
  await sprinkle.FillInStruct(_index.Type.String({
34
51
  title: "Enter name"
35
52
  }));
36
- (0, _bunTest.expect)(mockInput.mock.calls[0][0].message).toBe("Enter name");
53
+ (0, _bunTest.expect)(mockInputCancellable.mock.calls[0][0].message).toBe("Enter name");
37
54
  });
38
55
  (0, _bunTest.test)("fills a bigint field", async () => {
39
- mockInput.mockResolvedValueOnce("42");
56
+ mockInputCancellable.mockResolvedValueOnce("42");
40
57
  const result = await sprinkle.FillInStruct(_index.Type.BigInt());
41
58
  (0, _bunTest.expect)(result).toBe(42n);
42
59
  });
43
60
  (0, _bunTest.test)("fills a literal field without prompting", async () => {
44
61
  const result = await sprinkle.FillInStruct(_index.Type.Literal("fixed"));
45
62
  (0, _bunTest.expect)(result).toBe("fixed");
46
- (0, _bunTest.expect)(mockInput).not.toHaveBeenCalled();
47
- (0, _bunTest.expect)(mockSelect).not.toHaveBeenCalled();
63
+ (0, _bunTest.expect)(mockInputCancellable).not.toHaveBeenCalled();
64
+ (0, _bunTest.expect)(mockSelectCancellable).not.toHaveBeenCalled();
48
65
  });
49
66
  (0, _bunTest.test)("fills an object with multiple fields", async () => {
50
67
  const schema = _index.Type.Object({
51
68
  name: _index.Type.String(),
52
69
  age: _index.Type.BigInt()
53
70
  });
54
- mockInput.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
71
+ mockInputCancellable.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
55
72
  const result = await sprinkle.FillInStruct(schema);
56
73
  (0, _bunTest.expect)(result).toEqual({
57
74
  name: "Alice",
@@ -68,10 +85,10 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
68
85
  })]);
69
86
 
70
87
  // Select first variant (the Object with type "a")
71
- mockSelect.mockImplementationOnce(async opts => {
88
+ mockSelectCancellable.mockImplementationOnce(async opts => {
72
89
  return opts.choices[0].value;
73
90
  });
74
- mockInput.mockResolvedValueOnce("test-value");
91
+ mockInputCancellable.mockResolvedValueOnce("test-value");
75
92
  const result = await sprinkle.FillInStruct(schema);
76
93
  (0, _bunTest.expect)(result).toEqual({
77
94
  type: "a",
@@ -80,31 +97,31 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
80
97
  });
81
98
  (0, _bunTest.test)("fills an array with items", async () => {
82
99
  const schema = _index.Type.Array(_index.Type.String());
83
- mockInput.mockResolvedValueOnce("first");
84
- mockSelect.mockResolvedValueOnce(true); // add another
85
- mockInput.mockResolvedValueOnce("second");
86
- mockSelect.mockResolvedValueOnce(false); // stop
100
+ mockInputCancellable.mockResolvedValueOnce("first");
101
+ mockSelectCancellable.mockResolvedValueOnce(true); // add another
102
+ mockInputCancellable.mockResolvedValueOnce("second");
103
+ mockSelectCancellable.mockResolvedValueOnce(false); // stop
87
104
 
88
105
  const result = await sprinkle.FillInStruct(schema);
89
106
  (0, _bunTest.expect)(result).toEqual(["first", "second"]);
90
107
  });
91
108
  (0, _bunTest.test)("fills an array with single item", async () => {
92
109
  const schema = _index.Type.Array(_index.Type.String());
93
- mockInput.mockResolvedValueOnce("only");
94
- mockSelect.mockResolvedValueOnce(false); // stop
110
+ mockInputCancellable.mockResolvedValueOnce("only");
111
+ mockSelectCancellable.mockResolvedValueOnce(false); // stop
95
112
 
96
113
  const result = await sprinkle.FillInStruct(schema);
97
114
  (0, _bunTest.expect)(result).toEqual(["only"]);
98
115
  });
99
116
  (0, _bunTest.test)("uses default value for string", async () => {
100
- mockInput.mockResolvedValueOnce("used-default");
117
+ mockInputCancellable.mockResolvedValueOnce("used-default");
101
118
  await sprinkle.FillInStruct(_index.Type.String(), "my-default");
102
- (0, _bunTest.expect)(mockInput.mock.calls[0][0].default).toBe("my-default");
119
+ (0, _bunTest.expect)(mockInputCancellable.mock.calls[0][0].default).toBe("my-default");
103
120
  });
104
121
  (0, _bunTest.test)("uses default value for bigint", async () => {
105
- mockInput.mockResolvedValueOnce("99");
122
+ mockInputCancellable.mockResolvedValueOnce("99");
106
123
  await sprinkle.FillInStruct(_index.Type.BigInt(), 99n);
107
- (0, _bunTest.expect)(mockInput.mock.calls[0][0].default).toBe("99");
124
+ (0, _bunTest.expect)(mockInputCancellable.mock.calls[0][0].default).toBe("99");
108
125
  });
109
126
  (0, _bunTest.test)("throws for unsupported types", async () => {
110
127
  (0, _bunTest.expect)(sprinkle.FillInStruct(_index.Type.Boolean())).rejects.toThrow("Unable to fill in struct");
@@ -115,7 +132,7 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
115
132
  inner: _index.Type.String()
116
133
  })
117
134
  });
118
- mockInput.mockResolvedValueOnce("deep-value");
135
+ mockInputCancellable.mockResolvedValueOnce("deep-value");
119
136
  const result = await sprinkle.FillInStruct(schema);
120
137
  (0, _bunTest.expect)(result).toEqual({
121
138
  outer: {
@@ -124,37 +141,37 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
124
141
  });
125
142
  });
126
143
  (0, _bunTest.test)("remembers last string input as default", async () => {
127
- mockInput.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
144
+ mockInputCancellable.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
128
145
  await sprinkle.FillInStruct(_index.Type.String());
129
146
  (0, _bunTest.expect)(sprinkle.defaults["string"]).toBe("first-input");
130
147
  await sprinkle.FillInStruct(_index.Type.String());
131
148
  // Second call should have the first input as default
132
- (0, _bunTest.expect)(mockInput.mock.calls[1][0].default).toBe("first-input");
149
+ (0, _bunTest.expect)(mockInputCancellable.mock.calls[1][0].default).toBe("first-input");
133
150
  });
134
151
  (0, _bunTest.test)("fills a tuple with same-type elements", async () => {
135
152
  const schema = _index.Type.Tuple([_index.Type.String(), _index.Type.String()]);
136
- mockInput.mockResolvedValueOnce("policyId").mockResolvedValueOnce("assetName");
153
+ mockInputCancellable.mockResolvedValueOnce("policyId").mockResolvedValueOnce("assetName");
137
154
  const result = await sprinkle.FillInStruct(schema);
138
155
  (0, _bunTest.expect)(result).toEqual(["policyId", "assetName"]);
139
156
  });
140
157
  (0, _bunTest.test)("fills a tuple with mixed types", async () => {
141
158
  const schema = _index.Type.Tuple([_index.Type.String(), _index.Type.BigInt()]);
142
- mockInput.mockResolvedValueOnce("label").mockResolvedValueOnce("42");
159
+ mockInputCancellable.mockResolvedValueOnce("label").mockResolvedValueOnce("42");
143
160
  const result = await sprinkle.FillInStruct(schema);
144
161
  (0, _bunTest.expect)(result).toEqual(["label", 42n]);
145
162
  });
146
163
  (0, _bunTest.test)("fills a tuple with default values", async () => {
147
164
  const schema = _index.Type.Tuple([_index.Type.String(), _index.Type.BigInt()]);
148
- mockInput.mockResolvedValueOnce("new-label").mockResolvedValueOnce("99");
165
+ mockInputCancellable.mockResolvedValueOnce("new-label").mockResolvedValueOnce("99");
149
166
  await sprinkle.FillInStruct(schema, ["default-label", 50n]);
150
- (0, _bunTest.expect)(mockInput.mock.calls[0][0].default).toBe("default-label");
151
- (0, _bunTest.expect)(mockInput.mock.calls[1][0].default).toBe("50");
167
+ (0, _bunTest.expect)(mockInputCancellable.mock.calls[0][0].default).toBe("default-label");
168
+ (0, _bunTest.expect)(mockInputCancellable.mock.calls[1][0].default).toBe("50");
152
169
  });
153
170
  (0, _bunTest.test)("fills a tuple nested in an object", async () => {
154
171
  const schema = _index.Type.Object({
155
172
  asset: _index.Type.Tuple([_index.Type.String(), _index.Type.String()])
156
173
  });
157
- mockInput.mockResolvedValueOnce("policy123").mockResolvedValueOnce("token456");
174
+ mockInputCancellable.mockResolvedValueOnce("policy123").mockResolvedValueOnce("token456");
158
175
  const result = await sprinkle.FillInStruct(schema);
159
176
  (0, _bunTest.expect)(result).toEqual({
160
177
  asset: ["policy123", "token456"]
@@ -166,13 +183,13 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
166
183
  });
167
184
 
168
185
  // Select "existing" option
169
- mockSelect.mockResolvedValueOnce("existing");
170
- mockPassword.mockResolvedValueOnce("my-private-key");
186
+ mockSelectCancellable.mockResolvedValueOnce("existing");
187
+ mockPasswordCancellable.mockResolvedValueOnce("my-private-key");
171
188
  const result = await sprinkle.FillInStruct(schema);
172
189
 
173
190
  // Verify select was called with correct options
174
- (0, _bunTest.expect)(mockSelect.mock.calls[0][0].message).toBe("Hot wallet setup:");
175
- (0, _bunTest.expect)(mockSelect.mock.calls[0][0].choices).toEqual([{
191
+ (0, _bunTest.expect)(mockSelectCancellable.mock.calls[0][0].message).toBe("Hot wallet setup:");
192
+ (0, _bunTest.expect)(mockSelectCancellable.mock.calls[0][0].choices).toEqual([{
176
193
  name: "Enter existing private key",
177
194
  value: "existing"
178
195
  }, {
@@ -185,27 +202,57 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
185
202
  const schema = _index.Type.String({
186
203
  title: "Hot Wallet Private Key"
187
204
  });
188
- mockSelect.mockResolvedValueOnce("existing");
189
- mockPassword.mockResolvedValueOnce("deadbeef1234");
205
+ mockSelectCancellable.mockResolvedValueOnce("existing");
206
+ mockPasswordCancellable.mockResolvedValueOnce("deadbeef1234");
190
207
  const result = await sprinkle.FillInStruct(schema);
191
- (0, _bunTest.expect)(mockPassword).toHaveBeenCalledWith({
208
+ (0, _bunTest.expect)(mockPasswordCancellable).toHaveBeenCalledWith({
192
209
  message: "Enter your private key:"
193
210
  });
194
211
  (0, _bunTest.expect)(result).toBe("deadbeef1234");
195
212
  });
196
213
  (0, _bunTest.test)("full wallet settings schema with existing key", async () => {
197
214
  // Select "hot" variant
198
- mockSelect.mockImplementationOnce(async opts => {
215
+ mockSelectCancellable.mockImplementationOnce(async opts => {
199
216
  return opts.choices[0].value; // hot wallet object
200
217
  });
201
218
  // Select "existing" key option
202
- mockSelect.mockResolvedValueOnce("existing");
203
- mockPassword.mockResolvedValueOnce("abc123privatekey");
219
+ mockSelectCancellable.mockResolvedValueOnce("existing");
220
+ mockPasswordCancellable.mockResolvedValueOnce("abc123privatekey");
204
221
  const result = await sprinkle.FillInStruct(_index.WalletSettingsSchema);
205
222
  (0, _bunTest.expect)(result).toEqual({
206
223
  type: "hot",
207
224
  privateKey: "abc123privatekey"
208
225
  });
209
226
  });
227
+ (0, _bunTest.test)("throws UserCancelledError when input prompt is cancelled", async () => {
228
+ mockInputCancellable.mockResolvedValueOnce(null);
229
+ await (0, _bunTest.expect)(sprinkle.FillInStruct(_index.Type.String())).rejects.toThrow(_types.UserCancelledError);
230
+ });
231
+ (0, _bunTest.test)("throws UserCancelledError when select prompt is cancelled", async () => {
232
+ const schema = _index.Type.Union([_index.Type.Object({
233
+ type: _index.Type.Literal("a")
234
+ }), _index.Type.Object({
235
+ type: _index.Type.Literal("b")
236
+ })]);
237
+ mockSelectCancellable.mockResolvedValueOnce(null);
238
+ await (0, _bunTest.expect)(sprinkle.FillInStruct(schema)).rejects.toThrow(_types.UserCancelledError);
239
+ });
240
+ (0, _bunTest.test)("throws UserCancelledError when nested prompt is cancelled", async () => {
241
+ const schema = _index.Type.Object({
242
+ name: _index.Type.String(),
243
+ age: _index.Type.BigInt()
244
+ });
245
+
246
+ // First field succeeds, second is cancelled
247
+ mockInputCancellable.mockResolvedValueOnce("Alice").mockResolvedValueOnce(null);
248
+ await (0, _bunTest.expect)(sprinkle.FillInStruct(schema)).rejects.toThrow(_types.UserCancelledError);
249
+ });
250
+ (0, _bunTest.test)("throws UserCancelledError when array add-another prompt is cancelled", async () => {
251
+ const schema = _index.Type.Array(_index.Type.String());
252
+ mockInputCancellable.mockResolvedValueOnce("first");
253
+ mockSelectCancellable.mockResolvedValueOnce(null); // cancel on "add another?"
254
+
255
+ await (0, _bunTest.expect)(sprinkle.FillInStruct(schema)).rejects.toThrow(_types.UserCancelledError);
256
+ });
210
257
  });
211
258
  //# sourceMappingURL=fill-in-struct.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","mockPassword","mockConfirm","module","select","input","password","confirm","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","WalletSettingsSchema","privateKey"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInput\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInput.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n mockInput\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelect.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelect.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPassword).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n test(\"full wallet settings schema with existing key\", async () => {\n // Select \"hot\" variant\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"abc123privatekey\");\n\n const result = await sprinkle.FillInStruct(WalletSettingsSchema);\n\n expect(result).toEqual({\n type: \"hot\",\n privateKey: \"abc123privatekey\",\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","_types","mockSelect","mock","mockInput","mockPassword","mockConfirm","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","module","select","input","password","confirm","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","WalletSettingsSchema","privateKey","UserCancelledError"],"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":";;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEA;AACA,MAAMG,UAAU,GAAG,IAAAC,aAAI,EAAC,CAAC;AACzB,MAAMC,SAAS,GAAG,IAAAD,aAAI,EAAC,CAAC;AACxB,MAAME,YAAY,GAAG,IAAAF,aAAI,EAAC,CAAC;AAC3B,MAAMG,WAAW,GAAG,IAAAH,aAAI,EAAC,CAAC;AAC1B,MAAMI,qBAAqB,GAAG,IAAAJ,aAAI,EAAC,CAAC;AACpC,MAAMK,oBAAoB,GAAG,IAAAL,aAAI,EAAC,CAAC;AACnC,MAAMM,uBAAuB,GAAG,IAAAN,aAAI,EAAC,CAAC;AACtC,MAAMO,sBAAsB,GAAG,IAAAP,aAAI,EAAC,CAAC;AAErCA,aAAI,CAACQ,MAAM,CAAC,mBAAmB,EAAE,OAAO;EACtCC,MAAM,EAAEV,UAAU;EAClBW,KAAK,EAAET,SAAS;EAChBU,QAAQ,EAAET,YAAY;EACtBU,OAAO,EAAET;AACX,CAAC,CAAC,CAAC;AAEHH,aAAI,CAACQ,MAAM,CAAC,eAAe,EAAE,OAAO;EAClCK,iBAAiB,EAAET,qBAAqB;EACxCU,gBAAgB,EAAET,oBAAoB;EACtCU,mBAAmB,EAAET,uBAAuB;EAC5CU,kBAAkB,EAAET;AACtB,CAAC,CAAC,CAAC;AAEH,IAAAU,iBAAQ,EAAC,cAAc,EAAE,MAAM;EAC7B,IAAIC,QAAuB;EAE3B,IAAAC,mBAAU,EAAC,MAAM;IACf,MAAMC,MAAM,GAAGC,WAAI,CAACC,MAAM,CAAC;MAAEC,WAAW,EAAEF,WAAI,CAACG,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1DN,QAAQ,GAAG,IAAIO,eAAQ,CAACL,MAAM,EAAE,WAAW,CAAC;IAC5CrB,UAAU,CAAC2B,SAAS,CAAC,CAAC;IACtBzB,SAAS,CAACyB,SAAS,CAAC,CAAC;IACrBxB,YAAY,CAACwB,SAAS,CAAC,CAAC;IACxBvB,WAAW,CAACuB,SAAS,CAAC,CAAC;IACvBtB,qBAAqB,CAACsB,SAAS,CAAC,CAAC;IACjCrB,oBAAoB,CAACqB,SAAS,CAAC,CAAC;IAChCpB,uBAAuB,CAACoB,SAAS,CAAC,CAAC;IACnCnB,sBAAsB,CAACmB,SAAS,CAAC,CAAC;EACpC,CAAC,CAAC;EAEF,IAAAC,aAAI,EAAC,6BAA6B,EAAE,YAAY;IAC9CtB,oBAAoB,CAACuB,qBAAqB,CAAC,OAAO,CAAC;IAEnD,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IACzD,IAAAO,eAAM,EAACF,MAAM,CAAC,CAACG,IAAI,CAAC,OAAO,CAAC;EAC9B,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,qCAAqC,EAAE,YAAY;IACtDtB,oBAAoB,CAACuB,qBAAqB,CAAC,OAAO,CAAC;IAEnD,MAAMV,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACG,MAAM,CAAC;MAAES,KAAK,EAAE;IAAa,CAAC,CAAC,CAAC;IACjE,IAAAF,eAAM,EAAC1B,oBAAoB,CAACL,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAACH,IAAI,CAAC,YAAY,CAAC;EAC1E,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,sBAAsB,EAAE,YAAY;IACvCtB,oBAAoB,CAACuB,qBAAqB,CAAC,IAAI,CAAC;IAEhD,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACe,MAAM,CAAC,CAAC,CAAC;IACzD,IAAAL,eAAM,EAACF,MAAM,CAAC,CAACG,IAAI,CAAC,GAAG,CAAC;EAC1B,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,yCAAyC,EAAE,YAAY;IAC1D,MAAME,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACgB,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,IAAAN,eAAM,EAACF,MAAM,CAAC,CAACG,IAAI,CAAC,OAAO,CAAC;IAC5B,IAAAD,eAAM,EAAC1B,oBAAoB,CAAC,CAACiC,GAAG,CAACC,gBAAgB,CAAC,CAAC;IACnD,IAAAR,eAAM,EAAC3B,qBAAqB,CAAC,CAACkC,GAAG,CAACC,gBAAgB,CAAC,CAAC;EACtD,CAAC,CAAC;EAEF,IAAAZ,aAAI,EAAC,sCAAsC,EAAE,YAAY;IACvD,MAAMP,MAAM,GAAGC,WAAI,CAACC,MAAM,CAAC;MACzBkB,IAAI,EAAEnB,WAAI,CAACG,MAAM,CAAC,CAAC;MACnBiB,GAAG,EAAEpB,WAAI,CAACe,MAAM,CAAC;IACnB,CAAC,CAAC;IAEF/B,oBAAoB,CACjBuB,qBAAqB,CAAC,OAAO,CAAC,CAC9BA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC;MAAEF,IAAI,EAAE,OAAO;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;EACrD,CAAC,CAAC;EAEF,IAAAd,aAAI,EAAC,sDAAsD,EAAE,YAAY;IACvE,MAAMP,MAAM,GAAGC,WAAI,CAACsB,KAAK,CAAC,CACxBtB,WAAI,CAACC,MAAM,CAAC;MACVsB,IAAI,EAAEvB,WAAI,CAACgB,OAAO,CAAC,GAAG,CAAC;MACvBQ,KAAK,EAAExB,WAAI,CAACG,MAAM,CAAC;IACrB,CAAC,CAAC,EACFH,WAAI,CAACC,MAAM,CAAC;MACVsB,IAAI,EAAEvB,WAAI,CAACgB,OAAO,CAAC,GAAG,CAAC;MACvBS,KAAK,EAAEzB,WAAI,CAACe,MAAM,CAAC;IACrB,CAAC,CAAC,CACH,CAAC;;IAEF;IACAhC,qBAAqB,CAAC2C,sBAAsB,CAAC,MAAOC,IAAS,IAAK;MAChE,OAAOA,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC,CAACJ,KAAK;IAC9B,CAAC,CAAC;IACFxC,oBAAoB,CAACuB,qBAAqB,CAAC,YAAY,CAAC;IAExD,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC;MAAEE,IAAI,EAAE,GAAG;MAAEC,KAAK,EAAE;IAAa,CAAC,CAAC;EAC5D,CAAC,CAAC;EAEF,IAAAlB,aAAI,EAAC,2BAA2B,EAAE,YAAY;IAC5C,MAAMP,MAAM,GAAGC,WAAI,CAAC6B,KAAK,CAAC7B,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IAExCnB,oBAAoB,CAACuB,qBAAqB,CAAC,OAAO,CAAC;IACnDxB,qBAAqB,CAACwB,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;IACnDvB,oBAAoB,CAACuB,qBAAqB,CAAC,QAAQ,CAAC;IACpDxB,qBAAqB,CAACwB,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;;IAEpD,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;EAC7C,CAAC,CAAC;EAEF,IAAAf,aAAI,EAAC,iCAAiC,EAAE,YAAY;IAClD,MAAMP,MAAM,GAAGC,WAAI,CAAC6B,KAAK,CAAC7B,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IAExCnB,oBAAoB,CAACuB,qBAAqB,CAAC,MAAM,CAAC;IAClDxB,qBAAqB,CAACwB,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;;IAEpD,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;EAClC,CAAC,CAAC;EAEF,IAAAf,aAAI,EAAC,+BAA+B,EAAE,YAAY;IAChDtB,oBAAoB,CAACuB,qBAAqB,CAAC,cAAc,CAAC;IAE1D,MAAMV,QAAQ,CAACY,YAAY,CACzBT,WAAI,CAACG,MAAM,CAAC,CAAC,EACb,YACF,CAAC;IAED,IAAAO,eAAM,EAAC1B,oBAAoB,CAACL,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,YAAY,CAAC;EAC1E,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,+BAA+B,EAAE,YAAY;IAChDtB,oBAAoB,CAACuB,qBAAqB,CAAC,IAAI,CAAC;IAEhD,MAAMV,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACe,MAAM,CAAC,CAAC,EAAE,GAAU,CAAC;IAEtD,IAAAL,eAAM,EAAC1B,oBAAoB,CAACL,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,IAAI,CAAC;EAClE,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,8BAA8B,EAAE,YAAY;IAC/C,IAAAI,eAAM,EACJb,QAAQ,CAACY,YAAY,CAACT,WAAI,CAAC+B,OAAO,CAAC,CAAQ,CAC7C,CAAC,CAACC,OAAO,CAACC,OAAO,CAAC,0BAA0B,CAAC;EAC/C,CAAC,CAAC;EAEF,IAAA3B,aAAI,EAAC,sBAAsB,EAAE,YAAY;IACvC,MAAMP,MAAM,GAAGC,WAAI,CAACC,MAAM,CAAC;MACzBiC,KAAK,EAAElC,WAAI,CAACC,MAAM,CAAC;QACjBkC,KAAK,EAAEnC,WAAI,CAACG,MAAM,CAAC;MACrB,CAAC;IACH,CAAC,CAAC;IAEFnB,oBAAoB,CAACuB,qBAAqB,CAAC,YAAY,CAAC;IAExD,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC;MAAEa,KAAK,EAAE;QAAEC,KAAK,EAAE;MAAa;IAAE,CAAC,CAAC;EAC5D,CAAC,CAAC;EAEF,IAAA7B,aAAI,EAAC,wCAAwC,EAAE,YAAY;IACzDtB,oBAAoB,CACjBuB,qBAAqB,CAAC,aAAa,CAAC,CACpCA,qBAAqB,CAAC,cAAc,CAAC;IAExC,MAAMV,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IAC1C,IAAAO,eAAM,EAACb,QAAQ,CAACuC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAACzB,IAAI,CAAC,aAAa,CAAC;IAEvD,MAAMd,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IAC1C;IACA,IAAAO,eAAM,EAAC1B,oBAAoB,CAACL,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,aAAa,CAAC;EAC3E,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,uCAAuC,EAAE,YAAY;IACxD,MAAMP,MAAM,GAAGC,WAAI,CAACqC,KAAK,CAAC,CAACrC,WAAI,CAACG,MAAM,CAAC,CAAC,EAAEH,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzDnB,oBAAoB,CACjBuB,qBAAqB,CAAC,UAAU,CAAC,CACjCA,qBAAqB,CAAC,WAAW,CAAC;IAErC,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;EACnD,CAAC,CAAC;EAEF,IAAAf,aAAI,EAAC,gCAAgC,EAAE,YAAY;IACjD,MAAMP,MAAM,GAAGC,WAAI,CAACqC,KAAK,CAAC,CAACrC,WAAI,CAACG,MAAM,CAAC,CAAC,EAAEH,WAAI,CAACe,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzD/B,oBAAoB,CACjBuB,qBAAqB,CAAC,OAAO,CAAC,CAC9BA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;EACxC,CAAC,CAAC;EAEF,IAAAf,aAAI,EAAC,mCAAmC,EAAE,YAAY;IACpD,MAAMP,MAAM,GAAGC,WAAI,CAACqC,KAAK,CAAC,CAACrC,WAAI,CAACG,MAAM,CAAC,CAAC,EAAEH,WAAI,CAACe,MAAM,CAAC,CAAC,CAAC,CAAC;IAEzD/B,oBAAoB,CACjBuB,qBAAqB,CAAC,WAAW,CAAC,CAClCA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAMV,QAAQ,CAACY,YAAY,CAACV,MAAM,EAAE,CAAC,eAAe,EAAE,GAAG,CAAQ,CAAC;IAElE,IAAAW,eAAM,EAAC1B,oBAAoB,CAACL,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,eAAe,CAAC;IAC3E,IAAAD,eAAM,EAAC1B,oBAAoB,CAACL,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACiB,OAAO,CAAC,CAACnB,IAAI,CAAC,IAAI,CAAC;EAClE,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,mCAAmC,EAAE,YAAY;IACpD,MAAMP,MAAM,GAAGC,WAAI,CAACC,MAAM,CAAC;MACzBqC,KAAK,EAAEtC,WAAI,CAACqC,KAAK,CAAC,CAACrC,WAAI,CAACG,MAAM,CAAC,CAAC,EAAEH,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IAEFnB,oBAAoB,CACjBuB,qBAAqB,CAAC,WAAW,CAAC,CAClCA,qBAAqB,CAAC,UAAU,CAAC;IAEpC,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAClD,IAAAW,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC;MAAEiB,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU;IAAE,CAAC,CAAC;EAC9D,CAAC,CAAC;EAEF,IAAAhC,aAAI,EAAC,2CAA2C,EAAE,YAAY;IAC5D,MAAMP,MAAM,GAAGC,WAAI,CAACG,MAAM,CAAC;MAAES,KAAK,EAAE;IAAyB,CAAC,CAAC;;IAE/D;IACA7B,qBAAqB,CAACwB,qBAAqB,CAAC,UAAU,CAAC;IACvDtB,uBAAuB,CAACsB,qBAAqB,CAAC,gBAAgB,CAAC;IAE/D,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;;IAElD;IACA,IAAAW,eAAM,EAAC3B,qBAAqB,CAACJ,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAACH,IAAI,CAAC,mBAAmB,CAAC;IAChF,IAAAD,eAAM,EAAC3B,qBAAqB,CAACJ,IAAI,CAACkC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACe,OAAO,CAAC,CAACP,OAAO,CAAC,CAC7D;MAAEF,IAAI,EAAE,4BAA4B;MAAEK,KAAK,EAAE;IAAW,CAAC,EACzD;MAAEL,IAAI,EAAE,qBAAqB;MAAEK,KAAK,EAAE;IAAW,CAAC,CACnD,CAAC;IACF,IAAAd,eAAM,EAACF,MAAM,CAAC,CAACG,IAAI,CAAC,gBAAgB,CAAC;EACvC,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,8CAA8C,EAAE,YAAY;IAC/D,MAAMP,MAAM,GAAGC,WAAI,CAACG,MAAM,CAAC;MAAES,KAAK,EAAE;IAAyB,CAAC,CAAC;IAE/D7B,qBAAqB,CAACwB,qBAAqB,CAAC,UAAU,CAAC;IACvDtB,uBAAuB,CAACsB,qBAAqB,CAAC,cAAc,CAAC;IAE7D,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC;IAElD,IAAAW,eAAM,EAACzB,uBAAuB,CAAC,CAACsD,oBAAoB,CAAC;MACnDzB,OAAO,EAAE;IACX,CAAC,CAAC;IACF,IAAAJ,eAAM,EAACF,MAAM,CAAC,CAACG,IAAI,CAAC,cAAc,CAAC;EACrC,CAAC,CAAC;EAEF,IAAAL,aAAI,EAAC,+CAA+C,EAAE,YAAY;IAChE;IACAvB,qBAAqB,CAAC2C,sBAAsB,CAAC,MAAOC,IAAS,IAAK;MAChE,OAAOA,IAAI,CAACC,OAAO,CAAC,CAAC,CAAC,CAACJ,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IACF;IACAzC,qBAAqB,CAACwB,qBAAqB,CAAC,UAAU,CAAC;IACvDtB,uBAAuB,CAACsB,qBAAqB,CAAC,kBAAkB,CAAC;IAEjE,MAAMC,MAAM,GAAG,MAAMX,QAAQ,CAACY,YAAY,CAAC+B,2BAAoB,CAAC;IAEhE,IAAA9B,eAAM,EAACF,MAAM,CAAC,CAACa,OAAO,CAAC;MACrBE,IAAI,EAAE,KAAK;MACXkB,UAAU,EAAE;IACd,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAAnC,aAAI,EAAC,0DAA0D,EAAE,YAAY;IAC3EtB,oBAAoB,CAACuB,qBAAqB,CAAC,IAAI,CAAC;IAEhD,MAAM,IAAAG,eAAM,EAACb,QAAQ,CAACY,YAAY,CAACT,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC6B,OAAO,CAACC,OAAO,CAChES,yBACF,CAAC;EACH,CAAC,CAAC;EAEF,IAAApC,aAAI,EAAC,2DAA2D,EAAE,YAAY;IAC5E,MAAMP,MAAM,GAAGC,WAAI,CAACsB,KAAK,CAAC,CACxBtB,WAAI,CAACC,MAAM,CAAC;MAAEsB,IAAI,EAAEvB,WAAI,CAACgB,OAAO,CAAC,GAAG;IAAE,CAAC,CAAC,EACxChB,WAAI,CAACC,MAAM,CAAC;MAAEsB,IAAI,EAAEvB,WAAI,CAACgB,OAAO,CAAC,GAAG;IAAE,CAAC,CAAC,CACzC,CAAC;IAEFjC,qBAAqB,CAACwB,qBAAqB,CAAC,IAAI,CAAC;IAEjD,MAAM,IAAAG,eAAM,EAACb,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC,CAAC,CAACiC,OAAO,CAACC,OAAO,CACzDS,yBACF,CAAC;EACH,CAAC,CAAC;EAEF,IAAApC,aAAI,EAAC,2DAA2D,EAAE,YAAY;IAC5E,MAAMP,MAAM,GAAGC,WAAI,CAACC,MAAM,CAAC;MACzBkB,IAAI,EAAEnB,WAAI,CAACG,MAAM,CAAC,CAAC;MACnBiB,GAAG,EAAEpB,WAAI,CAACe,MAAM,CAAC;IACnB,CAAC,CAAC;;IAEF;IACA/B,oBAAoB,CACjBuB,qBAAqB,CAAC,OAAO,CAAC,CAC9BA,qBAAqB,CAAC,IAAI,CAAC;IAE9B,MAAM,IAAAG,eAAM,EAACb,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC,CAAC,CAACiC,OAAO,CAACC,OAAO,CACzDS,yBACF,CAAC;EACH,CAAC,CAAC;EAEF,IAAApC,aAAI,EAAC,sEAAsE,EAAE,YAAY;IACvF,MAAMP,MAAM,GAAGC,WAAI,CAAC6B,KAAK,CAAC7B,WAAI,CAACG,MAAM,CAAC,CAAC,CAAC;IAExCnB,oBAAoB,CAACuB,qBAAqB,CAAC,OAAO,CAAC;IACnDxB,qBAAqB,CAACwB,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;;IAEnD,MAAM,IAAAG,eAAM,EAACb,QAAQ,CAACY,YAAY,CAACV,MAAM,CAAC,CAAC,CAACiC,OAAO,CAACC,OAAO,CACzDS,yBACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -195,5 +195,125 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
195
195
  });
196
196
  (0, _bunTest.expect)(sprinkle.profileMeta.name).toBe("Default");
197
197
  });
198
+ (0, _bunTest.describe)("currentProfile", () => {
199
+ (0, _bunTest.test)("returns null when no profile loaded", () => {
200
+ const schema = _index.Type.Object({
201
+ name: _index.Type.String()
202
+ });
203
+ const sprinkle = new _index.Sprinkle(schema, tmpDir);
204
+ (0, _bunTest.expect)(sprinkle.currentProfile).toBeNull();
205
+ });
206
+ (0, _bunTest.test)("returns profile info when loaded", () => {
207
+ const schema = _index.Type.Object({
208
+ name: _index.Type.String()
209
+ });
210
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
211
+ const profile = sprinkle.currentProfile;
212
+ (0, _bunTest.expect)(profile).not.toBeNull();
213
+ (0, _bunTest.expect)(profile.id).toBe("test");
214
+ (0, _bunTest.expect)(profile.name).toBe("Test");
215
+ (0, _bunTest.expect)(profile.createdAt).toBeDefined();
216
+ (0, _bunTest.expect)(profile.updatedAt).toBeDefined();
217
+ });
218
+ (0, _bunTest.test)("includes description when present", () => {
219
+ const schema = _index.Type.Object({
220
+ name: _index.Type.String()
221
+ });
222
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
223
+ sprinkle.profileMeta.description = "Test profile description";
224
+ const profile = sprinkle.currentProfile;
225
+ (0, _bunTest.expect)(profile.description).toBe("Test profile description");
226
+ });
227
+ (0, _bunTest.test)("has undefined description when not set", () => {
228
+ const schema = _index.Type.Object({
229
+ name: _index.Type.String()
230
+ });
231
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
232
+ delete sprinkle.profileMeta.description;
233
+ const profile = sprinkle.currentProfile;
234
+ (0, _bunTest.expect)(profile.description).toBeUndefined();
235
+ });
236
+ });
237
+ (0, _bunTest.describe)("getDisplaySettings", () => {
238
+ (0, _bunTest.test)("masks sensitive fields", () => {
239
+ const schema = _index.Type.Object({
240
+ name: _index.Type.String(),
241
+ secret: _index.Type.String({
242
+ sensitive: true
243
+ })
244
+ });
245
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
246
+ sprinkle.settings = {
247
+ name: "visible",
248
+ secret: "hidden"
249
+ };
250
+ const display = sprinkle.getDisplaySettings();
251
+ (0, _bunTest.expect)(display.name).toBe("visible");
252
+ (0, _bunTest.expect)(display.secret).toBe("********");
253
+ });
254
+ (0, _bunTest.test)("preserves non-sensitive fields", () => {
255
+ const schema = _index.Type.Object({
256
+ name: _index.Type.String(),
257
+ count: _index.Type.Number()
258
+ });
259
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
260
+ sprinkle.settings = {
261
+ name: "test",
262
+ count: 42
263
+ };
264
+ const display = sprinkle.getDisplaySettings();
265
+ (0, _bunTest.expect)(display.name).toBe("test");
266
+ (0, _bunTest.expect)(display.count).toBe(42);
267
+ });
268
+ (0, _bunTest.test)("preserves BigInt values", () => {
269
+ const schema = _index.Type.Object({
270
+ amount: _index.Type.BigInt(),
271
+ secret: _index.Type.String({
272
+ sensitive: true
273
+ })
274
+ });
275
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
276
+ sprinkle.settings = {
277
+ amount: 42n,
278
+ secret: "hidden"
279
+ };
280
+ const display = sprinkle.getDisplaySettings();
281
+ (0, _bunTest.expect)(display.amount).toBe(42n);
282
+ (0, _bunTest.expect)(display.secret).toBe("********");
283
+ });
284
+ (0, _bunTest.test)("masks nested sensitive fields", () => {
285
+ const schema = _index.Type.Object({
286
+ wallet: _index.Type.Object({
287
+ key: _index.Type.String({
288
+ sensitive: true
289
+ }),
290
+ address: _index.Type.String()
291
+ })
292
+ });
293
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
294
+ sprinkle.settings = {
295
+ wallet: {
296
+ key: "secret",
297
+ address: "addr1..."
298
+ }
299
+ };
300
+ const display = sprinkle.getDisplaySettings();
301
+ (0, _bunTest.expect)(display.wallet.key).toBe("********");
302
+ (0, _bunTest.expect)(display.wallet.address).toBe("addr1...");
303
+ });
304
+ (0, _bunTest.test)("does not mask empty sensitive fields", () => {
305
+ const schema = _index.Type.Object({
306
+ secret: _index.Type.String({
307
+ sensitive: true
308
+ })
309
+ });
310
+ const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
311
+ sprinkle.settings = {
312
+ secret: ""
313
+ };
314
+ const display = sprinkle.getDisplaySettings();
315
+ (0, _bunTest.expect)(display.secret).toBe("");
316
+ });
317
+ });
198
318
  });
199
319
  //# sourceMappingURL=settings-persistence.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-persistence.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","test","result","Sprinkle","SettingsPath","expect","toBe","sep","nestedDir","schema","Type","name","String","sprinkle","withProfile","settings","saveSettings","existsSync","content","readFileSync","parsed","JSON","parse","defaults","toEqual","meta","amount","BigInt","raw","sprinkle2","loadProfile","string","user","score","profileMeta","profiles","scanProfiles","length","id","sanitizeProfileId","mkdirSync","writeFileSync","stringify","migrateIfNeeded"],"sources":["../../../../src/Sprinkle/__tests__/settings-persistence.test.ts"],"sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\ndescribe(\"Settings Persistence\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-test-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n test(\"SettingsPath returns correct path\", () => {\n const result = Sprinkle.SettingsPath(\"/some/path\");\n expect(result).toBe(`/some/path${path.sep}settings.json`);\n });\n\n test(\"saveSettings creates directory if missing\", () => {\n const nestedDir = path.join(tmpDir, \"nested\", \"deep\");\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, nestedDir));\n sprinkle.settings = { name: \"test\" } as any;\n\n sprinkle.saveSettings();\n\n expect(fs.existsSync(path.join(nestedDir, \"profiles\", \"test.json\"))).toBe(\n true,\n );\n });\n\n test(\"saveSettings writes valid JSON with profile format\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"hello\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"hello\");\n expect(parsed.defaults).toEqual({});\n expect(parsed.meta.name).toBe(\"Test\");\n });\n\n test(\"saveSettings serializes BigInt values\", () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const raw = JSON.parse(content);\n expect(raw.settings.amount).toBe(\"42n\");\n });\n\n test(\"saveSettings and loadProfile round-trip with BigInt\", async () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 99n } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ amount: 99n });\n });\n\n test(\"saveSettings preserves defaults\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"last-input\" };\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.defaults.string).toBe(\"last-input\");\n });\n\n test(\"loadProfile restores defaults\", async () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"remembered\" };\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.defaults).toEqual({ string: \"remembered\" });\n });\n\n test(\"round-trip with nested objects\", async () => {\n const schema = Type.Object({\n user: Type.Object({\n name: Type.String(),\n score: Type.BigInt(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { user: { name: \"alice\", score: 100n } } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({\n user: { name: \"alice\", score: 100n },\n });\n });\n\n test(\"scanProfiles returns profile entries\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir), \"alice\");\n sprinkle.profileMeta.name = \"Alice\";\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.saveSettings();\n\n const profiles = sprinkle.scanProfiles();\n expect(profiles.length).toBe(1);\n expect(profiles[0]!.id).toBe(\"alice\");\n expect(profiles[0]!.meta.name).toBe(\"Alice\");\n });\n\n test(\"sanitizeProfileId handles various inputs\", () => {\n expect(Sprinkle.sanitizeProfileId(\"Mainnet Alice\")).toBe(\"mainnet-alice\");\n expect(Sprinkle.sanitizeProfileId(\"test--profile\")).toBe(\"test-profile\");\n expect(Sprinkle.sanitizeProfileId(\"Hello World!@#$\")).toBe(\"hello-world\");\n expect(Sprinkle.sanitizeProfileId(\" \")).toBe(\"profile\");\n expect(Sprinkle.sanitizeProfileId(\"simple\")).toBe(\"simple\");\n });\n\n test(\"migration converts legacy settings.json to profile\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings.json\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({\n settings: { name: \"legacy\" },\n defaults: { string: \"old\" },\n }),\n );\n\n // Create sprinkle and trigger migration\n const sprinkle = new Sprinkle(schema, tmpDir);\n await (sprinkle as any).migrateIfNeeded();\n\n // Check profile was created\n expect(fs.existsSync(path.join(tmpDir, \"profiles\", \"default.json\"))).toBe(\n true,\n );\n // Check legacy file was backed up\n expect(fs.existsSync(path.join(tmpDir, \"settings.json.bak\"))).toBe(true);\n expect(fs.existsSync(path.join(tmpDir, \"settings.json\"))).toBe(false);\n\n // Load the migrated profile\n await sprinkle.loadProfile(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"legacy\" });\n expect(sprinkle.defaults).toEqual({ string: \"old\" });\n expect(sprinkle.profileMeta.name).toBe(\"Default\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"settings-persistence.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","test","result","Sprinkle","SettingsPath","expect","toBe","sep","nestedDir","schema","Type","name","String","sprinkle","withProfile","settings","saveSettings","existsSync","content","readFileSync","parsed","JSON","parse","defaults","toEqual","meta","amount","BigInt","raw","sprinkle2","loadProfile","string","user","score","profileMeta","profiles","scanProfiles","length","id","sanitizeProfileId","mkdirSync","writeFileSync","stringify","migrateIfNeeded","currentProfile","toBeNull","profile","not","createdAt","toBeDefined","updatedAt","description","toBeUndefined","secret","sensitive","display","getDisplaySettings","count","Number","wallet","key","address"],"sources":["../../../../src/Sprinkle/__tests__/settings-persistence.test.ts"],"sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\ndescribe(\"Settings Persistence\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-test-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n test(\"SettingsPath returns correct path\", () => {\n const result = Sprinkle.SettingsPath(\"/some/path\");\n expect(result).toBe(`/some/path${path.sep}settings.json`);\n });\n\n test(\"saveSettings creates directory if missing\", () => {\n const nestedDir = path.join(tmpDir, \"nested\", \"deep\");\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, nestedDir));\n sprinkle.settings = { name: \"test\" } as any;\n\n sprinkle.saveSettings();\n\n expect(fs.existsSync(path.join(nestedDir, \"profiles\", \"test.json\"))).toBe(\n true,\n );\n });\n\n test(\"saveSettings writes valid JSON with profile format\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"hello\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"hello\");\n expect(parsed.defaults).toEqual({});\n expect(parsed.meta.name).toBe(\"Test\");\n });\n\n test(\"saveSettings serializes BigInt values\", () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const raw = JSON.parse(content);\n expect(raw.settings.amount).toBe(\"42n\");\n });\n\n test(\"saveSettings and loadProfile round-trip with BigInt\", async () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 99n } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ amount: 99n });\n });\n\n test(\"saveSettings preserves defaults\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"last-input\" };\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.defaults.string).toBe(\"last-input\");\n });\n\n test(\"loadProfile restores defaults\", async () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"remembered\" };\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.defaults).toEqual({ string: \"remembered\" });\n });\n\n test(\"round-trip with nested objects\", async () => {\n const schema = Type.Object({\n user: Type.Object({\n name: Type.String(),\n score: Type.BigInt(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { user: { name: \"alice\", score: 100n } } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({\n user: { name: \"alice\", score: 100n },\n });\n });\n\n test(\"scanProfiles returns profile entries\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir), \"alice\");\n sprinkle.profileMeta.name = \"Alice\";\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.saveSettings();\n\n const profiles = sprinkle.scanProfiles();\n expect(profiles.length).toBe(1);\n expect(profiles[0]!.id).toBe(\"alice\");\n expect(profiles[0]!.meta.name).toBe(\"Alice\");\n });\n\n test(\"sanitizeProfileId handles various inputs\", () => {\n expect(Sprinkle.sanitizeProfileId(\"Mainnet Alice\")).toBe(\"mainnet-alice\");\n expect(Sprinkle.sanitizeProfileId(\"test--profile\")).toBe(\"test-profile\");\n expect(Sprinkle.sanitizeProfileId(\"Hello World!@#$\")).toBe(\"hello-world\");\n expect(Sprinkle.sanitizeProfileId(\" \")).toBe(\"profile\");\n expect(Sprinkle.sanitizeProfileId(\"simple\")).toBe(\"simple\");\n });\n\n test(\"migration converts legacy settings.json to profile\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings.json\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({\n settings: { name: \"legacy\" },\n defaults: { string: \"old\" },\n }),\n );\n\n // Create sprinkle and trigger migration\n const sprinkle = new Sprinkle(schema, tmpDir);\n await (sprinkle as any).migrateIfNeeded();\n\n // Check profile was created\n expect(fs.existsSync(path.join(tmpDir, \"profiles\", \"default.json\"))).toBe(\n true,\n );\n // Check legacy file was backed up\n expect(fs.existsSync(path.join(tmpDir, \"settings.json.bak\"))).toBe(true);\n expect(fs.existsSync(path.join(tmpDir, \"settings.json\"))).toBe(false);\n\n // Load the migrated profile\n await sprinkle.loadProfile(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"legacy\" });\n expect(sprinkle.defaults).toEqual({ string: \"old\" });\n expect(sprinkle.profileMeta.name).toBe(\"Default\");\n });\n\n describe(\"currentProfile\", () => {\n test(\"returns null when no profile loaded\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n expect(sprinkle.currentProfile).toBeNull();\n });\n\n test(\"returns profile info when loaded\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n\n const profile = sprinkle.currentProfile;\n expect(profile).not.toBeNull();\n expect(profile!.id).toBe(\"test\");\n expect(profile!.name).toBe(\"Test\");\n expect(profile!.createdAt).toBeDefined();\n expect(profile!.updatedAt).toBeDefined();\n });\n\n test(\"includes description when present\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.profileMeta.description = \"Test profile description\";\n\n const profile = sprinkle.currentProfile;\n expect(profile!.description).toBe(\"Test profile description\");\n });\n\n test(\"has undefined description when not set\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n delete sprinkle.profileMeta.description;\n\n const profile = sprinkle.currentProfile;\n expect(profile!.description).toBeUndefined();\n });\n });\n\n describe(\"getDisplaySettings\", () => {\n test(\"masks sensitive fields\", () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"visible\", secret: \"hidden\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.name).toBe(\"visible\");\n expect(display.secret).toBe(\"********\");\n });\n\n test(\"preserves non-sensitive fields\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Number(),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\", count: 42 } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.name).toBe(\"test\");\n expect(display.count).toBe(42);\n });\n\n test(\"preserves BigInt values\", () => {\n const schema = Type.Object({\n amount: Type.BigInt(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n, secret: \"hidden\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.amount).toBe(42n);\n expect(display.secret).toBe(\"********\");\n });\n\n test(\"masks nested sensitive fields\", () => {\n const schema = Type.Object({\n wallet: Type.Object({\n key: Type.String({ sensitive: true }),\n address: Type.String(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = {\n wallet: { key: \"secret\", address: \"addr1...\" },\n } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.wallet.key).toBe(\"********\");\n expect(display.wallet.address).toBe(\"addr1...\");\n });\n\n test(\"does not mask empty sensitive fields\", () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { secret: \"\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.secret).toBe(\"\");\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}