@sundaeswap/sprinkles 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/dist/cjs/Sprinkle/__tests__/bigint-reviver.test.js +40 -0
  4. package/dist/cjs/Sprinkle/__tests__/bigint-reviver.test.js.map +1 -0
  5. package/dist/cjs/Sprinkle/__tests__/encryption.test.js +267 -0
  6. package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -0
  7. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +147 -0
  8. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -0
  9. package/dist/cjs/Sprinkle/__tests__/extract-message.test.js +60 -0
  10. package/dist/cjs/Sprinkle/__tests__/extract-message.test.js.map +1 -0
  11. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +131 -0
  12. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -0
  13. package/dist/cjs/Sprinkle/__tests__/schemas.test.js +184 -0
  14. package/dist/cjs/Sprinkle/__tests__/schemas.test.js.map +1 -0
  15. package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +199 -0
  16. package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -0
  17. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +108 -0
  18. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -0
  19. package/dist/cjs/Sprinkle/__tests__/test-helpers.js +16 -0
  20. package/dist/cjs/Sprinkle/__tests__/test-helpers.js.map +1 -0
  21. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +271 -0
  22. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -0
  23. package/dist/cjs/Sprinkle/index.js +954 -0
  24. package/dist/cjs/Sprinkle/index.js.map +1 -0
  25. package/dist/cjs/index.js +17 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/esm/Sprinkle/__tests__/bigint-reviver.test.js +38 -0
  29. package/dist/esm/Sprinkle/__tests__/bigint-reviver.test.js.map +1 -0
  30. package/dist/esm/Sprinkle/__tests__/encryption.test.js +264 -0
  31. package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -0
  32. package/dist/esm/Sprinkle/__tests__/enhancements.test.js +145 -0
  33. package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -0
  34. package/dist/esm/Sprinkle/__tests__/extract-message.test.js +58 -0
  35. package/dist/esm/Sprinkle/__tests__/extract-message.test.js.map +1 -0
  36. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +130 -0
  37. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -0
  38. package/dist/esm/Sprinkle/__tests__/schemas.test.js +182 -0
  39. package/dist/esm/Sprinkle/__tests__/schemas.test.js.map +1 -0
  40. package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +196 -0
  41. package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -0
  42. package/dist/esm/Sprinkle/__tests__/show-menu.test.js +106 -0
  43. package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -0
  44. package/dist/esm/Sprinkle/__tests__/test-helpers.js +10 -0
  45. package/dist/esm/Sprinkle/__tests__/test-helpers.js.map +1 -0
  46. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +269 -0
  47. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -0
  48. package/dist/esm/Sprinkle/index.js +928 -0
  49. package/dist/esm/Sprinkle/index.js.map +1 -0
  50. package/dist/esm/index.js +2 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/types/Sprinkle/index.d.ts +205 -0
  53. package/dist/types/Sprinkle/index.d.ts.map +1 -0
  54. package/dist/types/index.d.ts +2 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/tsconfig.build.tsbuildinfo +1 -0
  57. package/package.json +85 -0
  58. package/src/Sprinkle/__tests__/bigint-reviver.test.ts +49 -0
  59. package/src/Sprinkle/__tests__/encryption.test.ts +266 -0
  60. package/src/Sprinkle/__tests__/enhancements.test.ts +154 -0
  61. package/src/Sprinkle/__tests__/extract-message.test.ts +60 -0
  62. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +159 -0
  63. package/src/Sprinkle/__tests__/schemas.test.ts +215 -0
  64. package/src/Sprinkle/__tests__/settings-persistence.test.ts +181 -0
  65. package/src/Sprinkle/__tests__/show-menu.test.ts +123 -0
  66. package/src/Sprinkle/__tests__/test-helpers.ts +14 -0
  67. package/src/Sprinkle/__tests__/tx-dialog.test.ts +293 -0
  68. package/src/Sprinkle/index.ts +1215 -0
  69. package/src/index.ts +1 -0
