@ledgerhq/context-module 0.0.0-develop-20260107144144 → 0.0.0-develop-20260109001030

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/ContextModuleBuilder.js +1 -1
  3. package/lib/cjs/src/ContextModuleBuilder.js.map +3 -3
  4. package/lib/cjs/src/DefaultContextModule.test.js +1 -1
  5. package/lib/cjs/src/DefaultContextModule.test.js.map +3 -3
  6. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.js +2 -0
  7. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.js.map +7 -0
  8. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.test.js +2 -0
  9. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.test.js.map +7 -0
  10. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  11. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  12. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
  13. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
  14. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
  15. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +3 -3
  16. package/lib/esm/package.json +1 -1
  17. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  18. package/lib/esm/src/ContextModuleBuilder.js.map +3 -3
  19. package/lib/esm/src/DefaultContextModule.test.js +1 -1
  20. package/lib/esm/src/DefaultContextModule.test.js.map +3 -3
  21. package/lib/esm/src/shared/utils/NullLoggerPublisherService.js +2 -0
  22. package/lib/esm/src/shared/utils/NullLoggerPublisherService.js.map +7 -0
  23. package/lib/esm/src/shared/utils/NullLoggerPublisherService.test.js +2 -0
  24. package/lib/esm/src/shared/utils/NullLoggerPublisherService.test.js.map +7 -0
  25. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  26. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  27. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
  28. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
  29. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
  30. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +3 -3
  31. package/lib/types/src/shared/utils/NullLoggerPublisherService.d.ts +3 -0
  32. package/lib/types/src/shared/utils/NullLoggerPublisherService.d.ts.map +1 -0
  33. package/lib/types/src/shared/utils/NullLoggerPublisherService.test.d.ts +2 -0
  34. package/lib/types/src/shared/utils/NullLoggerPublisherService.test.d.ts.map +1 -0
  35. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  36. package/package.json +5 -5
  37. package/lib/cjs/src/shared/utils/NullLoggerFactory.js +0 -2
  38. package/lib/cjs/src/shared/utils/NullLoggerFactory.js.map +0 -7
  39. package/lib/cjs/src/shared/utils/NullLoggerFactory.test.js +0 -2
  40. package/lib/cjs/src/shared/utils/NullLoggerFactory.test.js.map +0 -7
  41. package/lib/esm/src/shared/utils/NullLoggerFactory.js +0 -2
  42. package/lib/esm/src/shared/utils/NullLoggerFactory.js.map +0 -7
  43. package/lib/esm/src/shared/utils/NullLoggerFactory.test.js +0 -2
  44. package/lib/esm/src/shared/utils/NullLoggerFactory.test.js.map +0 -7
  45. package/lib/types/src/shared/utils/NullLoggerFactory.d.ts +0 -3
  46. package/lib/types/src/shared/utils/NullLoggerFactory.d.ts.map +0 -1
  47. package/lib/types/src/shared/utils/NullLoggerFactory.test.d.ts +0 -2
  48. package/lib/types/src/shared/utils/NullLoggerFactory.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/DefaultContextModule.test.ts"],
