@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.
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/dist/cjs/Sprinkle/__tests__/bigint-reviver.test.js +40 -0
- package/dist/cjs/Sprinkle/__tests__/bigint-reviver.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js +267 -0
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +147 -0
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/extract-message.test.js +60 -0
- package/dist/cjs/Sprinkle/__tests__/extract-message.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +131 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/schemas.test.js +184 -0
- package/dist/cjs/Sprinkle/__tests__/schemas.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +199 -0
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +108 -0
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/test-helpers.js +16 -0
- package/dist/cjs/Sprinkle/__tests__/test-helpers.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +271 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -0
- package/dist/cjs/Sprinkle/index.js +954 -0
- package/dist/cjs/Sprinkle/index.js.map +1 -0
- package/dist/cjs/index.js +17 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/Sprinkle/__tests__/bigint-reviver.test.js +38 -0
- package/dist/esm/Sprinkle/__tests__/bigint-reviver.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +264 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +145 -0
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/extract-message.test.js +58 -0
- package/dist/esm/Sprinkle/__tests__/extract-message.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +130 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/schemas.test.js +182 -0
- package/dist/esm/Sprinkle/__tests__/schemas.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +196 -0
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js +106 -0
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/test-helpers.js +10 -0
- package/dist/esm/Sprinkle/__tests__/test-helpers.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +269 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -0
- package/dist/esm/Sprinkle/index.js +928 -0
- package/dist/esm/Sprinkle/index.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +205 -0
- package/dist/types/Sprinkle/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +85 -0
- package/src/Sprinkle/__tests__/bigint-reviver.test.ts +49 -0
- package/src/Sprinkle/__tests__/encryption.test.ts +266 -0
- package/src/Sprinkle/__tests__/enhancements.test.ts +154 -0
- package/src/Sprinkle/__tests__/extract-message.test.ts +60 -0
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +159 -0
- package/src/Sprinkle/__tests__/schemas.test.ts +215 -0
- package/src/Sprinkle/__tests__/settings-persistence.test.ts +181 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +123 -0
- package/src/Sprinkle/__tests__/test-helpers.ts +14 -0
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +293 -0
- package/src/Sprinkle/index.ts +1215 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _bunTest = require("bun:test");
|
|
4
|
+
var _index = require("../index.js");
|
|
5
|
+
const mockSelect = (0, _bunTest.mock)();
|
|
6
|
+
const mockInput = (0, _bunTest.mock)();
|
|
7
|
+
const mockPassword = (0, _bunTest.mock)();
|
|
8
|
+
const mockSearch = (0, _bunTest.mock)();
|
|
9
|
+
_bunTest.mock.module("@inquirer/prompts", () => ({
|
|
10
|
+
select: mockSelect,
|
|
11
|
+
input: mockInput,
|
|
12
|
+
password: mockPassword,
|
|
13
|
+
search: mockSearch
|
|
14
|
+
}));
|
|
15
|
+
(0, _bunTest.describe)("beforeShow hook (2.2)", () => {
|
|
16
|
+
let sprinkle;
|
|
17
|
+
(0, _bunTest.beforeEach)(() => {
|
|
18
|
+
const schema = _index.Type.Object({
|
|
19
|
+
name: _index.Type.String()
|
|
20
|
+
});
|
|
21
|
+
sprinkle = new _index.Sprinkle(schema, "/tmp/test");
|
|
22
|
+
sprinkle.settings = {
|
|
23
|
+
name: "test"
|
|
24
|
+
};
|
|
25
|
+
mockSelect.mockClear();
|
|
26
|
+
});
|
|
27
|
+
(0, _bunTest.test)("calls beforeShow before rendering menu", async () => {
|
|
28
|
+
const callOrder = [];
|
|
29
|
+
const beforeShowFn = (0, _bunTest.mock)(async () => {
|
|
30
|
+
callOrder.push("beforeShow");
|
|
31
|
+
});
|
|
32
|
+
mockSelect.mockImplementation(async () => {
|
|
33
|
+
callOrder.push("select");
|
|
34
|
+
return -1; // exit
|
|
35
|
+
});
|
|
36
|
+
const menu = {
|
|
37
|
+
title: "Test",
|
|
38
|
+
beforeShow: beforeShowFn,
|
|
39
|
+
items: [{
|
|
40
|
+
title: "Action",
|
|
41
|
+
action: async () => {}
|
|
42
|
+
}]
|
|
43
|
+
};
|
|
44
|
+
await sprinkle.showMenu(menu);
|
|
45
|
+
(0, _bunTest.expect)(beforeShowFn).toHaveBeenCalledTimes(1);
|
|
46
|
+
(0, _bunTest.expect)(callOrder[0]).toBe("beforeShow");
|
|
47
|
+
(0, _bunTest.expect)(callOrder[1]).toBe("select");
|
|
48
|
+
});
|
|
49
|
+
(0, _bunTest.test)("passes sprinkle instance to beforeShow", async () => {
|
|
50
|
+
let receivedSprinkle;
|
|
51
|
+
mockSelect.mockResolvedValueOnce(-1);
|
|
52
|
+
const menu = {
|
|
53
|
+
title: "Test",
|
|
54
|
+
beforeShow: async s => {
|
|
55
|
+
receivedSprinkle = s;
|
|
56
|
+
},
|
|
57
|
+
items: [{
|
|
58
|
+
title: "Action",
|
|
59
|
+
action: async () => {}
|
|
60
|
+
}]
|
|
61
|
+
};
|
|
62
|
+
await sprinkle.showMenu(menu);
|
|
63
|
+
(0, _bunTest.expect)(receivedSprinkle).toBe(sprinkle);
|
|
64
|
+
});
|
|
65
|
+
(0, _bunTest.test)("menu works without beforeShow", async () => {
|
|
66
|
+
mockSelect.mockResolvedValueOnce(-1);
|
|
67
|
+
const menu = {
|
|
68
|
+
title: "Test",
|
|
69
|
+
items: [{
|
|
70
|
+
title: "Action",
|
|
71
|
+
action: async () => {}
|
|
72
|
+
}]
|
|
73
|
+
};
|
|
74
|
+
await sprinkle.showMenu(menu);
|
|
75
|
+
// Should complete without error
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
(0, _bunTest.describe)("SearchSelect (2.3)", () => {
|
|
79
|
+
(0, _bunTest.beforeEach)(() => {
|
|
80
|
+
mockSearch.mockClear();
|
|
81
|
+
});
|
|
82
|
+
(0, _bunTest.test)("delegates to search prompt", async () => {
|
|
83
|
+
mockSearch.mockResolvedValueOnce("selected-value");
|
|
84
|
+
const result = await _index.Sprinkle.SearchSelect({
|
|
85
|
+
message: "Pick one",
|
|
86
|
+
source: () => [{
|
|
87
|
+
name: "Option A",
|
|
88
|
+
value: "a"
|
|
89
|
+
}, {
|
|
90
|
+
name: "Option B",
|
|
91
|
+
value: "b"
|
|
92
|
+
}]
|
|
93
|
+
});
|
|
94
|
+
(0, _bunTest.expect)(result).toBe("selected-value");
|
|
95
|
+
(0, _bunTest.expect)(mockSearch).toHaveBeenCalledTimes(1);
|
|
96
|
+
(0, _bunTest.expect)(mockSearch.mock.calls[0][0].message).toBe("Pick one");
|
|
97
|
+
});
|
|
98
|
+
(0, _bunTest.test)("passes source function through", async () => {
|
|
99
|
+
const sourceFn = (0, _bunTest.mock)(() => [{
|
|
100
|
+
name: "X",
|
|
101
|
+
value: "x"
|
|
102
|
+
}]);
|
|
103
|
+
mockSearch.mockResolvedValueOnce("x");
|
|
104
|
+
await _index.Sprinkle.SearchSelect({
|
|
105
|
+
message: "Search",
|
|
106
|
+
source: sourceFn
|
|
107
|
+
});
|
|
108
|
+
(0, _bunTest.expect)(mockSearch.mock.calls[0][0].source).toBe(sourceFn);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
(0, _bunTest.describe)("Optional type support (2.4)", () => {
|
|
112
|
+
let sprinkle;
|
|
113
|
+
(0, _bunTest.beforeEach)(() => {
|
|
114
|
+
const schema = _index.Type.Object({
|
|
115
|
+
placeholder: _index.Type.String()
|
|
116
|
+
});
|
|
117
|
+
sprinkle = new _index.Sprinkle(schema, "/tmp/test");
|
|
118
|
+
mockSelect.mockClear();
|
|
119
|
+
mockInput.mockClear();
|
|
120
|
+
});
|
|
121
|
+
(0, _bunTest.test)("skips optional field when user selects Skip", async () => {
|
|
122
|
+
const schema = _index.Type.Object({
|
|
123
|
+
name: _index.Type.String(),
|
|
124
|
+
nickname: _index.Type.Optional(_index.Type.String())
|
|
125
|
+
});
|
|
126
|
+
mockInput.mockResolvedValueOnce("Alice"); // name
|
|
127
|
+
mockSelect.mockResolvedValueOnce(false); // skip nickname
|
|
128
|
+
|
|
129
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
130
|
+
(0, _bunTest.expect)(result.name).toBe("Alice");
|
|
131
|
+
(0, _bunTest.expect)(result.nickname).toBeUndefined();
|
|
132
|
+
});
|
|
133
|
+
(0, _bunTest.test)("fills optional field when user selects Yes", async () => {
|
|
134
|
+
const schema = _index.Type.Object({
|
|
135
|
+
name: _index.Type.String(),
|
|
136
|
+
nickname: _index.Type.Optional(_index.Type.String())
|
|
137
|
+
});
|
|
138
|
+
mockInput.mockResolvedValueOnce("Alice") // name
|
|
139
|
+
.mockResolvedValueOnce("Ali"); // nickname
|
|
140
|
+
mockSelect.mockResolvedValueOnce(true); // fill nickname
|
|
141
|
+
|
|
142
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
143
|
+
(0, _bunTest.expect)(result.name).toBe("Alice");
|
|
144
|
+
(0, _bunTest.expect)(result.nickname).toBe("Ali");
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=enhancements.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancements.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","mockPassword","mockSearch","module","select","input","password","search","describe","sprinkle","beforeEach","schema","Type","Object","name","String","Sprinkle","settings","mockClear","test","callOrder","beforeShowFn","push","mockImplementation","menu","title","beforeShow","items","action","showMenu","expect","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,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _bunTest = require("bun:test");
|
|
4
|
+
var _index = require("../index.js");
|
|
5
|
+
(0, _bunTest.describe)("ExtractMessage", () => {
|
|
6
|
+
(0, _bunTest.test)("returns title when present", () => {
|
|
7
|
+
const schema = _index.Type.String({
|
|
8
|
+
title: "My Title"
|
|
9
|
+
});
|
|
10
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("My Title");
|
|
11
|
+
});
|
|
12
|
+
(0, _bunTest.test)("returns description when title is absent", () => {
|
|
13
|
+
const schema = _index.Type.String({
|
|
14
|
+
description: "My Description"
|
|
15
|
+
});
|
|
16
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("My Description");
|
|
17
|
+
});
|
|
18
|
+
(0, _bunTest.test)("prefers title over description", () => {
|
|
19
|
+
const schema = _index.Type.String({
|
|
20
|
+
title: "My Title",
|
|
21
|
+
description: "My Description"
|
|
22
|
+
});
|
|
23
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("My Title");
|
|
24
|
+
});
|
|
25
|
+
(0, _bunTest.test)("returns literal const value as string", () => {
|
|
26
|
+
const schema = _index.Type.Literal("hello");
|
|
27
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("hello");
|
|
28
|
+
});
|
|
29
|
+
(0, _bunTest.test)("returns literal number const as string", () => {
|
|
30
|
+
const schema = _index.Type.Literal(42);
|
|
31
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("42");
|
|
32
|
+
});
|
|
33
|
+
(0, _bunTest.test)("returns type field message for objects with a type field", () => {
|
|
34
|
+
const schema = _index.Type.Object({
|
|
35
|
+
type: _index.Type.Literal("blockfrost"),
|
|
36
|
+
projectId: _index.Type.String()
|
|
37
|
+
});
|
|
38
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("blockfrost");
|
|
39
|
+
});
|
|
40
|
+
(0, _bunTest.test)("returns single field name for single-field objects", () => {
|
|
41
|
+
const schema = _index.Type.Object({
|
|
42
|
+
Signature: _index.Type.Object({
|
|
43
|
+
key_hash: _index.Type.String()
|
|
44
|
+
})
|
|
45
|
+
});
|
|
46
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("Signature");
|
|
47
|
+
});
|
|
48
|
+
(0, _bunTest.test)("returns default for multi-field objects without type field", () => {
|
|
49
|
+
const schema = _index.Type.Object({
|
|
50
|
+
name: _index.Type.String(),
|
|
51
|
+
age: _index.Type.BigInt()
|
|
52
|
+
});
|
|
53
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("fallback");
|
|
54
|
+
});
|
|
55
|
+
(0, _bunTest.test)("returns default for plain string without title/description", () => {
|
|
56
|
+
const schema = _index.Type.String();
|
|
57
|
+
(0, _bunTest.expect)(_index.Sprinkle.ExtractMessage(schema, "fallback")).toBe("fallback");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=extract-message.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-message.test.js","names":["_bunTest","require","_index","describe","test","schema","Type","String","title","expect","Sprinkle","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":"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","ignoreList":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _bunTest = require("bun:test");
|
|
4
|
+
var _index = require("../index.js");
|
|
5
|
+
// Mock @inquirer/prompts
|
|
6
|
+
const mockSelect = (0, _bunTest.mock)();
|
|
7
|
+
const mockInput = (0, _bunTest.mock)();
|
|
8
|
+
_bunTest.mock.module("@inquirer/prompts", () => ({
|
|
9
|
+
select: mockSelect,
|
|
10
|
+
input: mockInput
|
|
11
|
+
}));
|
|
12
|
+
(0, _bunTest.describe)("FillInStruct", () => {
|
|
13
|
+
let sprinkle;
|
|
14
|
+
(0, _bunTest.beforeEach)(() => {
|
|
15
|
+
const schema = _index.Type.Object({
|
|
16
|
+
placeholder: _index.Type.String()
|
|
17
|
+
});
|
|
18
|
+
sprinkle = new _index.Sprinkle(schema, "/tmp/test");
|
|
19
|
+
mockSelect.mockClear();
|
|
20
|
+
mockInput.mockClear();
|
|
21
|
+
});
|
|
22
|
+
(0, _bunTest.test)("fills a simple string field", async () => {
|
|
23
|
+
mockInput.mockResolvedValueOnce("hello");
|
|
24
|
+
const result = await sprinkle.FillInStruct(_index.Type.String());
|
|
25
|
+
(0, _bunTest.expect)(result).toBe("hello");
|
|
26
|
+
});
|
|
27
|
+
(0, _bunTest.test)("fills a string with title as prompt", async () => {
|
|
28
|
+
mockInput.mockResolvedValueOnce("world");
|
|
29
|
+
await sprinkle.FillInStruct(_index.Type.String({
|
|
30
|
+
title: "Enter name"
|
|
31
|
+
}));
|
|
32
|
+
(0, _bunTest.expect)(mockInput.mock.calls[0][0].message).toBe("Enter name");
|
|
33
|
+
});
|
|
34
|
+
(0, _bunTest.test)("fills a bigint field", async () => {
|
|
35
|
+
mockInput.mockResolvedValueOnce("42");
|
|
36
|
+
const result = await sprinkle.FillInStruct(_index.Type.BigInt());
|
|
37
|
+
(0, _bunTest.expect)(result).toBe(42n);
|
|
38
|
+
});
|
|
39
|
+
(0, _bunTest.test)("fills a literal field without prompting", async () => {
|
|
40
|
+
const result = await sprinkle.FillInStruct(_index.Type.Literal("fixed"));
|
|
41
|
+
(0, _bunTest.expect)(result).toBe("fixed");
|
|
42
|
+
(0, _bunTest.expect)(mockInput).not.toHaveBeenCalled();
|
|
43
|
+
(0, _bunTest.expect)(mockSelect).not.toHaveBeenCalled();
|
|
44
|
+
});
|
|
45
|
+
(0, _bunTest.test)("fills an object with multiple fields", async () => {
|
|
46
|
+
const schema = _index.Type.Object({
|
|
47
|
+
name: _index.Type.String(),
|
|
48
|
+
age: _index.Type.BigInt()
|
|
49
|
+
});
|
|
50
|
+
mockInput.mockResolvedValueOnce("Alice").mockResolvedValueOnce("30");
|
|
51
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
52
|
+
(0, _bunTest.expect)(result).toEqual({
|
|
53
|
+
name: "Alice",
|
|
54
|
+
age: 30n
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
(0, _bunTest.test)("fills a union type by selecting variant then filling", async () => {
|
|
58
|
+
const schema = _index.Type.Union([_index.Type.Object({
|
|
59
|
+
type: _index.Type.Literal("a"),
|
|
60
|
+
value: _index.Type.String()
|
|
61
|
+
}), _index.Type.Object({
|
|
62
|
+
type: _index.Type.Literal("b"),
|
|
63
|
+
count: _index.Type.BigInt()
|
|
64
|
+
})]);
|
|
65
|
+
|
|
66
|
+
// Select first variant (the Object with type "a")
|
|
67
|
+
mockSelect.mockImplementationOnce(async opts => {
|
|
68
|
+
return opts.choices[0].value;
|
|
69
|
+
});
|
|
70
|
+
mockInput.mockResolvedValueOnce("test-value");
|
|
71
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
72
|
+
(0, _bunTest.expect)(result).toEqual({
|
|
73
|
+
type: "a",
|
|
74
|
+
value: "test-value"
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
(0, _bunTest.test)("fills an array with items", async () => {
|
|
78
|
+
const schema = _index.Type.Array(_index.Type.String());
|
|
79
|
+
mockInput.mockResolvedValueOnce("first");
|
|
80
|
+
mockSelect.mockResolvedValueOnce(true); // add another
|
|
81
|
+
mockInput.mockResolvedValueOnce("second");
|
|
82
|
+
mockSelect.mockResolvedValueOnce(false); // stop
|
|
83
|
+
|
|
84
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
85
|
+
(0, _bunTest.expect)(result).toEqual(["first", "second"]);
|
|
86
|
+
});
|
|
87
|
+
(0, _bunTest.test)("fills an array with single item", async () => {
|
|
88
|
+
const schema = _index.Type.Array(_index.Type.String());
|
|
89
|
+
mockInput.mockResolvedValueOnce("only");
|
|
90
|
+
mockSelect.mockResolvedValueOnce(false); // stop
|
|
91
|
+
|
|
92
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
93
|
+
(0, _bunTest.expect)(result).toEqual(["only"]);
|
|
94
|
+
});
|
|
95
|
+
(0, _bunTest.test)("uses default value for string", async () => {
|
|
96
|
+
mockInput.mockResolvedValueOnce("used-default");
|
|
97
|
+
await sprinkle.FillInStruct(_index.Type.String(), "my-default");
|
|
98
|
+
(0, _bunTest.expect)(mockInput.mock.calls[0][0].default).toBe("my-default");
|
|
99
|
+
});
|
|
100
|
+
(0, _bunTest.test)("uses default value for bigint", async () => {
|
|
101
|
+
mockInput.mockResolvedValueOnce("99");
|
|
102
|
+
await sprinkle.FillInStruct(_index.Type.BigInt(), 99n);
|
|
103
|
+
(0, _bunTest.expect)(mockInput.mock.calls[0][0].default).toBe("99");
|
|
104
|
+
});
|
|
105
|
+
(0, _bunTest.test)("throws for unsupported types", async () => {
|
|
106
|
+
(0, _bunTest.expect)(sprinkle.FillInStruct(_index.Type.Boolean())).rejects.toThrow("Unable to fill in struct");
|
|
107
|
+
});
|
|
108
|
+
(0, _bunTest.test)("fills nested objects", async () => {
|
|
109
|
+
const schema = _index.Type.Object({
|
|
110
|
+
outer: _index.Type.Object({
|
|
111
|
+
inner: _index.Type.String()
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
mockInput.mockResolvedValueOnce("deep-value");
|
|
115
|
+
const result = await sprinkle.FillInStruct(schema);
|
|
116
|
+
(0, _bunTest.expect)(result).toEqual({
|
|
117
|
+
outer: {
|
|
118
|
+
inner: "deep-value"
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
(0, _bunTest.test)("remembers last string input as default", async () => {
|
|
123
|
+
mockInput.mockResolvedValueOnce("first-input").mockResolvedValueOnce("second-input");
|
|
124
|
+
await sprinkle.FillInStruct(_index.Type.String());
|
|
125
|
+
(0, _bunTest.expect)(sprinkle.defaults["string"]).toBe("first-input");
|
|
126
|
+
await sprinkle.FillInStruct(_index.Type.String());
|
|
127
|
+
// Second call should have the first input as default
|
|
128
|
+
(0, _bunTest.expect)(mockInput.mock.calls[1][0].default).toBe("first-input");
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=fill-in-struct.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill-in-struct.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","module","select","input","describe","sprinkle","beforeEach","schema","Type","Object","placeholder","String","Sprinkle","mockClear","test","mockResolvedValueOnce","result","FillInStruct","expect","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults"],"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,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _bunTest = require("bun:test");
|
|
4
|
+
var _value = require("@sinclair/typebox/value");
|
|
5
|
+
var _index = require("../index.js");
|
|
6
|
+
(0, _bunTest.describe)("Built-in Schemas", () => {
|
|
7
|
+
(0, _bunTest.describe)("NetworkSchema", () => {
|
|
8
|
+
(0, _bunTest.test)("accepts mainnet", () => {
|
|
9
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.NetworkSchema, "mainnet")).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
(0, _bunTest.test)("accepts preview", () => {
|
|
12
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.NetworkSchema, "preview")).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
(0, _bunTest.test)("accepts preprod", () => {
|
|
15
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.NetworkSchema, "preprod")).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
(0, _bunTest.test)("rejects invalid network", () => {
|
|
18
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.NetworkSchema, "testnet")).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
(0, _bunTest.test)("rejects non-string", () => {
|
|
21
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.NetworkSchema, 42)).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
(0, _bunTest.describe)("ProviderSettingsSchema", () => {
|
|
25
|
+
(0, _bunTest.test)("accepts blockfrost settings", () => {
|
|
26
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.ProviderSettingsSchema, {
|
|
27
|
+
type: "blockfrost",
|
|
28
|
+
projectId: "abc123"
|
|
29
|
+
})).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
(0, _bunTest.test)("accepts maestro settings", () => {
|
|
32
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.ProviderSettingsSchema, {
|
|
33
|
+
type: "maestro",
|
|
34
|
+
apiKey: "key123"
|
|
35
|
+
})).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
(0, _bunTest.test)("rejects empty projectId for blockfrost", () => {
|
|
38
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.ProviderSettingsSchema, {
|
|
39
|
+
type: "blockfrost",
|
|
40
|
+
projectId: ""
|
|
41
|
+
})).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
(0, _bunTest.test)("rejects empty apiKey for maestro", () => {
|
|
44
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.ProviderSettingsSchema, {
|
|
45
|
+
type: "maestro",
|
|
46
|
+
apiKey: ""
|
|
47
|
+
})).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
(0, _bunTest.test)("rejects unknown provider type", () => {
|
|
50
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.ProviderSettingsSchema, {
|
|
51
|
+
type: "unknown",
|
|
52
|
+
key: "abc"
|
|
53
|
+
})).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
(0, _bunTest.describe)("WalletSettingsSchema", () => {
|
|
57
|
+
(0, _bunTest.test)("accepts hot wallet settings", () => {
|
|
58
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.WalletSettingsSchema, {
|
|
59
|
+
type: "hot",
|
|
60
|
+
privateKey: "deadbeef"
|
|
61
|
+
})).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
(0, _bunTest.test)("accepts cold wallet settings", () => {
|
|
64
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.WalletSettingsSchema, {
|
|
65
|
+
type: "cold",
|
|
66
|
+
address: "addr1qtest"
|
|
67
|
+
})).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
(0, _bunTest.test)("rejects empty privateKey for hot wallet", () => {
|
|
70
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.WalletSettingsSchema, {
|
|
71
|
+
type: "hot",
|
|
72
|
+
privateKey: ""
|
|
73
|
+
})).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
(0, _bunTest.test)("rejects empty address for cold wallet", () => {
|
|
76
|
+
(0, _bunTest.expect)(_value.Value.Check(_index.WalletSettingsSchema, {
|
|
77
|
+
type: "cold",
|
|
78
|
+
address: ""
|
|
79
|
+
})).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
(0, _bunTest.describe)("MultisigScript", () => {
|
|
83
|
+
const MultisigScript = _index.MultisigScriptModule.Import("MultisigScript");
|
|
84
|
+
(0, _bunTest.test)("accepts Signature variant", () => {
|
|
85
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
86
|
+
Signature: {
|
|
87
|
+
key_hash: "abc123"
|
|
88
|
+
}
|
|
89
|
+
})).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
(0, _bunTest.test)("accepts AllOf variant with nested scripts", () => {
|
|
92
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
93
|
+
AllOf: {
|
|
94
|
+
scripts: [{
|
|
95
|
+
Signature: {
|
|
96
|
+
key_hash: "abc"
|
|
97
|
+
}
|
|
98
|
+
}, {
|
|
99
|
+
Signature: {
|
|
100
|
+
key_hash: "def"
|
|
101
|
+
}
|
|
102
|
+
}]
|
|
103
|
+
}
|
|
104
|
+
})).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
(0, _bunTest.test)("accepts AnyOf variant", () => {
|
|
107
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
108
|
+
AnyOf: {
|
|
109
|
+
scripts: [{
|
|
110
|
+
Signature: {
|
|
111
|
+
key_hash: "abc"
|
|
112
|
+
}
|
|
113
|
+
}]
|
|
114
|
+
}
|
|
115
|
+
})).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
(0, _bunTest.test)("accepts AtLeast variant", () => {
|
|
118
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
119
|
+
AtLeast: {
|
|
120
|
+
required: 2n,
|
|
121
|
+
scripts: [{
|
|
122
|
+
Signature: {
|
|
123
|
+
key_hash: "a"
|
|
124
|
+
}
|
|
125
|
+
}, {
|
|
126
|
+
Signature: {
|
|
127
|
+
key_hash: "b"
|
|
128
|
+
}
|
|
129
|
+
}, {
|
|
130
|
+
Signature: {
|
|
131
|
+
key_hash: "c"
|
|
132
|
+
}
|
|
133
|
+
}]
|
|
134
|
+
}
|
|
135
|
+
})).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
(0, _bunTest.test)("accepts Before variant", () => {
|
|
138
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
139
|
+
Before: {
|
|
140
|
+
time: 1000n
|
|
141
|
+
}
|
|
142
|
+
})).toBe(true);
|
|
143
|
+
});
|
|
144
|
+
(0, _bunTest.test)("accepts After variant", () => {
|
|
145
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
146
|
+
After: {
|
|
147
|
+
time: 2000n
|
|
148
|
+
}
|
|
149
|
+
})).toBe(true);
|
|
150
|
+
});
|
|
151
|
+
(0, _bunTest.test)("accepts Script variant", () => {
|
|
152
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
153
|
+
Script: {
|
|
154
|
+
script_hash: "hash123"
|
|
155
|
+
}
|
|
156
|
+
})).toBe(true);
|
|
157
|
+
});
|
|
158
|
+
(0, _bunTest.test)("accepts deeply nested scripts", () => {
|
|
159
|
+
(0, _bunTest.expect)(_value.Value.Check(MultisigScript, {
|
|
160
|
+
AllOf: {
|
|
161
|
+
scripts: [{
|
|
162
|
+
AnyOf: {
|
|
163
|
+
scripts: [{
|
|
164
|
+
Signature: {
|
|
165
|
+
key_hash: "nested"
|
|
166
|
+
}
|
|
167
|
+
}, {
|
|
168
|
+
AtLeast: {
|
|
169
|
+
required: 1n,
|
|
170
|
+
scripts: [{
|
|
171
|
+
Signature: {
|
|
172
|
+
key_hash: "deep"
|
|
173
|
+
}
|
|
174
|
+
}]
|
|
175
|
+
}
|
|
176
|
+
}]
|
|
177
|
+
}
|
|
178
|
+
}]
|
|
179
|
+
}
|
|
180
|
+
})).toBe(true);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=schemas.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.test.js","names":["_bunTest","require","_value","_index","describe","test","expect","Value","Check","NetworkSchema","toBe","ProviderSettingsSchema","type","projectId","apiKey","key","WalletSettingsSchema","privateKey","address","MultisigScript","MultisigScriptModule","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":[]}
|