@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
@@ -3,12 +3,23 @@ import { Sprinkle, Type } from "../index.js";
3
3
  const mockSelect = mock();
4
4
  const mockInput = mock();
5
5
  const mockPassword = mock();
6
- const mockSearch = mock();
6
+ const mockSelectCancellable = mock();
7
+ const mockInputCancellable = mock();
8
+ const mockPasswordCancellable = mock();
9
+ const mockConfirmCancellable = mock();
10
+ const mockSearchCancellable = mock();
7
11
  mock.module("@inquirer/prompts", () => ({
8
12
  select: mockSelect,
9
13
  input: mockInput,
10
- password: mockPassword,
11
- search: mockSearch
14
+ password: mockPassword
15
+ }));
16
+ mock.module("../prompts.js", () => ({
17
+ selectCancellable: mockSelectCancellable,
18
+ inputCancellable: mockInputCancellable,
19
+ passwordCancellable: mockPasswordCancellable,
20
+ confirmCancellable: mockConfirmCancellable,
21
+ searchCancellable: mockSearchCancellable,
22
+ select: mockSelectCancellable
12
23
  }));
13
24
  describe("beforeShow hook (2.2)", () => {
14
25
  let sprinkle;
@@ -21,13 +32,14 @@ describe("beforeShow hook (2.2)", () => {
21
32
  name: "test"
22
33
  };
23
34
  mockSelect.mockClear();
35
+ mockSelectCancellable.mockClear();
24
36
  });
25
37
  test("calls beforeShow before rendering menu", async () => {
26
38
  const callOrder = [];
27
39
  const beforeShowFn = mock(async () => {
28
40
  callOrder.push("beforeShow");
29
41
  });
30
- mockSelect.mockImplementation(async () => {
42
+ mockSelectCancellable.mockImplementation(async () => {
31
43
  callOrder.push("select");
32
44
  return -1; // exit
33
45
  });
@@ -46,7 +58,7 @@ describe("beforeShow hook (2.2)", () => {
46
58
  });
47
59
  test("passes sprinkle instance to beforeShow", async () => {
48
60
  let receivedSprinkle;
49
- mockSelect.mockResolvedValueOnce(-1);
61
+ mockSelectCancellable.mockResolvedValueOnce(-1);
50
62
  const menu = {
51
63
  title: "Test",
52
64
  beforeShow: async s => {
@@ -61,7 +73,7 @@ describe("beforeShow hook (2.2)", () => {
61
73
  expect(receivedSprinkle).toBe(sprinkle);
62
74
  });
63
75
  test("menu works without beforeShow", async () => {
64
- mockSelect.mockResolvedValueOnce(-1);
76
+ mockSelectCancellable.mockResolvedValueOnce(-1);
65
77
  const menu = {
66
78
  title: "Test",
67
79
  items: [{
@@ -75,10 +87,10 @@ describe("beforeShow hook (2.2)", () => {
75
87
  });
76
88
  describe("SearchSelect (2.3)", () => {
77
89
  beforeEach(() => {
78
- mockSearch.mockClear();
90
+ mockSearchCancellable.mockClear();
79
91
  });
80
92
  test("delegates to search prompt", async () => {
81
- mockSearch.mockResolvedValueOnce("selected-value");
93
+ mockSearchCancellable.mockResolvedValueOnce("selected-value");
82
94
  const result = await Sprinkle.SearchSelect({
83
95
  message: "Pick one",
84
96
  source: () => [{
@@ -90,20 +102,31 @@ describe("SearchSelect (2.3)", () => {
90
102
  }]
91
103
  });
92
104
  expect(result).toBe("selected-value");
93
- expect(mockSearch).toHaveBeenCalledTimes(1);
94
- expect(mockSearch.mock.calls[0][0].message).toBe("Pick one");
105
+ expect(mockSearchCancellable).toHaveBeenCalledTimes(1);
106
+ expect(mockSearchCancellable.mock.calls[0][0].message).toBe("Pick one");
95
107
  });
96
108
  test("passes source function through", async () => {
97
109
  const sourceFn = mock(() => [{
98
110
  name: "X",
99
111
  value: "x"
100
112
  }]);
101
- mockSearch.mockResolvedValueOnce("x");
113
+ mockSearchCancellable.mockResolvedValueOnce("x");
102
114
  await Sprinkle.SearchSelect({
103
115
  message: "Search",
104
116
  source: sourceFn
105
117
  });
106
- expect(mockSearch.mock.calls[0][0].source).toBe(sourceFn);
118
+ expect(mockSearchCancellable.mock.calls[0][0].source).toBe(sourceFn);
119
+ });
120
+ test("returns null when cancelled", async () => {
121
+ mockSearchCancellable.mockResolvedValueOnce(null);
122
+ const result = await Sprinkle.SearchSelect({
123
+ message: "Pick one",
124
+ source: () => [{
125
+ name: "A",
126
+ value: "a"
127
+ }]
128
+ });
129
+ expect(result).toBeNull();
107
130
  });
108
131
  });
109
132
  describe("Optional type support (2.4)", () => {
@@ -115,14 +138,16 @@ describe("Optional type support (2.4)", () => {
115
138
  sprinkle = new Sprinkle(schema, "/tmp/test");
116
139
  mockSelect.mockClear();
117
140
  mockInput.mockClear();
141
+ mockSelectCancellable.mockClear();
142
+ mockInputCancellable.mockClear();
118
143
  });
119
144
  test("skips optional field when user selects Skip", async () => {
120
145
  const schema = Type.Object({
121
146
  name: Type.String(),
122
147
  nickname: Type.Optional(Type.String())
123
148
  });
124
- mockInput.mockResolvedValueOnce("Alice"); // name
125
- mockSelect.mockResolvedValueOnce(false); // skip nickname
149
+ mockInputCancellable.mockResolvedValueOnce("Alice"); // name
150
+ mockSelectCancellable.mockResolvedValueOnce(false); // skip nickname
126
151
 
127
152
  const result = await sprinkle.FillInStruct(schema);
128
153
  expect(result.name).toBe("Alice");
@@ -133,9 +158,9 @@ describe("Optional type support (2.4)", () => {
133
158
  name: Type.String(),
134
159
  nickname: Type.Optional(Type.String())
135
160
  });
136
- mockInput.mockResolvedValueOnce("Alice") // name
161
+ mockInputCancellable.mockResolvedValueOnce("Alice") // name
137
162
  .mockResolvedValueOnce("Ali"); // nickname
138
- mockSelect.mockResolvedValueOnce(true); // fill nickname
163
+ mockSelectCancellable.mockResolvedValueOnce(true); // fill nickname
139
164
 
140
165
  const result = await sprinkle.FillInStruct(schema);
141
166
  expect(result.name).toBe("Alice");
@@ -1 +1 @@
1
- {"version":3,"file":"enhancements.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","mockPassword","mockSearch","module","select","input","password","search","sprinkle","schema","Object","name","String","settings","mockClear","callOrder","beforeShowFn","push","mockImplementation","menu","title","beforeShow","items","action","showMenu","toHaveBeenCalledTimes","toBe","receivedSprinkle","mockResolvedValueOnce","s","result","SearchSelect","message","source","value","calls","sourceFn","placeholder","nickname","Optional","FillInStruct","toBeUndefined"],"sources":["../../../../src/Sprinkle/__tests__/enhancements.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockSearch = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n search: mockSearch,\n}));\n\ndescribe(\"beforeShow hook (2.2)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n });\n\n test(\"calls beforeShow before rendering menu\", async () => {\n const callOrder: string[] = [];\n\n const beforeShowFn = mock(async () => {\n callOrder.push(\"beforeShow\");\n });\n\n mockSelect.mockImplementation(async () => {\n callOrder.push(\"select\");\n return -1; // exit\n });\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: beforeShowFn,\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n expect(beforeShowFn).toHaveBeenCalledTimes(1);\n expect(callOrder[0]).toBe(\"beforeShow\");\n expect(callOrder[1]).toBe(\"select\");\n });\n\n test(\"passes sprinkle instance to beforeShow\", async () => {\n let receivedSprinkle: any;\n\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: async (s) => {\n receivedSprinkle = s;\n },\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n expect(receivedSprinkle).toBe(sprinkle);\n });\n\n test(\"menu works without beforeShow\", async () => {\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n // Should complete without error\n });\n});\n\ndescribe(\"SearchSelect (2.3)\", () => {\n beforeEach(() => {\n mockSearch.mockClear();\n });\n\n test(\"delegates to search prompt\", async () => {\n mockSearch.mockResolvedValueOnce(\"selected-value\");\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [\n { name: \"Option A\", value: \"a\" },\n { name: \"Option B\", value: \"b\" },\n ],\n });\n\n expect(result).toBe(\"selected-value\");\n expect(mockSearch).toHaveBeenCalledTimes(1);\n expect(mockSearch.mock.calls[0][0].message).toBe(\"Pick one\");\n });\n\n test(\"passes source function through\", async () => {\n const sourceFn = mock(() => [{ name: \"X\", value: \"x\" }]);\n mockSearch.mockResolvedValueOnce(\"x\");\n\n await Sprinkle.SearchSelect({\n message: \"Search\",\n source: sourceFn,\n });\n\n expect(mockSearch.mock.calls[0][0].source).toBe(sourceFn);\n });\n});\n\ndescribe(\"Optional type support (2.4)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"skips optional field when user selects Skip\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInput.mockResolvedValueOnce(\"Alice\"); // name\n mockSelect.mockResolvedValueOnce(false); // skip nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBeUndefined();\n });\n\n test(\"fills optional field when user selects Yes\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\") // name\n .mockResolvedValueOnce(\"Ali\"); // nickname\n mockSelect.mockResolvedValueOnce(true); // fill nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBe(\"Ali\");\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAAQ,UAAU;AACnE,SAASC,QAAQ,EAAEC,IAAI,QAAoB,aAAa;AAExD,MAAMC,UAAU,GAAGJ,IAAI,CAAC,CAAC;AACzB,MAAMK,SAAS,GAAGL,IAAI,CAAC,CAAC;AACxB,MAAMM,YAAY,GAAGN,IAAI,CAAC,CAAC;AAC3B,MAAMO,UAAU,GAAGP,IAAI,CAAC,CAAC;AAEzBA,IAAI,CAACQ,MAAM,CAAC,mBAAmB,EAAE,OAAO;EACtCC,MAAM,EAAEL,UAAU;EAClBM,KAAK,EAAEL,SAAS;EAChBM,QAAQ,EAAEL,YAAY;EACtBM,MAAM,EAAEL;AACV,CAAC,CAAC,CAAC;AAEHV,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtC,IAAIgB,QAAuB;EAE3BZ,UAAU,CAAC,MAAM;IACf,MAAMa,MAAM,GAAGX,IAAI,CAACY,MAAM,CAAC;MAAEC,IAAI,EAAEb,IAAI,CAACc,MAAM,CAAC;IAAE,CAAC,CAAC;IACnDJ,QAAQ,GAAG,IAAIX,QAAQ,CAACY,MAAM,EAAE,WAAW,CAAC;IAC5CD,QAAQ,CAACK,QAAQ,GAAG;MAAEF,IAAI,EAAE;IAAO,CAAQ;IAC3CZ,UAAU,CAACe,SAAS,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFpB,IAAI,CAAC,wCAAwC,EAAE,YAAY;IACzD,MAAMqB,SAAmB,GAAG,EAAE;IAE9B,MAAMC,YAAY,GAAGrB,IAAI,CAAC,YAAY;MACpCoB,SAAS,CAACE,IAAI,CAAC,YAAY,CAAC;IAC9B,CAAC,CAAC;IAEFlB,UAAU,CAACmB,kBAAkB,CAAC,YAAY;MACxCH,SAAS,CAACE,IAAI,CAAC,QAAQ,CAAC;MACxB,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC,CAAC;IAEF,MAAME,IAAgB,GAAG;MACvBC,KAAK,EAAE,MAAM;MACbC,UAAU,EAAEL,YAAY;MACxBM,KAAK,EAAE,CAAC;QAAEF,KAAK,EAAE,QAAQ;QAAEG,MAAM,EAAE,MAAAA,CAAA,KAAY,CAAC;MAAE,CAAC;IACrD,CAAC;IAED,MAAMf,QAAQ,CAACgB,QAAQ,CAACL,IAAI,CAAC;IAE7B1B,MAAM,CAACuB,YAAY,CAAC,CAACS,qBAAqB,CAAC,CAAC,CAAC;IAC7ChC,MAAM,CAACsB,SAAS,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,YAAY,CAAC;IACvCjC,MAAM,CAACsB,SAAS,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,QAAQ,CAAC;EACrC,CAAC,CAAC;EAEFhC,IAAI,CAAC,wCAAwC,EAAE,YAAY;IACzD,IAAIiC,gBAAqB;IAEzB5B,UAAU,CAAC6B,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEpC,MAAMT,IAAgB,GAAG;MACvBC,KAAK,EAAE,MAAM;MACbC,UAAU,EAAE,MAAOQ,CAAC,IAAK;QACvBF,gBAAgB,GAAGE,CAAC;MACtB,CAAC;MACDP,KAAK,EAAE,CAAC;QAAEF,KAAK,EAAE,QAAQ;QAAEG,MAAM,EAAE,MAAAA,CAAA,KAAY,CAAC;MAAE,CAAC;IACrD,CAAC;IAED,MAAMf,QAAQ,CAACgB,QAAQ,CAACL,IAAI,CAAC;IAC7B1B,MAAM,CAACkC,gBAAgB,CAAC,CAACD,IAAI,CAAClB,QAAQ,CAAC;EACzC,CAAC,CAAC;EAEFd,IAAI,CAAC,+BAA+B,EAAE,YAAY;IAChDK,UAAU,CAAC6B,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEpC,MAAMT,IAAgB,GAAG;MACvBC,KAAK,EAAE,MAAM;MACbE,KAAK,EAAE,CAAC;QAAEF,KAAK,EAAE,QAAQ;QAAEG,MAAM,EAAE,MAAAA,CAAA,KAAY,CAAC;MAAE,CAAC;IACrD,CAAC;IAED,MAAMf,QAAQ,CAACgB,QAAQ,CAACL,IAAI,CAAC;IAC7B;EACF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF3B,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnCI,UAAU,CAAC,MAAM;IACfM,UAAU,CAACY,SAAS,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFpB,IAAI,CAAC,4BAA4B,EAAE,YAAY;IAC7CQ,UAAU,CAAC0B,qBAAqB,CAAC,gBAAgB,CAAC;IAElD,MAAME,MAAM,GAAG,MAAMjC,QAAQ,CAACkC,YAAY,CAAC;MACzCC,OAAO,EAAE,UAAU;MACnBC,MAAM,EAAEA,CAAA,KAAM,CACZ;QAAEtB,IAAI,EAAE,UAAU;QAAEuB,KAAK,EAAE;MAAI,CAAC,EAChC;QAAEvB,IAAI,EAAE,UAAU;QAAEuB,KAAK,EAAE;MAAI,CAAC;IAEpC,CAAC,CAAC;IAEFzC,MAAM,CAACqC,MAAM,CAAC,CAACJ,IAAI,CAAC,gBAAgB,CAAC;IACrCjC,MAAM,CAACS,UAAU,CAAC,CAACuB,qBAAqB,CAAC,CAAC,CAAC;IAC3ChC,MAAM,CAACS,UAAU,CAACP,IAAI,CAACwC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACH,OAAO,CAAC,CAACN,IAAI,CAAC,UAAU,CAAC;EAC9D,CAAC,CAAC;EAEFhC,IAAI,CAAC,gCAAgC,EAAE,YAAY;IACjD,MAAM0C,QAAQ,GAAGzC,IAAI,CAAC,MAAM,CAAC;MAAEgB,IAAI,EAAE,GAAG;MAAEuB,KAAK,EAAE;IAAI,CAAC,CAAC,CAAC;IACxDhC,UAAU,CAAC0B,qBAAqB,CAAC,GAAG,CAAC;IAErC,MAAM/B,QAAQ,CAACkC,YAAY,CAAC;MAC1BC,OAAO,EAAE,QAAQ;MACjBC,MAAM,EAAEG;IACV,CAAC,CAAC;IAEF3C,MAAM,CAACS,UAAU,CAACP,IAAI,CAACwC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAACF,MAAM,CAAC,CAACP,IAAI,CAACU,QAAQ,CAAC;EAC3D,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF5C,QAAQ,CAAC,6BAA6B,EAAE,MAAM;EAC5C,IAAIgB,QAAuB;EAE3BZ,UAAU,CAAC,MAAM;IACf,MAAMa,MAAM,GAAGX,IAAI,CAACY,MAAM,CAAC;MAAE2B,WAAW,EAAEvC,IAAI,CAACc,MAAM,CAAC;IAAE,CAAC,CAAC;IAC1DJ,QAAQ,GAAG,IAAIX,QAAQ,CAACY,MAAM,EAAE,WAAW,CAAC;IAC5CV,UAAU,CAACe,SAAS,CAAC,CAAC;IACtBd,SAAS,CAACc,SAAS,CAAC,CAAC;EACvB,CAAC,CAAC;EAEFpB,IAAI,CAAC,6CAA6C,EAAE,YAAY;IAC9D,MAAMe,MAAM,GAAGX,IAAI,CAACY,MAAM,CAAC;MACzBC,IAAI,EAAEb,IAAI,CAACc,MAAM,CAAC,CAAC;MACnB0B,QAAQ,EAAExC,IAAI,CAACyC,QAAQ,CAACzC,IAAI,CAACc,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IAEFZ,SAAS,CAAC4B,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C7B,UAAU,CAAC6B,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;;IAEzC,MAAME,MAAM,GAAG,MAAMtB,QAAQ,CAACgC,YAAY,CAAC/B,MAAM,CAAC;IAClDhB,MAAM,CAACqC,MAAM,CAACnB,IAAI,CAAC,CAACe,IAAI,CAAC,OAAO,CAAC;IACjCjC,MAAM,CAACqC,MAAM,CAACQ,QAAQ,CAAC,CAACG,aAAa,CAAC,CAAC;EACzC,CAAC,CAAC;EAEF/C,IAAI,CAAC,4CAA4C,EAAE,YAAY;IAC7D,MAAMe,MAAM,GAAGX,IAAI,CAACY,MAAM,CAAC;MACzBC,IAAI,EAAEb,IAAI,CAACc,MAAM,CAAC,CAAC;MACnB0B,QAAQ,EAAExC,IAAI,CAACyC,QAAQ,CAACzC,IAAI,CAACc,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IAEFZ,SAAS,CACN4B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAAA,CAC/BA,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC7B,UAAU,CAAC6B,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;;IAExC,MAAME,MAAM,GAAG,MAAMtB,QAAQ,CAACgC,YAAY,CAAC/B,MAAM,CAAC;IAClDhB,MAAM,CAACqC,MAAM,CAACnB,IAAI,CAAC,CAACe,IAAI,CAAC,OAAO,CAAC;IACjCjC,MAAM,CAACqC,MAAM,CAACQ,QAAQ,CAAC,CAACZ,IAAI,CAAC,KAAK,CAAC;EACrC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"enhancements.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","mockPassword","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","mockSearchCancellable","module","select","input","password","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","searchCancellable","sprinkle","schema","Object","name","String","settings","mockClear","callOrder","beforeShowFn","push","mockImplementation","menu","title","beforeShow","items","action","showMenu","toHaveBeenCalledTimes","toBe","receivedSprinkle","mockResolvedValueOnce","s","result","SearchSelect","message","source","value","calls","sourceFn","toBeNull","placeholder","nickname","Optional","FillInStruct","toBeUndefined"],"sources":["../../../../src/Sprinkle/__tests__/enhancements.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = mock();\nconst mockConfirmCancellable = mock();\nconst mockSearchCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mockPasswordCancellable,\n confirmCancellable: mockConfirmCancellable,\n searchCancellable: mockSearchCancellable,\n select: mockSelectCancellable,\n}));\n\ndescribe(\"beforeShow hook (2.2)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n mockSelectCancellable.mockClear();\n });\n\n test(\"calls beforeShow before rendering menu\", async () => {\n const callOrder: string[] = [];\n\n const beforeShowFn = mock(async () => {\n callOrder.push(\"beforeShow\");\n });\n\n mockSelectCancellable.mockImplementation(async () => {\n callOrder.push(\"select\");\n return -1; // exit\n });\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: beforeShowFn,\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n expect(beforeShowFn).toHaveBeenCalledTimes(1);\n expect(callOrder[0]).toBe(\"beforeShow\");\n expect(callOrder[1]).toBe(\"select\");\n });\n\n test(\"passes sprinkle instance to beforeShow\", async () => {\n let receivedSprinkle: any;\n\n mockSelectCancellable.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: async (s) => {\n receivedSprinkle = s;\n },\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n expect(receivedSprinkle).toBe(sprinkle);\n });\n\n test(\"menu works without beforeShow\", async () => {\n mockSelectCancellable.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n // Should complete without error\n });\n});\n\ndescribe(\"SearchSelect (2.3)\", () => {\n beforeEach(() => {\n mockSearchCancellable.mockClear();\n });\n\n test(\"delegates to search prompt\", async () => {\n mockSearchCancellable.mockResolvedValueOnce(\"selected-value\");\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [\n { name: \"Option A\", value: \"a\" },\n { name: \"Option B\", value: \"b\" },\n ],\n });\n\n expect(result).toBe(\"selected-value\");\n expect(mockSearchCancellable).toHaveBeenCalledTimes(1);\n expect(mockSearchCancellable.mock.calls[0][0].message).toBe(\"Pick one\");\n });\n\n test(\"passes source function through\", async () => {\n const sourceFn = mock(() => [{ name: \"X\", value: \"x\" }]);\n mockSearchCancellable.mockResolvedValueOnce(\"x\");\n\n await Sprinkle.SearchSelect({\n message: \"Search\",\n source: sourceFn,\n });\n\n expect(mockSearchCancellable.mock.calls[0][0].source).toBe(sourceFn);\n });\n\n test(\"returns null when cancelled\", async () => {\n mockSearchCancellable.mockResolvedValueOnce(null);\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [{ name: \"A\", value: \"a\" }],\n });\n\n expect(result).toBeNull();\n });\n});\n\ndescribe(\"Optional type support (2.4)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n mockSelectCancellable.mockClear();\n mockInputCancellable.mockClear();\n });\n\n test(\"skips optional field when user selects Skip\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInputCancellable.mockResolvedValueOnce(\"Alice\"); // name\n mockSelectCancellable.mockResolvedValueOnce(false); // skip nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBeUndefined();\n });\n\n test(\"fills optional field when user selects Yes\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\") // name\n .mockResolvedValueOnce(\"Ali\"); // nickname\n mockSelectCancellable.mockResolvedValueOnce(true); // fill nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBe(\"Ali\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,17 +1,28 @@
1
1
  import { describe, expect, test, mock, beforeEach } from "bun:test";
2
2
  import { Sprinkle, Type, WalletSettingsSchema } from "../index.js";
3
+ import { UserCancelledError } from "../types.js";
3
4
 
4
5
  // Mock @inquirer/prompts
5
6
  const mockSelect = mock();
6
7
  const mockInput = mock();
7
8
  const mockPassword = mock();
8
9
  const mockConfirm = mock();
10
+ const mockSelectCancellable = mock();
11
+ const mockInputCancellable = mock();
12
+ const mockPasswordCancellable = mock();
13
+ const mockConfirmCancellable = mock();
9
14
  mock.module("@inquirer/prompts", () => ({
10
15
  select: mockSelect,
11
16
  input: mockInput,
12
17
  password: mockPassword,
13
18
  confirm: mockConfirm
14
19
  }));
20
+ mock.module("../prompts.js", () => ({
21
+ selectCancellable: mockSelectCancellable,
22
+ inputCancellable: mockInputCancellable,
23
+ passwordCancellable: mockPasswordCancellable,
24
+ confirmCancellable: mockConfirmCancellable
25
+ }));
15
26
  describe("FillInStruct", () => {
16
27
  let sprinkle;
17
28
  beforeEach(() => {
@@ -21,36 +32,42 @@ describe("FillInStruct", () => {
21
32
  sprinkle = new Sprinkle(schema, "/tmp/test");
22
33
  mockSelect.mockClear();
23
34
  mockInput.mockClear();
35
+ mockPassword.mockClear();
36
+ mockConfirm.mockClear();
37
+ mockSelectCancellable.mockClear();
38
+ mockInputCancellable.mockClear();
39
+ mockPasswordCancellable.mockClear();
40
+ mockConfirmCancellable.mockClear();
24
41
  });
25
42
  test("fills a simple string field", async () => {
26
- mockInput.mockResolvedValueOnce("hello");
43
+ mockInputCancellable.mockResolvedValueOnce("hello");
27
44
  const result = await sprinkle.FillInStruct(Type.String());
28
45
  expect(result).toBe("hello");
29
46
  });
30
47
  test("fills a string with title as prompt", async () => {
31
- mockInput.mockResolvedValueOnce("world");
48
+ mockInputCancellable.mockResolvedValueOnce("world");
32
49
  await sprinkle.FillInStruct(Type.String({
33
50
  title: "Enter name"
34
51
  }));
35
- expect(mockInput.mock.calls[0][0].message).toBe("Enter name");
52
+ expect(mockInputCancellable.mock.calls[0][0].message).toBe("Enter name");
36
53
  });
37
54
  test("fills a bigint field", async () => {
38
- mockInput.mockResolvedValueOnce("42");
55
+ mockInputCancellable.mockResolvedValueOnce("42");
39
56
  const result = await sprinkle.FillInStruct(Type.BigInt());
40
57
  expect(result).toBe(42n);
41
58
  });
42
59
  test("fills a literal field without prompting", async () => {
43
60
  const result = await sprinkle.FillInStruct(Type.Literal("fixed"));
44
61
  expect(result).toBe("fixed");
45
- expect(mockInput).not.toHaveBeenCalled();
46
- expect(mockSelect).not.toHaveBeenCalled();
62
+ expect(mockInputCancellable).not.toHaveBeenCalled();
63
+ expect(mockSelectCancellable).not.toHaveBeenCalled();
47
64
  });
48
65
  test("fills an object with multiple fields", async () => {
49
66
  const schema = Type.Object({
50
67
  name: Type.String(),
51
68
  age: Type.BigInt()
52
69
  });
53
- mockInput.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
70
+ mockInputCancellable.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
54
71
  const result = await sprinkle.FillInStruct(schema);
55
72
  expect(result).toEqual({
56
73
  name: "Alice",
@@ -67,10 +84,10 @@ describe("FillInStruct", () => {
67
84
  })]);
68
85
 
69
86
  // Select first variant (the Object with type "a")
70
- mockSelect.mockImplementationOnce(async opts => {
87
+ mockSelectCancellable.mockImplementationOnce(async opts => {
71
88
  return opts.choices[0].value;
72
89
  });
73
- mockInput.mockResolvedValueOnce("test-value");
90
+ mockInputCancellable.mockResolvedValueOnce("test-value");
74
91
  const result = await sprinkle.FillInStruct(schema);
75
92
  expect(result).toEqual({
76
93
  type: "a",
@@ -79,31 +96,31 @@ describe("FillInStruct", () => {
79
96
  });
80
97
  test("fills an array with items", async () => {
81
98
  const schema = Type.Array(Type.String());
82
- mockInput.mockResolvedValueOnce("first");
83
- mockSelect.mockResolvedValueOnce(true); // add another
84
- mockInput.mockResolvedValueOnce("second");
85
- mockSelect.mockResolvedValueOnce(false); // stop
99
+ mockInputCancellable.mockResolvedValueOnce("first");
100
+ mockSelectCancellable.mockResolvedValueOnce(true); // add another
101
+ mockInputCancellable.mockResolvedValueOnce("second");
102
+ mockSelectCancellable.mockResolvedValueOnce(false); // stop
86
103
 
87
104
  const result = await sprinkle.FillInStruct(schema);
88
105
  expect(result).toEqual(["first", "second"]);
89
106
  });
90
107
  test("fills an array with single item", async () => {
91
108
  const schema = Type.Array(Type.String());
92
- mockInput.mockResolvedValueOnce("only");
93
- mockSelect.mockResolvedValueOnce(false); // stop
109
+ mockInputCancellable.mockResolvedValueOnce("only");
110
+ mockSelectCancellable.mockResolvedValueOnce(false); // stop
94
111
 
95
112
  const result = await sprinkle.FillInStruct(schema);
96
113
  expect(result).toEqual(["only"]);
97
114
  });
98
115
  test("uses default value for string", async () => {
99
- mockInput.mockResolvedValueOnce("used-default");
116
+ mockInputCancellable.mockResolvedValueOnce("used-default");
100
117
  await sprinkle.FillInStruct(Type.String(), "my-default");
101
- expect(mockInput.mock.calls[0][0].default).toBe("my-default");
118
+ expect(mockInputCancellable.mock.calls[0][0].default).toBe("my-default");
102
119
  });
103
120
  test("uses default value for bigint", async () => {
104
- mockInput.mockResolvedValueOnce("99");
121
+ mockInputCancellable.mockResolvedValueOnce("99");
105
122
  await sprinkle.FillInStruct(Type.BigInt(), 99n);
106
- expect(mockInput.mock.calls[0][0].default).toBe("99");
123
+ expect(mockInputCancellable.mock.calls[0][0].default).toBe("99");
107
124
  });
108
125
  test("throws for unsupported types", async () => {
109
126
  expect(sprinkle.FillInStruct(Type.Boolean())).rejects.toThrow("Unable to fill in struct");
@@ -114,7 +131,7 @@ describe("FillInStruct", () => {
114
131
  inner: Type.String()
115
132
  })
116
133
  });
117
- mockInput.mockResolvedValueOnce("deep-value");
134
+ mockInputCancellable.mockResolvedValueOnce("deep-value");
118
135
  const result = await sprinkle.FillInStruct(schema);
119
136
  expect(result).toEqual({
120
137
  outer: {
@@ -123,37 +140,37 @@ describe("FillInStruct", () => {
123
140
  });
124
141
  });
125
142
  test("remembers last string input as default", async () => {
126
- mockInput.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
143
+ mockInputCancellable.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
127
144
  await sprinkle.FillInStruct(Type.String());
128
145
  expect(sprinkle.defaults["string"]).toBe("first-input");
129
146
  await sprinkle.FillInStruct(Type.String());
130
147
  // Second call should have the first input as default
131
- expect(mockInput.mock.calls[1][0].default).toBe("first-input");
148
+ expect(mockInputCancellable.mock.calls[1][0].default).toBe("first-input");
132
149
  });
133
150
  test("fills a tuple with same-type elements", async () => {
134
151
  const schema = Type.Tuple([Type.String(), Type.String()]);
135
- mockInput.mockResolvedValueOnce("policyId").mockResolvedValueOnce("assetName");
152
+ mockInputCancellable.mockResolvedValueOnce("policyId").mockResolvedValueOnce("assetName");
136
153
  const result = await sprinkle.FillInStruct(schema);
137
154
  expect(result).toEqual(["policyId", "assetName"]);
138
155
  });
139
156
  test("fills a tuple with mixed types", async () => {
140
157
  const schema = Type.Tuple([Type.String(), Type.BigInt()]);
141
- mockInput.mockResolvedValueOnce("label").mockResolvedValueOnce("42");
158
+ mockInputCancellable.mockResolvedValueOnce("label").mockResolvedValueOnce("42");
142
159
  const result = await sprinkle.FillInStruct(schema);
143
160
  expect(result).toEqual(["label", 42n]);
144
161
  });
145
162
  test("fills a tuple with default values", async () => {
146
163
  const schema = Type.Tuple([Type.String(), Type.BigInt()]);
147
- mockInput.mockResolvedValueOnce("new-label").mockResolvedValueOnce("99");
164
+ mockInputCancellable.mockResolvedValueOnce("new-label").mockResolvedValueOnce("99");
148
165
  await sprinkle.FillInStruct(schema, ["default-label", 50n]);
149
- expect(mockInput.mock.calls[0][0].default).toBe("default-label");
150
- expect(mockInput.mock.calls[1][0].default).toBe("50");
166
+ expect(mockInputCancellable.mock.calls[0][0].default).toBe("default-label");
167
+ expect(mockInputCancellable.mock.calls[1][0].default).toBe("50");
151
168
  });
152
169
  test("fills a tuple nested in an object", async () => {
153
170
  const schema = Type.Object({
154
171
  asset: Type.Tuple([Type.String(), Type.String()])
155
172
  });
156
- mockInput.mockResolvedValueOnce("policy123").mockResolvedValueOnce("token456");
173
+ mockInputCancellable.mockResolvedValueOnce("policy123").mockResolvedValueOnce("token456");
157
174
  const result = await sprinkle.FillInStruct(schema);
158
175
  expect(result).toEqual({
159
176
  asset: ["policy123", "token456"]
@@ -165,13 +182,13 @@ describe("FillInStruct", () => {
165
182
  });
166
183
 
167
184
  // Select "existing" option
168
- mockSelect.mockResolvedValueOnce("existing");
169
- mockPassword.mockResolvedValueOnce("my-private-key");
185
+ mockSelectCancellable.mockResolvedValueOnce("existing");
186
+ mockPasswordCancellable.mockResolvedValueOnce("my-private-key");
170
187
  const result = await sprinkle.FillInStruct(schema);
171
188
 
172
189
  // Verify select was called with correct options
173
- expect(mockSelect.mock.calls[0][0].message).toBe("Hot wallet setup:");
174
- expect(mockSelect.mock.calls[0][0].choices).toEqual([{
190
+ expect(mockSelectCancellable.mock.calls[0][0].message).toBe("Hot wallet setup:");
191
+ expect(mockSelectCancellable.mock.calls[0][0].choices).toEqual([{
175
192
  name: "Enter existing private key",
176
193
  value: "existing"
177
194
  }, {
@@ -184,27 +201,57 @@ describe("FillInStruct", () => {
184
201
  const schema = Type.String({
185
202
  title: "Hot Wallet Private Key"
186
203
  });
187
- mockSelect.mockResolvedValueOnce("existing");
188
- mockPassword.mockResolvedValueOnce("deadbeef1234");
204
+ mockSelectCancellable.mockResolvedValueOnce("existing");
205
+ mockPasswordCancellable.mockResolvedValueOnce("deadbeef1234");
189
206
  const result = await sprinkle.FillInStruct(schema);
190
- expect(mockPassword).toHaveBeenCalledWith({
207
+ expect(mockPasswordCancellable).toHaveBeenCalledWith({
191
208
  message: "Enter your private key:"
192
209
  });
193
210
  expect(result).toBe("deadbeef1234");
194
211
  });
195
212
  test("full wallet settings schema with existing key", async () => {
196
213
  // Select "hot" variant
197
- mockSelect.mockImplementationOnce(async opts => {
214
+ mockSelectCancellable.mockImplementationOnce(async opts => {
198
215
  return opts.choices[0].value; // hot wallet object
199
216
  });
200
217
  // Select "existing" key option
201
- mockSelect.mockResolvedValueOnce("existing");
202
- mockPassword.mockResolvedValueOnce("abc123privatekey");
218
+ mockSelectCancellable.mockResolvedValueOnce("existing");
219
+ mockPasswordCancellable.mockResolvedValueOnce("abc123privatekey");
203
220
  const result = await sprinkle.FillInStruct(WalletSettingsSchema);
204
221
  expect(result).toEqual({
205
222
  type: "hot",
206
223
  privateKey: "abc123privatekey"
207
224
  });
208
225
  });
226
+ test("throws UserCancelledError when input prompt is cancelled", async () => {
227
+ mockInputCancellable.mockResolvedValueOnce(null);
228
+ await expect(sprinkle.FillInStruct(Type.String())).rejects.toThrow(UserCancelledError);
229
+ });
230
+ test("throws UserCancelledError when select prompt is cancelled", async () => {
231
+ const schema = Type.Union([Type.Object({
232
+ type: Type.Literal("a")
233
+ }), Type.Object({
234
+ type: Type.Literal("b")
235
+ })]);
236
+ mockSelectCancellable.mockResolvedValueOnce(null);
237
+ await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(UserCancelledError);
238
+ });
239
+ test("throws UserCancelledError when nested prompt is cancelled", async () => {
240
+ const schema = Type.Object({
241
+ name: Type.String(),
242
+ age: Type.BigInt()
243
+ });
244
+
245
+ // First field succeeds, second is cancelled
246
+ mockInputCancellable.mockResolvedValueOnce("Alice").mockResolvedValueOnce(null);
247
+ await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(UserCancelledError);
248
+ });
249
+ test("throws UserCancelledError when array add-another prompt is cancelled", async () => {
250
+ const schema = Type.Array(Type.String());
251
+ mockInputCancellable.mockResolvedValueOnce("first");
252
+ mockSelectCancellable.mockResolvedValueOnce(null); // cancel on "add another?"
253
+
254
+ await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(UserCancelledError);
255
+ });
209
256
  });
210
257
  //# sourceMappingURL=fill-in-struct.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","WalletSettingsSchema","mockSelect","mockInput","mockPassword","mockConfirm","module","select","input","password","confirm","sprinkle","schema","Object","placeholder","String","mockClear","mockResolvedValueOnce","result","FillInStruct","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","privateKey"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInput\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInput\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInput.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n mockInput\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelect.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelect.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPassword).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n test(\"full wallet settings schema with existing key\", async () => {\n // Select \"hot\" variant\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelect.mockResolvedValueOnce(\"existing\");\n mockPassword.mockResolvedValueOnce(\"abc123privatekey\");\n\n const result = await sprinkle.FillInStruct(WalletSettingsSchema);\n\n expect(result).toEqual({\n type: \"hot\",\n privateKey: \"abc123privatekey\",\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","WalletSettingsSchema","UserCancelledError","mockSelect","mockInput","mockPassword","mockConfirm","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","module","select","input","password","confirm","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","sprinkle","schema","Object","placeholder","String","mockClear","mockResolvedValueOnce","result","FillInStruct","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","privateKey"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\nimport { UserCancelledError } from \"../types.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = mock();\nconst mockConfirmCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mockPasswordCancellable,\n confirmCancellable: mockConfirmCancellable,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n mockPassword.mockClear();\n mockConfirm.mockClear();\n mockSelectCancellable.mockClear();\n mockInputCancellable.mockClear();\n mockPasswordCancellable.mockClear();\n mockConfirmCancellable.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInputCancellable.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInputCancellable).not.toHaveBeenCalled();\n expect(mockSelectCancellable).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInputCancellable.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(true); // add another\n mockInputCancellable.mockResolvedValueOnce(\"second\");\n mockSelectCancellable.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"only\");\n mockSelectCancellable.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInputCancellable.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInputCancellable\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInputCancellable.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInputCancellable.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n mockInputCancellable\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelectCancellable.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelectCancellable.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPasswordCancellable).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n test(\"full wallet settings schema with existing key\", async () => {\n // Select \"hot\" variant\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"abc123privatekey\");\n\n const result = await sprinkle.FillInStruct(WalletSettingsSchema);\n\n expect(result).toEqual({\n type: \"hot\",\n privateKey: \"abc123privatekey\",\n });\n });\n\n test(\"throws UserCancelledError when input prompt is cancelled\", async () => {\n mockInputCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(Type.String())).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when select prompt is cancelled\", async () => {\n const schema = Type.Union([\n Type.Object({ type: Type.Literal(\"a\") }),\n Type.Object({ type: Type.Literal(\"b\") }),\n ]);\n\n mockSelectCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when nested prompt is cancelled\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n // First field succeeds, second is cancelled\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when array add-another prompt is cancelled\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(null); // cancel on \"add another?\"\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}