@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.
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js +20 -8
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +41 -16
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +93 -7
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +21 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/cjs/Sprinkle/encryption.js +131 -0
- package/dist/cjs/Sprinkle/encryption.js.map +1 -0
- package/dist/cjs/Sprinkle/index.js +318 -352
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/prompts.js +393 -0
- package/dist/cjs/Sprinkle/prompts.js.map +1 -0
- package/dist/cjs/Sprinkle/schemas.js +97 -0
- package/dist/cjs/Sprinkle/schemas.js.map +1 -0
- package/dist/cjs/Sprinkle/tx-dialog.js +101 -0
- package/dist/cjs/Sprinkle/tx-dialog.js.map +1 -0
- package/dist/cjs/Sprinkle/type-guards.js +42 -0
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -0
- package/dist/cjs/Sprinkle/types.js +49 -0
- package/dist/cjs/Sprinkle/types.js.map +1 -0
- package/dist/cjs/Sprinkle/wallet.js +98 -0
- package/dist/cjs/Sprinkle/wallet.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +20 -8
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +41 -16
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +85 -38
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js +94 -8
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +21 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/esm/Sprinkle/encryption.js +117 -0
- package/dist/esm/Sprinkle/encryption.js.map +1 -0
- package/dist/esm/Sprinkle/index.js +172 -337
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/prompts.js +385 -0
- package/dist/esm/Sprinkle/prompts.js.map +1 -0
- package/dist/esm/Sprinkle/schemas.js +91 -0
- package/dist/esm/Sprinkle/schemas.js.map +1 -0
- package/dist/esm/Sprinkle/tx-dialog.js +90 -0
- package/dist/esm/Sprinkle/tx-dialog.js.map +1 -0
- package/dist/esm/Sprinkle/type-guards.js +24 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -0
- package/dist/esm/Sprinkle/types.js +42 -0
- package/dist/esm/Sprinkle/types.js.map +1 -0
- package/dist/esm/Sprinkle/wallet.js +90 -0
- package/dist/esm/Sprinkle/wallet.js.map +1 -0
- package/dist/types/Sprinkle/encryption.d.ts +43 -0
- package/dist/types/Sprinkle/encryption.d.ts.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +13 -174
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/prompts.d.ts +94 -0
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -0
- package/dist/types/Sprinkle/schemas.d.ts +125 -0
- package/dist/types/Sprinkle/schemas.d.ts.map +1 -0
- package/dist/types/Sprinkle/tx-dialog.d.ts +37 -0
- package/dist/types/Sprinkle/tx-dialog.d.ts.map +1 -0
- package/dist/types/Sprinkle/type-guards.d.ts +22 -0
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -0
- package/dist/types/Sprinkle/types.d.ts +62 -0
- package/dist/types/Sprinkle/types.d.ts.map +1 -0
- package/dist/types/Sprinkle/wallet.d.ts +27 -0
- package/dist/types/Sprinkle/wallet.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/encryption.test.ts +21 -8
- package/src/Sprinkle/__tests__/enhancements.test.ts +41 -15
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +104 -38
- package/src/Sprinkle/__tests__/settings-persistence.test.ts +108 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +96 -8
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +21 -0
- package/src/Sprinkle/encryption.ts +130 -0
- package/src/Sprinkle/index.ts +265 -478
- package/src/Sprinkle/prompts.ts +481 -0
- package/src/Sprinkle/schemas.ts +111 -0
- package/src/Sprinkle/tx-dialog.ts +100 -0
- package/src/Sprinkle/type-guards.ts +51 -0
- package/src/Sprinkle/types.ts +73 -0
- package/src/Sprinkle/wallet.ts +133 -0
|
@@ -10,11 +10,20 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
10
10
|
const mockSelect = (0, _bunTest.mock)();
|
|
11
11
|
const mockInput = (0, _bunTest.mock)();
|
|
12
12
|
const mockPassword = (0, _bunTest.mock)();
|
|
13
|
+
const mockSelectCancellable = (0, _bunTest.mock)();
|
|
14
|
+
const mockInputCancellable = (0, _bunTest.mock)();
|
|
15
|
+
const mockPasswordCancellable = (0, _bunTest.mock)();
|
|
13
16
|
_bunTest.mock.module("@inquirer/prompts", () => ({
|
|
14
17
|
select: mockSelect,
|
|
15
18
|
input: mockInput,
|
|
16
19
|
password: mockPassword
|
|
17
20
|
}));
|
|
21
|
+
_bunTest.mock.module("../prompts.js", () => ({
|
|
22
|
+
selectCancellable: mockSelectCancellable,
|
|
23
|
+
inputCancellable: mockInputCancellable,
|
|
24
|
+
passwordCancellable: mockPasswordCancellable,
|
|
25
|
+
confirmCancellable: (0, _bunTest.mock)()
|
|
26
|
+
}));
|
|
18
27
|
(0, _bunTest.describe)("Encryption & Sensitive Fields", () => {
|
|
19
28
|
let tmpDir;
|
|
20
29
|
(0, _bunTest.beforeEach)(() => {
|
|
@@ -22,6 +31,9 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
22
31
|
mockSelect.mockClear();
|
|
23
32
|
mockInput.mockClear();
|
|
24
33
|
mockPassword.mockClear();
|
|
34
|
+
mockSelectCancellable.mockClear();
|
|
35
|
+
mockInputCancellable.mockClear();
|
|
36
|
+
mockPasswordCancellable.mockClear();
|
|
25
37
|
});
|
|
26
38
|
(0, _bunTest.afterEach)(() => {
|
|
27
39
|
fs.rmSync(tmpDir, {
|
|
@@ -38,14 +50,14 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
38
50
|
})
|
|
39
51
|
});
|
|
40
52
|
const sprinkle = new _index.Sprinkle(schema, tmpDir);
|
|
41
|
-
|
|
53
|
+
mockPasswordCancellable.mockResolvedValueOnce("my-secret");
|
|
42
54
|
const result = await sprinkle.FillInStruct(schema);
|
|
43
55
|
(0, _bunTest.expect)(result).toEqual({
|
|
44
56
|
secret: "my-secret"
|
|
45
57
|
});
|
|
46
|
-
(0, _bunTest.expect)(
|
|
47
|
-
(0, _bunTest.expect)(
|
|
48
|
-
(0, _bunTest.expect)(
|
|
58
|
+
(0, _bunTest.expect)(mockPasswordCancellable).toHaveBeenCalledTimes(1);
|
|
59
|
+
(0, _bunTest.expect)(mockPasswordCancellable.mock.calls[0][0].message).toBe("Enter secret");
|
|
60
|
+
(0, _bunTest.expect)(mockInputCancellable).not.toHaveBeenCalled();
|
|
49
61
|
});
|
|
50
62
|
(0, _bunTest.test)("uses input() for non-sensitive string fields", async () => {
|
|
51
63
|
const schema = _index.Type.Object({
|
|
@@ -54,13 +66,13 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
54
66
|
})
|
|
55
67
|
});
|
|
56
68
|
const sprinkle = new _index.Sprinkle(schema, tmpDir);
|
|
57
|
-
|
|
69
|
+
mockInputCancellable.mockResolvedValueOnce("visible");
|
|
58
70
|
const result = await sprinkle.FillInStruct(schema);
|
|
59
71
|
(0, _bunTest.expect)(result).toEqual({
|
|
60
72
|
name: "visible"
|
|
61
73
|
});
|
|
62
|
-
(0, _bunTest.expect)(
|
|
63
|
-
(0, _bunTest.expect)(
|
|
74
|
+
(0, _bunTest.expect)(mockInputCancellable).toHaveBeenCalledTimes(1);
|
|
75
|
+
(0, _bunTest.expect)(mockPasswordCancellable).not.toHaveBeenCalled();
|
|
64
76
|
});
|
|
65
77
|
(0, _bunTest.test)("does not remember sensitive field as default", async () => {
|
|
66
78
|
const schema = _index.Type.String({
|
|
@@ -69,7 +81,7 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
69
81
|
const sprinkle = new _index.Sprinkle(_index.Type.Object({
|
|
70
82
|
p: _index.Type.String()
|
|
71
83
|
}), tmpDir);
|
|
72
|
-
|
|
84
|
+
mockPasswordCancellable.mockResolvedValueOnce("secret-val");
|
|
73
85
|
await sprinkle.FillInStruct(schema);
|
|
74
86
|
(0, _bunTest.expect)(sprinkle.defaults["string"]).toBeUndefined();
|
|
75
87
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","mockSelect","mock","mockInput","mockPassword","module","select","input","password","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","mockClear","afterEach","rmSync","recursive","force","test","schema","Type","secret","String","sensitive","title","sprinkle","Sprinkle","mockResolvedValueOnce","result","FillInStruct","expect","toEqual","toHaveBeenCalledTimes","calls","message","toBe","not","toHaveBeenCalled","name","p","defaults","toBeUndefined","withProfile","encryption","encrypt","plain","decrypt","cipher","replace","settings","saveSettings","content","readFileSync","parsed","JSON","parse","sprinkle1","sprinkle2","loadProfile","wallet","key","address","Union","type","Literal","privateKey","outerSchema","network","count","BigInt","opts","Buffer","from","toString","s1","s2","mkdirSync","writeFileSync","stringify","New","c","options","toBeDefined","profileId"],"sources":["../../../../src/Sprinkle/__tests__/encryption.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n}));\n\ndescribe(\"Encryption & Sensitive Fields\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-enc-test-\"));\n mockSelect.mockClear();\n mockInput.mockClear();\n mockPassword.mockClear();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe(\"sensitive field prompts\", () => {\n test(\"uses password() for sensitive string fields\", async () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true, title: \"Enter secret\" }),\n });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n mockPassword.mockResolvedValueOnce(\"my-secret\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ secret: \"my-secret\" });\n expect(mockPassword).toHaveBeenCalledTimes(1);\n expect(mockPassword.mock.calls[0][0].message).toBe(\"Enter secret\");\n expect(mockInput).not.toHaveBeenCalled();\n });\n\n test(\"uses input() for non-sensitive string fields\", async () => {\n const schema = Type.Object({\n name: Type.String({ title: \"Enter name\" }),\n });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n mockInput.mockResolvedValueOnce(\"visible\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"visible\" });\n expect(mockInput).toHaveBeenCalledTimes(1);\n expect(mockPassword).not.toHaveBeenCalled();\n });\n\n test(\"does not remember sensitive field as default\", async () => {\n const schema = Type.String({ sensitive: true });\n const sprinkle = new Sprinkle(Type.Object({ p: Type.String() }), tmpDir);\n\n mockPassword.mockResolvedValueOnce(\"secret-val\");\n\n await sprinkle.FillInStruct(schema);\n expect(sprinkle.defaults[\"string\"]).toBeUndefined();\n });\n });\n\n describe(\"encryption on save/load\", () => {\n test(\"encrypts sensitive fields when saving with encryption configured\", () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(\n new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle.settings = { name: \"visible\", secret: \"hidden\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"visible\");\n expect(parsed.settings.secret).toBe(\"ENC:hidden\");\n });\n\n test(\"decrypts sensitive fields when loading with encryption configured\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n\n // First save with encryption\n const sprinkle1 = withProfile(\n new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle1.settings = { name: \"visible\", secret: \"hidden\" } as any;\n sprinkle1.saveSettings();\n\n // Then load with same encryption\n const sprinkle2 = new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n });\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ name: \"visible\", secret: \"hidden\" });\n });\n\n test(\"does not encrypt when no encryption configured\", () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { secret: \"plain-value\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.secret).toBe(\"plain-value\");\n });\n\n test(\"encrypts nested sensitive fields\", () => {\n const schema = Type.Object({\n wallet: Type.Object({\n key: Type.String({ sensitive: true }),\n address: Type.String(),\n }),\n });\n const sprinkle = withProfile(\n new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle.settings = {\n wallet: { key: \"secret-key\", address: \"addr1...\" },\n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.wallet.key).toBe(\"ENC:secret-key\");\n expect(parsed.settings.wallet.address).toBe(\"addr1...\");\n });\n\n test(\"handles sensitive fields in union variants\", () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"hot\"),\n privateKey: Type.String({ sensitive: true }),\n }),\n Type.Object({\n type: Type.Literal(\"cold\"),\n address: Type.String(),\n }),\n ]);\n const outerSchema = Type.Object({ wallet: schema });\n const sprinkle = withProfile(\n new Sprinkle(outerSchema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle.settings = {\n wallet: { type: \"hot\", privateKey: \"my-key\" },\n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.wallet.privateKey).toBe(\"ENC:my-key\");\n });\n\n test(\"round-trip with encryption preserves all data\", async () => {\n const schema = Type.Object({\n network: Type.String(),\n secret: Type.String({ sensitive: true }),\n count: Type.BigInt(),\n });\n const opts = {\n encryption: {\n encrypt: (plain: string) => Buffer.from(plain).toString(\"base64\"),\n decrypt: async (cipher: string) =>\n Buffer.from(cipher, \"base64\").toString(),\n },\n };\n const s1 = withProfile(new Sprinkle(schema, tmpDir, opts));\n s1.settings = {\n network: \"mainnet\",\n secret: \"top-secret\",\n count: 42n,\n } as any;\n s1.saveSettings();\n\n const s2 = new Sprinkle(schema, tmpDir, opts);\n await s2.loadProfile(\"test\");\n\n expect(s2.settings).toEqual({\n network: \"mainnet\",\n secret: \"top-secret\",\n count: 42n,\n });\n });\n });\n\n describe(\"Sprinkle.New with options\", () => {\n test(\"passes options through to instance and migrates legacy\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings file so New triggers migration\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({ settings: { name: \"test\" }, defaults: {} }),\n );\n\n const sprinkle = await Sprinkle.New(schema, tmpDir, {\n encryption: {\n encrypt: (p) => p,\n decrypt: async (c) => c,\n },\n });\n\n expect(sprinkle.options.encryption).toBeDefined();\n expect(sprinkle.profileId).toBe(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"test\" });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"encryption.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","mockSelect","mock","mockInput","mockPassword","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","module","select","input","password","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","mockClear","afterEach","rmSync","recursive","force","test","schema","Type","secret","String","sensitive","title","sprinkle","Sprinkle","mockResolvedValueOnce","result","FillInStruct","expect","toEqual","toHaveBeenCalledTimes","calls","message","toBe","not","toHaveBeenCalled","name","p","defaults","toBeUndefined","withProfile","encryption","encrypt","plain","decrypt","cipher","replace","settings","saveSettings","content","readFileSync","parsed","JSON","parse","sprinkle1","sprinkle2","loadProfile","wallet","key","address","Union","type","Literal","privateKey","outerSchema","network","count","BigInt","opts","Buffer","from","toString","s1","s2","mkdirSync","writeFileSync","stringify","New","c","options","toBeDefined","profileId"],"sources":["../../../../src/Sprinkle/__tests__/encryption.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = 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: mock(),\n}));\n\ndescribe(\"Encryption & Sensitive Fields\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-enc-test-\"));\n mockSelect.mockClear();\n mockInput.mockClear();\n mockPassword.mockClear();\n mockSelectCancellable.mockClear();\n mockInputCancellable.mockClear();\n mockPasswordCancellable.mockClear();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe(\"sensitive field prompts\", () => {\n test(\"uses password() for sensitive string fields\", async () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true, title: \"Enter secret\" }),\n });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n mockPasswordCancellable.mockResolvedValueOnce(\"my-secret\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ secret: \"my-secret\" });\n expect(mockPasswordCancellable).toHaveBeenCalledTimes(1);\n expect(mockPasswordCancellable.mock.calls[0][0].message).toBe(\"Enter secret\");\n expect(mockInputCancellable).not.toHaveBeenCalled();\n });\n\n test(\"uses input() for non-sensitive string fields\", async () => {\n const schema = Type.Object({\n name: Type.String({ title: \"Enter name\" }),\n });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n mockInputCancellable.mockResolvedValueOnce(\"visible\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"visible\" });\n expect(mockInputCancellable).toHaveBeenCalledTimes(1);\n expect(mockPasswordCancellable).not.toHaveBeenCalled();\n });\n\n test(\"does not remember sensitive field as default\", async () => {\n const schema = Type.String({ sensitive: true });\n const sprinkle = new Sprinkle(Type.Object({ p: Type.String() }), tmpDir);\n\n mockPasswordCancellable.mockResolvedValueOnce(\"secret-val\");\n\n await sprinkle.FillInStruct(schema);\n expect(sprinkle.defaults[\"string\"]).toBeUndefined();\n });\n });\n\n describe(\"encryption on save/load\", () => {\n test(\"encrypts sensitive fields when saving with encryption configured\", () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(\n new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle.settings = { name: \"visible\", secret: \"hidden\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"visible\");\n expect(parsed.settings.secret).toBe(\"ENC:hidden\");\n });\n\n test(\"decrypts sensitive fields when loading with encryption configured\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n\n // First save with encryption\n const sprinkle1 = withProfile(\n new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle1.settings = { name: \"visible\", secret: \"hidden\" } as any;\n sprinkle1.saveSettings();\n\n // Then load with same encryption\n const sprinkle2 = new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n });\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ name: \"visible\", secret: \"hidden\" });\n });\n\n test(\"does not encrypt when no encryption configured\", () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { secret: \"plain-value\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.secret).toBe(\"plain-value\");\n });\n\n test(\"encrypts nested sensitive fields\", () => {\n const schema = Type.Object({\n wallet: Type.Object({\n key: Type.String({ sensitive: true }),\n address: Type.String(),\n }),\n });\n const sprinkle = withProfile(\n new Sprinkle(schema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle.settings = {\n wallet: { key: \"secret-key\", address: \"addr1...\" },\n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.wallet.key).toBe(\"ENC:secret-key\");\n expect(parsed.settings.wallet.address).toBe(\"addr1...\");\n });\n\n test(\"handles sensitive fields in union variants\", () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"hot\"),\n privateKey: Type.String({ sensitive: true }),\n }),\n Type.Object({\n type: Type.Literal(\"cold\"),\n address: Type.String(),\n }),\n ]);\n const outerSchema = Type.Object({ wallet: schema });\n const sprinkle = withProfile(\n new Sprinkle(outerSchema, tmpDir, {\n encryption: {\n encrypt: (plain) => `ENC:${plain}`,\n decrypt: async (cipher) => cipher.replace(\"ENC:\", \"\"),\n },\n }),\n );\n sprinkle.settings = {\n wallet: { type: \"hot\", privateKey: \"my-key\" },\n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.wallet.privateKey).toBe(\"ENC:my-key\");\n });\n\n test(\"round-trip with encryption preserves all data\", async () => {\n const schema = Type.Object({\n network: Type.String(),\n secret: Type.String({ sensitive: true }),\n count: Type.BigInt(),\n });\n const opts = {\n encryption: {\n encrypt: (plain: string) => Buffer.from(plain).toString(\"base64\"),\n decrypt: async (cipher: string) =>\n Buffer.from(cipher, \"base64\").toString(),\n },\n };\n const s1 = withProfile(new Sprinkle(schema, tmpDir, opts));\n s1.settings = {\n network: \"mainnet\",\n secret: \"top-secret\",\n count: 42n,\n } as any;\n s1.saveSettings();\n\n const s2 = new Sprinkle(schema, tmpDir, opts);\n await s2.loadProfile(\"test\");\n\n expect(s2.settings).toEqual({\n network: \"mainnet\",\n secret: \"top-secret\",\n count: 42n,\n });\n });\n });\n\n describe(\"Sprinkle.New with options\", () => {\n test(\"passes options through to instance and migrates legacy\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings file so New triggers migration\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({ settings: { name: \"test\" }, defaults: {} }),\n );\n\n const sprinkle = await Sprinkle.New(schema, tmpDir, {\n encryption: {\n encrypt: (p) => p,\n decrypt: async (c) => c,\n },\n });\n\n expect(sprinkle.options.encryption).toBeDefined();\n expect(sprinkle.profileId).toBe(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"test\" });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,12 +5,23 @@ var _index = require("../index.js");
|
|
|
5
5
|
const mockSelect = (0, _bunTest.mock)();
|
|
6
6
|
const mockInput = (0, _bunTest.mock)();
|
|
7
7
|
const mockPassword = (0, _bunTest.mock)();
|
|
8
|
-
const
|
|
8
|
+
const mockSelectCancellable = (0, _bunTest.mock)();
|
|
9
|
+
const mockInputCancellable = (0, _bunTest.mock)();
|
|
10
|
+
const mockPasswordCancellable = (0, _bunTest.mock)();
|
|
11
|
+
const mockConfirmCancellable = (0, _bunTest.mock)();
|
|
12
|
+
const mockSearchCancellable = (0, _bunTest.mock)();
|
|
9
13
|
_bunTest.mock.module("@inquirer/prompts", () => ({
|
|
10
14
|
select: mockSelect,
|
|
11
15
|
input: mockInput,
|
|
12
|
-
password: mockPassword
|
|
13
|
-
|
|
16
|
+
password: mockPassword
|
|
17
|
+
}));
|
|
18
|
+
_bunTest.mock.module("../prompts.js", () => ({
|
|
19
|
+
selectCancellable: mockSelectCancellable,
|
|
20
|
+
inputCancellable: mockInputCancellable,
|
|
21
|
+
passwordCancellable: mockPasswordCancellable,
|
|
22
|
+
confirmCancellable: mockConfirmCancellable,
|
|
23
|
+
searchCancellable: mockSearchCancellable,
|
|
24
|
+
select: mockSelectCancellable
|
|
14
25
|
}));
|
|
15
26
|
(0, _bunTest.describe)("beforeShow hook (2.2)", () => {
|
|
16
27
|
let sprinkle;
|
|
@@ -23,13 +34,14 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
23
34
|
name: "test"
|
|
24
35
|
};
|
|
25
36
|
mockSelect.mockClear();
|
|
37
|
+
mockSelectCancellable.mockClear();
|
|
26
38
|
});
|
|
27
39
|
(0, _bunTest.test)("calls beforeShow before rendering menu", async () => {
|
|
28
40
|
const callOrder = [];
|
|
29
41
|
const beforeShowFn = (0, _bunTest.mock)(async () => {
|
|
30
42
|
callOrder.push("beforeShow");
|
|
31
43
|
});
|
|
32
|
-
|
|
44
|
+
mockSelectCancellable.mockImplementation(async () => {
|
|
33
45
|
callOrder.push("select");
|
|
34
46
|
return -1; // exit
|
|
35
47
|
});
|
|
@@ -48,7 +60,7 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
48
60
|
});
|
|
49
61
|
(0, _bunTest.test)("passes sprinkle instance to beforeShow", async () => {
|
|
50
62
|
let receivedSprinkle;
|
|
51
|
-
|
|
63
|
+
mockSelectCancellable.mockResolvedValueOnce(-1);
|
|
52
64
|
const menu = {
|
|
53
65
|
title: "Test",
|
|
54
66
|
beforeShow: async s => {
|
|
@@ -63,7 +75,7 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
63
75
|
(0, _bunTest.expect)(receivedSprinkle).toBe(sprinkle);
|
|
64
76
|
});
|
|
65
77
|
(0, _bunTest.test)("menu works without beforeShow", async () => {
|
|
66
|
-
|
|
78
|
+
mockSelectCancellable.mockResolvedValueOnce(-1);
|
|
67
79
|
const menu = {
|
|
68
80
|
title: "Test",
|
|
69
81
|
items: [{
|
|
@@ -77,10 +89,10 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
77
89
|
});
|
|
78
90
|
(0, _bunTest.describe)("SearchSelect (2.3)", () => {
|
|
79
91
|
(0, _bunTest.beforeEach)(() => {
|
|
80
|
-
|
|
92
|
+
mockSearchCancellable.mockClear();
|
|
81
93
|
});
|
|
82
94
|
(0, _bunTest.test)("delegates to search prompt", async () => {
|
|
83
|
-
|
|
95
|
+
mockSearchCancellable.mockResolvedValueOnce("selected-value");
|
|
84
96
|
const result = await _index.Sprinkle.SearchSelect({
|
|
85
97
|
message: "Pick one",
|
|
86
98
|
source: () => [{
|
|
@@ -92,20 +104,31 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
92
104
|
}]
|
|
93
105
|
});
|
|
94
106
|
(0, _bunTest.expect)(result).toBe("selected-value");
|
|
95
|
-
(0, _bunTest.expect)(
|
|
96
|
-
(0, _bunTest.expect)(
|
|
107
|
+
(0, _bunTest.expect)(mockSearchCancellable).toHaveBeenCalledTimes(1);
|
|
108
|
+
(0, _bunTest.expect)(mockSearchCancellable.mock.calls[0][0].message).toBe("Pick one");
|
|
97
109
|
});
|
|
98
110
|
(0, _bunTest.test)("passes source function through", async () => {
|
|
99
111
|
const sourceFn = (0, _bunTest.mock)(() => [{
|
|
100
112
|
name: "X",
|
|
101
113
|
value: "x"
|
|
102
114
|
}]);
|
|
103
|
-
|
|
115
|
+
mockSearchCancellable.mockResolvedValueOnce("x");
|
|
104
116
|
await _index.Sprinkle.SearchSelect({
|
|
105
117
|
message: "Search",
|
|
106
118
|
source: sourceFn
|
|
107
119
|
});
|
|
108
|
-
(0, _bunTest.expect)(
|
|
120
|
+
(0, _bunTest.expect)(mockSearchCancellable.mock.calls[0][0].source).toBe(sourceFn);
|
|
121
|
+
});
|
|
122
|
+
(0, _bunTest.test)("returns null when cancelled", async () => {
|
|
123
|
+
mockSearchCancellable.mockResolvedValueOnce(null);
|
|
124
|
+
const result = await _index.Sprinkle.SearchSelect({
|
|
125
|
+
message: "Pick one",
|
|
126
|
+
source: () => [{
|
|
127
|
+
name: "A",
|
|
128
|
+
value: "a"
|
|
129
|
+
}]
|
|
130
|
+
});
|
|
131
|
+
(0, _bunTest.expect)(result).toBeNull();
|
|
109
132
|
});
|
|
110
133
|
});
|
|
111
134
|
(0, _bunTest.describe)("Optional type support (2.4)", () => {
|
|
@@ -117,14 +140,16 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
117
140
|
sprinkle = new _index.Sprinkle(schema, "/tmp/test");
|
|
118
141
|
mockSelect.mockClear();
|
|
119
142
|
mockInput.mockClear();
|
|
143
|
+
mockSelectCancellable.mockClear();
|
|
144
|
+
mockInputCancellable.mockClear();
|
|
120
145
|
});
|
|
121
146
|
(0, _bunTest.test)("skips optional field when user selects Skip", async () => {
|
|
122
147
|
const schema = _index.Type.Object({
|
|
123
148
|
name: _index.Type.String(),
|
|
124
149
|
nickname: _index.Type.Optional(_index.Type.String())
|
|
125
150
|
});
|
|
126
|
-
|
|
127
|
-
|
|
151
|
+
mockInputCancellable.mockResolvedValueOnce("Alice"); // name
|
|
152
|
+
mockSelectCancellable.mockResolvedValueOnce(false); // skip nickname
|
|
128
153
|
|
|
129
154
|
const result = await sprinkle.FillInStruct(schema);
|
|
130
155
|
(0, _bunTest.expect)(result.name).toBe("Alice");
|
|
@@ -135,9 +160,9 @@ _bunTest.mock.module("@inquirer/prompts", () => ({
|
|
|
135
160
|
name: _index.Type.String(),
|
|
136
161
|
nickname: _index.Type.Optional(_index.Type.String())
|
|
137
162
|
});
|
|
138
|
-
|
|
163
|
+
mockInputCancellable.mockResolvedValueOnce("Alice") // name
|
|
139
164
|
.mockResolvedValueOnce("Ali"); // nickname
|
|
140
|
-
|
|
165
|
+
mockSelectCancellable.mockResolvedValueOnce(true); // fill nickname
|
|
141
166
|
|
|
142
167
|
const result = await sprinkle.FillInStruct(schema);
|
|
143
168
|
(0, _bunTest.expect)(result.name).toBe("Alice");
|
|
@@ -1 +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":[]}
|
|
1
|
+
{"version":3,"file":"enhancements.test.js","names":["_bunTest","require","_index","mockSelect","mock","mockInput","mockPassword","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","mockSearchCancellable","module","select","input","password","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","searchCancellable","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","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":[]}
|