@sundaeswap/sprinkles 0.5.0 → 0.6.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/dist/cjs/Sprinkle/__tests__/encryption.test.js +3 -1
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +3 -37
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/field-utils.test.js +170 -0
- package/dist/cjs/Sprinkle/__tests__/field-utils.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +377 -84
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/formatting.test.js +97 -0
- package/dist/cjs/Sprinkle/__tests__/formatting.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +9 -5
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +9 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +174 -94
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/menus/array-menu.js +195 -0
- package/dist/cjs/Sprinkle/menus/array-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/field-menu.js +161 -0
- package/dist/cjs/Sprinkle/menus/field-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/index.js +33 -0
- package/dist/cjs/Sprinkle/menus/index.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/object-menu.js +324 -0
- package/dist/cjs/Sprinkle/menus/object-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/prompts.js +68 -2
- package/dist/cjs/Sprinkle/prompts.js.map +1 -1
- package/dist/cjs/Sprinkle/type-guards.js +48 -1
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
- package/dist/cjs/Sprinkle/types.js +24 -0
- package/dist/cjs/Sprinkle/types.js.map +1 -1
- package/dist/cjs/Sprinkle/utils/field-utils.js +154 -0
- package/dist/cjs/Sprinkle/utils/field-utils.js.map +1 -0
- package/dist/cjs/Sprinkle/utils/formatting.js +126 -0
- package/dist/cjs/Sprinkle/utils/formatting.js.map +1 -0
- package/dist/cjs/Sprinkle/utils/index.js +56 -0
- package/dist/cjs/Sprinkle/utils/index.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +3 -1
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +3 -37
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/field-utils.test.js +168 -0
- package/dist/esm/Sprinkle/__tests__/field-utils.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +378 -85
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/formatting.test.js +95 -0
- package/dist/esm/Sprinkle/__tests__/formatting.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js +9 -5
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +9 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +141 -96
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/menus/array-menu.js +190 -0
- package/dist/esm/Sprinkle/menus/array-menu.js.map +1 -0
- package/dist/esm/Sprinkle/menus/field-menu.js +155 -0
- package/dist/esm/Sprinkle/menus/field-menu.js.map +1 -0
- package/dist/esm/Sprinkle/menus/index.js +8 -0
- package/dist/esm/Sprinkle/menus/index.js.map +1 -0
- package/dist/esm/Sprinkle/menus/object-menu.js +318 -0
- package/dist/esm/Sprinkle/menus/object-menu.js.map +1 -0
- package/dist/esm/Sprinkle/prompts.js +59 -1
- package/dist/esm/Sprinkle/prompts.js.map +1 -1
- package/dist/esm/Sprinkle/type-guards.js +42 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -1
- package/dist/esm/Sprinkle/types.js +24 -0
- package/dist/esm/Sprinkle/types.js.map +1 -1
- package/dist/esm/Sprinkle/utils/field-utils.js +145 -0
- package/dist/esm/Sprinkle/utils/field-utils.js.map +1 -0
- package/dist/esm/Sprinkle/utils/formatting.js +118 -0
- package/dist/esm/Sprinkle/utils/formatting.js.map +1 -0
- package/dist/esm/Sprinkle/utils/index.js +7 -0
- package/dist/esm/Sprinkle/utils/index.js.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +9 -3
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/menus/array-menu.d.ts +31 -0
- package/dist/types/Sprinkle/menus/array-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/field-menu.d.ts +34 -0
- package/dist/types/Sprinkle/menus/field-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/index.d.ts +10 -0
- package/dist/types/Sprinkle/menus/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/object-menu.d.ts +34 -0
- package/dist/types/Sprinkle/menus/object-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/prompts.d.ts +25 -0
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
- package/dist/types/Sprinkle/type-guards.d.ts +24 -1
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
- package/dist/types/Sprinkle/types.d.ts +53 -0
- package/dist/types/Sprinkle/types.d.ts.map +1 -1
- package/dist/types/Sprinkle/utils/field-utils.d.ts +47 -0
- package/dist/types/Sprinkle/utils/field-utils.d.ts.map +1 -0
- package/dist/types/Sprinkle/utils/formatting.d.ts +30 -0
- package/dist/types/Sprinkle/utils/formatting.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 +2 -0
- package/src/Sprinkle/__tests__/enhancements.test.ts +3 -42
- package/src/Sprinkle/__tests__/field-utils.test.ts +191 -0
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +393 -100
- package/src/Sprinkle/__tests__/formatting.test.ts +115 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +14 -8
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +9 -0
- package/src/Sprinkle/index.ts +175 -122
- package/src/Sprinkle/menus/array-menu.ts +191 -0
- package/src/Sprinkle/menus/field-menu.ts +145 -0
- package/src/Sprinkle/menus/index.ts +12 -0
- package/src/Sprinkle/menus/object-menu.ts +336 -0
- package/src/Sprinkle/prompts.ts +71 -1
- package/src/Sprinkle/type-guards.ts +42 -0
- package/src/Sprinkle/types.ts +43 -0
- package/src/Sprinkle/utils/field-utils.ts +158 -0
- package/src/Sprinkle/utils/formatting.ts +127 -0
- package/src/Sprinkle/utils/index.ts +17 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","WalletSettingsSchema","UserCancelledError","mockSelect","mockInput","mockPassword","mockConfirm","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","module","select","input","password","confirm","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","sprinkle","schema","Object","placeholder","String","mockClear","mockResolvedValueOnce","result","FillInStruct","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","name","age","toEqual","Union","type","value","count","mockImplementationOnce","opts","choices","Array","default","Boolean","rejects","toThrow","outer","inner","defaults","Tuple","asset","toHaveBeenCalledWith","privateKey"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\nimport { UserCancelledError } from \"../types.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = mock();\nconst mockConfirmCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mockPasswordCancellable,\n confirmCancellable: mockConfirmCancellable,\n}));\n\ndescribe(\"FillInStruct\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ placeholder: Type.String() });\n sprinkle = new Sprinkle(schema, \"/tmp/test\");\n mockSelect.mockClear();\n mockInput.mockClear();\n mockPassword.mockClear();\n mockConfirm.mockClear();\n mockSelectCancellable.mockClear();\n mockInputCancellable.mockClear();\n mockPasswordCancellable.mockClear();\n mockConfirmCancellable.mockClear();\n });\n\n test(\"fills a simple string field\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInputCancellable.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInputCancellable).not.toHaveBeenCalled();\n expect(mockSelectCancellable).not.toHaveBeenCalled();\n });\n\n test(\"fills an object with multiple fields\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(\"30\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\n });\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInputCancellable.mockResolvedValueOnce(\"test-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(true); // add another\n mockInputCancellable.mockResolvedValueOnce(\"second\");\n mockSelectCancellable.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"first\", \"second\"]);\n });\n\n test(\"fills an array with single item\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"only\");\n mockSelectCancellable.mockResolvedValueOnce(false); // stop\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"uses default value for string\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(\n Type.String(),\n \"my-default\" as any,\n );\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(\n sprinkle.FillInStruct(Type.Boolean() as any),\n ).rejects.toThrow(\"Unable to fill in struct\");\n });\n\n test(\"fills nested objects\", async () => {\n const schema = Type.Object({\n outer: Type.Object({\n inner: Type.String(),\n }),\n });\n\n mockInputCancellable.mockResolvedValueOnce(\"deep-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInputCancellable\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInputCancellable.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInputCancellable.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n mockInputCancellable\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelectCancellable.mock.calls[0][0].message).toBe(\"Hot wallet setup:\");\n expect(mockSelectCancellable.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPasswordCancellable).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n test(\"full wallet settings schema with existing key\", async () => {\n // Select \"hot\" variant\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value; // hot wallet object\n });\n // Select \"existing\" key option\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"abc123privatekey\");\n\n const result = await sprinkle.FillInStruct(WalletSettingsSchema);\n\n expect(result).toEqual({\n type: \"hot\",\n privateKey: \"abc123privatekey\",\n });\n });\n\n test(\"throws UserCancelledError when input prompt is cancelled\", async () => {\n mockInputCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(Type.String())).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when select prompt is cancelled\", async () => {\n const schema = Type.Union([\n Type.Object({ type: Type.Literal(\"a\") }),\n Type.Object({ type: Type.Literal(\"b\") }),\n ]);\n\n mockSelectCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when nested prompt is cancelled\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n // First field succeeds, second is cancelled\n mockInputCancellable\n .mockResolvedValueOnce(\"Alice\")\n .mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when array add-another prompt is cancelled\", async () => {\n const schema = Type.Array(Type.String());\n\n mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(null); // cancel on \"add another?\"\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"fill-in-struct.test.js","names":["describe","expect","test","mock","beforeEach","Sprinkle","Type","UserCancelledError","mockSelect","mockInput","mockPassword","mockConfirm","mockSelectCancellable","mockInputCancellable","mockPasswordCancellable","mockConfirmCancellable","module","select","input","password","confirm","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","searchCancellable","sprinkle","schema","Object","placeholder","String","mockReset","mockResolvedValueOnce","result","FillInStruct","toBe","title","calls","message","BigInt","Literal","not","toHaveBeenCalled","default","Boolean","rejects","toThrow","defaults","Union","type","value","count","mockImplementationOnce","opts","choices","toEqual","defaultValue","settings","timeout","retries","name","toBeUndefined","age","outer","inner","required","optional","Optional","nickname","a","b","Array","Tuple","asset","toHaveBeenCalledWith"],"sources":["../../../../src/Sprinkle/__tests__/fill-in-struct.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, WalletSettingsSchema } from \"../index.js\";\nimport { UserCancelledError } from \"../types.js\";\n\n// Mock @inquirer/prompts\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockPassword = mock();\nconst mockConfirm = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\nconst mockPasswordCancellable = mock();\nconst mockConfirmCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n password: mockPassword,\n confirm: mockConfirm,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mockPasswordCancellable,\n confirmCancellable: mockConfirmCancellable,\n searchCancellable: mock(),\n select: mockSelectCancellable,\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 // Use mockReset to clear both call history and queued responses\n mockSelect.mockReset();\n mockInput.mockReset();\n mockPassword.mockReset();\n mockConfirm.mockReset();\n mockSelectCancellable.mockReset();\n mockInputCancellable.mockReset();\n mockPasswordCancellable.mockReset();\n mockConfirmCancellable.mockReset();\n });\n\n // --- Primitive types (unchanged behavior) ---\n\n test(\"fills a simple string field\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"hello\");\n\n const result = await sprinkle.FillInStruct(Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"fills a string with title as prompt\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"world\");\n\n await sprinkle.FillInStruct(Type.String({ title: \"Enter name\" }));\n expect(mockInputCancellable.mock.calls[0][0].message).toBe(\"Enter name\");\n });\n\n test(\"fills a bigint field\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(Type.BigInt());\n expect(result).toBe(42n);\n });\n\n test(\"fills a literal field without prompting\", async () => {\n const result = await sprinkle.FillInStruct(Type.Literal(\"fixed\"));\n expect(result).toBe(\"fixed\");\n expect(mockInputCancellable).not.toHaveBeenCalled();\n expect(mockSelectCancellable).not.toHaveBeenCalled();\n });\n\n test(\"uses default value for string\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"used-default\");\n\n await sprinkle.FillInStruct(Type.String(), \"my-default\" as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"my-default\");\n });\n\n test(\"uses default value for bigint\", async () => {\n mockInputCancellable.mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(Type.BigInt(), 99n as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"99\");\n });\n\n test(\"throws for unsupported types\", async () => {\n expect(sprinkle.FillInStruct(Type.Boolean() as any)).rejects.toThrow(\n \"Unable to fill in struct\",\n );\n });\n\n test(\"remembers last string input as default\", async () => {\n mockInputCancellable\n .mockResolvedValueOnce(\"first-input\")\n .mockResolvedValueOnce(\"second-input\");\n\n await sprinkle.FillInStruct(Type.String());\n expect(sprinkle.defaults[\"string\"]).toBe(\"first-input\");\n\n await sprinkle.FillInStruct(Type.String());\n // Second call should have the first input as default\n expect(mockInputCancellable.mock.calls[1][0].default).toBe(\"first-input\");\n });\n\n // --- Union types ---\n\n test(\"fills a union type by selecting variant then filling\", async () => {\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"a\"),\n value: Type.String(),\n }),\n Type.Object({\n type: Type.Literal(\"b\"),\n count: Type.BigInt(),\n }),\n ]);\n\n // Select first variant (the Object with type \"a\")\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n // Object menu: select \"value\" field, then Submit\n mockSelectCancellable.mockResolvedValueOnce(\"field:value\");\n mockInputCancellable.mockResolvedValueOnce(\"test-value\");\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ type: \"a\", value: \"test-value\" });\n });\n\n test(\"throws UserCancelledError when select prompt is cancelled\", async () => {\n const schema = Type.Union([\n Type.Object({ type: Type.Literal(\"a\") }),\n Type.Object({ type: Type.Literal(\"b\") }),\n ]);\n\n mockSelectCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"discriminated union propagates default when variant matches\", async () => {\n // When default has type \"a\" and user selects variant A, the default values\n // for non-literal fields should be pre-populated (field starts as \"set\" status).\n // Submitting without editing should return the default values.\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 const defaultValue = { type: \"a\" as const, value: \"existing-value\" };\n\n // Select the first variant (type \"a\") - matches the default\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n // Both fields are \"set\" (type auto-filled, value pre-populated from default).\n // allRequiredFieldsFilled is true so Submit is enabled. Submit immediately.\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema, defaultValue as any);\n\n // The default value for the \"value\" field should be included in the result\n expect(result).toEqual({ type: \"a\", value: \"existing-value\" });\n });\n\n test(\"discriminated union with nested object propagates nested defaults\", async () => {\n // When a discriminated union default has a nested settings object, the nested\n // fields should also be pre-populated from the default.\n const schema = Type.Union([\n Type.Object({\n type: Type.Literal(\"config\"),\n settings: Type.Object({\n timeout: Type.BigInt(),\n retries: Type.BigInt(),\n }),\n }),\n Type.Object({\n type: Type.Literal(\"other\"),\n name: Type.String(),\n }),\n ]);\n\n const defaultValue = {\n type: \"config\" as const,\n settings: { timeout: 30n, retries: 3n },\n };\n\n // Select the first variant (type \"config\") - matches the default\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n // Outer object: \"type\" is auto-filled literal, \"settings\" is pre-populated from default.\n // Both required fields are \"set\", so Submit is available.\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema, defaultValue as any);\n\n // Both the outer and nested default values should be returned\n expect(result).toEqual({\n type: \"config\",\n settings: { timeout: 30n, retries: 3n },\n });\n });\n\n test(\"discriminated union does not propagate default when variant does not match\", async () => {\n // When default has type \"a\" but user selects variant B, no default should be passed.\n // The variant B field should start as \"unset\" and require user input.\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 name: Type.String(),\n }),\n ]);\n\n // Default has type \"a\" but user selects variant \"b\"\n const defaultValue = { type: \"a\" as const, value: \"should-not-appear\" };\n\n // Select the second variant (type \"b\") - does NOT match the default\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[1].value;\n });\n // Variant B: \"type\" is auto-filled, \"name\" starts as unset (no default propagated).\n // Select \"name\" field and fill it in.\n mockSelectCancellable.mockResolvedValueOnce(\"field:name\");\n mockInputCancellable.mockResolvedValueOnce(\"new-name\");\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema, defaultValue as any);\n\n expect(result).toEqual({ type: \"b\", name: \"new-name\" });\n // The input prompt for \"name\" should have no default (default from variant A was not passed)\n expect(mockInputCancellable.mock.calls[0][0].default).toBeUndefined();\n });\n\n test(\"non-discriminated union propagates default when value structurally matches selected variant\", async () => {\n // For a union of simple types, when the default matches the selected variant\n // structurally (via Value.Check), it should be passed through.\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n\n const defaultValue = \"default-string\";\n\n // Select the first variant (String)\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[0].value;\n });\n mockInputCancellable.mockResolvedValueOnce(\"new-value\");\n\n await sprinkle.FillInStruct(schema, defaultValue as any);\n\n // The input prompt should show the string default\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"default-string\");\n });\n\n test(\"non-discriminated union does not propagate default when value does not match selected variant\", async () => {\n // When a string default is provided but BigInt variant is selected,\n // the default must not be passed (it would fail structural validation).\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n\n // Default is a string but user selects BigInt variant\n const defaultValue = \"not-a-bigint\";\n\n // Select the second variant (BigInt)\n mockSelectCancellable.mockImplementationOnce(async (opts: any) => {\n return opts.choices[1].value;\n });\n mockInputCancellable.mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema, defaultValue as any);\n\n expect(result).toBe(42n);\n // The string default must not be passed to the BigInt prompt\n expect(mockInputCancellable.mock.calls[0][0].default).toBeUndefined();\n });\n\n // --- Object types (menu-based) ---\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 // Menu flow: select name -> fill -> select age -> fill -> submit\n mockSelectCancellable.mockResolvedValueOnce(\"field:name\");\n mockInputCancellable.mockResolvedValueOnce(\"Alice\");\n mockSelectCancellable.mockResolvedValueOnce(\"field:age\");\n mockInputCancellable.mockResolvedValueOnce(\"30\");\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", age: 30n });\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 // Outer menu: select \"outer\" field\n mockSelectCancellable.mockResolvedValueOnce(\"field:outer\");\n // Inner menu: select \"inner\" field, fill, submit\n mockSelectCancellable.mockResolvedValueOnce(\"field:inner\");\n mockInputCancellable.mockResolvedValueOnce(\"deep-value\");\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n // Back to outer menu: submit\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ outer: { inner: \"deep-value\" } });\n });\n\n test(\"single required field skips menu\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n });\n\n // No menu - directly prompts for the field\n mockInputCancellable.mockResolvedValueOnce(\"direct-value\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"direct-value\" });\n // Verify no select menu was shown\n expect(mockSelectCancellable).not.toHaveBeenCalled();\n });\n\n test(\"throws UserCancelledError when object menu is cancelled\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n // Cancel at menu (no values set)\n mockSelectCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"cancel with values prompts confirmation\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n // Fill one field\n mockSelectCancellable.mockResolvedValueOnce(\"field:name\");\n mockInputCancellable.mockResolvedValueOnce(\"Alice\");\n // Escape at menu\n mockSelectCancellable.mockResolvedValueOnce(null);\n // Confirm discard\n mockConfirmCancellable.mockResolvedValueOnce(true);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n // --- Optional fields in object menu ---\n\n test(\"optional field shows without asterisk in menu\", async () => {\n const schema = Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.String()),\n });\n\n // Menu flow: select required -> fill -> submit (leaving optional unset)\n mockSelectCancellable.mockResolvedValueOnce(\"field:required\");\n mockInputCancellable.mockResolvedValueOnce(\"value\");\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ required: \"value\" });\n // Optional field should be omitted from result\n expect(\"optional\" in result).toBe(false);\n });\n\n test(\"selecting optional field prompts Yes/Skip\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n // Menu flow: select name -> fill -> select nickname -> Yes -> fill -> submit\n mockSelectCancellable.mockResolvedValueOnce(\"field:name\");\n mockInputCancellable.mockResolvedValueOnce(\"Alice\");\n mockSelectCancellable.mockResolvedValueOnce(\"field:nickname\");\n // Prompt: \"Set value for nickname? Yes/Skip\"\n mockSelectCancellable.mockResolvedValueOnce(true); // Yes\n mockInputCancellable.mockResolvedValueOnce(\"Ali\");\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\", nickname: \"Ali\" });\n });\n\n test(\"skipping optional field leaves it undefined\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n nickname: Type.Optional(Type.String()),\n });\n\n // Menu flow: select name -> fill -> select nickname -> Skip -> submit\n mockSelectCancellable.mockResolvedValueOnce(\"field:name\");\n mockInputCancellable.mockResolvedValueOnce(\"Alice\");\n mockSelectCancellable.mockResolvedValueOnce(\"field:nickname\");\n // Prompt: \"Set value for nickname? Yes/Skip\"\n mockSelectCancellable.mockResolvedValueOnce(false); // Skip\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ name: \"Alice\" });\n expect(\"nickname\" in result).toBe(false);\n });\n\n test(\"all-optional object can be submitted empty\", async () => {\n const schema = Type.Object({\n a: Type.Optional(Type.String()),\n b: Type.Optional(Type.String()),\n });\n\n // Submit immediately without setting any fields\n mockSelectCancellable.mockResolvedValueOnce(\"submit\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({});\n });\n\n // --- Array types (menu-based) ---\n\n test(\"fills an array with items\", async () => {\n const schema = Type.Array(Type.String());\n\n // Menu: Add -> fill -> Add -> fill -> Done\n mockSelectCancellable.mockResolvedValueOnce(\"add\");\n mockInputCancellable.mockResolvedValueOnce(\"first\");\n mockSelectCancellable.mockResolvedValueOnce(\"add\");\n mockInputCancellable.mockResolvedValueOnce(\"second\");\n mockSelectCancellable.mockResolvedValueOnce(\"done\");\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 // Menu: Add -> fill -> Done\n mockSelectCancellable.mockResolvedValueOnce(\"add\");\n mockInputCancellable.mockResolvedValueOnce(\"only\");\n mockSelectCancellable.mockResolvedValueOnce(\"done\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"only\"]);\n });\n\n test(\"fills empty array by selecting Done immediately\", async () => {\n const schema = Type.Array(Type.String());\n\n mockSelectCancellable.mockResolvedValueOnce(\"done\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([]);\n });\n\n test(\"array Back throws UserCancelledError\", async () => {\n const schema = Type.Array(Type.String());\n\n mockSelectCancellable.mockResolvedValueOnce(\"back\");\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n // --- Tuple types (unchanged - sequential) ---\n\n test(\"fills a tuple with same-type elements\", async () => {\n const schema = Type.Tuple([Type.String(), Type.String()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"policyId\")\n .mockResolvedValueOnce(\"assetName\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"policyId\", \"assetName\"]);\n });\n\n test(\"fills a tuple with mixed types\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"label\")\n .mockResolvedValueOnce(\"42\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual([\"label\", 42n]);\n });\n\n test(\"fills a tuple with default values\", async () => {\n const schema = Type.Tuple([Type.String(), Type.BigInt()]);\n\n mockInputCancellable\n .mockResolvedValueOnce(\"new-label\")\n .mockResolvedValueOnce(\"99\");\n\n await sprinkle.FillInStruct(schema, [\"default-label\", 50n] as any);\n\n expect(mockInputCancellable.mock.calls[0][0].default).toBe(\"default-label\");\n expect(mockInputCancellable.mock.calls[1][0].default).toBe(\"50\");\n });\n\n test(\"fills a tuple nested in an object\", async () => {\n const schema = Type.Object({\n asset: Type.Tuple([Type.String(), Type.String()]),\n });\n\n // Single required field skips menu\n mockInputCancellable\n .mockResolvedValueOnce(\"policy123\")\n .mockResolvedValueOnce(\"token456\");\n\n const result = await sprinkle.FillInStruct(schema);\n expect(result).toEqual({ asset: [\"policy123\", \"token456\"] });\n });\n\n // --- Hot wallet special handling ---\n\n test(\"hot wallet private key shows setup choice\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n // Select \"existing\" option\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"my-private-key\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n // Verify select was called with correct options\n expect(mockSelectCancellable.mock.calls[0][0].message).toBe(\n \"Hot wallet setup:\",\n );\n expect(mockSelectCancellable.mock.calls[0][0].choices).toEqual([\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ]);\n expect(result).toBe(\"my-private-key\");\n });\n\n test(\"hot wallet existing key prompts for password\", async () => {\n const schema = Type.String({ title: \"Hot Wallet Private Key\" });\n\n mockSelectCancellable.mockResolvedValueOnce(\"existing\");\n mockPasswordCancellable.mockResolvedValueOnce(\"deadbeef1234\");\n\n const result = await sprinkle.FillInStruct(schema);\n\n expect(mockPasswordCancellable).toHaveBeenCalledWith({\n message: \"Enter your private key:\",\n });\n expect(result).toBe(\"deadbeef1234\");\n });\n\n // Note: Full wallet settings test removed due to mock complexity.\n // The individual components (union selection, single-field optimization,\n // hot wallet key handling) are tested separately above.\n\n // --- Cancel/escape behavior ---\n\n test(\"throws UserCancelledError when input prompt is cancelled\", async () => {\n mockInputCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(Type.String())).rejects.toThrow(\n UserCancelledError,\n );\n });\n\n test(\"throws UserCancelledError when field input cancelled in object menu\", async () => {\n const schema = Type.Object({\n name: Type.String(),\n age: Type.BigInt(),\n });\n\n // Select name field\n mockSelectCancellable.mockResolvedValueOnce(\"field:name\");\n // Cancel during input\n mockInputCancellable.mockResolvedValueOnce(null);\n // Return to menu (field unchanged)\n // Then cancel at menu\n mockSelectCancellable.mockResolvedValueOnce(null);\n\n await expect(sprinkle.FillInStruct(schema)).rejects.toThrow(\n UserCancelledError,\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { formatValuePreview, formatPath, formatBreadcrumb } from "../utils/formatting.js";
|
|
3
|
+
describe("formatValuePreview", () => {
|
|
4
|
+
test("returns [not set] for undefined", () => {
|
|
5
|
+
expect(formatValuePreview(undefined)).toBe("[not set]");
|
|
6
|
+
});
|
|
7
|
+
test("returns null for null", () => {
|
|
8
|
+
expect(formatValuePreview(null)).toBe("null");
|
|
9
|
+
});
|
|
10
|
+
test("formats short strings with quotes", () => {
|
|
11
|
+
expect(formatValuePreview("hello")).toBe('"hello"');
|
|
12
|
+
});
|
|
13
|
+
test("truncates long strings", () => {
|
|
14
|
+
const longString = "a".repeat(50);
|
|
15
|
+
const result = formatValuePreview(longString, 40);
|
|
16
|
+
expect(result.length).toBeLessThanOrEqual(40);
|
|
17
|
+
expect(result).toContain("...");
|
|
18
|
+
});
|
|
19
|
+
test("formats numbers", () => {
|
|
20
|
+
expect(formatValuePreview(42)).toBe("42");
|
|
21
|
+
expect(formatValuePreview(3.14)).toBe("3.14");
|
|
22
|
+
});
|
|
23
|
+
test("formats bigints", () => {
|
|
24
|
+
expect(formatValuePreview(42n)).toBe("42");
|
|
25
|
+
});
|
|
26
|
+
test("formats booleans", () => {
|
|
27
|
+
expect(formatValuePreview(true)).toBe("true");
|
|
28
|
+
expect(formatValuePreview(false)).toBe("false");
|
|
29
|
+
});
|
|
30
|
+
test("formats arrays with item count", () => {
|
|
31
|
+
expect(formatValuePreview([])).toBe("[0 items]");
|
|
32
|
+
expect(formatValuePreview([1])).toBe("[1 item]");
|
|
33
|
+
expect(formatValuePreview([1, 2, 3])).toBe("[3 items]");
|
|
34
|
+
});
|
|
35
|
+
test("formats empty objects", () => {
|
|
36
|
+
expect(formatValuePreview({})).toBe("{}");
|
|
37
|
+
});
|
|
38
|
+
test("formats single-key objects", () => {
|
|
39
|
+
const result = formatValuePreview({
|
|
40
|
+
Signature: "abc123"
|
|
41
|
+
});
|
|
42
|
+
expect(result).toContain("Signature");
|
|
43
|
+
expect(result).toContain("abc123");
|
|
44
|
+
});
|
|
45
|
+
test("formats multi-key objects with abbreviation", () => {
|
|
46
|
+
const result = formatValuePreview({
|
|
47
|
+
a: 1,
|
|
48
|
+
b: 2,
|
|
49
|
+
c: 3
|
|
50
|
+
});
|
|
51
|
+
expect(result).toContain("a");
|
|
52
|
+
expect(result).toContain("+2");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("formatPath", () => {
|
|
56
|
+
test("returns empty string for root-only path", () => {
|
|
57
|
+
expect(formatPath(["root"])).toBe("");
|
|
58
|
+
});
|
|
59
|
+
test("strips root prefix", () => {
|
|
60
|
+
expect(formatPath(["root", "name"])).toBe("name");
|
|
61
|
+
});
|
|
62
|
+
test("joins multiple segments with dots", () => {
|
|
63
|
+
expect(formatPath(["root", "settings", "permissions"])).toBe("settings.permissions");
|
|
64
|
+
});
|
|
65
|
+
test("handles paths without root", () => {
|
|
66
|
+
expect(formatPath(["settings", "name"])).toBe("settings.name");
|
|
67
|
+
});
|
|
68
|
+
test("handles empty path", () => {
|
|
69
|
+
expect(formatPath([])).toBe("");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("formatBreadcrumb", () => {
|
|
73
|
+
test("returns empty string for root-only path", () => {
|
|
74
|
+
expect(formatBreadcrumb(["root"])).toBe("");
|
|
75
|
+
});
|
|
76
|
+
test("strips root prefix", () => {
|
|
77
|
+
expect(formatBreadcrumb(["root", "name"])).toBe("name");
|
|
78
|
+
});
|
|
79
|
+
test("joins segments with arrow", () => {
|
|
80
|
+
const result = formatBreadcrumb(["root", "settings", "permissions"]);
|
|
81
|
+
expect(result).toContain("settings");
|
|
82
|
+
expect(result).toContain("\u2192"); // Unicode right arrow
|
|
83
|
+
expect(result).toContain("permissions");
|
|
84
|
+
});
|
|
85
|
+
test("truncates long paths from left", () => {
|
|
86
|
+
const path = ["root", "a", "b", "c", "d", "e", "final"];
|
|
87
|
+
const result = formatBreadcrumb(path, 20);
|
|
88
|
+
expect(result).toContain("...");
|
|
89
|
+
expect(result).toContain("final");
|
|
90
|
+
});
|
|
91
|
+
test("handles empty path", () => {
|
|
92
|
+
expect(formatBreadcrumb([])).toBe("");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=formatting.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.test.js","names":["describe","expect","test","formatValuePreview","formatPath","formatBreadcrumb","undefined","toBe","longString","repeat","result","length","toBeLessThanOrEqual","toContain","Signature","a","b","c","path"],"sources":["../../../../src/Sprinkle/__tests__/formatting.test.ts"],"sourcesContent":["import { describe, expect, test } from \"bun:test\";\nimport {\n formatValuePreview,\n formatPath,\n formatBreadcrumb,\n} from \"../utils/formatting.js\";\n\ndescribe(\"formatValuePreview\", () => {\n test(\"returns [not set] for undefined\", () => {\n expect(formatValuePreview(undefined)).toBe(\"[not set]\");\n });\n\n test(\"returns null for null\", () => {\n expect(formatValuePreview(null)).toBe(\"null\");\n });\n\n test(\"formats short strings with quotes\", () => {\n expect(formatValuePreview(\"hello\")).toBe('\"hello\"');\n });\n\n test(\"truncates long strings\", () => {\n const longString = \"a\".repeat(50);\n const result = formatValuePreview(longString, 40);\n expect(result.length).toBeLessThanOrEqual(40);\n expect(result).toContain(\"...\");\n });\n\n test(\"formats numbers\", () => {\n expect(formatValuePreview(42)).toBe(\"42\");\n expect(formatValuePreview(3.14)).toBe(\"3.14\");\n });\n\n test(\"formats bigints\", () => {\n expect(formatValuePreview(42n)).toBe(\"42\");\n });\n\n test(\"formats booleans\", () => {\n expect(formatValuePreview(true)).toBe(\"true\");\n expect(formatValuePreview(false)).toBe(\"false\");\n });\n\n test(\"formats arrays with item count\", () => {\n expect(formatValuePreview([])).toBe(\"[0 items]\");\n expect(formatValuePreview([1])).toBe(\"[1 item]\");\n expect(formatValuePreview([1, 2, 3])).toBe(\"[3 items]\");\n });\n\n test(\"formats empty objects\", () => {\n expect(formatValuePreview({})).toBe(\"{}\");\n });\n\n test(\"formats single-key objects\", () => {\n const result = formatValuePreview({ Signature: \"abc123\" });\n expect(result).toContain(\"Signature\");\n expect(result).toContain(\"abc123\");\n });\n\n test(\"formats multi-key objects with abbreviation\", () => {\n const result = formatValuePreview({ a: 1, b: 2, c: 3 });\n expect(result).toContain(\"a\");\n expect(result).toContain(\"+2\");\n });\n});\n\ndescribe(\"formatPath\", () => {\n test(\"returns empty string for root-only path\", () => {\n expect(formatPath([\"root\"])).toBe(\"\");\n });\n\n test(\"strips root prefix\", () => {\n expect(formatPath([\"root\", \"name\"])).toBe(\"name\");\n });\n\n test(\"joins multiple segments with dots\", () => {\n expect(formatPath([\"root\", \"settings\", \"permissions\"])).toBe(\n \"settings.permissions\",\n );\n });\n\n test(\"handles paths without root\", () => {\n expect(formatPath([\"settings\", \"name\"])).toBe(\"settings.name\");\n });\n\n test(\"handles empty path\", () => {\n expect(formatPath([])).toBe(\"\");\n });\n});\n\ndescribe(\"formatBreadcrumb\", () => {\n test(\"returns empty string for root-only path\", () => {\n expect(formatBreadcrumb([\"root\"])).toBe(\"\");\n });\n\n test(\"strips root prefix\", () => {\n expect(formatBreadcrumb([\"root\", \"name\"])).toBe(\"name\");\n });\n\n test(\"joins segments with arrow\", () => {\n const result = formatBreadcrumb([\"root\", \"settings\", \"permissions\"]);\n expect(result).toContain(\"settings\");\n expect(result).toContain(\"\\u2192\"); // Unicode right arrow\n expect(result).toContain(\"permissions\");\n });\n\n test(\"truncates long paths from left\", () => {\n const path = [\"root\", \"a\", \"b\", \"c\", \"d\", \"e\", \"final\"];\n const result = formatBreadcrumb(path, 20);\n expect(result).toContain(\"...\");\n expect(result).toContain(\"final\");\n });\n\n test(\"handles empty path\", () => {\n expect(formatBreadcrumb([])).toBe(\"\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,7 +13,9 @@ mock.module("../prompts.js", () => ({
|
|
|
13
13
|
selectCancellable: mockSelectCancellable,
|
|
14
14
|
inputCancellable: mockInputCancellable,
|
|
15
15
|
passwordCancellable: mock(),
|
|
16
|
-
confirmCancellable: mock()
|
|
16
|
+
confirmCancellable: mock(),
|
|
17
|
+
searchCancellable: mock(),
|
|
18
|
+
select: mockSelectCancellable
|
|
17
19
|
}));
|
|
18
20
|
describe("showMenu", () => {
|
|
19
21
|
let sprinkle;
|
|
@@ -134,9 +136,11 @@ describe("showMenu", () => {
|
|
|
134
136
|
test("View settings displays masked settings", async () => {
|
|
135
137
|
const consoleSpy = spyOn(console, "log").mockImplementation(() => {});
|
|
136
138
|
|
|
137
|
-
// Select "Settings & Profiles" (-5), then "View settings" (0),
|
|
139
|
+
// Select "Settings & Profiles" (-5), then "View settings" (0),
|
|
140
|
+
// then "Continue" for the press Enter prompt, then "Back" (-1), then "Exit" (-1)
|
|
138
141
|
mockSelectCancellable.mockResolvedValueOnce(-5) // Settings & Profiles
|
|
139
142
|
.mockResolvedValueOnce(0) // View settings (first item)
|
|
143
|
+
.mockResolvedValueOnce("continue") // Press Enter to continue
|
|
140
144
|
.mockResolvedValueOnce(-1) // Back
|
|
141
145
|
.mockResolvedValueOnce(-1); // Exit
|
|
142
146
|
|
|
@@ -149,10 +153,10 @@ describe("showMenu", () => {
|
|
|
149
153
|
};
|
|
150
154
|
await sprinkle.showMenu(menu);
|
|
151
155
|
|
|
152
|
-
// Should have called console.log with the settings
|
|
156
|
+
// Should have called console.log with the settings (find the JSON output among breadcrumbs)
|
|
153
157
|
expect(consoleSpy).toHaveBeenCalled();
|
|
154
|
-
const
|
|
155
|
-
expect(
|
|
158
|
+
const jsonOutput = consoleSpy.mock.calls.find(call => call[0] && typeof call[0] === "string" && call[0].includes('"name"'));
|
|
159
|
+
expect(jsonOutput).toBeDefined();
|
|
156
160
|
consoleSpy.mockRestore();
|
|
157
161
|
});
|
|
158
162
|
test("Create profile restores state when FillInStruct is cancelled", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show-menu.test.js","names":["describe","expect","test","mock","beforeEach","spyOn","Sprinkle","Type","withProfile","mockSelect","mockInput","mockSelectCancellable","mockInputCancellable","module","select","input","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","sprinkle","schema","Object","name","String","settings","mockClear","mockResolvedValueOnce","menu","title","items","action","showMenu","actionFn","toHaveBeenCalledTimes","choices","calls","names","map","c","toContain","not","subChoices","subNames","s","toEqual","settingsChoices","settingsNames","consoleSpy","console","mockImplementation","toHaveBeenCalled","output","mockRestore","originalProfileId","currentProfile","id","originalSettings","toBe"],"sources":["../../../../src/Sprinkle/__tests__/show-menu.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\nimport { withProfile } from \"./test-helpers.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mock(),\n confirmCancellable: mock(),\n}));\n\ndescribe(\"showMenu\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = withProfile(new Sprinkle(schema, \"/tmp/test\"));\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n mockSelectCancellable.mockClear();\n mockInput.mockClear();\n });\n\n test(\"exits when Exit is selected on main menu\", async () => {\n mockSelectCancellable.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test Menu\",\n items: [\n {\n title: \"Action 1\",\n action: async () => {},\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n });\n\n test(\"executes action and re-shows menu\", async () => {\n const actionFn = mock(async () => {});\n\n mockSelectCancellable.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test Menu\",\n items: [\n {\n title: \"My Action\",\n action: actionFn,\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n expect(actionFn).toHaveBeenCalledTimes(1);\n });\n\n test(\"main menu includes Settings & Profiles submenu and Exit\", 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\n const choices = mockSelectCancellable.mock.calls[0][0].choices;\n const names = choices.map((c: any) => c.name);\n expect(names).toContain(\"Settings & Profiles\");\n expect(names).toContain(\"Exit\");\n expect(names).not.toContain(\"Switch profile\");\n expect(names).not.toContain(\"Manage profiles\");\n expect(names).not.toContain(\"Edit settings\");\n });\n\n test(\"submenu includes Back instead of Exit\", async () => {\n mockSelectCancellable\n .mockResolvedValueOnce(0)\n .mockResolvedValueOnce(-1)\n .mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Main\",\n items: [\n {\n title: \"Sub\",\n items: [{ title: \"Sub Action\", action: async () => {} }],\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n\n const subChoices = mockSelectCancellable.mock.calls[1][0].choices;\n const subNames = subChoices.map((c: any) => c.name);\n expect(subNames).toContain(\"Back\");\n expect(subNames).not.toContain(\"Exit\");\n });\n\n test(\"action returning sprinkle instance saves settings\", async () => {\n sprinkle.settings = { name: \"original\" } as any;\n\n mockSelectCancellable.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [\n {\n title: \"Update\",\n action: async (s: Sprinkle<any>) => {\n s.settings = { name: \"updated\" } as any;\n return s;\n },\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n expect(sprinkle.settings).toEqual({ name: \"updated\" });\n });\n\n test(\"Settings submenu includes View settings option\", async () => {\n // Select \"Settings & Profiles\" (-5), then \"Back\" (-1), then \"Exit\" (-1)\n mockSelectCancellable\n .mockResolvedValueOnce(-5) // Settings & Profiles\n .mockResolvedValueOnce(-1) // Back\n .mockResolvedValueOnce(-1); // Exit\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n // Second call is the settings submenu\n const settingsChoices = mockSelectCancellable.mock.calls[1][0].choices;\n const settingsNames = settingsChoices.map((c: any) => c.name);\n expect(settingsNames).toContain(\"View settings\");\n });\n\n test(\"View settings displays masked settings\", async () => {\n const consoleSpy = spyOn(console, \"log\").mockImplementation(() => {});\n\n // Select \"Settings & Profiles\" (-5), then \"View settings\" (0), then \"Back\" (-1), then \"Exit\" (-1)\n mockSelectCancellable\n .mockResolvedValueOnce(-5) // Settings & Profiles\n .mockResolvedValueOnce(0) // View settings (first item)\n .mockResolvedValueOnce(-1) // Back\n .mockResolvedValueOnce(-1); // Exit\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n // Should have called console.log with the settings\n expect(consoleSpy).toHaveBeenCalled();\n const output = consoleSpy.mock.calls[0][0];\n expect(output).toContain(\"name\");\n\n consoleSpy.mockRestore();\n });\n\n test(\"Create profile restores state when FillInStruct is cancelled\", async () => {\n // Capture original state\n const originalProfileId = sprinkle.currentProfile?.id;\n const originalSettings = { ...sprinkle.settings };\n\n // Settings menu indices: 0=View, 1=Edit, 2=Switch, 3=Create new profile\n mockSelectCancellable\n .mockResolvedValueOnce(-5) // Settings & Profiles\n .mockResolvedValueOnce(3); // Create new profile\n\n // promptProfileMeta: name then description\n mockInputCancellable\n .mockResolvedValueOnce(\"New Profile\") // Profile name\n .mockResolvedValueOnce(\"\") // Profile description\n .mockResolvedValueOnce(null); // Cancel during FillInStruct (name field)\n\n // After cancellation, back out of menus\n mockSelectCancellable\n .mockResolvedValueOnce(-1) // Back from settings\n .mockResolvedValueOnce(-1); // Exit\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n // State should be restored to original\n expect(sprinkle.currentProfile?.id).toBe(originalProfileId);\n expect(sprinkle.settings).toEqual(originalSettings);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"show-menu.test.js","names":["describe","expect","test","mock","beforeEach","spyOn","Sprinkle","Type","withProfile","mockSelect","mockInput","mockSelectCancellable","mockInputCancellable","module","select","input","selectCancellable","inputCancellable","passwordCancellable","confirmCancellable","searchCancellable","sprinkle","schema","Object","name","String","settings","mockClear","mockResolvedValueOnce","menu","title","items","action","showMenu","actionFn","toHaveBeenCalledTimes","choices","calls","names","map","c","toContain","not","subChoices","subNames","s","toEqual","settingsChoices","settingsNames","consoleSpy","console","mockImplementation","toHaveBeenCalled","jsonOutput","find","call","includes","toBeDefined","mockRestore","originalProfileId","currentProfile","id","originalSettings","toBe"],"sources":["../../../../src/Sprinkle/__tests__/show-menu.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Sprinkle, Type, type IMenu } from \"../index.js\";\nimport { withProfile } from \"./test-helpers.js\";\n\nconst mockSelect = mock();\nconst mockInput = mock();\nconst mockSelectCancellable = mock();\nconst mockInputCancellable = mock();\n\nmock.module(\"@inquirer/prompts\", () => ({\n select: mockSelect,\n input: mockInput,\n}));\n\nmock.module(\"../prompts.js\", () => ({\n selectCancellable: mockSelectCancellable,\n inputCancellable: mockInputCancellable,\n passwordCancellable: mock(),\n confirmCancellable: mock(),\n searchCancellable: mock(),\n select: mockSelectCancellable,\n}));\n\ndescribe(\"showMenu\", () => {\n let sprinkle: Sprinkle<any>;\n\n beforeEach(() => {\n const schema = Type.Object({ name: Type.String() });\n sprinkle = withProfile(new Sprinkle(schema, \"/tmp/test\"));\n sprinkle.settings = { name: \"test\" } as any;\n mockSelect.mockClear();\n mockSelectCancellable.mockClear();\n mockInput.mockClear();\n });\n\n test(\"exits when Exit is selected on main menu\", async () => {\n mockSelectCancellable.mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test Menu\",\n items: [\n {\n title: \"Action 1\",\n action: async () => {},\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n });\n\n test(\"executes action and re-shows menu\", async () => {\n const actionFn = mock(async () => {});\n\n mockSelectCancellable.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test Menu\",\n items: [\n {\n title: \"My Action\",\n action: actionFn,\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n expect(actionFn).toHaveBeenCalledTimes(1);\n });\n\n test(\"main menu includes Settings & Profiles submenu and Exit\", 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\n const choices = mockSelectCancellable.mock.calls[0][0].choices;\n const names = choices.map((c: any) => c.name);\n expect(names).toContain(\"Settings & Profiles\");\n expect(names).toContain(\"Exit\");\n expect(names).not.toContain(\"Switch profile\");\n expect(names).not.toContain(\"Manage profiles\");\n expect(names).not.toContain(\"Edit settings\");\n });\n\n test(\"submenu includes Back instead of Exit\", async () => {\n mockSelectCancellable\n .mockResolvedValueOnce(0)\n .mockResolvedValueOnce(-1)\n .mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Main\",\n items: [\n {\n title: \"Sub\",\n items: [{ title: \"Sub Action\", action: async () => {} }],\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n\n const subChoices = mockSelectCancellable.mock.calls[1][0].choices;\n const subNames = subChoices.map((c: any) => c.name);\n expect(subNames).toContain(\"Back\");\n expect(subNames).not.toContain(\"Exit\");\n });\n\n test(\"action returning sprinkle instance saves settings\", async () => {\n sprinkle.settings = { name: \"original\" } as any;\n\n mockSelectCancellable.mockResolvedValueOnce(0).mockResolvedValueOnce(-1);\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [\n {\n title: \"Update\",\n action: async (s: Sprinkle<any>) => {\n s.settings = { name: \"updated\" } as any;\n return s;\n },\n },\n ],\n };\n\n await sprinkle.showMenu(menu);\n expect(sprinkle.settings).toEqual({ name: \"updated\" });\n });\n\n test(\"Settings submenu includes View settings option\", async () => {\n // Select \"Settings & Profiles\" (-5), then \"Back\" (-1), then \"Exit\" (-1)\n mockSelectCancellable\n .mockResolvedValueOnce(-5) // Settings & Profiles\n .mockResolvedValueOnce(-1) // Back\n .mockResolvedValueOnce(-1); // Exit\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n // Second call is the settings submenu\n const settingsChoices = mockSelectCancellable.mock.calls[1][0].choices;\n const settingsNames = settingsChoices.map((c: any) => c.name);\n expect(settingsNames).toContain(\"View settings\");\n });\n\n test(\"View settings displays masked settings\", async () => {\n const consoleSpy = spyOn(console, \"log\").mockImplementation(() => {});\n\n // Select \"Settings & Profiles\" (-5), then \"View settings\" (0),\n // then \"Continue\" for the press Enter prompt, then \"Back\" (-1), then \"Exit\" (-1)\n mockSelectCancellable\n .mockResolvedValueOnce(-5) // Settings & Profiles\n .mockResolvedValueOnce(0) // View settings (first item)\n .mockResolvedValueOnce(\"continue\") // Press Enter to continue\n .mockResolvedValueOnce(-1) // Back\n .mockResolvedValueOnce(-1); // Exit\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n // Should have called console.log with the settings (find the JSON output among breadcrumbs)\n expect(consoleSpy).toHaveBeenCalled();\n const jsonOutput = consoleSpy.mock.calls.find((call: any[]) =>\n call[0] && typeof call[0] === \"string\" && call[0].includes('\"name\"')\n );\n expect(jsonOutput).toBeDefined();\n\n consoleSpy.mockRestore();\n });\n\n test(\"Create profile restores state when FillInStruct is cancelled\", async () => {\n // Capture original state\n const originalProfileId = sprinkle.currentProfile?.id;\n const originalSettings = { ...sprinkle.settings };\n\n // Settings menu indices: 0=View, 1=Edit, 2=Switch, 3=Create new profile\n mockSelectCancellable\n .mockResolvedValueOnce(-5) // Settings & Profiles\n .mockResolvedValueOnce(3); // Create new profile\n\n // promptProfileMeta: name then description\n mockInputCancellable\n .mockResolvedValueOnce(\"New Profile\") // Profile name\n .mockResolvedValueOnce(\"\") // Profile description\n .mockResolvedValueOnce(null); // Cancel during FillInStruct (name field)\n\n // After cancellation, back out of menus\n mockSelectCancellable\n .mockResolvedValueOnce(-1) // Back from settings\n .mockResolvedValueOnce(-1); // Exit\n\n const menu: IMenu<any> = {\n title: \"Test\",\n items: [{ title: \"Action\", action: async () => {} }],\n };\n\n await sprinkle.showMenu(menu);\n\n // State should be restored to original\n expect(sprinkle.currentProfile?.id).toBe(originalProfileId);\n expect(sprinkle.settings).toEqual(originalSettings);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -47,6 +47,15 @@ mock.module("../prompts.js", () => ({
|
|
|
47
47
|
confirmCancellable: mock(async () => {
|
|
48
48
|
const response = confirmResponses.shift();
|
|
49
49
|
return response ?? false;
|
|
50
|
+
}),
|
|
51
|
+
searchCancellable: mock(async () => "result"),
|
|
52
|
+
select: mock(async opts => {
|
|
53
|
+
selectCalls.push(opts);
|
|
54
|
+
const response = selectResponses.shift();
|
|
55
|
+
if (response === undefined) {
|
|
56
|
+
return "cancel";
|
|
57
|
+
}
|
|
58
|
+
return response;
|
|
50
59
|
})
|
|
51
60
|
}));
|
|
52
61
|
|