4
- "sourcesContent": ["import { type ContextModuleConfig } from \"./config/model/ContextModuleConfig\";\nimport { type ContextFieldLoader } from \"./shared/domain/ContextFieldLoader\";\nimport { type ContextLoader } from \"./shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"./shared/model/ClearSignContext\";\nimport { type TypedDataContext } from \"./shared/model/TypedDataContext\";\nimport { NullLoggerFactory } from \"./shared/utils/NullLoggerFactory\";\nimport type { TypedDataContextLoader } from \"./typed-data/domain/TypedDataContextLoader\";\nimport { DefaultContextModule } from \"./DefaultContextModule\";\n\nconst contextLoaderStubBuilder = (canHandle: boolean): ContextLoader => {\n return {\n load: vi.fn(),\n canHandle: vi\n .fn()\n .mockReturnValue(canHandle) as unknown as ContextLoader[\"canHandle\"],\n };\n};\n\nconst fieldLoaderStubBuilder = (): ContextFieldLoader => {\n return {\n canHandle: vi.fn() as unknown as ContextFieldLoader[\"canHandle\"],\n loadField: vi.fn(),\n };\n};\n\ndescribe(\"DefaultContextModule\", () => {\n const typedDataLoader: TypedDataContextLoader = { load: vi.fn() };\n const defaultContextModuleConfig: ContextModuleConfig = {\n customLoaders: [],\n defaultLoaders: false,\n defaultFieldLoaders: false,\n customFieldLoaders: [],\n customTypedDataLoader: typedDataLoader,\n cal: {\n url: \"https://cal/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n web3checks: {\n url: \"https://web3checks/v3\",\n },\n metadataServiceDomain: {\n url: \"https://metadata.com\",\n },\n originToken: \"originToken\",\n loggerFactory: NullLoggerFactory,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"should initialize the context module with all the default loaders\", async () => {\n const contextModule = new DefaultContextModule(defaultContextModuleConfig);\n\n const res = await contextModule.getContexts({});\n\n expect(res).toEqual([]);\n });\n\n it(\"should return an empty array when no loaders\", async () => {\n const contextModule = new DefaultContextModule(defaultContextModuleConfig);\n\n const res = await contextModule.getContexts({});\n\n expect(res).toEqual([]);\n });\n\n it(\"should call all fetch method from metadata fetcher\", async () => {\n const loader = contextLoaderStubBuilder(true);\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader, loader],\n });\n\n await contextModule.getContexts({});\n\n expect(loader.canHandle).toHaveBeenCalledTimes(2);\n expect(loader.load).toHaveBeenCalledTimes(2);\n });\n\n it(\"should return an array of context response\", async () => {\n const loader = contextLoaderStubBuilder(true);\n const responses = [\n [{ type: \"provideERC20Info\", payload: \"payload1\" }],\n [\n { type: \"provideERC20Info\", payload: \"payload2\" },\n { type: \"plugin\", payload: \"payload3\" },\n ],\n ] as ClearSignContext[][];\n vi.spyOn(loader, \"load\")\n .mockResolvedValueOnce(responses[0]!)\n .mockResolvedValueOnce(responses[1]!);\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader, loader],\n });\n\n const res = await contextModule.getContexts({});\n\n expect(loader.canHandle).toHaveBeenCalledTimes(2);\n expect(loader.load).toHaveBeenCalledTimes(2);\n expect(res).toEqual(responses.flat());\n });\n\n it(\"should only call loaders that can handle the input\", async () => {\n const loader1 = contextLoaderStubBuilder(true);\n const loader2 = contextLoaderStubBuilder(true);\n\n vi.spyOn(loader1, \"canHandle\").mockReturnValue(true);\n vi.spyOn(loader2, \"canHandle\").mockReturnValue(false);\n vi.spyOn(loader1, \"load\").mockResolvedValue([\n { type: ClearSignContextType.TOKEN, payload: \"payload1\" },\n ]);\n vi.spyOn(loader2, \"load\").mockResolvedValue([\n { type: ClearSignContextType.NFT, payload: \"payload2\" },\n ]);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader1, loader2],\n });\n\n const testInput = { to: \"0x123\", selector: \"0xabc\" };\n const res = await contextModule.getContexts(testInput);\n\n expect(loader1.canHandle).toHaveBeenCalledWith(\n testInput,\n Object.values(ClearSignContextType),\n );\n expect(loader2.canHandle).toHaveBeenCalledWith(\n testInput,\n Object.values(ClearSignContextType),\n );\n expect(loader1.load).toHaveBeenCalledWith(testInput);\n expect(loader2.load).not.toHaveBeenCalled(); // Should not be called since canHandle returned false\n expect(res).toEqual([{ type: \"token\", payload: \"payload1\" }]);\n });\n\n it(\"should use expected types if provided\", async () => {\n const loader = contextLoaderStubBuilder(true);\n\n vi.spyOn(loader, \"canHandle\").mockReturnValue(true);\n\n vi.spyOn(loader, \"load\").mockResolvedValue([\n { type: ClearSignContextType.TOKEN, payload: \"payload1\" },\n ]);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader],\n });\n\n const testInput = { to: \"0x123\", selector: \"0xabc\" };\n await contextModule.getContexts(testInput, [ClearSignContextType.TOKEN]);\n\n expect(loader.canHandle).toHaveBeenCalledWith(testInput, [\n ClearSignContextType.TOKEN,\n ]);\n });\n\n it(\"should call the typed data loader\", async () => {\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customTypedDataLoader: typedDataLoader,\n });\n\n await contextModule.getTypedDataFilters({} as TypedDataContext);\n\n expect(typedDataLoader.load).toHaveBeenCalledTimes(1);\n });\n\n describe(\"getFieldContext\", () => {\n it(\"should return error when no loader can handle the field\", async () => {\n // GIVEN\n const fieldLoader = fieldLoaderStubBuilder();\n vi.spyOn(fieldLoader, \"canHandle\").mockReturnValue(false);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader],\n });\n\n const testField = { type: \"unknown\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader.loadField).not.toHaveBeenCalled();\n expect(result).toEqual({\n type: ClearSignContextType.ERROR,\n error: new Error(\n `Loader not found for field: ${testField} and expected type: ${ClearSignContextType.TOKEN}`,\n ),\n });\n });\n\n it(\"should return context when a loader can handle the field\", async () => {\n // GIVEN\n const fieldLoader = fieldLoaderStubBuilder();\n const mockContext: ClearSignContext = {\n type: ClearSignContextType.TOKEN,\n payload: \"test-payload\",\n };\n\n vi.spyOn(fieldLoader, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader, \"loadField\").mockResolvedValue(mockContext);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader],\n });\n\n const testField = { type: \"token\", address: \"0x123\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader.loadField).toHaveBeenCalledWith(testField);\n expect(result).toEqual(mockContext);\n });\n\n it(\"should return first context when multiple loaders can handle the field\", async () => {\n // GIVEN\n const fieldLoader1 = fieldLoaderStubBuilder();\n const fieldLoader2 = fieldLoaderStubBuilder();\n\n const mockContext1: ClearSignContext = {\n type: ClearSignContextType.TOKEN,\n payload: \"first-payload\",\n };\n const mockContext2: ClearSignContext = {\n type: ClearSignContextType.NFT,\n payload: \"second-payload\",\n };\n\n vi.spyOn(fieldLoader1, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader2, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader1, \"loadField\").mockResolvedValue(mockContext1);\n vi.spyOn(fieldLoader2, \"loadField\").mockResolvedValue(mockContext2);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader1, fieldLoader2],\n });\n\n const testField = { type: \"multi\", address: \"0x123\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader1.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader2.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader1.loadField).toHaveBeenCalledWith(testField);\n expect(fieldLoader2.loadField).not.toHaveBeenCalled();\n expect(result).toEqual(mockContext1); // Should return first context\n });\n\n it(\"should return second context when first context is an error\", async () => {\n // GIVEN\n const fieldLoader1 = fieldLoaderStubBuilder();\n const fieldLoader2 = fieldLoaderStubBuilder();\n const mockContext1: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"first-error\"),\n };\n const mockContext2: ClearSignContext = {\n type: ClearSignContextType.TOKEN,\n payload: \"second-payload\",\n };\n vi.spyOn(fieldLoader1, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader2, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader1, \"loadField\").mockResolvedValue(mockContext1);\n vi.spyOn(fieldLoader2, \"loadField\").mockResolvedValue(mockContext2);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader1, fieldLoader2],\n });\n\n const testField = { type: \"error\", address: \"0x123\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader1.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader2.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader1.loadField).toHaveBeenCalledWith(testField);\n expect(fieldLoader2.loadField).toHaveBeenCalledWith(testField);\n expect(result).toEqual(mockContext2);\n });\n\n it(\"should handle loader rejection gracefully\", async () => {\n // GIVEN\n const fieldLoader = fieldLoaderStubBuilder();\n const loadError = new Error(\"Load field failed\");\n\n vi.spyOn(fieldLoader, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader, \"loadField\").mockRejectedValue(loadError);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader],\n });\n\n const testField = { type: \"error\", address: \"0x123\" };\n\n // WHEN & THEN\n await expect(\n contextModule.getFieldContext(testField, ClearSignContextType.TOKEN),\n ).rejects.toThrow(\"Load field failed\");\n\n expect(fieldLoader.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader.loadField).toHaveBeenCalledWith(testField);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["ClearSignContextType", "NullLoggerFactory", "DefaultContextModule", "contextLoaderStubBuilder", "canHandle", "fieldLoaderStubBuilder", "typedDataLoader", "defaultContextModuleConfig", "res", "loader", "responses", "loader1", "loader2", "contextModule", "testInput", "fieldLoader", "testField", "result", "mockContext", "fieldLoader1", "fieldLoader2", "mockContext1", "mockContext2", "loadError"]
4
+ "sourcesContent": ["import { type ContextModuleConfig } from \"./config/model/ContextModuleConfig\";\nimport { type ContextFieldLoader } from \"./shared/domain/ContextFieldLoader\";\nimport { type ContextLoader } from \"./shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"./shared/model/ClearSignContext\";\nimport { type TypedDataContext } from \"./shared/model/TypedDataContext\";\nimport { NullLoggerPublisherService } from \"./shared/utils/NullLoggerPublisherService\";\nimport type { TypedDataContextLoader } from \"./typed-data/domain/TypedDataContextLoader\";\nimport { DefaultContextModule } from \"./DefaultContextModule\";\n\nconst contextLoaderStubBuilder = (canHandle: boolean): ContextLoader => {\n return {\n load: vi.fn(),\n canHandle: vi\n .fn()\n .mockReturnValue(canHandle) as unknown as ContextLoader[\"canHandle\"],\n };\n};\n\nconst fieldLoaderStubBuilder = (): ContextFieldLoader => {\n return {\n canHandle: vi.fn() as unknown as ContextFieldLoader[\"canHandle\"],\n loadField: vi.fn(),\n };\n};\n\ndescribe(\"DefaultContextModule\", () => {\n const typedDataLoader: TypedDataContextLoader = { load: vi.fn() };\n const defaultContextModuleConfig: ContextModuleConfig = {\n customLoaders: [],\n defaultLoaders: false,\n defaultFieldLoaders: false,\n customFieldLoaders: [],\n customTypedDataLoader: typedDataLoader,\n cal: {\n url: \"https://cal/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n web3checks: {\n url: \"https://web3checks/v3\",\n },\n metadataServiceDomain: {\n url: \"https://metadata.com\",\n },\n originToken: \"originToken\",\n loggerFactory: NullLoggerPublisherService,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"should initialize the context module with all the default loaders\", async () => {\n const contextModule = new DefaultContextModule(defaultContextModuleConfig);\n\n const res = await contextModule.getContexts({});\n\n expect(res).toEqual([]);\n });\n\n it(\"should return an empty array when no loaders\", async () => {\n const contextModule = new DefaultContextModule(defaultContextModuleConfig);\n\n const res = await contextModule.getContexts({});\n\n expect(res).toEqual([]);\n });\n\n it(\"should call all fetch method from metadata fetcher\", async () => {\n const loader = contextLoaderStubBuilder(true);\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader, loader],\n });\n\n await contextModule.getContexts({});\n\n expect(loader.canHandle).toHaveBeenCalledTimes(2);\n expect(loader.load).toHaveBeenCalledTimes(2);\n });\n\n it(\"should return an array of context response\", async () => {\n const loader = contextLoaderStubBuilder(true);\n const responses = [\n [{ type: \"provideERC20Info\", payload: \"payload1\" }],\n [\n { type: \"provideERC20Info\", payload: \"payload2\" },\n { type: \"plugin\", payload: \"payload3\" },\n ],\n ] as ClearSignContext[][];\n vi.spyOn(loader, \"load\")\n .mockResolvedValueOnce(responses[0]!)\n .mockResolvedValueOnce(responses[1]!);\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader, loader],\n });\n\n const res = await contextModule.getContexts({});\n\n expect(loader.canHandle).toHaveBeenCalledTimes(2);\n expect(loader.load).toHaveBeenCalledTimes(2);\n expect(res).toEqual(responses.flat());\n });\n\n it(\"should only call loaders that can handle the input\", async () => {\n const loader1 = contextLoaderStubBuilder(true);\n const loader2 = contextLoaderStubBuilder(true);\n\n vi.spyOn(loader1, \"canHandle\").mockReturnValue(true);\n vi.spyOn(loader2, \"canHandle\").mockReturnValue(false);\n vi.spyOn(loader1, \"load\").mockResolvedValue([\n { type: ClearSignContextType.TOKEN, payload: \"payload1\" },\n ]);\n vi.spyOn(loader2, \"load\").mockResolvedValue([\n { type: ClearSignContextType.NFT, payload: \"payload2\" },\n ]);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader1, loader2],\n });\n\n const testInput = { to: \"0x123\", selector: \"0xabc\" };\n const res = await contextModule.getContexts(testInput);\n\n expect(loader1.canHandle).toHaveBeenCalledWith(\n testInput,\n Object.values(ClearSignContextType),\n );\n expect(loader2.canHandle).toHaveBeenCalledWith(\n testInput,\n Object.values(ClearSignContextType),\n );\n expect(loader1.load).toHaveBeenCalledWith(testInput);\n expect(loader2.load).not.toHaveBeenCalled(); // Should not be called since canHandle returned false\n expect(res).toEqual([{ type: \"token\", payload: \"payload1\" }]);\n });\n\n it(\"should use expected types if provided\", async () => {\n const loader = contextLoaderStubBuilder(true);\n\n vi.spyOn(loader, \"canHandle\").mockReturnValue(true);\n\n vi.spyOn(loader, \"load\").mockResolvedValue([\n { type: ClearSignContextType.TOKEN, payload: \"payload1\" },\n ]);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customLoaders: [loader],\n });\n\n const testInput = { to: \"0x123\", selector: \"0xabc\" };\n await contextModule.getContexts(testInput, [ClearSignContextType.TOKEN]);\n\n expect(loader.canHandle).toHaveBeenCalledWith(testInput, [\n ClearSignContextType.TOKEN,\n ]);\n });\n\n it(\"should call the typed data loader\", async () => {\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customTypedDataLoader: typedDataLoader,\n });\n\n await contextModule.getTypedDataFilters({} as TypedDataContext);\n\n expect(typedDataLoader.load).toHaveBeenCalledTimes(1);\n });\n\n describe(\"getFieldContext\", () => {\n it(\"should return error when no loader can handle the field\", async () => {\n // GIVEN\n const fieldLoader = fieldLoaderStubBuilder();\n vi.spyOn(fieldLoader, \"canHandle\").mockReturnValue(false);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader],\n });\n\n const testField = { type: \"unknown\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader.loadField).not.toHaveBeenCalled();\n expect(result).toEqual({\n type: ClearSignContextType.ERROR,\n error: new Error(\n `Loader not found for field: ${testField} and expected type: ${ClearSignContextType.TOKEN}`,\n ),\n });\n });\n\n it(\"should return context when a loader can handle the field\", async () => {\n // GIVEN\n const fieldLoader = fieldLoaderStubBuilder();\n const mockContext: ClearSignContext = {\n type: ClearSignContextType.TOKEN,\n payload: \"test-payload\",\n };\n\n vi.spyOn(fieldLoader, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader, \"loadField\").mockResolvedValue(mockContext);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader],\n });\n\n const testField = { type: \"token\", address: \"0x123\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader.loadField).toHaveBeenCalledWith(testField);\n expect(result).toEqual(mockContext);\n });\n\n it(\"should return first context when multiple loaders can handle the field\", async () => {\n // GIVEN\n const fieldLoader1 = fieldLoaderStubBuilder();\n const fieldLoader2 = fieldLoaderStubBuilder();\n\n const mockContext1: ClearSignContext = {\n type: ClearSignContextType.TOKEN,\n payload: \"first-payload\",\n };\n const mockContext2: ClearSignContext = {\n type: ClearSignContextType.NFT,\n payload: \"second-payload\",\n };\n\n vi.spyOn(fieldLoader1, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader2, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader1, \"loadField\").mockResolvedValue(mockContext1);\n vi.spyOn(fieldLoader2, \"loadField\").mockResolvedValue(mockContext2);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader1, fieldLoader2],\n });\n\n const testField = { type: \"multi\", address: \"0x123\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader1.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader2.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader1.loadField).toHaveBeenCalledWith(testField);\n expect(fieldLoader2.loadField).not.toHaveBeenCalled();\n expect(result).toEqual(mockContext1); // Should return first context\n });\n\n it(\"should return second context when first context is an error\", async () => {\n // GIVEN\n const fieldLoader1 = fieldLoaderStubBuilder();\n const fieldLoader2 = fieldLoaderStubBuilder();\n const mockContext1: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"first-error\"),\n };\n const mockContext2: ClearSignContext = {\n type: ClearSignContextType.TOKEN,\n payload: \"second-payload\",\n };\n vi.spyOn(fieldLoader1, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader2, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader1, \"loadField\").mockResolvedValue(mockContext1);\n vi.spyOn(fieldLoader2, \"loadField\").mockResolvedValue(mockContext2);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader1, fieldLoader2],\n });\n\n const testField = { type: \"error\", address: \"0x123\" };\n\n // WHEN\n const result = await contextModule.getFieldContext(\n testField,\n ClearSignContextType.TOKEN,\n );\n\n // THEN\n expect(fieldLoader1.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader2.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader1.loadField).toHaveBeenCalledWith(testField);\n expect(fieldLoader2.loadField).toHaveBeenCalledWith(testField);\n expect(result).toEqual(mockContext2);\n });\n\n it(\"should handle loader rejection gracefully\", async () => {\n // GIVEN\n const fieldLoader = fieldLoaderStubBuilder();\n const loadError = new Error(\"Load field failed\");\n\n vi.spyOn(fieldLoader, \"canHandle\").mockReturnValue(true);\n vi.spyOn(fieldLoader, \"loadField\").mockRejectedValue(loadError);\n\n const contextModule = new DefaultContextModule({\n ...defaultContextModuleConfig,\n customFieldLoaders: [fieldLoader],\n });\n\n const testField = { type: \"error\", address: \"0x123\" };\n\n // WHEN & THEN\n await expect(\n contextModule.getFieldContext(testField, ClearSignContextType.TOKEN),\n ).rejects.toThrow(\"Load field failed\");\n\n expect(fieldLoader.canHandle).toHaveBeenCalledWith(\n testField,\n ClearSignContextType.TOKEN,\n );\n expect(fieldLoader.loadField).toHaveBeenCalledWith(testField);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["ClearSignContextType", "NullLoggerPublisherService", "DefaultContextModule", "contextLoaderStubBuilder", "canHandle", "fieldLoaderStubBuilder", "typedDataLoader", "defaultContextModuleConfig", "res", "loader", "responses", "loader1", "loader2", "contextModule", "testInput", "fieldLoader", "testField", "result", "mockContext", "fieldLoader1", "fieldLoader2", "mockContext1", "mockContext2", "loadError"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ const r=e=>({debug:()=>{},info:()=>{},warn:()=>{},error:()=>{},subscribers:[]});export{r as NullLoggerPublisherService};
2
+ //# sourceMappingURL=NullLoggerPublisherService.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/NullLoggerPublisherService.ts"],
4
+ "sourcesContent": ["import type { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\n\nexport const NullLoggerPublisherService: (\n tag: string,\n) => LoggerPublisherService = (_tag: string) => ({\n debug: () => {\n // no-op\n },\n info: () => {\n // no-op\n },\n warn: () => {\n // no-op\n },\n error: () => {\n // no-op\n },\n subscribers: [],\n});\n"],
5
+ "mappings": "AAEO,MAAMA,EAEkBC,IAAkB,CAC/C,MAAO,IAAM,CAEb,EACA,KAAM,IAAM,CAEZ,EACA,KAAM,IAAM,CAEZ,EACA,MAAO,IAAM,CAEb,EACA,YAAa,CAAC,CAChB",
6
+ "names": ["NullLoggerPublisherService", "_tag"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{describe as i,expect as o,it as t}from"vitest";import{NullLoggerPublisherService as r}from"./NullLoggerPublisherService";i("NullLoggerPublisherService",()=>{t("returns a LoggerPublisherService-like obj",()=>{const e=r("any-tag");o(e).toBeDefined(),o(typeof e.debug).toBe("function"),o(typeof e.info).toBe("function"),o(typeof e.warn).toBe("function"),o(typeof e.error).toBe("function"),o(Array.isArray(e.subscribers)).toBe(!0),o(e.subscribers).toHaveLength(0)}),t("methods are no-ops (do not throw)",()=>{const e=r("test");o(()=>e.debug("hello")).not.toThrow(),o(()=>e.info("hello")).not.toThrow(),o(()=>e.warn("hello")).not.toThrow(),o(()=>e.error("hello")).not.toThrow(),o(()=>e.debug("hello",{data:{a:1}})).not.toThrow()}),t("returns a new object per call (current implementation)",()=>{const e=r("x"),n=r("x");o(e).not.toBe(n)})});
2
+ //# sourceMappingURL=NullLoggerPublisherService.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/NullLoggerPublisherService.test.ts"],
4
+ "sourcesContent": ["import type { LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { NullLoggerPublisherService } from \"./NullLoggerPublisherService\";\n\ndescribe(\"NullLoggerPublisherService\", () => {\n it(\"returns a LoggerPublisherService-like obj\", () => {\n const logger = NullLoggerPublisherService(\n \"any-tag\",\n ) as LoggerPublisherService;\n\n expect(logger).toBeDefined();\n expect(typeof logger.debug).toBe(\"function\");\n expect(typeof logger.info).toBe(\"function\");\n expect(typeof logger.warn).toBe(\"function\");\n expect(typeof logger.error).toBe(\"function\");\n expect(Array.isArray(logger.subscribers)).toBe(true);\n expect(logger.subscribers).toHaveLength(0);\n });\n\n it(\"methods are no-ops (do not throw)\", () => {\n const logger = NullLoggerPublisherService(\"test\");\n\n expect(() => logger.debug(\"hello\")).not.toThrow();\n expect(() => logger.info(\"hello\")).not.toThrow();\n expect(() => logger.warn(\"hello\")).not.toThrow();\n expect(() => logger.error(\"hello\")).not.toThrow();\n\n expect(() => logger.debug(\"hello\", { data: { a: 1 } })).not.toThrow();\n });\n\n it(\"returns a new object per call (current implementation)\", () => {\n const logger1 = NullLoggerPublisherService(\"x\");\n const logger2 = NullLoggerPublisherService(\"x\");\n\n expect(logger1).not.toBe(logger2);\n });\n});\n"],
5
+ "mappings": "AACA,OAAS,YAAAA,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OAAS,8BAAAC,MAAkC,+BAE3CH,EAAS,6BAA8B,IAAM,CAC3CE,EAAG,4CAA6C,IAAM,CACpD,MAAME,EAASD,EACb,SACF,EAEAF,EAAOG,CAAM,EAAE,YAAY,EAC3BH,EAAO,OAAOG,EAAO,KAAK,EAAE,KAAK,UAAU,EAC3CH,EAAO,OAAOG,EAAO,IAAI,EAAE,KAAK,UAAU,EAC1CH,EAAO,OAAOG,EAAO,IAAI,EAAE,KAAK,UAAU,EAC1CH,EAAO,OAAOG,EAAO,KAAK,EAAE,KAAK,UAAU,EAC3CH,EAAO,MAAM,QAAQG,EAAO,WAAW,CAAC,EAAE,KAAK,EAAI,EACnDH,EAAOG,EAAO,WAAW,EAAE,aAAa,CAAC,CAC3C,CAAC,EAEDF,EAAG,oCAAqC,IAAM,CAC5C,MAAME,EAASD,EAA2B,MAAM,EAEhDF,EAAO,IAAMG,EAAO,MAAM,OAAO,CAAC,EAAE,IAAI,QAAQ,EAChDH,EAAO,IAAMG,EAAO,KAAK,OAAO,CAAC,EAAE,IAAI,QAAQ,EAC/CH,EAAO,IAAMG,EAAO,KAAK,OAAO,CAAC,EAAE,IAAI,QAAQ,EAC/CH,EAAO,IAAMG,EAAO,MAAM,OAAO,CAAC,EAAE,IAAI,QAAQ,EAEhDH,EAAO,IAAMG,EAAO,MAAM,QAAS,CAAE,KAAM,CAAE,EAAG,CAAE,CAAE,CAAC,CAAC,EAAE,IAAI,QAAQ,CACtE,CAAC,EAEDF,EAAG,yDAA0D,IAAM,CACjE,MAAMG,EAAUF,EAA2B,GAAG,EACxCG,EAAUH,EAA2B,GAAG,EAE9CF,EAAOI,CAAO,EAAE,IAAI,KAAKC,CAAO,CAClC,CAAC,CACH,CAAC",
6
+ "names": ["describe", "expect", "it", "NullLoggerPublisherService", "logger", "logger1", "logger2"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as y}from"@ledgerhq/device-management-kit";import{Left as m,Right as f}from"purify-ts";import{beforeEach as g,describe as k,expect as o,it as s,vi as t}from"vitest";import{KeyUsage as T}from"../../pki/model/KeyUsage";import{SolanaContextTypes as d}from"../../shared/model/SolanaContextTypes";import{NullLoggerFactory as I}from"../../shared/utils/NullLoggerFactory";import{SolanaTokenContextLoader as O}from"../../solanaToken/domain/SolanaTokenContextLoader";k("SolanaTokenContextLoader",()=>{let l,i;const c=new Uint8Array([240,202,204,26]),n={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},p={tokenInternalId:"token-1",deviceModelId:y.FLEX};g(()=>{t.restoreAllMocks(),l={getTokenInfosPayload:t.fn()},i={loadCertificate:t.fn()}});const r=e=>{const a={cal:{mode:e}};return new O(l,a,i,I)};k("canHandle",()=>{s("returns true when tokenInternalId is provided",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:"abc123"},d.SOLANA_TOKEN)).toBe(!0)}),s("returns false when tokenInternalId is missing or falsy",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:""},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({tokenInternalId:void 0},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({},d.SOLANA_TOKEN)).toBe(!1)})}),k("loadField",()=>{s("returns an error when datasource returns Left(error) and still fetched certificate beforehand",async()=>{const e=r("prod"),a=new Error("datasource failed");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(m(a)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const u=await e.loadField(p);o(l.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),o(i.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:T.CoinMeta,targetDevice:p.deviceModelId}),o(u).toEqual({type:d.ERROR,error:a})}),s("returns SOLANA_TOKEN with prod signature by default (falsy mode), and includes certificate",async()=>{const e=r("");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-2"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:c}})}),s("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const e=r("test");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-3"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:c}})}),s("works even if certificate loader returns undefined (certificate omitted)",async()=>{const e=r("prod");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue(void 0);const a=await e.loadField(p);o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),k("pluckTokenData (private)",()=>{s("picks the signature for the configured mode",()=>{const e=r("test"),u=e.pluckTokenData.bind(e)(n);o(u).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}})}),s("falls back to 'prod' when config.cal.mode is falsy",()=>{const a=r(void 0).pluckTokenData(n);o(a).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}})})})});
1
+ import{DeviceModelId as y}from"@ledgerhq/device-management-kit";import{Left as m,Right as f}from"purify-ts";import{beforeEach as g,describe as k,expect as o,it as s,vi as t}from"vitest";import{KeyUsage as T}from"../../pki/model/KeyUsage";import{SolanaContextTypes as d}from"../../shared/model/SolanaContextTypes";import{NullLoggerPublisherService as I}from"../../shared/utils/NullLoggerPublisherService";import{SolanaTokenContextLoader as O}from"../../solanaToken/domain/SolanaTokenContextLoader";k("SolanaTokenContextLoader",()=>{let l,i;const c=new Uint8Array([240,202,204,26]),n={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},p={tokenInternalId:"token-1",deviceModelId:y.FLEX};g(()=>{t.restoreAllMocks(),l={getTokenInfosPayload:t.fn()},i={loadCertificate:t.fn()}});const r=e=>{const a={cal:{mode:e}};return new O(l,a,i,I)};k("canHandle",()=>{s("returns true when tokenInternalId is provided",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:"abc123"},d.SOLANA_TOKEN)).toBe(!0)}),s("returns false when tokenInternalId is missing or falsy",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:""},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({tokenInternalId:void 0},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({},d.SOLANA_TOKEN)).toBe(!1)})}),k("loadField",()=>{s("returns an error when datasource returns Left(error) and still fetched certificate beforehand",async()=>{const e=r("prod"),a=new Error("datasource failed");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(m(a)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const u=await e.loadField(p);o(l.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),o(i.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:T.CoinMeta,targetDevice:p.deviceModelId}),o(u).toEqual({type:d.ERROR,error:a})}),s("returns SOLANA_TOKEN with prod signature by default (falsy mode), and includes certificate",async()=>{const e=r("");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-2"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:c}})}),s("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const e=r("test");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-3"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:c}})}),s("works even if certificate loader returns undefined (certificate omitted)",async()=>{const e=r("prod");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue(void 0);const a=await e.loadField(p);o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),k("pluckTokenData (private)",()=>{s("picks the signature for the configured mode",()=>{const e=r("test"),u=e.pluckTokenData.bind(e)(n);o(u).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}})}),s("falls back to 'prod' when config.cal.mode is falsy",()=>{const a=r(void 0).pluckTokenData(n);o(a).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}})})})});
2
2
  //# sourceMappingURL=DefaultSolanaContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/solana/domain/DefaultSolanaContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { SolanaContextTypes } from \"@/shared/model/SolanaContextTypes\";\nimport { NullLoggerFactory } from \"@/shared/utils/NullLoggerFactory\";\nimport type { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\nimport { SolanaTokenContextLoader } from \"@/solanaToken/domain/SolanaTokenContextLoader\";\n\ndescribe(\"SolanaTokenContextLoader\", () => {\n let mockDataSource: SolanaTokenDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const bytes = new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]);\n\n const tokenDataResponse: TokenDataResponse = {\n descriptor: {\n data: { symbol: \"SOL\", name: \"Solana\", decimals: 9 } as any,\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n } as any,\n },\n } as any;\n\n const baseCtx = {\n tokenInternalId: \"token-1\",\n deviceModelId: DeviceModelId.FLEX,\n } as any;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getTokenInfosPayload: vi.fn(),\n } as unknown as SolanaTokenDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = (mode?: string) => {\n const config = { cal: { mode } } as unknown as ContextModuleConfig;\n return new SolanaTokenContextLoader(\n mockDataSource,\n config,\n mockCertLoader,\n NullLoggerFactory,\n );\n };\n\n describe(\"canHandle\", () => {\n it(\"returns true when tokenInternalId is provided\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n {\n tokenInternalId: \"abc123\",\n } as SolanaTransactionContext,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when tokenInternalId is missing or falsy\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n { tokenInternalId: \"\" } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { tokenInternalId: undefined } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_TOKEN)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error) and still fetched certificate beforehand\", async () => {\n const loader = makeLoader(\"prod\");\n const error = new Error(\"datasource failed\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Left(error),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField(baseCtx);\n\n expect(mockDataSource.getTokenInfosPayload).toHaveBeenCalledWith({\n tokenInternalId: \"token-1\",\n });\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: baseCtx.deviceModelId,\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_TOKEN with prod signature by default (falsy mode), and includes certificate\", async () => {\n const loader = makeLoader(\"\"); // falsy -> default 'prod'\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-2\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: { keyUsageNumber: 0, payload: bytes },\n });\n });\n\n it(\"returns SOLANA_TOKEN with signature matching config.cal.mode\", async () => {\n const loader = makeLoader(\"test\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 1,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-3\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n },\n certificate: { keyUsageNumber: 1, payload: bytes },\n });\n });\n\n it(\"works even if certificate loader returns undefined (certificate omitted)\", async () => {\n const loader = makeLoader(\"prod\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const result = await loader.loadField(baseCtx);\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: undefined,\n });\n });\n });\n\n describe(\"pluckTokenData (private)\", () => {\n it(\"picks the signature for the configured mode\", () => {\n const loader = makeLoader(\"test\");\n const pluck = (loader as any).pluckTokenData.bind(loader);\n\n const result = pluck(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n });\n });\n\n it(\"falls back to 'prod' when config.cal.mode is falsy\", () => {\n const loader = makeLoader(undefined as any);\n const result = (loader as any).pluckTokenData(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "KeyUsage", "SolanaContextTypes", "NullLoggerFactory", "SolanaTokenContextLoader", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { SolanaContextTypes } from \"@/shared/model/SolanaContextTypes\";\nimport { NullLoggerPublisherService } from \"@/shared/utils/NullLoggerPublisherService\";\nimport type { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\nimport { SolanaTokenContextLoader } from \"@/solanaToken/domain/SolanaTokenContextLoader\";\n\ndescribe(\"SolanaTokenContextLoader\", () => {\n let mockDataSource: SolanaTokenDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const bytes = new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]);\n\n const tokenDataResponse: TokenDataResponse = {\n descriptor: {\n data: { symbol: \"SOL\", name: \"Solana\", decimals: 9 } as any,\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n } as any,\n },\n } as any;\n\n const baseCtx = {\n tokenInternalId: \"token-1\",\n deviceModelId: DeviceModelId.FLEX,\n } as any;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getTokenInfosPayload: vi.fn(),\n } as unknown as SolanaTokenDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = (mode?: string) => {\n const config = { cal: { mode } } as unknown as ContextModuleConfig;\n return new SolanaTokenContextLoader(\n mockDataSource,\n config,\n mockCertLoader,\n NullLoggerPublisherService,\n );\n };\n\n describe(\"canHandle\", () => {\n it(\"returns true when tokenInternalId is provided\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n {\n tokenInternalId: \"abc123\",\n } as SolanaTransactionContext,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when tokenInternalId is missing or falsy\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n { tokenInternalId: \"\" } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { tokenInternalId: undefined } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_TOKEN)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error) and still fetched certificate beforehand\", async () => {\n const loader = makeLoader(\"prod\");\n const error = new Error(\"datasource failed\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Left(error),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField(baseCtx);\n\n expect(mockDataSource.getTokenInfosPayload).toHaveBeenCalledWith({\n tokenInternalId: \"token-1\",\n });\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: baseCtx.deviceModelId,\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_TOKEN with prod signature by default (falsy mode), and includes certificate\", async () => {\n const loader = makeLoader(\"\"); // falsy -> default 'prod'\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-2\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: { keyUsageNumber: 0, payload: bytes },\n });\n });\n\n it(\"returns SOLANA_TOKEN with signature matching config.cal.mode\", async () => {\n const loader = makeLoader(\"test\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 1,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-3\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n },\n certificate: { keyUsageNumber: 1, payload: bytes },\n });\n });\n\n it(\"works even if certificate loader returns undefined (certificate omitted)\", async () => {\n const loader = makeLoader(\"prod\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const result = await loader.loadField(baseCtx);\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: undefined,\n });\n });\n });\n\n describe(\"pluckTokenData (private)\", () => {\n it(\"picks the signature for the configured mode\", () => {\n const loader = makeLoader(\"test\");\n const pluck = (loader as any).pluckTokenData.bind(loader);\n\n const result = pluck(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n });\n });\n\n it(\"falls back to 'prod' when config.cal.mode is falsy\", () => {\n const loader = makeLoader(undefined as any);\n const result = (loader as any).pluckTokenData(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n });\n });\n });\n});\n"],
5
+ "mappings": "AAIA,OAAS,iBAAAA,MAAqB,kCAC9B,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,YAAAC,MAAgB,uBACzB,OAAS,sBAAAC,MAA0B,oCACnC,OAAS,8BAAAC,MAAkC,4CAM3C,OAAS,4BAAAC,MAAgC,gDAEzCP,EAAS,2BAA4B,IAAM,CACzC,IAAIQ,EACAC,EAEJ,MAAMC,EAAQ,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC,EAE/CC,EAAuC,CAC3C,WAAY,CACV,KAAM,CAAE,OAAQ,MAAO,KAAM,SAAU,SAAU,CAAE,EACnD,WAAY,CACV,KAAM,WACN,KAAM,UACR,CACF,CACF,EAEMC,EAAU,CACd,gBAAiB,UACjB,cAAehB,EAAc,IAC/B,EAEAG,EAAW,IAAM,CACfI,EAAG,gBAAgB,EAEnBK,EAAiB,CACf,qBAAsBL,EAAG,GAAG,CAC9B,EAEAM,EAAiB,CACf,gBAAiBN,EAAG,GAAG,CACzB,CACF,CAAC,EAED,MAAMU,EAAcC,GAAkB,CACpC,MAAMC,EAAS,CAAE,IAAK,CAAE,KAAAD,CAAK,CAAE,EAC/B,OAAO,IAAIP,EACTC,EACAO,EACAN,EACAH,CACF,CACF,EAEAN,EAAS,YAAa,IAAM,CAC1BE,EAAG,gDAAiD,IAAM,CACxD,MAAMc,EAASH,EAAW,MAAM,EAEhCZ,EACEe,EAAO,UACL,CACE,gBAAiB,QACnB,EACAX,EAAmB,YACrB,CACF,EAAE,KAAK,EAAI,CACb,CAAC,EAEDH,EAAG,yDAA0D,IAAM,CACjE,MAAMc,EAASH,EAAW,MAAM,EAEhCZ,EACEe,EAAO,UACL,CAAE,gBAAiB,EAAG,EACtBX,EAAmB,YACrB,CACF,EAAE,KAAK,EAAK,EACZJ,EACEe,EAAO,UACL,CAAE,gBAAiB,MAAU,EAC7BX,EAAmB,YACrB,CACF,EAAE,KAAK,EAAK,EACZJ,EAAOe,EAAO,UAAU,CAAC,EAAUX,EAAmB,YAAY,CAAC,EAAE,KACnE,EACF,CACF,CAAC,CACH,CAAC,EAEDL,EAAS,YAAa,IAAM,CAC1BE,EAAG,gGAAiG,SAAY,CAC9G,MAAMc,EAASH,EAAW,MAAM,EAC1BI,EAAQ,IAAI,MAAM,mBAAmB,EAE3Cd,EAAG,MAAMK,EAAgB,sBAAsB,EAAE,kBAC/CX,EAAKoB,CAAK,CACZ,EACAd,EAAG,MAAMM,EAAgB,iBAAiB,EAAE,kBAAkB,CAC5D,eAAgB,EAChB,QAASC,CACX,CAAC,EAED,MAAMQ,EAAS,MAAMF,EAAO,UAAUJ,CAAO,EAE7CX,EAAOO,EAAe,oBAAoB,EAAE,qBAAqB,CAC/D,gBAAiB,SACnB,CAAC,EACDP,EAAOQ,EAAe,eAAe,EAAE,qBAAqB,CAC1D,MAAO,qBACP,SAAUL,EAAS,SACnB,aAAcQ,EAAQ,aACxB,CAAC,EACDX,EAAOiB,CAAM,EAAE,QAAQ,CACrB,KAAMb,EAAmB,MACzB,MAAAY,CACF,CAAC,CACH,CAAC,EAEDf,EAAG,6FAA8F,SAAY,CAC3G,MAAMc,EAASH,EAAW,EAAE,EAE5BV,EAAG,MAAMK,EAAgB,sBAAsB,EAAE,kBAC/CV,EAAMa,CAAiB,CACzB,EACAR,EAAG,MAAMM,EAAgB,iBAAiB,EAAE,kBAAkB,CAC5D,eAAgB,EAChB,QAASC,CACX,CAAC,EAED,MAAMQ,EAAS,MAAMF,EAAO,UAAU,CACpC,GAAGJ,EACH,gBAAiB,SACnB,CAAC,EAEDX,EAAOiB,CAAM,EAAE,QAAQ,CACrB,KAAMb,EAAmB,aACzB,QAAS,CACP,sBAAuB,CACrB,KAAMM,EAAkB,WAAW,KACnC,UAAW,UACb,CACF,EACA,YAAa,CAAE,eAAgB,EAAG,QAASD,CAAM,CACnD,CAAC,CACH,CAAC,EAEDR,EAAG,+DAAgE,SAAY,CAC7E,MAAMc,EAASH,EAAW,MAAM,EAEhCV,EAAG,MAAMK,EAAgB,sBAAsB,EAAE,kBAC/CV,EAAMa,CAAiB,CACzB,EACAR,EAAG,MAAMM,EAAgB,iBAAiB,EAAE,kBAAkB,CAC5D,eAAgB,EAChB,QAASC,CACX,CAAC,EAED,MAAMQ,EAAS,MAAMF,EAAO,UAAU,CACpC,GAAGJ,EACH,gBAAiB,SACnB,CAAC,EAEDX,EAAOiB,CAAM,EAAE,QAAQ,CACrB,KAAMb,EAAmB,aACzB,QAAS,CACP,sBAAuB,CACrB,KAAMM,EAAkB,WAAW,KACnC,UAAW,UACb,CACF,EACA,YAAa,CAAE,eAAgB,EAAG,QAASD,CAAM,CACnD,CAAC,CACH,CAAC,EAEDR,EAAG,2EAA4E,SAAY,CACzF,MAAMc,EAASH,EAAW,MAAM,EAEhCV,EAAG,MAAMK,EAAgB,sBAAsB,EAAE,kBAC/CV,EAAMa,CAAiB,CACzB,EACAR,EAAG,MAAMM,EAAgB,iBAAiB,EAAE,kBAAkB,MAAS,EAEvE,MAAMS,EAAS,MAAMF,EAAO,UAAUJ,CAAO,EAE7CX,EAAOiB,CAAM,EAAE,QAAQ,CACrB,KAAMb,EAAmB,aACzB,QAAS,CACP,sBAAuB,CACrB,KAAMM,EAAkB,WAAW,KACnC,UAAW,UACb,CACF,EACA,YAAa,MACf,CAAC,CACH,CAAC,CACH,CAAC,EAEDX,EAAS,2BAA4B,IAAM,CACzCE,EAAG,8CAA+C,IAAM,CACtD,MAAMc,EAASH,EAAW,MAAM,EAG1BK,EAFSF,EAAe,eAAe,KAAKA,CAAM,EAEnCL,CAAiB,EAEtCV,EAAOiB,CAAM,EAAE,QAAQ,CACrB,sBAAuB,CACrB,KAAMP,EAAkB,WAAW,KACnC,UAAW,UACb,CACF,CAAC,CACH,CAAC,EAEDT,EAAG,qDAAsD,IAAM,CAE7D,MAAMgB,EADSL,EAAW,MAAgB,EACX,eAAeF,CAAiB,EAE/DV,EAAOiB,CAAM,EAAE,QAAQ,CACrB,sBAAuB,CACrB,KAAMP,EAAkB,WAAW,KACnC,UAAW,UACb,CACF,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "KeyUsage", "SolanaContextTypes", "NullLoggerPublisherService", "SolanaTokenContextLoader", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Left as m,Right as y}from"purify-ts";import{beforeEach as I,describe as c,expect as e,it as l,vi as i}from"vitest";import{SolanaContextTypes as o}from"../../shared/model/SolanaContextTypes";import{NullLoggerFactory as L}from"../../shared/utils/NullLoggerFactory";import{SolanaLifiContextLoader as f}from"./SolanaLifiContextLoader";c("SolanaLifiContextLoader",()=>{let t;const d={swap:{programId:"SomeProgram",accounts:[],data:"abc123"},bridge:{programId:"AnotherProgram",accounts:[],data:"def456"}},p={descriptors:d};I(()=>{i.restoreAllMocks(),t={getTransactionDescriptorsPayload:i.fn()}});const r=()=>new f(t,L);c("canHandle",()=>{l("returns true when templateId is provided",()=>{const a=r();e(a.canHandle({templateId:"tpl-123",deviceModelId:"nanoS"},o.SOLANA_LIFI)).toBe(!0)}),l("returns false when templateId is missing or falsy",()=>{const a=r();e(a.canHandle({templateId:""},o.SOLANA_LIFI)).toBe(!1),e(a.canHandle({templateId:void 0},o.SOLANA_LIFI)).toBe(!1),e(a.canHandle({},o.SOLANA_LIFI)).toBe(!1)})}),c("loadField",()=>{l("returns an error when datasource returns Left(error)",async()=>{const a=r(),n=new Error("boom");i.spyOn(t,"getTransactionDescriptorsPayload").mockResolvedValue(m(n));const s={templateId:"tpl-err",deviceModelId:"nanoS"},u=await a.loadField(s);e(t.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-err"}),e(u).toEqual({type:o.ERROR,error:n})}),l("returns SOLANA_LIFI with plucked descriptors when datasource returns Right(value)",async()=>{const a=r();i.spyOn(t,"getTransactionDescriptorsPayload").mockResolvedValue(y(p));const n={templateId:"tpl-ok",deviceModelId:"nanoS"},s=await a.loadField(n);e(t.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-ok"}),e(s).toEqual({type:o.SOLANA_LIFI,payload:d})})}),c("pluckTransactionData (private)",()=>{l("simply returns the descriptors object from the response",()=>{const a=r(),s=a.pluckTransactionData.bind(a)(p);e(s).toEqual(d)})})});
1
+ import{Left as m,Right as y}from"purify-ts";import{beforeEach as I,describe as c,expect as a,it as l,vi as i}from"vitest";import{SolanaContextTypes as o}from"../../shared/model/SolanaContextTypes";import{NullLoggerPublisherService as L}from"../../shared/utils/NullLoggerPublisherService";import{SolanaLifiContextLoader as f}from"./SolanaLifiContextLoader";c("SolanaLifiContextLoader",()=>{let t;const d={swap:{programId:"SomeProgram",accounts:[],data:"abc123"},bridge:{programId:"AnotherProgram",accounts:[],data:"def456"}},p={descriptors:d};I(()=>{i.restoreAllMocks(),t={getTransactionDescriptorsPayload:i.fn()}});const r=()=>new f(t,L);c("canHandle",()=>{l("returns true when templateId is provided",()=>{const e=r();a(e.canHandle({templateId:"tpl-123",deviceModelId:"nanoS"},o.SOLANA_LIFI)).toBe(!0)}),l("returns false when templateId is missing or falsy",()=>{const e=r();a(e.canHandle({templateId:""},o.SOLANA_LIFI)).toBe(!1),a(e.canHandle({templateId:void 0},o.SOLANA_LIFI)).toBe(!1),a(e.canHandle({},o.SOLANA_LIFI)).toBe(!1)})}),c("loadField",()=>{l("returns an error when datasource returns Left(error)",async()=>{const e=r(),n=new Error("boom");i.spyOn(t,"getTransactionDescriptorsPayload").mockResolvedValue(m(n));const s={templateId:"tpl-err",deviceModelId:"nanoS"},u=await e.loadField(s);a(t.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-err"}),a(u).toEqual({type:o.ERROR,error:n})}),l("returns SOLANA_LIFI with plucked descriptors when datasource returns Right(value)",async()=>{const e=r();i.spyOn(t,"getTransactionDescriptorsPayload").mockResolvedValue(y(p));const n={templateId:"tpl-ok",deviceModelId:"nanoS"},s=await e.loadField(n);a(t.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-ok"}),a(s).toEqual({type:o.SOLANA_LIFI,payload:d})})}),c("pluckTransactionData (private)",()=>{l("simply returns the descriptors object from the response",()=>{const e=r(),s=e.pluckTransactionData.bind(e)(p);a(s).toEqual(d)})})});
2
2
  //# sourceMappingURL=SolanaLifiContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n SolanaContextTypes,\n type SolanaTransactionDescriptorList,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { NullLoggerFactory } from \"@/shared/utils/NullLoggerFactory\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\n\nimport { SolanaLifiContextLoader } from \"./SolanaLifiContextLoader\";\n\ndescribe(\"SolanaLifiContextLoader\", () => {\n let mockDataSource: SolanaLifiDataSource;\n\n const descriptors: SolanaTransactionDescriptorList = {\n // Shape not important for the loader: it's plucked verbatim\n swap: { programId: \"SomeProgram\", accounts: [], data: \"abc123\" } as any,\n bridge: {\n programId: \"AnotherProgram\",\n accounts: [],\n data: \"def456\",\n } as any,\n };\n\n const txDescriptorsResponse: GetTransactionDescriptorsResponse = {\n descriptors,\n } as any;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockDataSource = {\n getTransactionDescriptorsPayload: vi.fn(),\n } as unknown as SolanaLifiDataSource;\n });\n\n const makeLoader = () =>\n new SolanaLifiContextLoader(mockDataSource, NullLoggerFactory);\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n { templateId: \"\" } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { templateId: undefined } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_LIFI)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"boom\");\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Left(error));\n const input = { templateId: \"tpl-err\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_LIFI with plucked descriptors when datasource returns Right(value)\", async () => {\n const loader = makeLoader();\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(txDescriptorsResponse));\n const input = { templateId: \"tpl-ok\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-ok\",\n });\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: descriptors,\n });\n });\n });\n\n describe(\"pluckTransactionData (private)\", () => {\n it(\"simply returns the descriptors object from the response\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result = pluck(txDescriptorsResponse);\n\n expect(result).toEqual(descriptors);\n });\n });\n});\n"],
5
- "mappings": "AAIA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAErD,OACE,sBAAAC,MAEK,oCACP,OAAS,qBAAAC,MAAyB,mCAMlC,OAAS,2BAAAC,MAA+B,4BAExCN,EAAS,0BAA2B,IAAM,CACxC,IAAIO,EAEJ,MAAMC,EAA+C,CAEnD,KAAM,CAAE,UAAW,cAAe,SAAU,CAAC,EAAG,KAAM,QAAS,EAC/D,OAAQ,CACN,UAAW,iBACX,SAAU,CAAC,EACX,KAAM,QACR,CACF,EAEMC,EAA2D,CAC/D,YAAAD,CACF,EAEAT,EAAW,IAAM,CACfI,EAAG,gBAAgB,EACnBI,EAAiB,CACf,iCAAkCJ,EAAG,GAAG,CAC1C,CACF,CAAC,EAED,MAAMO,EAAa,IACjB,IAAIJ,EAAwBC,EAAgBF,CAAiB,EAE/DL,EAAS,YAAa,IAAM,CAC1BE,EAAG,2CAA4C,IAAM,CACnD,MAAMS,EAASD,EAAW,EAE1BT,EACEU,EAAO,UACL,CACE,WAAY,UACZ,cAAe,OACjB,EACAP,EAAmB,WACrB,CACF,EAAE,KAAK,EAAI,CACb,CAAC,EAEDF,EAAG,oDAAqD,IAAM,CAC5D,MAAMS,EAASD,EAAW,EAE1BT,EACEU,EAAO,UACL,CAAE,WAAY,EAAG,EACjBP,EAAmB,WACrB,CACF,EAAE,KAAK,EAAK,EACZH,EACEU,EAAO,UACL,CAAE,WAAY,MAAU,EACxBP,EAAmB,WACrB,CACF,EAAE,KAAK,EAAK,EACZH,EAAOU,EAAO,UAAU,CAAC,EAAUP,EAAmB,WAAW,CAAC,EAAE,KAClE,EACF,CACF,CAAC,CACH,CAAC,EAEDJ,EAAS,YAAa,IAAM,CAC1BE,EAAG,uDAAwD,SAAY,CACrE,MAAMS,EAASD,EAAW,EACpBE,EAAQ,IAAI,MAAM,MAAM,EAC9BT,EAAG,MACDI,EACA,kCACF,EAAE,kBAAkBV,EAAKe,CAAK,CAAC,EAC/B,MAAMC,EAAQ,CAAE,WAAY,UAAW,cAAe,OAAe,EAC/DC,EAAS,MAAMH,EAAO,UAAUE,CAAK,EAE3CZ,EACEM,EAAe,gCACjB,EAAE,qBAAqB,CACrB,WAAY,SACd,CAAC,EACDN,EAAOa,CAAM,EAAE,QAAQ,CACrB,KAAMV,EAAmB,MACzB,MAAAQ,CACF,CAAC,CACH,CAAC,EAEDV,EAAG,oFAAqF,SAAY,CAClG,MAAMS,EAASD,EAAW,EAC1BP,EAAG,MACDI,EACA,kCACF,EAAE,kBAAkBT,EAAMW,CAAqB,CAAC,EAChD,MAAMI,EAAQ,CAAE,WAAY,SAAU,cAAe,OAAe,EAC9DC,EAAS,MAAMH,EAAO,UAAUE,CAAK,EAE3CZ,EACEM,EAAe,gCACjB,EAAE,qBAAqB,CACrB,WAAY,QACd,CAAC,EACDN,EAAOa,CAAM,EAAE,QAAQ,CACrB,KAAMV,EAAmB,YACzB,QAASI,CACX,CAAC,CACH,CAAC,CACH,CAAC,EAEDR,EAAS,iCAAkC,IAAM,CAC/CE,EAAG,0DAA2D,IAAM,CAClE,MAAMS,EAASD,EAAW,EAGpBI,EAFSH,EAAe,qBAAqB,KAAKA,CAAM,EAEzCF,CAAqB,EAE1CR,EAAOa,CAAM,EAAE,QAAQN,CAAW,CACpC,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "SolanaContextTypes", "NullLoggerFactory", "SolanaLifiContextLoader", "mockDataSource", "descriptors", "txDescriptorsResponse", "makeLoader", "loader", "error", "input", "result"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n SolanaContextTypes,\n type SolanaTransactionDescriptorList,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { NullLoggerPublisherService } from \"@/shared/utils/NullLoggerPublisherService\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\n\nimport { SolanaLifiContextLoader } from \"./SolanaLifiContextLoader\";\n\ndescribe(\"SolanaLifiContextLoader\", () => {\n let mockDataSource: SolanaLifiDataSource;\n\n const descriptors: SolanaTransactionDescriptorList = {\n // Shape not important for the loader: it's plucked verbatim\n swap: { programId: \"SomeProgram\", accounts: [], data: \"abc123\" } as any,\n bridge: {\n programId: \"AnotherProgram\",\n accounts: [],\n data: \"def456\",\n } as any,\n };\n\n const txDescriptorsResponse: GetTransactionDescriptorsResponse = {\n descriptors,\n } as any;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockDataSource = {\n getTransactionDescriptorsPayload: vi.fn(),\n } as unknown as SolanaLifiDataSource;\n });\n\n const makeLoader = () =>\n new SolanaLifiContextLoader(mockDataSource, NullLoggerPublisherService);\n\n describe(\"canHandle\", () => {\n it(\"returns true when templateId is provided\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n {\n templateId: \"tpl-123\",\n deviceModelId: \"nanoS\" as any,\n },\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when templateId is missing or falsy\", () => {\n const loader = makeLoader();\n\n expect(\n loader.canHandle(\n { templateId: \"\" } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { templateId: undefined } as any,\n SolanaContextTypes.SOLANA_LIFI,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_LIFI)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error)\", async () => {\n const loader = makeLoader();\n const error = new Error(\"boom\");\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Left(error));\n const input = { templateId: \"tpl-err\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-err\",\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_LIFI with plucked descriptors when datasource returns Right(value)\", async () => {\n const loader = makeLoader();\n vi.spyOn(\n mockDataSource,\n \"getTransactionDescriptorsPayload\",\n ).mockResolvedValue(Right(txDescriptorsResponse));\n const input = { templateId: \"tpl-ok\", deviceModelId: \"nanoS\" as any };\n const result = await loader.loadField(input);\n\n expect(\n mockDataSource.getTransactionDescriptorsPayload,\n ).toHaveBeenCalledWith({\n templateId: \"tpl-ok\",\n });\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: descriptors,\n });\n });\n });\n\n describe(\"pluckTransactionData (private)\", () => {\n it(\"simply returns the descriptors object from the response\", () => {\n const loader = makeLoader();\n const pluck = (loader as any).pluckTransactionData.bind(loader);\n\n const result = pluck(txDescriptorsResponse);\n\n expect(result).toEqual(descriptors);\n });\n });\n});\n"],
5
+ "mappings": "AAIA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAErD,OACE,sBAAAC,MAEK,oCACP,OAAS,8BAAAC,MAAkC,4CAM3C,OAAS,2BAAAC,MAA+B,4BAExCN,EAAS,0BAA2B,IAAM,CACxC,IAAIO,EAEJ,MAAMC,EAA+C,CAEnD,KAAM,CAAE,UAAW,cAAe,SAAU,CAAC,EAAG,KAAM,QAAS,EAC/D,OAAQ,CACN,UAAW,iBACX,SAAU,CAAC,EACX,KAAM,QACR,CACF,EAEMC,EAA2D,CAC/D,YAAAD,CACF,EAEAT,EAAW,IAAM,CACfI,EAAG,gBAAgB,EACnBI,EAAiB,CACf,iCAAkCJ,EAAG,GAAG,CAC1C,CACF,CAAC,EAED,MAAMO,EAAa,IACjB,IAAIJ,EAAwBC,EAAgBF,CAA0B,EAExEL,EAAS,YAAa,IAAM,CAC1BE,EAAG,2CAA4C,IAAM,CACnD,MAAMS,EAASD,EAAW,EAE1BT,EACEU,EAAO,UACL,CACE,WAAY,UACZ,cAAe,OACjB,EACAP,EAAmB,WACrB,CACF,EAAE,KAAK,EAAI,CACb,CAAC,EAEDF,EAAG,oDAAqD,IAAM,CAC5D,MAAMS,EAASD,EAAW,EAE1BT,EACEU,EAAO,UACL,CAAE,WAAY,EAAG,EACjBP,EAAmB,WACrB,CACF,EAAE,KAAK,EAAK,EACZH,EACEU,EAAO,UACL,CAAE,WAAY,MAAU,EACxBP,EAAmB,WACrB,CACF,EAAE,KAAK,EAAK,EACZH,EAAOU,EAAO,UAAU,CAAC,EAAUP,EAAmB,WAAW,CAAC,EAAE,KAClE,EACF,CACF,CAAC,CACH,CAAC,EAEDJ,EAAS,YAAa,IAAM,CAC1BE,EAAG,uDAAwD,SAAY,CACrE,MAAMS,EAASD,EAAW,EACpBE,EAAQ,IAAI,MAAM,MAAM,EAC9BT,EAAG,MACDI,EACA,kCACF,EAAE,kBAAkBV,EAAKe,CAAK,CAAC,EAC/B,MAAMC,EAAQ,CAAE,WAAY,UAAW,cAAe,OAAe,EAC/DC,EAAS,MAAMH,EAAO,UAAUE,CAAK,EAE3CZ,EACEM,EAAe,gCACjB,EAAE,qBAAqB,CACrB,WAAY,SACd,CAAC,EACDN,EAAOa,CAAM,EAAE,QAAQ,CACrB,KAAMV,EAAmB,MACzB,MAAAQ,CACF,CAAC,CACH,CAAC,EAEDV,EAAG,oFAAqF,SAAY,CAClG,MAAMS,EAASD,EAAW,EAC1BP,EAAG,MACDI,EACA,kCACF,EAAE,kBAAkBT,EAAMW,CAAqB,CAAC,EAChD,MAAMI,EAAQ,CAAE,WAAY,SAAU,cAAe,OAAe,EAC9DC,EAAS,MAAMH,EAAO,UAAUE,CAAK,EAE3CZ,EACEM,EAAe,gCACjB,EAAE,qBAAqB,CACrB,WAAY,QACd,CAAC,EACDN,EAAOa,CAAM,EAAE,QAAQ,CACrB,KAAMV,EAAmB,YACzB,QAASI,CACX,CAAC,CACH,CAAC,CACH,CAAC,EAEDR,EAAS,iCAAkC,IAAM,CAC/CE,EAAG,0DAA2D,IAAM,CAClE,MAAMS,EAASD,EAAW,EAGpBI,EAFSH,EAAe,qBAAqB,KAAKA,CAAM,EAEzCF,CAAqB,EAE1CR,EAAOa,CAAM,EAAE,QAAQN,CAAW,CACpC,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "SolanaContextTypes", "NullLoggerPublisherService", "SolanaLifiContextLoader", "mockDataSource", "descriptors", "txDescriptorsResponse", "makeLoader", "loader", "error", "input", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as y}from"@ledgerhq/device-management-kit";import{Left as m,Right as f}from"purify-ts";import{beforeEach as g,describe as k,expect as o,it as s,vi as t}from"vitest";import{KeyUsage as T}from"../../pki/model/KeyUsage";import{SolanaContextTypes as d}from"../../shared/model/SolanaContextTypes";import{NullLoggerFactory as I}from"../../shared/utils/NullLoggerFactory";import{SolanaTokenContextLoader as O}from"./SolanaTokenContextLoader";k("SolanaTokenContextLoader",()=>{let l,i;const c=new Uint8Array([240,202,204,26]),n={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},p={tokenInternalId:"token-1",deviceModelId:y.FLEX};g(()=>{t.restoreAllMocks(),l={getTokenInfosPayload:t.fn()},i={loadCertificate:t.fn()}});const r=e=>{const a={cal:{mode:e}};return new O(l,a,i,I)};k("canHandle",()=>{s("returns true when tokenInternalId is provided",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:"abc123"},d.SOLANA_TOKEN)).toBe(!0)}),s("returns false when tokenInternalId is missing or falsy",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:""},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({tokenInternalId:void 0},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({},d.SOLANA_TOKEN)).toBe(!1)})}),k("loadField",()=>{s("returns an error when datasource returns Left(error) (certificate still retrieved)",async()=>{const e=r("prod"),a=new Error("datasource failed");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(m(a)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const u=await e.loadField(p);o(l.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),o(i.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:T.CoinMeta,targetDevice:p.deviceModelId}),o(u).toEqual({type:d.ERROR,error:a})}),s("returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate",async()=>{const e=r("");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-2"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:c}})}),s("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const e=r("test");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-3"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:c}})}),s("works even if certificate loader returns undefined (certificate omitted)",async()=>{const e=r("prod");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue(void 0);const a=await e.loadField(p);o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),k("pluckTokenData (private)",()=>{s("picks the signature for the configured mode",()=>{const e=r("test"),u=e.pluckTokenData.bind(e)(n);o(u).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}})}),s("falls back to 'prod' when config.cal.mode is falsy",()=>{const a=r(void 0).pluckTokenData(n);o(a).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}})})})});
1
+ import{DeviceModelId as y}from"@ledgerhq/device-management-kit";import{Left as m,Right as f}from"purify-ts";import{beforeEach as g,describe as k,expect as o,it as s,vi as t}from"vitest";import{KeyUsage as T}from"../../pki/model/KeyUsage";import{SolanaContextTypes as d}from"../../shared/model/SolanaContextTypes";import{NullLoggerPublisherService as I}from"../../shared/utils/NullLoggerPublisherService";import{SolanaTokenContextLoader as O}from"./SolanaTokenContextLoader";k("SolanaTokenContextLoader",()=>{let l,i;const c=new Uint8Array([240,202,204,26]),n={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},p={tokenInternalId:"token-1",deviceModelId:y.FLEX};g(()=>{t.restoreAllMocks(),l={getTokenInfosPayload:t.fn()},i={loadCertificate:t.fn()}});const r=e=>{const a={cal:{mode:e}};return new O(l,a,i,I)};k("canHandle",()=>{s("returns true when tokenInternalId is provided",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:"abc123"},d.SOLANA_TOKEN)).toBe(!0)}),s("returns false when tokenInternalId is missing or falsy",()=>{const e=r("prod");o(e.canHandle({tokenInternalId:""},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({tokenInternalId:void 0},d.SOLANA_TOKEN)).toBe(!1),o(e.canHandle({},d.SOLANA_TOKEN)).toBe(!1)})}),k("loadField",()=>{s("returns an error when datasource returns Left(error) (certificate still retrieved)",async()=>{const e=r("prod"),a=new Error("datasource failed");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(m(a)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const u=await e.loadField(p);o(l.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),o(i.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:T.CoinMeta,targetDevice:p.deviceModelId}),o(u).toEqual({type:d.ERROR,error:a})}),s("returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate",async()=>{const e=r("");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-2"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:c}})}),s("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const e=r("test");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:c});const a=await e.loadField({...p,tokenInternalId:"token-3"});o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:c}})}),s("works even if certificate loader returns undefined (certificate omitted)",async()=>{const e=r("prod");t.spyOn(l,"getTokenInfosPayload").mockResolvedValue(f(n)),t.spyOn(i,"loadCertificate").mockResolvedValue(void 0);const a=await e.loadField(p);o(a).toEqual({type:d.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),k("pluckTokenData (private)",()=>{s("picks the signature for the configured mode",()=>{const e=r("test"),u=e.pluckTokenData.bind(e)(n);o(u).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"test-sig"}})}),s("falls back to 'prod' when config.cal.mode is falsy",()=>{const a=r(void 0).pluckTokenData(n);o(a).toEqual({solanaTokenDescriptor:{data:n.descriptor.data,signature:"prod-sig"}})})})});
2
2
  //# sourceMappingURL=SolanaTokenContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { SolanaContextTypes } from \"@/shared/model/SolanaContextTypes\";\nimport { NullLoggerFactory } from \"@/shared/utils/NullLoggerFactory\";\nimport type { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\n\nimport { SolanaTokenContextLoader } from \"./SolanaTokenContextLoader\";\n\ndescribe(\"SolanaTokenContextLoader\", () => {\n let mockDataSource: SolanaTokenDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const bytes = new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]);\n\n const tokenDataResponse: TokenDataResponse = {\n descriptor: {\n // The loader just forwards this; exact shape isn't important for the test\n data: { symbol: \"SOL\", name: \"Solana\", decimals: 9 } as any,\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n } as any,\n },\n } as any;\n\n const baseCtx = {\n tokenInternalId: \"token-1\",\n deviceModelId: DeviceModelId.FLEX,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getTokenInfosPayload: vi.fn(),\n } as unknown as SolanaTokenDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = (mode?: string) => {\n const config = { cal: { mode } } as unknown as ContextModuleConfig;\n return new SolanaTokenContextLoader(\n mockDataSource,\n config,\n mockCertLoader,\n NullLoggerFactory,\n );\n };\n\n describe(\"canHandle\", () => {\n it(\"returns true when tokenInternalId is provided\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n {\n tokenInternalId: \"abc123\",\n } as SolanaTransactionContext,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when tokenInternalId is missing or falsy\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n { tokenInternalId: \"\" } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { tokenInternalId: undefined } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_TOKEN)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error) (certificate still retrieved)\", async () => {\n const loader = makeLoader(\"prod\");\n const error = new Error(\"datasource failed\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Left(error),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField(baseCtx);\n\n expect(mockDataSource.getTokenInfosPayload).toHaveBeenCalledWith({\n tokenInternalId: \"token-1\",\n });\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: baseCtx.deviceModelId,\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate\", async () => {\n const loader = makeLoader(\"\"); // falsy -> default 'prod'\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-2\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: { keyUsageNumber: 0, payload: bytes },\n });\n });\n\n it(\"returns SOLANA_TOKEN with signature matching config.cal.mode\", async () => {\n const loader = makeLoader(\"test\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 1,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-3\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n },\n certificate: { keyUsageNumber: 1, payload: bytes },\n });\n });\n\n it(\"works even if certificate loader returns undefined (certificate omitted)\", async () => {\n const loader = makeLoader(\"prod\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const result = await loader.loadField(baseCtx);\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: undefined,\n });\n });\n });\n\n describe(\"pluckTokenData (private)\", () => {\n it(\"picks the signature for the configured mode\", () => {\n const loader = makeLoader(\"test\");\n const pluck = (loader as any).pluckTokenData.bind(loader);\n\n const result = pluck(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n });\n });\n\n it(\"falls back to 'prod' when config.cal.mode is falsy\", () => {\n const loader = makeLoader(undefined as any);\n const result = (loader as any).pluckTokenData(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "KeyUsage", "SolanaContextTypes", "NullLoggerFactory", "SolanaTokenContextLoader", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { SolanaContextTypes } from \"@/shared/model/SolanaContextTypes\";\nimport { NullLoggerPublisherService } from \"@/shared/utils/NullLoggerPublisherService\";\nimport type { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\n\nimport { SolanaTokenContextLoader } from \"./SolanaTokenContextLoader\";\n\ndescribe(\"SolanaTokenContextLoader\", () => {\n let mockDataSource: SolanaTokenDataSource;\n let mockCertLoader: PkiCertificateLoader;\n\n const bytes = new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]);\n\n const tokenDataResponse: TokenDataResponse = {\n descriptor: {\n // The loader just forwards this; exact shape isn't important for the test\n data: { symbol: \"SOL\", name: \"Solana\", decimals: 9 } as any,\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n } as any,\n },\n } as any;\n\n const baseCtx = {\n tokenInternalId: \"token-1\",\n deviceModelId: DeviceModelId.FLEX,\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockDataSource = {\n getTokenInfosPayload: vi.fn(),\n } as unknown as SolanaTokenDataSource;\n\n mockCertLoader = {\n loadCertificate: vi.fn(),\n } as unknown as PkiCertificateLoader;\n });\n\n const makeLoader = (mode?: string) => {\n const config = { cal: { mode } } as unknown as ContextModuleConfig;\n return new SolanaTokenContextLoader(\n mockDataSource,\n config,\n mockCertLoader,\n NullLoggerPublisherService,\n );\n };\n\n describe(\"canHandle\", () => {\n it(\"returns true when tokenInternalId is provided\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n {\n tokenInternalId: \"abc123\",\n } as SolanaTransactionContext,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(true);\n });\n\n it(\"returns false when tokenInternalId is missing or falsy\", () => {\n const loader = makeLoader(\"prod\");\n\n expect(\n loader.canHandle(\n { tokenInternalId: \"\" } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n { tokenInternalId: undefined } as any,\n SolanaContextTypes.SOLANA_TOKEN,\n ),\n ).toBe(false);\n expect(loader.canHandle({} as any, SolanaContextTypes.SOLANA_TOKEN)).toBe(\n false,\n );\n });\n });\n\n describe(\"loadField\", () => {\n it(\"returns an error when datasource returns Left(error) (certificate still retrieved)\", async () => {\n const loader = makeLoader(\"prod\");\n const error = new Error(\"datasource failed\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Left(error),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField(baseCtx);\n\n expect(mockDataSource.getTokenInfosPayload).toHaveBeenCalledWith({\n tokenInternalId: \"token-1\",\n });\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: baseCtx.deviceModelId,\n });\n expect(result).toEqual({\n type: SolanaContextTypes.ERROR,\n error,\n });\n });\n\n it(\"returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate\", async () => {\n const loader = makeLoader(\"\"); // falsy -> default 'prod'\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 0,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-2\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: { keyUsageNumber: 0, payload: bytes },\n });\n });\n\n it(\"returns SOLANA_TOKEN with signature matching config.cal.mode\", async () => {\n const loader = makeLoader(\"test\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue({\n keyUsageNumber: 1,\n payload: bytes,\n });\n\n const result = await loader.loadField({\n ...baseCtx,\n tokenInternalId: \"token-3\",\n });\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n },\n certificate: { keyUsageNumber: 1, payload: bytes },\n });\n });\n\n it(\"works even if certificate loader returns undefined (certificate omitted)\", async () => {\n const loader = makeLoader(\"prod\");\n\n vi.spyOn(mockDataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(tokenDataResponse),\n );\n vi.spyOn(mockCertLoader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const result = await loader.loadField(baseCtx);\n\n expect(result).toEqual({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n },\n certificate: undefined,\n });\n });\n });\n\n describe(\"pluckTokenData (private)\", () => {\n it(\"picks the signature for the configured mode\", () => {\n const loader = makeLoader(\"test\");\n const pluck = (loader as any).pluckTokenData.bind(loader);\n\n const result = pluck(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"test-sig\",\n },\n });\n });\n\n it(\"falls back to 'prod' when config.cal.mode is falsy\", () => {\n const loader = makeLoader(undefined as any);\n const result = (loader as any).pluckTokenData(tokenDataResponse);\n\n expect(result).toEqual({\n solanaTokenDescriptor: {\n data: tokenDataResponse.descriptor.data,\n signature: \"prod-sig\",\n },\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "KeyUsage", "SolanaContextTypes", "NullLoggerPublisherService", "SolanaTokenContextLoader", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
7
7
  }
@@ -0,0 +1,3 @@
1
+ import type { LoggerPublisherService } from "@ledgerhq/device-management-kit";
2
+ export declare const NullLoggerPublisherService: (tag: string) => LoggerPublisherService;
3
+ //# sourceMappingURL=NullLoggerPublisherService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullLoggerPublisherService.d.ts","sourceRoot":"","sources":["../../../../../src/shared/utils/NullLoggerPublisherService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,eAAO,MAAM,0BAA0B,EAAE,CACvC,GAAG,EAAE,MAAM,KACR,sBAcH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NullLoggerPublisherService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullLoggerPublisherService.test.d.ts","sourceRoot":"","sources":["../../../../../src/shared/utils/NullLoggerPublisherService.test.ts"],"names":[],"mappings":""}