@@ -0,0 +1,145 @@
1
+ import { describe, expect, test, mock, beforeEach } from "bun:test";
2
+ import { Sprinkle, Type } from "../index.js";
3
+ const mockSelect = mock();
4
+ const mockInput = mock();
5
+ const mockPassword = mock();
6
+ const mockSearch = mock();
7
+ mock.module("@inquirer/prompts", () => ({
8
+ select: mockSelect,
9
+ input: mockInput,
10
+ password: mockPassword,
11
+ search: mockSearch
12
+ }));
13
+ describe("beforeShow hook (2.2)", () => {
14
+ let sprinkle;
15
+ beforeEach(() => {
16
+ const schema = Type.Object({
17
+ name: Type.String()
18
+ });
19
+ sprinkle = new Sprinkle(schema, "/tmp/test");
20
+ sprinkle.settings = {
21
+ name: "test"
22
+ };
23
+ mockSelect.mockClear();
24
+ });
25
+ test("calls beforeShow before rendering menu", async () => {
26
+ const callOrder = [];
27
+ const beforeShowFn = mock(async () => {
28
+ callOrder.push("beforeShow");
29
+ });
30
+ mockSelect.mockImplementation(async () => {
31
+ callOrder.push("select");
32
+ return -1; // exit
33
+ });
34
+ const menu = {
35
+ title: "Test",
36
+ beforeShow: beforeShowFn,
37
+ items: [{
38
+ title: "Action",
39
+ action: async () => {}
40
+ }]
41
+ };
42
+ await sprinkle.showMenu(menu);
43
+ expect(beforeShowFn).toHaveBeenCalledTimes(1);
44
+ expect(callOrder[0]).toBe("beforeShow");
45
+ expect(callOrder[1]).toBe("select");
46
+ });
47
+ test("passes sprinkle instance to beforeShow", async () => {
48
+ let receivedSprinkle;
49
+ mockSelect.mockResolvedValueOnce(-1);
50
+ const menu = {
51
+ title: "Test",
52
+ beforeShow: async s => {
53
+ receivedSprinkle = s;
54
+ },
55
+ items: [{
56
+ title: "Action",
57
+ action: async () => {}
58
+ }]
59
+ };
60
+ await sprinkle.showMenu(menu);
61
+ expect(receivedSprinkle).toBe(sprinkle);
62
+ });
63
+ test("menu works without beforeShow", async () => {
64
+ mockSelect.mockResolvedValueOnce(-1);
65
+ const menu = {
66
+ title: "Test",
67
+ items: [{
68
+ title: "Action",
69
+ action: async () => {}
70
+ }]
71
+ };
72
+ await sprinkle.showMenu(menu);
73
+ // Should complete without error
74
+ });
75
+ });
76
+ describe("SearchSelect (2.3)", () => {
77
+ beforeEach(() => {
78
+ mockSearch.mockClear();
79
+ });
80
+ test("delegates to search prompt", async () => {
81
+ mockSearch.mockResolvedValueOnce("selected-value");
82
+ const result = await Sprinkle.SearchSelect({
83
+ message: "Pick one",
84
+ source: () => [{
85
+ name: "Option A",
86
+ value: "a"
87
+ }, {
88
+ name: "Option B",
89
+ value: "b"
90
+ }]
91
+ });
92
+ expect(result).toBe("selected-value");
93
+ expect(mockSearch).toHaveBeenCalledTimes(1);
94
+ expect(mockSearch.mock.calls[0][0].message).toBe("Pick one");
95
+ });
96
+ test("passes source function through", async () => {
97
+ const sourceFn = mock(() => [{
98
+ name: "X",
99
+ value: "x"
100
+ }]);
101
+ mockSearch.mockResolvedValueOnce("x");
102
+ await Sprinkle.SearchSelect({
103
+ message: "Search",
104
+ source: sourceFn
105
+ });
106
+ expect(mockSearch.mock.calls[0][0].source).toBe(sourceFn);
107
+ });
108
+ });
109
+ describe("Optional type support (2.4)", () => {
110
+ let sprinkle;
111
+ beforeEach(() => {
112
+ const schema = Type.Object({
113
+ placeholder: Type.String()
114
+ });
115
+ sprinkle = new Sprinkle(schema, "/tmp/test");
116
+ mockSelect.mockClear();
117
+ mockInput.mockClear();
118
+ });
119
+ test("skips optional field when user selects Skip", async () => {
120
+ const schema = Type.Object({
121
+ name: Type.String(),
122
+ nickname: Type.Optional(Type.String())
123
+ });
124
+ mockInput.mockResolvedValueOnce("Alice"); // name
125
+ mockSelect.mockResolvedValueOnce(false); // skip nickname
126
+
127
+ const result = await sprinkle.FillInStruct(schema);
128
+ expect(result.name).toBe("Alice");
129
+ expect(result.nickname).toBeUndefined();
130
+ });
131
+ test("fills optional field when user selects Yes", async () => {
132
+ const schema = Type.Object({
133
+ name: Type.String(),
134
+ nickname: Type.Optional(Type.String())
135
+ });
136
+ mockInput.mockResolvedValueOnce("Alice") // name
137
+ .mockResolvedValueOnce("Ali"); // nickname
138
+ mockSelect.mockResolvedValueOnce(true); // fill nickname
139
+
140
+ const result = await sprinkle.FillInStruct(schema);
141
+ expect(result.name).toBe("Alice");
142
+ expect(result.nickname).toBe("Ali");
143
+ });
144
+ });
145
+ //# sourceMappingURL=enhancements.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhancements.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","mockPassword","mockSearch","module","select","input","password","search","sprinkle","schema","Object","name","String","settings","mockClear","callOrder","beforeShowFn","push","mockImplementation","menu","title","beforeShow","items","action","showMenu","toHaveBeenCalledTimes","toBe","receivedSprinkle","mockResolvedValueOnce","s","result","SearchSelect","message","source","value","calls","sourceFn","placeholder","nickname","Optional","FillInStruct","toBeUndefined"],"sources":["../../../../src/Sprinkle/__tests__/enhancements.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockSearch = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n search: mockSearch,\n}));\n\ndescribe(\"beforeShow hook (2.2)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n });\n\n test(\"calls beforeShow before rendering menu\", async () => {\n const callOrder: string[] = [];\n\n const beforeShowFn = mock(async () => {\n callOrder.push(\"beforeShow\");\n });\n\n mockSelect.mockImplementation(async () => {\n callOrder.push(\"select\");\n return -1; // exit\n });\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: beforeShowFn,\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n expect(beforeShowFn).toHaveBeenCalledTimes(1);\n expect(callOrder[0]).toBe(\"beforeShow\");\n expect(callOrder[1]).toBe(\"select\");\n });\n\n test(\"passes sprinkle instance to beforeShow\", async () => {\n let receivedSprinkle: any;\n\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n beforeShow: async (s) => {\n receivedSprinkle = s;\n },\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n expect(receivedSprinkle).toBe(sprinkle);\n });\n\n test(\"menu works without beforeShow\", async () => {\n mockSelect.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n // Should complete without error\n });\n});\n\ndescribe(\"SearchSelect (2.3)\", () => {\n beforeEach(() => {\n mockSearch.mockClear();\n });\n\n test(\"delegates to search prompt\", async () => {\n mockSearch.mockResolvedValueOnce(\"selected-value\");\n\n const result = await Sprinkle.SearchSelect({\n message: \"Pick one\",\n source: () => [\n { name: \"Option A\", value: \"a\" },\n { name: \"Option B\", value: \"b\" },\n ],\n });\n\n expect(result).toBe(\"selected-value\");\n expect(mockSearch).toHaveBeenCalledTimes(1);\n expect(mockSearch.mock.calls[0][0].message).toBe(\"Pick one\");\n });\n\n test(\"passes source function through\", async () => {\n const sourceFn = mock(() => [{ name: \"X\", value: \"x\" }]);\n mockSearch.mockResolvedValueOnce(\"x\");\n\n await Sprinkle.SearchSelect({\n message: \"Search\",\n source: sourceFn,\n });\n\n expect(mockSearch.mock.calls[0][0].source).toBe(sourceFn);\n });\n});\n\ndescribe(\"Optional type support (2.4)\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"skips optional field when user selects Skip\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInput.mockResolvedValueOnce(\"Alice\"); // name\n mockSelect.mockResolvedValueOnce(false); // skip nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBeUndefined();\n });\n\n test(\"fills optional field when user selects Yes\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\") // name\n .mockResolvedValueOnce(\"Ali\"); // nickname\n mockSelect.mockResolvedValueOnce(true); // fill nickname\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result.name).toBe(\"Alice\");\n expect(result.nickname).toBe(\"Ali\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Sprinkle, Type } from "../index.js";
3
+ describe("ExtractMessage", () => {
4
+ test("returns title when present", () => {
5
+ const schema = Type.String({
6
+ title: "My Title"
7
+ });
8
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("My Title");
9
+ });
10
+ test("returns description when title is absent", () => {
11
+ const schema = Type.String({
12
+ description: "My Description"
13
+ });
14
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("My Description");
15
+ });
16
+ test("prefers title over description", () => {
17
+ const schema = Type.String({
18
+ title: "My Title",
19
+ description: "My Description"
20
+ });
21
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("My Title");
22
+ });
23
+ test("returns literal const value as string", () => {
24
+ const schema = Type.Literal("hello");
25
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("hello");
26
+ });
27
+ test("returns literal number const as string", () => {
28
+ const schema = Type.Literal(42);
29
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("42");
30
+ });
31
+ test("returns type field message for objects with a type field", () => {
32
+ const schema = Type.Object({
33
+ type: Type.Literal("blockfrost"),
34
+ projectId: Type.String()
35
+ });
36
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("blockfrost");
37
+ });
38
+ test("returns single field name for single-field objects", () => {
39
+ const schema = Type.Object({
40
+ Signature: Type.Object({
41
+ key_hash: Type.String()
42
+ })
43
+ });
44
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("Signature");
45
+ });
46
+ test("returns default for multi-field objects without type field", () => {
47
+ const schema = Type.Object({
48
+ name: Type.String(),
49
+ age: Type.BigInt()
50
+ });
51
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("fallback");
52
+ });
53
+ test("returns default for plain string without title/description", () => {
54
+ const schema = Type.String();
55
+ expect(Sprinkle.ExtractMessage(schema, "fallback")).toBe("fallback");
56
+ });
57
+ });
58
+ //# sourceMappingURL=extract-message.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-message.test.js","names":["describe","expect","test","Sprinkle","Type","schema","String","title","ExtractMessage","toBe","description","Literal","Object","type","projectId","Signature","key_hash","name","age","BigInt"],"sources":["../../../../src/Sprinkle/__tests__/extract-message.test.ts"],"sourcesContent":["import { describe, expect, test } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\n\ndescribe(\"ExtractMessage\", () => {\n test(\"returns title when present\", () => {\n const schema = Type.String({ title: \"My Title\" });\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"My Title\");\n });\n\n test(\"returns description when title is absent\", () => {\n const schema = Type.String({ description: \"My Description\" });\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"My Description\");\n });\n\n test(\"prefers title over description\", () => {\n const schema = Type.String({\n title: \"My Title\",\n description: \"My Description\",\n });\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"My Title\");\n });\n\n test(\"returns literal const value as string\", () => {\n const schema = Type.Literal(\"hello\");\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"hello\");\n });\n\n test(\"returns literal number const as string\", () => {\n const schema = Type.Literal(42);\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"42\");\n });\n\n test(\"returns type field message for objects with a type field\", () => {\n const schema = Type.Object({\n type: Type.Literal(\"blockfrost\"),\n projectId: Type.String(),\n });\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"blockfrost\");\n });\n\n test(\"returns single field name for single-field objects\", () => {\n const schema = Type.Object({\n Signature: Type.Object({ key_hash: Type.String() }),\n });\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"Signature\");\n });\n\n test(\"returns default for multi-field objects without type field\", () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"fallback\");\n });\n\n test(\"returns default for plain string without title/description\", () => {\n const schema = Type.String();\n expect(Sprinkle.ExtractMessage(schema, \"fallback\")).toBe(\"fallback\");\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,QAAQ,UAAU;AACjD,SAASC,QAAQ,EAAEC,IAAI,QAAQ,aAAa;AAE5CJ,QAAQ,CAAC,gBAAgB,EAAE,MAAM;EAC/BE,IAAI,CAAC,4BAA4B,EAAE,MAAM;IACvC,MAAMG,MAAM,GAAGD,IAAI,CAACE,MAAM,CAAC;MAAEC,KAAK,EAAE;IAAW,CAAC,CAAC;IACjDN,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,UAAU,CAAC;EACtE,CAAC,CAAC;EAEFP,IAAI,CAAC,0CAA0C,EAAE,MAAM;IACrD,MAAMG,MAAM,GAAGD,IAAI,CAACE,MAAM,CAAC;MAAEI,WAAW,EAAE;IAAiB,CAAC,CAAC;IAC7DT,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,gBAAgB,CAAC;EAC5E,CAAC,CAAC;EAEFP,IAAI,CAAC,gCAAgC,EAAE,MAAM;IAC3C,MAAMG,MAAM,GAAGD,IAAI,CAACE,MAAM,CAAC;MACzBC,KAAK,EAAE,UAAU;MACjBG,WAAW,EAAE;IACf,CAAC,CAAC;IACFT,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,UAAU,CAAC;EACtE,CAAC,CAAC;EAEFP,IAAI,CAAC,uCAAuC,EAAE,MAAM;IAClD,MAAMG,MAAM,GAAGD,IAAI,CAACO,OAAO,CAAC,OAAO,CAAC;IACpCV,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,OAAO,CAAC;EACnE,CAAC,CAAC;EAEFP,IAAI,CAAC,wCAAwC,EAAE,MAAM;IACnD,MAAMG,MAAM,GAAGD,IAAI,CAACO,OAAO,CAAC,EAAE,CAAC;IAC/BV,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,IAAI,CAAC;EAChE,CAAC,CAAC;EAEFP,IAAI,CAAC,0DAA0D,EAAE,MAAM;IACrE,MAAMG,MAAM,GAAGD,IAAI,CAACQ,MAAM,CAAC;MACzBC,IAAI,EAAET,IAAI,CAACO,OAAO,CAAC,YAAY,CAAC;MAChCG,SAAS,EAAEV,IAAI,CAACE,MAAM,CAAC;IACzB,CAAC,CAAC;IACFL,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,YAAY,CAAC;EACxE,CAAC,CAAC;EAEFP,IAAI,CAAC,oDAAoD,EAAE,MAAM;IAC/D,MAAMG,MAAM,GAAGD,IAAI,CAACQ,MAAM,CAAC;MACzBG,SAAS,EAAEX,IAAI,CAACQ,MAAM,CAAC;QAAEI,QAAQ,EAAEZ,IAAI,CAACE,MAAM,CAAC;MAAE,CAAC;IACpD,CAAC,CAAC;IACFL,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,WAAW,CAAC;EACvE,CAAC,CAAC;EAEFP,IAAI,CAAC,4DAA4D,EAAE,MAAM;IACvE,MAAMG,MAAM,GAAGD,IAAI,CAACQ,MAAM,CAAC;MACzBK,IAAI,EAAEb,IAAI,CAACE,MAAM,CAAC,CAAC;MACnBY,GAAG,EAAEd,IAAI,CAACe,MAAM,CAAC;IACnB,CAAC,CAAC;IACFlB,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,UAAU,CAAC;EACtE,CAAC,CAAC;EAEFP,IAAI,CAAC,4DAA4D,EAAE,MAAM;IACvE,MAAMG,MAAM,GAAGD,IAAI,CAACE,MAAM,CAAC,CAAC;IAC5BL,MAAM,CAACE,QAAQ,CAACK,cAAc,CAACH,MAAM,EAAE,UAAU,CAAC,CAAC,CAACI,IAAI,CAAC,UAAU,CAAC;EACtE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,130 @@
1
+ import { describe, expect, test, mock, beforeEach } from "bun:test";
2
+ import { Sprinkle, Type } from "../index.js";
3
+
4
+ // Mock @inquirer/prompts
5
+ const mockSelect = mock();
6
+ const mockInput = mock();
7
+ mock.module("@inquirer/prompts", () => ({
8
+ select: mockSelect,
9
+ input: mockInput
10
+ }));
11
+ describe("FillInStruct", () => {
12
+ let sprinkle;
13
+ beforeEach(() => {
14
+ const schema = Type.Object({
15
+ placeholder: Type.String()
16
+ });
17
+ sprinkle = new Sprinkle(schema, "/tmp/test");
18
+ mockSelect.mockClear();
19
+ mockInput.mockClear();
20
+ });
21
+ test("fills a simple string field", async () => {
22
+ mockInput.mockResolvedValueOnce("hello");
23
+ const result = await sprinkle.FillInStruct(Type.String());
24
+ expect(result).toBe("hello");
25
+ });
26
+ test("fills a string with title as prompt", async () => {
27
+ mockInput.mockResolvedValueOnce("world");
28
+ await sprinkle.FillInStruct(Type.String({
29
+ title: "Enter name"
30
+ }));
31
+ expect(mockInput.mock.calls[0][0].message).toBe("Enter name");
32
+ });
33
+ test("fills a bigint field", async () => {
34
+ mockInput.mockResolvedValueOnce("42");
35
+ const result = await sprinkle.FillInStruct(Type.BigInt());
36
+ expect(result).toBe(42n);
37
+ });
38
+ test("fills a literal field without prompting", async () => {
39
+ const result = await sprinkle.FillInStruct(Type.Literal("fixed"));
40
+ expect(result).toBe("fixed");
41
+ expect(mockInput).not.toHaveBeenCalled();
42
+ expect(mockSelect).not.toHaveBeenCalled();
43
+ });
44
+ test("fills an object with multiple fields", async () => {
45
+ const schema = Type.Object({
46
+ name: Type.String(),
47
+ age: Type.BigInt()
48
+ });
49
+ mockInput.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
50
+ const result = await sprinkle.FillInStruct(schema);
51
+ expect(result).toEqual({
52
+ name: "Alice",
53
+ age: 30n
54
+ });
55
+ });
56
+ test("fills a union type by selecting variant then filling", async () => {
57
+ const schema = Type.Union([Type.Object({
58
+ type: Type.Literal("a"),
59
+ value: Type.String()
60
+ }), Type.Object({
61
+ type: Type.Literal("b"),
62
+ count: Type.BigInt()
63
+ })]);
64
+
65
+ // Select first variant (the Object with type "a")
66
+ mockSelect.mockImplementationOnce(async opts => {
67
+ return opts.choices[0].value;
68
+ });
69
+ mockInput.mockResolvedValueOnce("test-value");
70
+ const result = await sprinkle.FillInStruct(schema);
71
+ expect(result).toEqual({
72
+ type: "a",
73
+ value: "test-value"
74
+ });
75
+ });
76
+ test("fills an array with items", async () => {
77
+ const schema = Type.Array(Type.String());
78
+ mockInput.mockResolvedValueOnce("first");
79
+ mockSelect.mockResolvedValueOnce(true); // add another
80
+ mockInput.mockResolvedValueOnce("second");
81
+ mockSelect.mockResolvedValueOnce(false); // stop
82
+
83
+ const result = await sprinkle.FillInStruct(schema);
84
+ expect(result).toEqual(["first", "second"]);
85
+ });
86
+ test("fills an array with single item", async () => {
87
+ const schema = Type.Array(Type.String());
88
+ mockInput.mockResolvedValueOnce("only");
89
+ mockSelect.mockResolvedValueOnce(false); // stop
90
+
91
+ const result = await sprinkle.FillInStruct(schema);
92
+ expect(result).toEqual(["only"]);
93
+ });
94
+ test("uses default value for string", async () => {
95
+ mockInput.mockResolvedValueOnce("used-default");
96
+ await sprinkle.FillInStruct(Type.String(), "my-default");
97
+ expect(mockInput.mock.calls[0][0].default).toBe("my-default");
98
+ });
99
+ test("uses default value for bigint", async () => {
100
+ mockInput.mockResolvedValueOnce("99");
101
+ await sprinkle.FillInStruct(Type.BigInt(), 99n);
102
+ expect(mockInput.mock.calls[0][0].default).toBe("99");
103
+ });
104
+ test("throws for unsupported types", async () => {
105
+ expect(sprinkle.FillInStruct(Type.Boolean())).rejects.toThrow("Unable to fill in struct");
106
+ });
107
+ test("fills nested objects", async () => {
108
+ const schema = Type.Object({
109
+ outer: Type.Object({
110
+ inner: Type.String()
111
+ })
112
+ });
113
+ mockInput.mockResolvedValueOnce("deep-value");
114
+ const result = await sprinkle.FillInStruct(schema);
115
+ expect(result).toEqual({
116
+ outer: {
117
+ inner: "deep-value"
118
+ }
119
+ });
120
+ });
121
+ test("remembers last string input as default", async () => {
122
+ mockInput.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
123
+ await sprinkle.FillInStruct(Type.String());
124
+ expect(sprinkle.defaults["string"]).toBe("first-input");
125
+ await sprinkle.FillInStruct(Type.String());
126
+ // Second call should have the first input as default
127
+ expect(mockInput.mock.calls[1][0].default).toBe("first-input");
128
+ });
129
+ });
130
+ //# sourceMappingURL=fill-in-struct.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","mockSelect","mockInput","module","select","input","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"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInput.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInput.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInput.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInput.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInput).not.toHaveBeenCalled();\n expect(mockSelect).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInput\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelect.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInput.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"first\");\n mockSelect.mockResolvedValueOnce(true); // add another\n mockInput.mockResolvedValueOnce(\"second\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInput.mockResolvedValueOnce(\"only\");\n mockSelect.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInput.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInput.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInput.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInput.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInput\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInput.mock.calls[1][0].default).toBe(\"first-input\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,182 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Value } from "@sinclair/typebox/value";
3
+ import { NetworkSchema, ProviderSettingsSchema, WalletSettingsSchema, MultisigScriptModule } from "../index.js";
4
+ describe("Built-in Schemas", () => {
5
+ describe("NetworkSchema", () => {
6
+ test("accepts mainnet", () => {
7
+ expect(Value.Check(NetworkSchema, "mainnet")).toBe(true);
8
+ });
9
+ test("accepts preview", () => {
10
+ expect(Value.Check(NetworkSchema, "preview")).toBe(true);
11
+ });
12
+ test("accepts preprod", () => {
13
+ expect(Value.Check(NetworkSchema, "preprod")).toBe(true);
14
+ });
15
+ test("rejects invalid network", () => {
16
+ expect(Value.Check(NetworkSchema, "testnet")).toBe(false);
17
+ });
18
+ test("rejects non-string", () => {
19
+ expect(Value.Check(NetworkSchema, 42)).toBe(false);
20
+ });
21
+ });
22
+ describe("ProviderSettingsSchema", () => {
23
+ test("accepts blockfrost settings", () => {
24
+ expect(Value.Check(ProviderSettingsSchema, {
25
+ type: "blockfrost",
26
+ projectId: "abc123"
27
+ })).toBe(true);
28
+ });
29
+ test("accepts maestro settings", () => {
30
+ expect(Value.Check(ProviderSettingsSchema, {
31
+ type: "maestro",
32
+ apiKey: "key123"
33
+ })).toBe(true);
34
+ });
35
+ test("rejects empty projectId for blockfrost", () => {
36
+ expect(Value.Check(ProviderSettingsSchema, {
37
+ type: "blockfrost",
38
+ projectId: ""
39
+ })).toBe(false);
40
+ });
41
+ test("rejects empty apiKey for maestro", () => {
42
+ expect(Value.Check(ProviderSettingsSchema, {
43
+ type: "maestro",
44
+ apiKey: ""
45
+ })).toBe(false);
46
+ });
47
+ test("rejects unknown provider type", () => {
48
+ expect(Value.Check(ProviderSettingsSchema, {
49
+ type: "unknown",
50
+ key: "abc"
51
+ })).toBe(false);
52
+ });
53
+ });
54
+ describe("WalletSettingsSchema", () => {
55
+ test("accepts hot wallet settings", () => {
56
+ expect(Value.Check(WalletSettingsSchema, {
57
+ type: "hot",
58
+ privateKey: "deadbeef"
59
+ })).toBe(true);
60
+ });
61
+ test("accepts cold wallet settings", () => {
62
+ expect(Value.Check(WalletSettingsSchema, {
63
+ type: "cold",
64
+ address: "addr1qtest"
65
+ })).toBe(true);
66
+ });
67
+ test("rejects empty privateKey for hot wallet", () => {
68
+ expect(Value.Check(WalletSettingsSchema, {
69
+ type: "hot",
70
+ privateKey: ""
71
+ })).toBe(false);
72
+ });
73
+ test("rejects empty address for cold wallet", () => {
74
+ expect(Value.Check(WalletSettingsSchema, {
75
+ type: "cold",
76
+ address: ""
77
+ })).toBe(false);
78
+ });
79
+ });
80
+ describe("MultisigScript", () => {
81
+ const MultisigScript = MultisigScriptModule.Import("MultisigScript");
82
+ test("accepts Signature variant", () => {
83
+ expect(Value.Check(MultisigScript, {
84
+ Signature: {
85
+ key_hash: "abc123"
86
+ }
87
+ })).toBe(true);
88
+ });
89
+ test("accepts AllOf variant with nested scripts", () => {
90
+ expect(Value.Check(MultisigScript, {
91
+ AllOf: {
92
+ scripts: [{
93
+ Signature: {
94
+ key_hash: "abc"
95
+ }
96
+ }, {
97
+ Signature: {
98
+ key_hash: "def"
99
+ }
100
+ }]
101
+ }
102
+ })).toBe(true);
103
+ });
104
+ test("accepts AnyOf variant", () => {
105
+ expect(Value.Check(MultisigScript, {
106
+ AnyOf: {
107
+ scripts: [{
108
+ Signature: {
109
+ key_hash: "abc"
110
+ }
111
+ }]
112
+ }
113
+ })).toBe(true);
114
+ });
115
+ test("accepts AtLeast variant", () => {
116
+ expect(Value.Check(MultisigScript, {
117
+ AtLeast: {
118
+ required: 2n,
119
+ scripts: [{
120
+ Signature: {
121
+ key_hash: "a"
122
+ }
123
+ }, {
124
+ Signature: {
125
+ key_hash: "b"
126
+ }
127
+ }, {
128
+ Signature: {
129
+ key_hash: "c"
130
+ }
131
+ }]
132
+ }
133
+ })).toBe(true);
134
+ });
135
+ test("accepts Before variant", () => {
136
+ expect(Value.Check(MultisigScript, {
137
+ Before: {
138
+ time: 1000n
139
+ }
140
+ })).toBe(true);
141
+ });
142
+ test("accepts After variant", () => {
143
+ expect(Value.Check(MultisigScript, {
144
+ After: {
145
+ time: 2000n
146
+ }
147
+ })).toBe(true);
148
+ });
149
+ test("accepts Script variant", () => {
150
+ expect(Value.Check(MultisigScript, {
151
+ Script: {
152
+ script_hash: "hash123"
153
+ }
154
+ })).toBe(true);
155
+ });
156
+ test("accepts deeply nested scripts", () => {
157
+ expect(Value.Check(MultisigScript, {
158
+ AllOf: {
159
+ scripts: [{
160
+ AnyOf: {
161
+ scripts: [{
162
+ Signature: {
163
+ key_hash: "nested"
164
+ }
165
+ }, {
166
+ AtLeast: {
167
+ required: 1n,
168
+ scripts: [{
169
+ Signature: {
170
+ key_hash: "deep"
171
+ }
172
+ }]
173
+ }
174
+ }]
175
+ }
176
+ }]
177
+ }
178
+ })).toBe(true);
179
+ });
180
+ });
181
+ });
182
+ //# sourceMappingURL=schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.js","names":["describe","expect","test","Value","NetworkSchema","ProviderSettingsSchema","WalletSettingsSchema","MultisigScriptModule","Check","toBe","type","projectId","apiKey","key","privateKey","address","MultisigScript","Import","Signature","key_hash","AllOf","scripts","AnyOf","AtLeast","required","Before","time","After","Script","script_hash"],"sources":["../../../../src/Sprinkle/__tests__/schemas.test.ts"],"sourcesContent":["import { describe, expect, test } from \"bun:test\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport {\n NetworkSchema,\n ProviderSettingsSchema,\n WalletSettingsSchema,\n MultisigScriptModule,\n} from \"../index.js\";\n\ndescribe(\"Built-in Schemas\", () => {\n describe(\"NetworkSchema\", () => {\n test(\"accepts mainnet\", () => {\n expect(Value.Check(NetworkSchema, \"mainnet\")).toBe(true);\n });\n\n test(\"accepts preview\", () => {\n expect(Value.Check(NetworkSchema, \"preview\")).toBe(true);\n });\n\n test(\"accepts preprod\", () => {\n expect(Value.Check(NetworkSchema, \"preprod\")).toBe(true);\n });\n\n test(\"rejects invalid network\", () => {\n expect(Value.Check(NetworkSchema, \"testnet\")).toBe(false);\n });\n\n test(\"rejects non-string\", () => {\n expect(Value.Check(NetworkSchema, 42)).toBe(false);\n });\n });\n\n describe(\"ProviderSettingsSchema\", () => {\n test(\"accepts blockfrost settings\", () => {\n expect(\n Value.Check(ProviderSettingsSchema, {\n type: \"blockfrost\",\n projectId: \"abc123\",\n }),\n ).toBe(true);\n });\n\n test(\"accepts maestro settings\", () => {\n expect(\n Value.Check(ProviderSettingsSchema, {\n type: \"maestro\",\n apiKey: \"key123\",\n }),\n ).toBe(true);\n });\n\n test(\"rejects empty projectId for blockfrost\", () => {\n expect(\n Value.Check(ProviderSettingsSchema, {\n type: \"blockfrost\",\n projectId: \"\",\n }),\n ).toBe(false);\n });\n\n test(\"rejects empty apiKey for maestro\", () => {\n expect(\n Value.Check(ProviderSettingsSchema, {\n type: \"maestro\",\n apiKey: \"\",\n }),\n ).toBe(false);\n });\n\n test(\"rejects unknown provider type\", () => {\n expect(\n Value.Check(ProviderSettingsSchema, {\n type: \"unknown\",\n key: \"abc\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"WalletSettingsSchema\", () => {\n test(\"accepts hot wallet settings\", () => {\n expect(\n Value.Check(WalletSettingsSchema, {\n type: \"hot\",\n privateKey: \"deadbeef\",\n }),\n ).toBe(true);\n });\n\n test(\"accepts cold wallet settings\", () => {\n expect(\n Value.Check(WalletSettingsSchema, {\n type: \"cold\",\n address: \"addr1qtest\",\n }),\n ).toBe(true);\n });\n\n test(\"rejects empty privateKey for hot wallet\", () => {\n expect(\n Value.Check(WalletSettingsSchema, {\n type: \"hot\",\n privateKey: \"\",\n }),\n ).toBe(false);\n });\n\n test(\"rejects empty address for cold wallet\", () => {\n expect(\n Value.Check(WalletSettingsSchema, {\n type: \"cold\",\n address: \"\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"MultisigScript\", () => {\n const MultisigScript = MultisigScriptModule.Import(\"MultisigScript\");\n\n test(\"accepts Signature variant\", () => {\n expect(\n Value.Check(MultisigScript, {\n Signature: { key_hash: \"abc123\" },\n }),\n ).toBe(true);\n });\n\n test(\"accepts AllOf variant with nested scripts\", () => {\n expect(\n Value.Check(MultisigScript, {\n AllOf: {\n scripts: [\n { Signature: { key_hash: \"abc\" } },\n { Signature: { key_hash: \"def\" } },\n ],\n },\n }),\n ).toBe(true);\n });\n\n test(\"accepts AnyOf variant\", () => {\n expect(\n Value.Check(MultisigScript, {\n AnyOf: {\n scripts: [{ Signature: { key_hash: \"abc\" } }],\n },\n }),\n ).toBe(true);\n });\n\n test(\"accepts AtLeast variant\", () => {\n expect(\n Value.Check(MultisigScript, {\n AtLeast: {\n required: 2n,\n scripts: [\n { Signature: { key_hash: \"a\" } },\n { Signature: { key_hash: \"b\" } },\n { Signature: { key_hash: \"c\" } },\n ],\n },\n }),\n ).toBe(true);\n });\n\n test(\"accepts Before variant\", () => {\n expect(\n Value.Check(MultisigScript, {\n Before: { time: 1000n },\n }),\n ).toBe(true);\n });\n\n test(\"accepts After variant\", () => {\n expect(\n Value.Check(MultisigScript, {\n After: { time: 2000n },\n }),\n ).toBe(true);\n });\n\n test(\"accepts Script variant\", () => {\n expect(\n Value.Check(MultisigScript, {\n Script: { script_hash: \"hash123\" },\n }),\n ).toBe(true);\n });\n\n test(\"accepts deeply nested scripts\", () => {\n expect(\n Value.Check(MultisigScript, {\n AllOf: {\n scripts: [\n {\n AnyOf: {\n scripts: [\n { Signature: { key_hash: \"nested\" } },\n {\n AtLeast: {\n required: 1n,\n scripts: [{ Signature: { key_hash: \"deep\" } }],\n },\n },\n ],\n },\n },\n ],\n },\n }),\n ).toBe(true);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}