@ledgerhq/context-module 0.0.0-test-attest-npmjs-20251126133407 → 0.0.0-test-snapshot-versions-20251204142134

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 (148) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/DefaultContextModule.test.js.map +1 -1
  3. package/lib/cjs/src/di.js +1 -1
  4. package/lib/cjs/src/di.js.map +3 -3
  5. package/lib/cjs/src/index.js +1 -1
  6. package/lib/cjs/src/index.js.map +2 -2
  7. package/lib/cjs/src/shared/domain/ContextFieldLoader.js +1 -1
  8. package/lib/cjs/src/shared/domain/ContextFieldLoader.js.map +1 -1
  9. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  10. package/lib/cjs/src/shared/model/ClearSignContext.js.map +1 -1
  11. package/lib/cjs/src/shared/model/SolanaContextTypes.js +2 -0
  12. package/lib/cjs/src/shared/model/SolanaContextTypes.js.map +7 -0
  13. package/lib/cjs/src/shared/model/SolanaTransactionContext.js +1 -1
  14. package/lib/cjs/src/shared/model/SolanaTransactionContext.js.map +1 -1
  15. package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.js +1 -1
  16. package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.js.map +3 -3
  17. package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js +1 -1
  18. package/lib/cjs/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js.map +2 -2
  19. package/lib/cjs/src/solana/data/SolanaDataSource.js +1 -1
  20. package/lib/cjs/src/solana/data/SolanaDataSource.js.map +1 -1
  21. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js +1 -1
  22. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js.map +3 -3
  23. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  24. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  25. package/lib/cjs/src/solana/domain/solanaContextTypes.js +1 -1
  26. package/lib/cjs/src/solana/domain/solanaContextTypes.js.map +1 -1
  27. package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.js +2 -0
  28. package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.js.map +7 -0
  29. package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js +2 -0
  30. package/lib/cjs/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js.map +7 -0
  31. package/lib/cjs/src/solanaLifi/data/SolanaLifiDataSource.js +2 -0
  32. package/lib/cjs/src/solanaLifi/data/SolanaLifiDataSource.js.map +7 -0
  33. package/lib/cjs/src/solanaLifi/di/lifiModuleFactory.js +2 -0
  34. package/lib/cjs/src/solanaLifi/di/lifiModuleFactory.js.map +7 -0
  35. package/lib/cjs/src/solanaLifi/di/solanaLifiTypes.js +2 -0
  36. package/lib/cjs/src/solanaLifi/di/solanaLifiTypes.js.map +7 -0
  37. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js +2 -0
  38. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +7 -0
  39. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +2 -0
  40. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +7 -0
  41. package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.js +2 -0
  42. package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.js.map +7 -0
  43. package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.test.js +7 -0
  44. package/lib/cjs/src/solanaToken/data/HttpSolanaTokenDataSource.test.js.map +7 -0
  45. package/lib/cjs/src/solanaToken/data/SolanaTokenDataSource.js +2 -0
  46. package/lib/cjs/src/solanaToken/data/SolanaTokenDataSource.js.map +7 -0
  47. package/lib/cjs/src/solanaToken/di/solanaTokenTypes.js +2 -0
  48. package/lib/cjs/src/solanaToken/di/solanaTokenTypes.js.map +7 -0
  49. package/lib/cjs/src/solanaToken/di/tokenModuleFactory.js +2 -0
  50. package/lib/cjs/src/solanaToken/di/tokenModuleFactory.js.map +7 -0
  51. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js +2 -0
  52. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js.map +7 -0
  53. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js +2 -0
  54. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +7 -0
  55. package/lib/esm/package.json +1 -1
  56. package/lib/esm/src/DefaultContextModule.test.js.map +1 -1
  57. package/lib/esm/src/di.js +1 -1
  58. package/lib/esm/src/di.js.map +3 -3
  59. package/lib/esm/src/index.js +1 -1
  60. package/lib/esm/src/index.js.map +2 -2
  61. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  62. package/lib/esm/src/shared/model/ClearSignContext.js.map +1 -1
  63. package/lib/esm/src/shared/model/SolanaContextTypes.js +2 -0
  64. package/lib/esm/src/shared/model/SolanaContextTypes.js.map +7 -0
  65. package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.js +1 -1
  66. package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.js.map +3 -3
  67. package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js +1 -1
  68. package/lib/esm/src/solana/data/HttpSolanaOwnerInfoDataSource.test.js.map +2 -2
  69. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js +1 -1
  70. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js.map +3 -3
  71. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  72. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  73. package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.js +2 -0
  74. package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.js.map +7 -0
  75. package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js +2 -0
  76. package/lib/esm/src/solanaLifi/data/HttpSolanaLifiDataSource.test.js.map +7 -0
  77. package/lib/esm/src/solanaLifi/data/SolanaLifiDataSource.js +1 -0
  78. package/lib/esm/src/solanaLifi/data/SolanaLifiDataSource.js.map +7 -0
  79. package/lib/esm/src/solanaLifi/di/lifiModuleFactory.js +2 -0
  80. package/lib/esm/src/solanaLifi/di/lifiModuleFactory.js.map +7 -0
  81. package/lib/esm/src/solanaLifi/di/solanaLifiTypes.js +2 -0
  82. package/lib/esm/src/solanaLifi/di/solanaLifiTypes.js.map +7 -0
  83. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js +2 -0
  84. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +7 -0
  85. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +2 -0
  86. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +7 -0
  87. package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.js +2 -0
  88. package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.js.map +7 -0
  89. package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.test.js +7 -0
  90. package/lib/esm/src/solanaToken/data/HttpSolanaTokenDataSource.test.js.map +7 -0
  91. package/lib/esm/src/solanaToken/data/SolanaTokenDataSource.js +1 -0
  92. package/lib/esm/src/solanaToken/data/SolanaTokenDataSource.js.map +7 -0
  93. package/lib/esm/src/solanaToken/di/solanaTokenTypes.js +2 -0
  94. package/lib/esm/src/solanaToken/di/solanaTokenTypes.js.map +7 -0
  95. package/lib/esm/src/solanaToken/di/tokenModuleFactory.js +2 -0
  96. package/lib/esm/src/solanaToken/di/tokenModuleFactory.js.map +7 -0
  97. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js +2 -0
  98. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js.map +7 -0
  99. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js +2 -0
  100. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +7 -0
  101. package/lib/types/src/di.d.ts.map +1 -1
  102. package/lib/types/src/index.d.ts +2 -0
  103. package/lib/types/src/index.d.ts.map +1 -1
  104. package/lib/types/src/shared/domain/ContextFieldLoader.d.ts +14 -4
  105. package/lib/types/src/shared/domain/ContextFieldLoader.d.ts.map +1 -1
  106. package/lib/types/src/shared/model/ClearSignContext.d.ts +59 -32
  107. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  108. package/lib/types/src/shared/model/SolanaContextTypes.d.ts +47 -0
  109. package/lib/types/src/shared/model/SolanaContextTypes.d.ts.map +1 -0
  110. package/lib/types/src/shared/model/SolanaTransactionContext.d.ts +2 -0
  111. package/lib/types/src/shared/model/SolanaTransactionContext.d.ts.map +1 -1
  112. package/lib/types/src/solana/data/HttpSolanaOwnerInfoDataSource.d.ts.map +1 -1
  113. package/lib/types/src/solana/data/SolanaDataSource.d.ts +1 -4
  114. package/lib/types/src/solana/data/SolanaDataSource.d.ts.map +1 -1
  115. package/lib/types/src/solana/domain/DefaultSolanaContextLoader.d.ts +5 -3
  116. package/lib/types/src/solana/domain/DefaultSolanaContextLoader.d.ts.map +1 -1
  117. package/lib/types/src/solana/domain/solanaContextTypes.d.ts +7 -5
  118. package/lib/types/src/solana/domain/solanaContextTypes.d.ts.map +1 -1
  119. package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.d.ts +9 -0
  120. package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.d.ts.map +1 -0
  121. package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.test.d.ts +2 -0
  122. package/lib/types/src/solanaLifi/data/HttpSolanaLifiDataSource.test.d.ts.map +1 -0
  123. package/lib/types/src/solanaLifi/data/SolanaLifiDataSource.d.ts +13 -0
  124. package/lib/types/src/solanaLifi/data/SolanaLifiDataSource.d.ts.map +1 -0
  125. package/lib/types/src/solanaLifi/di/lifiModuleFactory.d.ts +3 -0
  126. package/lib/types/src/solanaLifi/di/lifiModuleFactory.d.ts.map +1 -0
  127. package/lib/types/src/solanaLifi/di/solanaLifiTypes.d.ts +5 -0
  128. package/lib/types/src/solanaLifi/di/solanaLifiTypes.d.ts.map +1 -0
  129. package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts +16 -0
  130. package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts.map +1 -0
  131. package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.test.d.ts +2 -0
  132. package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.test.d.ts.map +1 -0
  133. package/lib/types/src/solanaToken/data/HttpSolanaTokenDataSource.d.ts +9 -0
  134. package/lib/types/src/solanaToken/data/HttpSolanaTokenDataSource.d.ts.map +1 -0
  135. package/lib/types/src/solanaToken/data/HttpSolanaTokenDataSource.test.d.ts +2 -0
  136. package/lib/types/src/solanaToken/data/HttpSolanaTokenDataSource.test.d.ts.map +1 -0
  137. package/lib/types/src/solanaToken/data/SolanaTokenDataSource.d.ts +44 -0
  138. package/lib/types/src/solanaToken/data/SolanaTokenDataSource.d.ts.map +1 -0
  139. package/lib/types/src/solanaToken/di/solanaTokenTypes.d.ts +5 -0
  140. package/lib/types/src/solanaToken/di/solanaTokenTypes.d.ts.map +1 -0
  141. package/lib/types/src/solanaToken/di/tokenModuleFactory.d.ts +3 -0
  142. package/lib/types/src/solanaToken/di/tokenModuleFactory.d.ts.map +1 -0
  143. package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts +22 -0
  144. package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts.map +1 -0
  145. package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.test.d.ts +2 -0
  146. package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.test.d.ts.map +1 -0
  147. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  148. package/package.json +4 -4
@@ -1,2 +1,2 @@
1
- "use strict";var l=require("@ledgerhq/device-management-kit"),a=require("purify-ts"),i=require("../../pki/model/KeyUsage"),s=require("../../solana/domain/DefaultSolanaContextLoader");describe("DefaultSolanaContextLoader",()=>{let o,e,n;const r={deviceModelId:l.DeviceModelId.FLEX,tokenAddress:"token-addr",challenge:"challenge-str"},c={descriptor:"cert-desc",signature:"cert-sig",keyUsageNumber:0,payload:new Uint8Array};beforeEach(()=>{vi.resetAllMocks(),o={getOwnerInfo:vi.fn()},e={loadCertificate:vi.fn()},n=new s.DefaultSolanaContextLoader(o,e)}),it("should call dataSource.getSolanaContext and certificateLoader.loadCertificate with correct args",async()=>{e.loadCertificate.mockResolvedValue(c),o.getOwnerInfo.mockResolvedValue((0,a.Right)({descriptor:Buffer.from("d"),tokenAccount:"tkn",owner:"own",contract:"ctr"})),await n.load(r),expect(e.loadCertificate).toHaveBeenCalledWith({keyId:"domain_metadata_key",keyUsage:i.KeyUsage.TrustedName,targetDevice:r.deviceModelId}),expect(o.getOwnerInfo).toHaveBeenCalledWith(r)}),it("should return Left if certificate loader returns undefined",async()=>{e.loadCertificate.mockResolvedValue(void 0);const t=await n.load(r);expect(t).toEqual((0,a.Left)(new Error("[ContextModule] - DefaultSolanaContextLoader: CAL certificate is undefined")))}),it("should propagate Left from dataSource.getSolanaContext",async()=>{e.loadCertificate.mockResolvedValue(c);const t=new Error("DS failure");o.getOwnerInfo.mockResolvedValue((0,a.Left)(t));const d=await n.load(r);expect(d).toEqual((0,a.Left)(t))}),it("should return Right with merged data and certificate on success",async()=>{e.loadCertificate.mockResolvedValue(c);const t={descriptor:Buffer.from("dd"),tokenAccount:"tokenAcct",owner:"ownerAddr",contract:"contractAddr",certificate:c};o.getOwnerInfo.mockResolvedValue((0,a.Right)(t));const d=await n.load(r);expect(d.isRight()).toBe(!0),expect(d.extract()).toEqual({...t,certificate:c})})});
1
+ "use strict";var p=require("@ledgerhq/device-management-kit"),l=require("purify-ts"),e=require("vitest"),u=require("../../pki/model/KeyUsage"),n=require("../../shared/model/SolanaContextTypes"),f=require("../../solanaToken/domain/SolanaTokenContextLoader");(0,e.describe)("SolanaTokenContextLoader",()=>{let s,d;const i=new Uint8Array([240,202,204,26]),t={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},c={tokenInternalId:"token-1",deviceModelId:p.DeviceModelId.FLEX};(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),s={getTokenInfosPayload:e.vi.fn()},d={loadCertificate:e.vi.fn()}});const r=a=>{const o={cal:{mode:a}};return new f.SolanaTokenContextLoader(s,o,d)};(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when tokenInternalId is provided",()=>{const a=r("prod");(0,e.expect)(a.canHandle({tokenInternalId:"abc123"},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!0)}),(0,e.it)("returns false when tokenInternalId is missing or falsy",()=>{const a=r("prod");(0,e.expect)(a.canHandle({tokenInternalId:""},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1),(0,e.expect)(a.canHandle({tokenInternalId:void 0},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1),(0,e.expect)(a.canHandle({},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1)})}),(0,e.describe)("loadField",()=>{(0,e.it)("returns an error when datasource returns Left(error) and still fetched certificate beforehand",async()=>{const a=r("prod"),o=new Error("datasource failed");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Left)(o)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:i});const k=await a.loadField(c);(0,e.expect)(s.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),(0,e.expect)(d.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:u.KeyUsage.CoinMeta,targetDevice:c.deviceModelId}),(0,e.expect)(k).toEqual({type:n.SolanaContextTypes.ERROR,error:o})}),(0,e.it)("returns SOLANA_TOKEN with prod signature by default (falsy mode), and includes certificate",async()=>{const a=r("");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:i});const o=await a.loadField({...c,tokenInternalId:"token-2"});(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:i}})}),(0,e.it)("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const a=r("test");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:i});const o=await a.loadField({...c,tokenInternalId:"token-3"});(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:i}})}),(0,e.it)("works even if certificate loader returns undefined (certificate omitted)",async()=>{const a=r("prod");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue(void 0);const o=await a.loadField(c);(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),(0,e.describe)("pluckTokenData (private)",()=>{(0,e.it)("picks the signature for the configured mode",()=>{const a=r("test"),k=a.pluckTokenData.bind(a)(t);(0,e.expect)(k).toEqual({solanaTokenDescriptor:{data:t.descriptor.data,signature:"test-sig"}})}),(0,e.it)("falls back to 'prod' when config.cal.mode is falsy",()=>{const o=r(void 0).pluckTokenData(t);(0,e.expect)(o).toEqual({solanaTokenDescriptor:{data:t.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-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { DefaultSolanaContextLoader } from \"@/solana/domain/DefaultSolanaContextLoader\";\nimport type {\n SolanaTransactionContext,\n SolanaTransactionContextResultSuccess,\n} from \"@/solana/domain/solanaContextTypes\";\n\ndescribe(\"DefaultSolanaContextLoader\", () => {\n let mockDataSource: {\n getOwnerInfo: any;\n };\n let mockCertLoader: {\n loadCertificate: any;\n };\n let loader: DefaultSolanaContextLoader;\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"token-addr\",\n challenge: \"challenge-str\",\n } as any;\n\n const fakeCert = {\n descriptor: \"cert-desc\",\n signature: \"cert-sig\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n mockDataSource = {\n getOwnerInfo: vi.fn(),\n };\n mockCertLoader = {\n loadCertificate: vi.fn(),\n };\n\n loader = new DefaultSolanaContextLoader(\n mockDataSource as any,\n mockCertLoader as any,\n );\n });\n\n it(\"should call dataSource.getSolanaContext and certificateLoader.loadCertificate with correct args\", async () => {\n // given\n mockCertLoader.loadCertificate.mockResolvedValue(fakeCert);\n mockDataSource.getOwnerInfo.mockResolvedValue(\n Right({\n descriptor: Buffer.from(\"d\"),\n tokenAccount: \"tkn\",\n owner: \"own\",\n contract: \"ctr\",\n }),\n );\n\n // when\n await loader.load(context);\n\n // then\n expect(mockCertLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"domain_metadata_key\",\n keyUsage: KeyUsage.TrustedName,\n targetDevice: context.deviceModelId,\n });\n expect(mockDataSource.getOwnerInfo).toHaveBeenCalledWith(context);\n });\n\n it(\"should return Left if certificate loader returns undefined\", async () => {\n mockCertLoader.loadCertificate.mockResolvedValue(undefined);\n\n const result = await loader.load(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - DefaultSolanaContextLoader: CAL certificate is undefined\",\n ),\n ),\n );\n });\n\n it(\"should propagate Left from dataSource.getSolanaContext\", async () => {\n mockCertLoader.loadCertificate.mockResolvedValue(fakeCert);\n const dsError = new Error(\"DS failure\");\n mockDataSource.getOwnerInfo.mockResolvedValue(Left(dsError));\n\n const result = await loader.load(context);\n\n expect(result).toEqual(Left(dsError));\n });\n\n it(\"should return Right with merged data and certificate on success\", async () => {\n mockCertLoader.loadCertificate.mockResolvedValue(fakeCert);\n\n const dsPayload: SolanaTransactionContextResultSuccess = {\n descriptor: Buffer.from(\"dd\"),\n tokenAccount: \"tokenAcct\",\n owner: \"ownerAddr\",\n contract: \"contractAddr\",\n certificate: fakeCert,\n };\n mockDataSource.getOwnerInfo.mockResolvedValue(Right(dsPayload));\n\n const result = await loader.load(context);\n\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual({\n ...dsPayload,\n certificate: fakeCert,\n });\n });\n});\n"],
5
- "mappings": "aACA,IAAAA,EAA8B,2CAC9BC,EAA4B,qBAE5BC,EAAyB,gCACzBC,EAA2C,sDAM3C,SAAS,6BAA8B,IAAM,CAC3C,IAAIC,EAGAC,EAGAC,EAEJ,MAAMC,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,aACd,UAAW,eACb,EAEMC,EAAW,CACf,WAAY,YACZ,UAAW,WACX,eAAgB,EAChB,QAAS,IAAI,UACf,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,EACjBJ,EAAiB,CACf,aAAc,GAAG,GAAG,CACtB,EACAC,EAAiB,CACf,gBAAiB,GAAG,GAAG,CACzB,EAEAC,EAAS,IAAI,6BACXF,EACAC,CACF,CACF,CAAC,EAED,GAAG,kGAAmG,SAAY,CAEhHA,EAAe,gBAAgB,kBAAkBG,CAAQ,EACzDJ,EAAe,aAAa,qBAC1B,SAAM,CACJ,WAAY,OAAO,KAAK,GAAG,EAC3B,aAAc,MACd,MAAO,MACP,SAAU,KACZ,CAAC,CACH,EAGA,MAAME,EAAO,KAAKC,CAAO,EAGzB,OAAOF,EAAe,eAAe,EAAE,qBAAqB,CAC1D,MAAO,sBACP,SAAU,WAAS,YACnB,aAAcE,EAAQ,aACxB,CAAC,EACD,OAAOH,EAAe,YAAY,EAAE,qBAAqBG,CAAO,CAClE,CAAC,EAED,GAAG,6DAA8D,SAAY,CAC3EF,EAAe,gBAAgB,kBAAkB,MAAS,EAE1D,MAAMI,EAAS,MAAMH,EAAO,KAAKC,CAAO,EAExC,OAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,4EACF,CACF,CACF,CACF,CAAC,EAED,GAAG,yDAA0D,SAAY,CACvEJ,EAAe,gBAAgB,kBAAkBG,CAAQ,EACzD,MAAME,EAAU,IAAI,MAAM,YAAY,EACtCN,EAAe,aAAa,qBAAkB,QAAKM,CAAO,CAAC,EAE3D,MAAMD,EAAS,MAAMH,EAAO,KAAKC,CAAO,EAExC,OAAOE,CAAM,EAAE,WAAQ,QAAKC,CAAO,CAAC,CACtC,CAAC,EAED,GAAG,kEAAmE,SAAY,CAChFL,EAAe,gBAAgB,kBAAkBG,CAAQ,EAEzD,MAAMG,EAAmD,CACvD,WAAY,OAAO,KAAK,IAAI,EAC5B,aAAc,YACd,MAAO,YACP,SAAU,eACV,YAAaH,CACf,EACAJ,EAAe,aAAa,qBAAkB,SAAMO,CAAS,CAAC,EAE9D,MAAMF,EAAS,MAAMH,EAAO,KAAKC,CAAO,EAExC,OAAOE,EAAO,QAAQ,CAAC,EAAE,KAAK,EAAI,EAClC,OAAOA,EAAO,QAAQ,CAAC,EAAE,QAAQ,CAC/B,GAAGE,EACH,YAAaH,CACf,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_purify_ts", "import_KeyUsage", "import_DefaultSolanaContextLoader", "mockDataSource", "mockCertLoader", "loader", "context", "fakeCert", "result", "dsError", "dsPayload"]
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 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(mockDataSource, config, mockCertLoader);\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": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_KeyUsage", "import_SolanaContextTypes", "import_SolanaTokenContextLoader", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of a(t))!c.call(e,r)&&r!==i&&o(e,r,{get:()=>t[r],enumerable:!(n=s(t,r))||n.enumerable});return e};var d=e=>p(o({},"__esModule",{value:!0}),e);var g={};module.exports=d(g);
1
+ "use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of i(t))!l.call(e,o)&&o!==a&&r(e,o,{get:()=>t[o],enumerable:!(n=s(t,o))||n.enumerable});return e};var p=e=>c(r({},"__esModule",{value:!0}),e);var d={};module.exports=p(d);
2
2
  //# sourceMappingURL=solanaContextTypes.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/solana/domain/solanaContextTypes.ts"],
4
- "sourcesContent": ["import { type DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { type Either } from \"purify-ts\";\n\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\n\nexport type SolanaTransactionContext = {\n deviceModelId: DeviceModelId;\n challenge?: string;\n tokenAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n};\n\nexport type SolanaSPLOwnerInfo = {\n tokenAccount: string;\n owner: string;\n contract: string;\n signedDescriptor: string;\n};\n\nexport type SolanaTransactionContextResultSuccess = {\n descriptor: Uint8Array;\n tokenAccount: string;\n owner: string;\n contract: string;\n certificate: PkiCertificate;\n};\n\nexport type SolanaTransactionContextResult = Either<\n Error,\n SolanaTransactionContextResultSuccess\n>;\n"],
4
+ "sourcesContent": ["import { type DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { type Either } from \"purify-ts\";\n\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport {\n type SolanaLifiContextResult,\n type SolanaTokenContextResult,\n} from \"@/shared/model/SolanaContextTypes\";\n\nexport type SolanaTransactionContext = {\n deviceModelId: DeviceModelId;\n challenge?: string;\n tokenAddress?: string;\n tokenInternalId?: string;\n templateId?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n};\n\nexport type SolanaSPLOwnerInfo = {\n tokenAccount: string;\n owner: string;\n contract: string;\n signedDescriptor: string;\n};\n\nexport type SolanaContextLoaderResults = Array<\n SolanaTokenContextResult | SolanaLifiContextResult\n>;\n\nexport type SolanaTransactionContextResultSuccess = {\n trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\n};\n\nexport type SolanaTransactionContextResult = Either<\n Error,\n SolanaTransactionContextResultSuccess\n>;\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["solanaContextTypes_exports", "__toCommonJS"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var T=Object.create;var s=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var _=(t,r)=>{for(var o in r)s(t,o,{get:r[o],enumerable:!0})},d=(t,r,o,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of G(r))!R.call(t,e)&&e!==o&&s(t,e,{get:()=>r[e],enumerable:!(i=f(r,e))||i.enumerable});return t};var l=(t,r,o)=>(o=t!=null?T(x(t)):{},d(r||!t||!t.__esModule?s(o,"default",{value:t,enumerable:!0}):o,t)),y=t=>d(s({},"__esModule",{value:!0}),t),u=(t,r,o,i)=>{for(var e=i>1?void 0:i?f(r,o):r,p=t.length-1,m;p>=0;p--)(m=t[p])&&(e=(i?m(r,o,e):m(e))||e);return i&&e&&s(r,o,e),e},E=(t,r)=>(o,i)=>r(o,i,t);var b={};_(b,{HttpSolanaLifiDataSource:()=>n});module.exports=y(b);var h=l(require("axios")),c=require("inversify"),a=require("purify-ts"),g=require("../../config/di/configTypes"),C=require("../../shared/constant/HttpHeaders"),D=l(require("../../../package.json"));let n=class{constructor(r){this.config=r}async getTransactionDescriptorsPayload({templateId:r}){try{const{data:o}=await h.default.request({method:"GET",url:`${this.config.cal.url}/swap_templates`,params:{template_id:r,output:"id,chain_id,instructions,descriptors",ref:"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784"},headers:{[C.LEDGER_CLIENT_VERSION_HEADER]:`context-module/${D.default.version}`}});return!o||o.length===0||!o[0]?(0,a.Left)(new Error(`[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${r}`)):(0,a.Right)(o[0])}catch{return(0,a.Left)(new Error("[ContextModule] HttpSolanaLifiDataSource: Failed to fetch transaction descriptors"))}}};n=u([(0,c.injectable)(),E(0,(0,c.inject)(g.configTypes.Config))],n);0&&(module.exports={HttpSolanaLifiDataSource});
2
+ //# sourceMappingURL=HttpSolanaLifiDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaLifi/data/HttpSolanaLifiDataSource.ts"],
4
+ "sourcesContent": ["import axios from \"axios\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { LEDGER_CLIENT_VERSION_HEADER } from \"@/shared/constant/HttpHeaders\";\nimport PACKAGE from \"@root/package.json\";\n\nimport {\n GetTransactionDescriptorsParams,\n GetTransactionDescriptorsResponse,\n SolanaLifiDataSource,\n} from \"./SolanaLifiDataSource\";\n\n@injectable()\nexport class HttpSolanaLifiDataSource implements SolanaLifiDataSource {\n constructor(\n @inject(configTypes.Config) private readonly config: ContextModuleConfig,\n ) {}\n public async getTransactionDescriptorsPayload({\n templateId,\n }: GetTransactionDescriptorsParams): Promise<\n Either<Error, GetTransactionDescriptorsResponse>\n > {\n try {\n const { data } = await axios.request<GetTransactionDescriptorsResponse[]>(\n {\n method: \"GET\",\n url: `${this.config.cal.url}/swap_templates`,\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n // TODO LIFI\n // REVERT WHEN CAL SUPPORTS IT\n ref: \"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784\",\n },\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n },\n },\n );\n\n if (!data || data.length === 0 || !data[0]) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n );\n }\n\n return Right(data[0]);\n } catch (_error) {\n return Left(\n new Error(\n \"[ContextModule] HttpSolanaLifiDataSource: Failed to fetch transaction descriptors\",\n ),\n );\n }\n }\n}\n"],
5
+ "mappings": "qtBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAkB,oBAClBC,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6C,yCAC7CC,EAAoB,iCASb,IAAMC,EAAN,KAA+D,CACpE,YAC+CC,EAC7C,CAD6C,YAAAA,CAC5C,CACH,MAAa,iCAAiC,CAC5C,WAAAC,CACF,EAEE,CACA,GAAI,CACF,KAAM,CAAE,KAAAC,CAAK,EAAI,MAAM,EAAAC,QAAM,QAC3B,CACE,OAAQ,MACR,IAAK,GAAG,KAAK,OAAO,IAAI,GAAG,kBAC3B,OAAQ,CACN,YAAaF,EACb,OAAQ,uCAGR,IAAK,qDACP,EACA,QAAS,CACP,CAAC,8BAA4B,EAAG,kBAAkB,EAAAG,QAAQ,OAAO,EACnE,CACF,CACF,EAEA,MAAI,CAACF,GAAQA,EAAK,SAAW,GAAK,CAACA,EAAK,CAAC,KAChC,QACL,IAAI,MACF,+EAA+ED,CAAU,EAC3F,CACF,KAGK,SAAMC,EAAK,CAAC,CAAC,CACtB,MAAiB,CACf,SAAO,QACL,IAAI,MACF,mFACF,CACF,CACF,CACF,CACF,EA5CaH,EAANM,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,IAFjBP",
6
+ "names": ["HttpSolanaLifiDataSource_exports", "__export", "HttpSolanaLifiDataSource", "__toCommonJS", "import_axios", "import_inversify", "import_purify_ts", "import_configTypes", "import_HttpHeaders", "import_package", "HttpSolanaLifiDataSource", "config", "templateId", "data", "axios", "PACKAGE", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var m=Object.create;var c=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var E=(a,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of y(t))!w.call(a,s)&&s!==r&&c(a,s,{get:()=>t[s],enumerable:!(o=f(t,s))||o.enumerable});return a};var l=(a,t,r)=>(r=a!=null?m(h(a)):{},E(t||!a||!a.__esModule?c(r,"default",{value:a,enumerable:!0}):r,a));var n=l(require("axios")),i=require("purify-ts"),e=require("vitest"),d=require("../../shared/constant/HttpHeaders"),p=l(require("../../../package.json")),u=require("./HttpSolanaLifiDataSource");e.vi.mock("axios");(0,e.describe)("HttpSolanaLifiDataSource",()=>{let a;const t="tpl-123",r={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}};(0,e.beforeAll)(()=>{a=new u.HttpSolanaLifiDataSource(r)}),(0,e.beforeEach)(()=>{e.vi.clearAllMocks()}),(0,e.it)("should call axios with the ledger client version header and correct params",async()=>{const o=e.vi.fn(()=>Promise.resolve({data:[]}));e.vi.spyOn(n.default,"request").mockImplementation(o),await a.getTransactionDescriptorsPayload({templateId:t}),(0,e.expect)(o).toHaveBeenCalledTimes(1),(0,e.expect)(o).toHaveBeenCalledWith(e.expect.objectContaining({method:"GET",url:`${r.cal.url}/swap_templates`,params:{template_id:t,output:"id,chain_id,instructions,descriptors",ref:"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784"},headers:{[d.LEDGER_CLIENT_VERSION_HEADER]:`context-module/${p.default.version}`}}))}),(0,e.it)("should return Right(data[0]) when axios responds with a non-empty array",async()=>{const o={descriptors:{swap:{programId:"SwapProgram",accounts:[],data:"abcd"}}};e.vi.spyOn(n.default,"request").mockResolvedValue({data:[o]});const s=await a.getTransactionDescriptorsPayload({templateId:t});(0,e.expect)(s).toEqual((0,i.Right)(o))}),(0,e.it)("should return an error when data is undefined",async()=>{e.vi.spyOn(n.default,"request").mockResolvedValue({data:void 0});const o=await a.getTransactionDescriptorsPayload({templateId:t});(0,e.expect)(o).toEqual((0,i.Left)(new Error(`[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${t}`)))}),(0,e.it)("should return an error when data array is empty",async()=>{e.vi.spyOn(n.default,"request").mockResolvedValue({data:[]});const o=await a.getTransactionDescriptorsPayload({templateId:t});(0,e.expect)(o).toEqual((0,i.Left)(new Error(`[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${t}`)))}),(0,e.it)("should return an error when first element is falsy",async()=>{e.vi.spyOn(n.default,"request").mockResolvedValue({data:[void 0]});const o=await a.getTransactionDescriptorsPayload({templateId:t});(0,e.expect)(o).toEqual((0,i.Left)(new Error(`[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${t}`)))}),(0,e.it)("should return an error when axios throws",async()=>{e.vi.spyOn(n.default,"request").mockRejectedValue(new Error("network"));const o=await a.getTransactionDescriptorsPayload({templateId:t});(0,e.expect)(o).toEqual((0,i.Left)(new Error("[ContextModule] HttpSolanaLifiDataSource: Failed to fetch transaction descriptors")))})});
2
+ //# sourceMappingURL=HttpSolanaLifiDataSource.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaLifi/data/HttpSolanaLifiDataSource.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport axios from \"axios\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { LEDGER_CLIENT_VERSION_HEADER } from \"@/shared/constant/HttpHeaders\";\nimport PACKAGE from \"@root/package.json\";\n\nimport { HttpSolanaLifiDataSource } from \"./HttpSolanaLifiDataSource\";\nimport {\n type GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"./SolanaLifiDataSource\";\n\nvi.mock(\"axios\");\n\ndescribe(\"HttpSolanaLifiDataSource\", () => {\n let datasource: SolanaLifiDataSource;\n const templateId = \"tpl-123\";\n const config: ContextModuleConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleConfig;\n\n beforeAll(() => {\n datasource = new HttpSolanaLifiDataSource(config);\n });\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should call axios with the ledger client version header and correct params\", async () => {\n // given\n const requestSpy = vi.fn(() => Promise.resolve({ data: [] }));\n vi.spyOn(axios, \"request\").mockImplementation(requestSpy);\n\n // when\n await datasource.getTransactionDescriptorsPayload({ templateId });\n\n // then\n expect(requestSpy).toHaveBeenCalledTimes(1);\n expect(requestSpy).toHaveBeenCalledWith(\n expect.objectContaining({\n method: \"GET\",\n url: `${config.cal.url}/swap_templates`,\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n // TODO LIFI\n // REVERT WHEN CAL SUPPORTS IT\n ref: \"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784\",\n },\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n },\n }),\n );\n });\n\n it(\"should return Right(data[0]) when axios responds with a non-empty array\", async () => {\n // given\n const response0: GetTransactionDescriptorsResponse = {\n descriptors: {\n swap: { programId: \"SwapProgram\", accounts: [], data: \"abcd\" } as any,\n },\n } as any;\n\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: [response0] });\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(Right(response0));\n });\n\n it(\"should return an error when data is undefined\", async () => {\n // given\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: undefined });\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when data array is empty\", async () => {\n // given\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: [] });\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when first element is falsy\", async () => {\n // given\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: [undefined] });\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpSolanaLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when axios throws\", async () => {\n // given\n vi.spyOn(axios, \"request\").mockRejectedValue(new Error(\"network\"));\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaLifiDataSource: Failed to fetch transaction descriptors\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "wdAEA,IAAAA,EAAkB,oBAClBC,EAA4B,qBAC5BC,EAAgE,kBAGhEC,EAA6C,yCAC7CC,EAAoB,iCAEpBC,EAAyC,sCAMzC,KAAG,KAAK,OAAO,KAEf,YAAS,2BAA4B,IAAM,CACzC,IAAIC,EACJ,MAAMC,EAAa,UACbC,EAA8B,CAClC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,KAEA,aAAU,IAAM,CACdF,EAAa,IAAI,2BAAyBE,CAAM,CAClD,CAAC,KAED,cAAW,IAAM,CACf,KAAG,cAAc,CACnB,CAAC,KAED,MAAG,6EAA8E,SAAY,CAE3F,MAAMC,EAAa,KAAG,GAAG,IAAM,QAAQ,QAAQ,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EAC5D,KAAG,MAAM,EAAAC,QAAO,SAAS,EAAE,mBAAmBD,CAAU,EAGxD,MAAMH,EAAW,iCAAiC,CAAE,WAAAC,CAAW,CAAC,KAGhE,UAAOE,CAAU,EAAE,sBAAsB,CAAC,KAC1C,UAAOA,CAAU,EAAE,qBACjB,SAAO,iBAAiB,CACtB,OAAQ,MACR,IAAK,GAAGD,EAAO,IAAI,GAAG,kBACtB,OAAQ,CACN,YAAaD,EACb,OAAQ,uCAGR,IAAK,qDACP,EACA,QAAS,CACP,CAAC,8BAA4B,EAAG,kBAAkB,EAAAI,QAAQ,OAAO,EACnE,CACF,CAAC,CACH,CACF,CAAC,KAED,MAAG,0EAA2E,SAAY,CAExF,MAAMC,EAA+C,CACnD,YAAa,CACX,KAAM,CAAE,UAAW,cAAe,SAAU,CAAC,EAAG,KAAM,MAAO,CAC/D,CACF,EAEA,KAAG,MAAM,EAAAF,QAAO,SAAS,EAAE,kBAAkB,CAAE,KAAM,CAACE,CAAS,CAAE,CAAC,EAGlE,MAAMC,EAAS,MAAMP,EAAW,iCAAiC,CAC/D,WAAAC,CACF,CAAC,KAGD,UAAOM,CAAM,EAAE,WAAQ,SAAMD,CAAS,CAAC,CACzC,CAAC,KAED,MAAG,gDAAiD,SAAY,CAE9D,KAAG,MAAM,EAAAF,QAAO,SAAS,EAAE,kBAAkB,CAAE,KAAM,MAAU,CAAC,EAGhE,MAAMG,EAAS,MAAMP,EAAW,iCAAiC,CAC/D,WAAAC,CACF,CAAC,KAGD,UAAOM,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EAA+EN,CAAU,EAC3F,CACF,CACF,CACF,CAAC,KAED,MAAG,kDAAmD,SAAY,CAEhE,KAAG,MAAM,EAAAG,QAAO,SAAS,EAAE,kBAAkB,CAAE,KAAM,CAAC,CAAE,CAAC,EAGzD,MAAMG,EAAS,MAAMP,EAAW,iCAAiC,CAC/D,WAAAC,CACF,CAAC,KAGD,UAAOM,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EAA+EN,CAAU,EAC3F,CACF,CACF,CACF,CAAC,KAED,MAAG,qDAAsD,SAAY,CAEnE,KAAG,MAAM,EAAAG,QAAO,SAAS,EAAE,kBAAkB,CAAE,KAAM,CAAC,MAAS,CAAE,CAAC,EAGlE,MAAMG,EAAS,MAAMP,EAAW,iCAAiC,CAC/D,WAAAC,CACF,CAAC,KAGD,UAAOM,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EAA+EN,CAAU,EAC3F,CACF,CACF,CACF,CAAC,KAED,MAAG,2CAA4C,SAAY,CAEzD,KAAG,MAAM,EAAAG,QAAO,SAAS,EAAE,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGjE,MAAMG,EAAS,MAAMP,EAAW,iCAAiC,CAC/D,WAAAC,CACF,CAAC,KAGD,UAAOM,CAAM,EAAE,WACb,QACE,IAAI,MACF,mFACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["import_axios", "import_purify_ts", "import_vitest", "import_HttpHeaders", "import_package", "import_HttpSolanaLifiDataSource", "datasource", "templateId", "config", "requestSpy", "axios", "PACKAGE", "response0", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,r,o,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of n(r))!p.call(t,e)&&e!==o&&a(t,e,{get:()=>r[e],enumerable:!(s=i(r,e))||s.enumerable});return t};var m=t=>c(a({},"__esModule",{value:!0}),t);var D={};module.exports=m(D);
2
+ //# sourceMappingURL=SolanaLifiDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaLifi/data/SolanaLifiDataSource.ts"],
4
+ "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nimport { type SolanaTransactionDescriptorList } from \"@/shared/model/SolanaContextTypes\";\n\nexport type GetTransactionDescriptorsParams = {\n templateId: string;\n};\n\nexport type GetTransactionDescriptorsResponse = {\n [key: string]: unknown;\n descriptors: SolanaTransactionDescriptorList;\n};\n\nexport interface SolanaLifiDataSource {\n getTransactionDescriptorsPayload(\n params: GetTransactionDescriptorsParams,\n ): Promise<Either<Error, GetTransactionDescriptorsResponse>>;\n}\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["SolanaLifiDataSource_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var c=(o,a)=>{for(var i in a)r(o,i,{get:a[i],enumerable:!0})},u=(o,a,i,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of L(a))!S.call(o,t)&&t!==i&&r(o,t,{get:()=>a[t],enumerable:!(f=p(a,t))||f.enumerable});return o};var d=o=>u(r({},"__esModule",{value:!0}),o);var x={};c(x,{solanaLifiModuleFactory:()=>s});module.exports=d(x);var n=require("inversify"),l=require("../../solanaLifi/data/HttpSolanaLifiDataSource"),m=require("../../solanaLifi/domain/SolanaLifiContextLoader"),e=require("./solanaLifiTypes");const s=()=>new n.ContainerModule(({bind:o})=>{o(e.lifiTypes.SolanaLifiDataSource).to(l.HttpSolanaLifiDataSource),o(e.lifiTypes.SolanaLifiContextLoader).to(m.SolanaLifiContextLoader)});0&&(module.exports={solanaLifiModuleFactory});
2
+ //# sourceMappingURL=lifiModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaLifi/di/lifiModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpSolanaLifiDataSource } from \"@/solanaLifi/data/HttpSolanaLifiDataSource\";\nimport { SolanaLifiContextLoader } from \"@/solanaLifi/domain/SolanaLifiContextLoader\";\n\nimport { lifiTypes } from \"./solanaLifiTypes\";\n\nexport const solanaLifiModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(lifiTypes.SolanaLifiDataSource).to(HttpSolanaLifiDataSource);\n bind(lifiTypes.SolanaLifiContextLoader).to(SolanaLifiContextLoader);\n });\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAyC,sDACzCC,EAAwC,uDAExCC,EAA0B,6BAEnB,MAAML,EAA0B,IACrC,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,YAAU,oBAAoB,EAAE,GAAG,0BAAwB,EAChEA,EAAK,YAAU,uBAAuB,EAAE,GAAG,yBAAuB,CACpE,CAAC",
6
+ "names": ["lifiModuleFactory_exports", "__export", "solanaLifiModuleFactory", "__toCommonJS", "import_inversify", "import_HttpSolanaLifiDataSource", "import_SolanaLifiContextLoader", "import_solanaLifiTypes", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var t=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var r=(a,o)=>{for(var e in o)t(a,e,{get:o[e],enumerable:!0})},L=(a,o,e,S)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of l(o))!n.call(a,i)&&i!==e&&t(a,i,{get:()=>o[i],enumerable:!(S=f(o,i))||S.enumerable});return a};var c=a=>L(t({},"__esModule",{value:!0}),a);var y={};r(y,{lifiTypes:()=>x});module.exports=c(y);const x={SolanaLifiDataSource:Symbol.for("SolanaLifiDataSource"),SolanaLifiContextLoader:Symbol.for("SolanaLifiContextLoader")};0&&(module.exports={lifiTypes});
2
+ //# sourceMappingURL=solanaLifiTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaLifi/di/solanaLifiTypes.ts"],
4
+ "sourcesContent": ["export const lifiTypes = {\n SolanaLifiDataSource: Symbol.for(\"SolanaLifiDataSource\"),\n SolanaLifiContextLoader: Symbol.for(\"SolanaLifiContextLoader\"),\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAY,CACvB,qBAAsB,OAAO,IAAI,sBAAsB,EACvD,wBAAyB,OAAO,IAAI,yBAAyB,CAC/D",
6
+ "names": ["solanaLifiTypes_exports", "__export", "lifiTypes", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var L=(n,t)=>{for(var e in t)r(n,e,{get:t[e],enumerable:!0})},I=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of d(t))!y.call(n,a)&&a!==e&&r(n,a,{get:()=>t[a],enumerable:!(o=u(t,a))||o.enumerable});return n};var T=n=>I(r({},"__esModule",{value:!0}),n),S=(n,t,e,o)=>{for(var a=o>1?void 0:o?u(t,e):t,p=n.length-1,c;p>=0;p--)(c=n[p])&&(a=(o?c(t,e,a):c(a))||a);return o&&a&&r(t,e,a),a},f=(n,t)=>(e,o)=>t(e,o,n);var R={};L(R,{SolanaLifiContextLoader:()=>i});module.exports=T(R);var s=require("inversify"),l=require("../../shared/model/SolanaContextTypes"),m=require("../../solanaLifi/di/solanaLifiTypes");let i=class{constructor(t){this.dataSource=t}canHandle(t,e){if(e!==l.SolanaContextTypes.SOLANA_LIFI)return!1;if(typeof t=="object"&&t!==null&&"templateId"in t){const o=t.templateId;return typeof o=="string"&&o.length>0}return!1}async loadField(t){const{templateId:e}=t;return(await this.dataSource.getTransactionDescriptorsPayload({templateId:e})).caseOf({Left:a=>({type:l.SolanaContextTypes.ERROR,error:a}),Right:a=>({type:l.SolanaContextTypes.SOLANA_LIFI,payload:this.pluckTransactionData(a)})})}pluckTransactionData(t){return{...t.descriptors}}};i=S([(0,s.injectable)(),f(0,(0,s.inject)(m.lifiTypes.SolanaLifiDataSource))],i);0&&(module.exports={SolanaLifiContextLoader});
2
+ //# sourceMappingURL=SolanaLifiContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaLifi/domain/SolanaLifiContextLoader.ts"],
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n SolanaContextTypes,\n SolanaLifiContextResult,\n SolanaTransactionDescriptorList,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n GetTransactionDescriptorsResponse,\n type SolanaLifiDataSource,\n} from \"@/solanaLifi/data/SolanaLifiDataSource\";\nimport { lifiTypes } from \"@/solanaLifi/di/solanaLifiTypes\";\n\ntype SolanaLifiFieldInput = SolanaTransactionContext & {\n templateId: string;\n};\n\n@injectable()\nexport class SolanaLifiContextLoader\n implements\n ContextFieldLoader<\n SolanaLifiFieldInput,\n SolanaContextTypes,\n SolanaLifiContextResult\n >\n{\n constructor(\n @inject(lifiTypes.SolanaLifiDataSource)\n private readonly dataSource: SolanaLifiDataSource,\n ) {}\n\n public canHandle(\n field: unknown,\n expectedType: SolanaContextTypes,\n ): field is SolanaLifiFieldInput {\n if (expectedType !== SolanaContextTypes.SOLANA_LIFI) return false;\n\n if (typeof field === \"object\" && field !== null && \"templateId\" in field) {\n const templateId = (field as { templateId: unknown }).templateId;\n return typeof templateId === \"string\" && templateId.length > 0;\n }\n\n return false;\n }\n\n public async loadField(\n solanaTokenContextInput: SolanaLifiFieldInput,\n ): Promise<SolanaLifiContextResult> {\n const { templateId } = solanaTokenContextInput;\n\n const payload = await this.dataSource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n return payload.caseOf({\n Left: (error): SolanaLifiContextResult => ({\n type: SolanaContextTypes.ERROR,\n error,\n }),\n Right: (value): SolanaLifiContextResult => ({\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: this.pluckTransactionData(value),\n }),\n });\n }\n\n private pluckTransactionData(\n tokenData: GetTransactionDescriptorsResponse,\n ): SolanaTransactionDescriptorList {\n return {\n ...tokenData.descriptors,\n };\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAGnCC,EAIO,6CAMPC,EAA0B,2CAOnB,IAAMC,EAAN,KAOP,CACE,YAEmBC,EACjB,CADiB,gBAAAA,CAChB,CAEI,UACLC,EACAC,EAC+B,CAC/B,GAAIA,IAAiB,qBAAmB,YAAa,MAAO,GAE5D,GAAI,OAAOD,GAAU,UAAYA,IAAU,MAAQ,eAAgBA,EAAO,CACxE,MAAME,EAAcF,EAAkC,WACtD,OAAO,OAAOE,GAAe,UAAYA,EAAW,OAAS,CAC/D,CAEA,MAAO,EACT,CAEA,MAAa,UACXC,EACkC,CAClC,KAAM,CAAE,WAAAD,CAAW,EAAIC,EAMvB,OAJgB,MAAM,KAAK,WAAW,iCAAiC,CACrE,WAAAD,CACF,CAAC,GAEc,OAAO,CACpB,KAAOE,IAAoC,CACzC,KAAM,qBAAmB,MACzB,MAAAA,CACF,GACA,MAAQC,IAAoC,CAC1C,KAAM,qBAAmB,YACzB,QAAS,KAAK,qBAAqBA,CAAK,CAC1C,EACF,CAAC,CACH,CAEQ,qBACNC,EACiC,CACjC,MAAO,CACL,GAAGA,EAAU,WACf,CACF,CACF,EAvDaR,EAANS,EAAA,IADN,cAAW,EAUPC,EAAA,eAAO,YAAU,oBAAoB,IAT7BV",
6
+ "names": ["SolanaLifiContextLoader_exports", "__export", "SolanaLifiContextLoader", "__toCommonJS", "import_inversify", "import_SolanaContextTypes", "import_solanaLifiTypes", "SolanaLifiContextLoader", "dataSource", "field", "expectedType", "templateId", "solanaTokenContextInput", "error", "value", "tokenData", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=require("purify-ts"),a=require("vitest"),t=require("../../shared/model/SolanaContextTypes"),d=require("./SolanaLifiContextLoader");(0,a.describe)("SolanaLifiContextLoader",()=>{let o;const c={swap:{programId:"SomeProgram",accounts:[],data:"abc123"},bridge:{programId:"AnotherProgram",accounts:[],data:"def456"}},i={descriptors:c};(0,a.beforeEach)(()=>{a.vi.restoreAllMocks(),o={getTransactionDescriptorsPayload:a.vi.fn()}});const r=()=>new d.SolanaLifiContextLoader(o);(0,a.describe)("canHandle",()=>{(0,a.it)("returns true when templateId is provided",()=>{const e=r();(0,a.expect)(e.canHandle({templateId:"tpl-123",deviceModelId:"nanoS"},t.SolanaContextTypes.SOLANA_LIFI)).toBe(!0)}),(0,a.it)("returns false when templateId is missing or falsy",()=>{const e=r();(0,a.expect)(e.canHandle({templateId:""},t.SolanaContextTypes.SOLANA_LIFI)).toBe(!1),(0,a.expect)(e.canHandle({templateId:void 0},t.SolanaContextTypes.SOLANA_LIFI)).toBe(!1),(0,a.expect)(e.canHandle({},t.SolanaContextTypes.SOLANA_LIFI)).toBe(!1)})}),(0,a.describe)("loadField",()=>{(0,a.it)("returns an error when datasource returns Left(error)",async()=>{const e=r(),n=new Error("boom");a.vi.spyOn(o,"getTransactionDescriptorsPayload").mockResolvedValue((0,l.Left)(n));const s={templateId:"tpl-err",deviceModelId:"nanoS"},p=await e.loadField(s);(0,a.expect)(o.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-err"}),(0,a.expect)(p).toEqual({type:t.SolanaContextTypes.ERROR,error:n})}),(0,a.it)("returns SOLANA_LIFI with plucked descriptors when datasource returns Right(value)",async()=>{const e=r();a.vi.spyOn(o,"getTransactionDescriptorsPayload").mockResolvedValue((0,l.Right)(i));const n={templateId:"tpl-ok",deviceModelId:"nanoS"},s=await e.loadField(n);(0,a.expect)(o.getTransactionDescriptorsPayload).toHaveBeenCalledWith({templateId:"tpl-ok"}),(0,a.expect)(s).toEqual({type:t.SolanaContextTypes.SOLANA_LIFI,payload:c})})}),(0,a.describe)("pluckTransactionData (private)",()=>{(0,a.it)("simply returns the descriptors object from the response",()=>{const e=r(),s=e.pluckTransactionData.bind(e)(i);(0,a.expect)(s).toEqual(c)})})});
2
+ //# sourceMappingURL=SolanaLifiContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 {\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 = () => new SolanaLifiContextLoader(mockDataSource);\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,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAGO,6CAMPC,EAAwC,wCAExC,YAAS,0BAA2B,IAAM,CACxC,IAAIC,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,KAEA,cAAW,IAAM,CACf,KAAG,gBAAgB,EACnBD,EAAiB,CACf,iCAAkC,KAAG,GAAG,CAC1C,CACF,CAAC,EAED,MAAMG,EAAa,IAAM,IAAI,0BAAwBH,CAAc,KAEnE,YAAS,YAAa,IAAM,IAC1B,MAAG,2CAA4C,IAAM,CACnD,MAAMI,EAASD,EAAW,KAE1B,UACEC,EAAO,UACL,CACE,WAAY,UACZ,cAAe,OACjB,EACA,qBAAmB,WACrB,CACF,EAAE,KAAK,EAAI,CACb,CAAC,KAED,MAAG,oDAAqD,IAAM,CAC5D,MAAMA,EAASD,EAAW,KAE1B,UACEC,EAAO,UACL,CAAE,WAAY,EAAG,EACjB,qBAAmB,WACrB,CACF,EAAE,KAAK,EAAK,KACZ,UACEA,EAAO,UACL,CAAE,WAAY,MAAU,EACxB,qBAAmB,WACrB,CACF,EAAE,KAAK,EAAK,KACZ,UAAOA,EAAO,UAAU,CAAC,EAAU,qBAAmB,WAAW,CAAC,EAAE,KAClE,EACF,CACF,CAAC,CACH,CAAC,KAED,YAAS,YAAa,IAAM,IAC1B,MAAG,uDAAwD,SAAY,CACrE,MAAMA,EAASD,EAAW,EACpBE,EAAQ,IAAI,MAAM,MAAM,EAC9B,KAAG,MACDL,EACA,kCACF,EAAE,qBAAkB,QAAKK,CAAK,CAAC,EAC/B,MAAMC,EAAQ,CAAE,WAAY,UAAW,cAAe,OAAe,EAC/DC,EAAS,MAAMH,EAAO,UAAUE,CAAK,KAE3C,UACEN,EAAe,gCACjB,EAAE,qBAAqB,CACrB,WAAY,SACd,CAAC,KACD,UAAOO,CAAM,EAAE,QAAQ,CACrB,KAAM,qBAAmB,MACzB,MAAAF,CACF,CAAC,CACH,CAAC,KAED,MAAG,oFAAqF,SAAY,CAClG,MAAMD,EAASD,EAAW,EAC1B,KAAG,MACDH,EACA,kCACF,EAAE,qBAAkB,SAAME,CAAqB,CAAC,EAChD,MAAMI,EAAQ,CAAE,WAAY,SAAU,cAAe,OAAe,EAC9DC,EAAS,MAAMH,EAAO,UAAUE,CAAK,KAE3C,UACEN,EAAe,gCACjB,EAAE,qBAAqB,CACrB,WAAY,QACd,CAAC,KACD,UAAOO,CAAM,EAAE,QAAQ,CACrB,KAAM,qBAAmB,YACzB,QAASN,CACX,CAAC,CACH,CAAC,CACH,CAAC,KAED,YAAS,iCAAkC,IAAM,IAC/C,MAAG,0DAA2D,IAAM,CAClE,MAAMG,EAASD,EAAW,EAGpBI,EAFSH,EAAe,qBAAqB,KAAKA,CAAM,EAEzCF,CAAqB,KAE1C,UAAOK,CAAM,EAAE,QAAQN,CAAW,CACpC,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_purify_ts", "import_vitest", "import_SolanaContextTypes", "import_SolanaLifiContextLoader", "mockDataSource", "descriptors", "txDescriptorsResponse", "makeLoader", "loader", "error", "input", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var T=Object.create;var a=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var R=(e,o)=>{for(var r in o)a(e,r,{get:o[r],enumerable:!0})},p=(e,o,r,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of x(o))!C.call(e,t)&&t!==r&&a(e,t,{get:()=>o[t],enumerable:!(n=l(o,t))||n.enumerable});return e};var d=(e,o,r)=>(r=e!=null?T(y(e)):{},p(o||!e||!e.__esModule?a(r,"default",{value:e,enumerable:!0}):r,e)),b=e=>p(a({},"__esModule",{value:!0}),e),u=(e,o,r,n)=>{for(var t=n>1?void 0:n?l(o,r):o,m=e.length-1,f;m>=0;m--)(f=e[m])&&(t=(n?f(o,r,t):f(t))||t);return n&&t&&a(o,r,t),t},h=(e,o)=>(r,n)=>o(r,n,e);var w={};R(w,{HttpSolanaTokenDataSource:()=>i});module.exports=b(w);var _=d(require("axios")),c=require("inversify"),s=require("purify-ts"),g=require("../../config/di/configTypes"),k=require("../../shared/constant/HttpHeaders"),E=d(require("../../../package.json"));let i=class{constructor(o){this.config=o}async getTokenInfosPayload({tokenInternalId:o}){try{const{data:r}=await _.default.request({method:"GET",url:`${this.config.cal.url}/tokens`,params:{id:o,output:"id,name,network,network_family,network_type,exchange_app_config_serialized,live_signature,ticker,decimals,blockchain_name,chain_id,contract_address,descriptor,descriptor_exchange_app,units,symbol",ref:`branch:${this.config.cal.branch}`},headers:{[k.LEDGER_CLIENT_VERSION_HEADER]:`context-module/${E.default.version}`}});return!r||r.length===0||!r[0]?(0,s.Left)(new Error(`[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${o}`)):(0,s.Right)(r[0])}catch{return(0,s.Left)(new Error("[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations"))}}};i=u([(0,c.injectable)(),h(0,(0,c.inject)(g.configTypes.Config))],i);0&&(module.exports={HttpSolanaTokenDataSource});
2
+ //# sourceMappingURL=HttpSolanaTokenDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaToken/data/HttpSolanaTokenDataSource.ts"],
4
+ "sourcesContent": ["import axios from \"axios\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { LEDGER_CLIENT_VERSION_HEADER } from \"@/shared/constant/HttpHeaders\";\nimport PACKAGE from \"@root/package.json\";\n\nimport {\n GetSolanaTokenInfosParams,\n SolanaTokenDataSource,\n TokenDataResponse,\n} from \"./SolanaTokenDataSource\";\n\n@injectable()\nexport class HttpSolanaTokenDataSource implements SolanaTokenDataSource {\n constructor(\n @inject(configTypes.Config) private readonly config: ContextModuleConfig,\n ) {}\n public async getTokenInfosPayload({\n tokenInternalId,\n }: GetSolanaTokenInfosParams): Promise<Either<Error, TokenDataResponse>> {\n try {\n const { data } = await axios.request<TokenDataResponse[]>({\n method: \"GET\",\n url: `${this.config.cal.url}/tokens`,\n params: {\n id: tokenInternalId,\n output:\n \"id,name,network,network_family,network_type,exchange_app_config_serialized,live_signature,ticker,decimals,blockchain_name,chain_id,contract_address,descriptor,descriptor_exchange_app,units,symbol\",\n ref: `branch:${this.config.cal.branch}`,\n },\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n },\n });\n\n if (!data || data.length === 0 || !data[0]) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${tokenInternalId}`,\n ),\n );\n }\n\n return Right(data[0]);\n } catch (_error) {\n return Left(\n new Error(\n \"[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations\",\n ),\n );\n }\n }\n}\n"],
5
+ "mappings": "qtBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAkB,oBAClBC,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6C,yCAC7CC,EAAoB,iCASb,IAAMC,EAAN,KAAiE,CACtE,YAC+CC,EAC7C,CAD6C,YAAAA,CAC5C,CACH,MAAa,qBAAqB,CAChC,gBAAAC,CACF,EAAyE,CACvE,GAAI,CACF,KAAM,CAAE,KAAAC,CAAK,EAAI,MAAM,EAAAC,QAAM,QAA6B,CACxD,OAAQ,MACR,IAAK,GAAG,KAAK,OAAO,IAAI,GAAG,UAC3B,OAAQ,CACN,GAAIF,EACJ,OACE,sMACF,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,EACA,QAAS,CACP,CAAC,8BAA4B,EAAG,kBAAkB,EAAAG,QAAQ,OAAO,EACnE,CACF,CAAC,EAED,MAAI,CAACF,GAAQA,EAAK,SAAW,GAAK,CAACA,EAAK,CAAC,KAChC,QACL,IAAI,MACF,uEAAuED,CAAe,EACxF,CACF,KAGK,SAAMC,EAAK,CAAC,CAAC,CACtB,MAAiB,CACf,SAAO,QACL,IAAI,MACF,+EACF,CACF,CACF,CACF,CACF,EAvCaH,EAANM,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,IAFjBP",
6
+ "names": ["HttpSolanaTokenDataSource_exports", "__export", "HttpSolanaTokenDataSource", "__toCommonJS", "import_axios", "import_inversify", "import_purify_ts", "import_configTypes", "import_HttpHeaders", "import_package", "HttpSolanaTokenDataSource", "config", "tokenInternalId", "data", "axios", "PACKAGE", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";var h=Object.create;var c=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var S=(a,t,n,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of k(t))!E.call(a,o)&&o!==n&&c(a,o,{get:()=>t[o],enumerable:!(l=y(t,o))||l.enumerable});return a};var d=(a,t,n)=>(n=a!=null?h(g(a)):{},S(t||!a||!a.__esModule?c(n,"default",{value:a,enumerable:!0}):n,a));var r=d(require("axios")),s=require("purify-ts"),e=require("vitest"),u=require("../../shared/constant/HttpHeaders"),m=d(require("../../../package.json")),p=require("./HttpSolanaTokenDataSource");e.vi.mock("axios");(0,e.describe)("HttpSolanaTokenDataSource",()=>{let a;const t="sol:usdc",n={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}},l=o=>`[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${o}`;(0,e.beforeAll)(()=>{a=new p.HttpSolanaTokenDataSource(n)}),(0,e.beforeEach)(()=>{e.vi.clearAllMocks()}),(0,e.it)("should call axios with the ledger client version header and correct params",async()=>{const o=e.vi.fn(()=>Promise.resolve({data:[]}));e.vi.spyOn(r.default,"request").mockImplementation(o),await a.getTokenInfosPayload({tokenInternalId:t}),(0,e.expect)(o).toHaveBeenCalledTimes(1),(0,e.expect)(o).toHaveBeenCalledWith(e.expect.objectContaining({method:"GET",url:`${n.cal.url}/tokens`,params:e.expect.objectContaining({id:t,ref:`branch:${n.cal.branch}`}),headers:{[u.LEDGER_CLIENT_VERSION_HEADER]:`context-module/${m.default.version}`}}))}),(0,e.it)("should return Right(data[0]) when axios responds with a non-empty array",async()=>{const o={descriptor:{data:"ABCD",signatures:{prod:"SIG-PROD",test:"SIG-TEST"}}};e.vi.spyOn(r.default,"request").mockResolvedValue({data:[o]});const i=await a.getTokenInfosPayload({tokenInternalId:t});(0,e.expect)(i).toEqual((0,s.Right)(o))}),e.describe.each`
2
+ caseName | apiResponse
3
+ ${"data is undefined"} | ${{data:void 0}}
4
+ ${"data array is empty"} | ${{data:[]}}
5
+ ${"first element is falsy"} | ${{data:[void 0]}}
6
+ `("Error cases",({caseName:o,apiResponse:i})=>{(0,e.it)(`should return an error when ${o}`,async()=>{e.vi.spyOn(r.default,"request").mockResolvedValue(i);const f=await a.getTokenInfosPayload({tokenInternalId:t});(0,e.expect)(f).toEqual((0,s.Left)(new Error(l(t))))})}),(0,e.it)("should return an error when axios throws",async()=>{e.vi.spyOn(r.default,"request").mockRejectedValue(new Error("network"));const o=await a.getTokenInfosPayload({tokenInternalId:t});(0,e.expect)(o).toEqual((0,s.Left)(new Error("[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations")))})});
7
+ //# sourceMappingURL=HttpSolanaTokenDataSource.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaToken/data/HttpSolanaTokenDataSource.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport axios from \"axios\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { LEDGER_CLIENT_VERSION_HEADER } from \"@/shared/constant/HttpHeaders\";\nimport PACKAGE from \"@root/package.json\";\n\nimport { HttpSolanaTokenDataSource } from \"./HttpSolanaTokenDataSource\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"./SolanaTokenDataSource\";\n\nvi.mock(\"axios\");\n\ndescribe(\"HttpSolanaTokenDataSource\", () => {\n let datasource: SolanaTokenDataSource;\n const tokenInternalId = \"sol:usdc\";\n const config: ContextModuleConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleConfig;\n\n const errorMessage = (id: string) =>\n `[ContextModule] HttpSolanaTokenDataSource: no token metadata for id ${id}`;\n\n beforeAll(() => {\n datasource = new HttpSolanaTokenDataSource(config);\n });\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should call axios with the ledger client version header and correct params\", async () => {\n // given\n const requestSpy = vi.fn(() => Promise.resolve({ data: [] }));\n vi.spyOn(axios, \"request\").mockImplementation(requestSpy);\n\n // when\n await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(requestSpy).toHaveBeenCalledTimes(1);\n expect(requestSpy).toHaveBeenCalledWith(\n expect.objectContaining({\n method: \"GET\",\n url: `${config.cal.url}/tokens`,\n params: expect.objectContaining({\n id: tokenInternalId,\n ref: `branch:${config.cal.branch}`,\n }),\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n },\n }),\n );\n });\n\n it(\"should return Right(data[0]) when axios responds with a non-empty array\", async () => {\n // given\n const response0: TokenDataResponse = {\n descriptor: {\n data: \"ABCD\",\n signatures: {\n prod: \"SIG-PROD\",\n test: \"SIG-TEST\",\n } as any,\n },\n } as any;\n\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: [response0] });\n\n // when\n const result = await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(result).toEqual(Right(response0));\n });\n\n describe.each`\n caseName | apiResponse\n ${\"data is undefined\"} | ${{ data: undefined }}\n ${\"data array is empty\"} | ${{ data: [] }}\n ${\"first element is falsy\"} | ${{ data: [undefined] }}\n `(\"Error cases\", ({ caseName, apiResponse }) => {\n it(`should return an error when ${caseName}`, async () => {\n // given\n vi.spyOn(axios, \"request\").mockResolvedValue(apiResponse);\n\n // when\n const result = await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(result).toEqual(Left(new Error(errorMessage(tokenInternalId))));\n });\n });\n\n it(\"should return an error when axios throws\", async () => {\n // given\n vi.spyOn(axios, \"request\").mockRejectedValue(new Error(\"network\"));\n\n // when\n const result = await datasource.getTokenInfosPayload({ tokenInternalId });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTokenDataSource: Failed to fetch token informations\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "wdAEA,IAAAA,EAAkB,oBAClBC,EAA4B,qBAC5BC,EAAgE,kBAGhEC,EAA6C,yCAC7CC,EAAoB,iCAEpBC,EAA0C,uCAM1C,KAAG,KAAK,OAAO,KAEf,YAAS,4BAA6B,IAAM,CAC1C,IAAIC,EACJ,MAAMC,EAAkB,WAClBC,EAA8B,CAClC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,EAEMC,EAAgBC,GACpB,uEAAuEA,CAAE,MAE3E,aAAU,IAAM,CACdJ,EAAa,IAAI,4BAA0BE,CAAM,CACnD,CAAC,KAED,cAAW,IAAM,CACf,KAAG,cAAc,CACnB,CAAC,KAED,MAAG,6EAA8E,SAAY,CAE3F,MAAMG,EAAa,KAAG,GAAG,IAAM,QAAQ,QAAQ,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EAC5D,KAAG,MAAM,EAAAC,QAAO,SAAS,EAAE,mBAAmBD,CAAU,EAGxD,MAAML,EAAW,qBAAqB,CAAE,gBAAAC,CAAgB,CAAC,KAGzD,UAAOI,CAAU,EAAE,sBAAsB,CAAC,KAC1C,UAAOA,CAAU,EAAE,qBACjB,SAAO,iBAAiB,CACtB,OAAQ,MACR,IAAK,GAAGH,EAAO,IAAI,GAAG,UACtB,OAAQ,SAAO,iBAAiB,CAC9B,GAAID,EACJ,IAAK,UAAUC,EAAO,IAAI,MAAM,EAClC,CAAC,EACD,QAAS,CACP,CAAC,8BAA4B,EAAG,kBAAkB,EAAAK,QAAQ,OAAO,EACnE,CACF,CAAC,CACH,CACF,CAAC,KAED,MAAG,0EAA2E,SAAY,CAExF,MAAMC,EAA+B,CACnC,WAAY,CACV,KAAM,OACN,WAAY,CACV,KAAM,WACN,KAAM,UACR,CACF,CACF,EAEA,KAAG,MAAM,EAAAF,QAAO,SAAS,EAAE,kBAAkB,CAAE,KAAM,CAACE,CAAS,CAAE,CAAC,EAGlE,MAAMC,EAAS,MAAMT,EAAW,qBAAqB,CAAE,gBAAAC,CAAgB,CAAC,KAGxE,UAAOQ,CAAM,EAAE,WAAQ,SAAMD,CAAS,CAAC,CACzC,CAAC,EAED,WAAS;AAAA;AAAA,MAEL,mBAAmB,WAAW,CAAE,KAAM,MAAU,CAAC;AAAA,MACjD,qBAAqB,SAAS,CAAE,KAAM,CAAC,CAAE,CAAC;AAAA,MAC1C,wBAAwB,MAAM,CAAE,KAAM,CAAC,MAAS,CAAE,CAAC;AAAA,IACrD,cAAe,CAAC,CAAE,SAAAE,EAAU,YAAAC,CAAY,IAAM,IAC9C,MAAG,+BAA+BD,CAAQ,GAAI,SAAY,CAExD,KAAG,MAAM,EAAAJ,QAAO,SAAS,EAAE,kBAAkBK,CAAW,EAGxD,MAAMF,EAAS,MAAMT,EAAW,qBAAqB,CAAE,gBAAAC,CAAgB,CAAC,KAGxE,UAAOQ,CAAM,EAAE,WAAQ,QAAK,IAAI,MAAMN,EAAaF,CAAe,CAAC,CAAC,CAAC,CACvE,CAAC,CACH,CAAC,KAED,MAAG,2CAA4C,SAAY,CAEzD,KAAG,MAAM,EAAAK,QAAO,SAAS,EAAE,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGjE,MAAMG,EAAS,MAAMT,EAAW,qBAAqB,CAAE,gBAAAC,CAAgB,CAAC,KAGxE,UAAOQ,CAAM,EAAE,WACb,QACE,IAAI,MACF,+EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["import_axios", "import_purify_ts", "import_vitest", "import_HttpHeaders", "import_package", "import_HttpSolanaTokenDataSource", "datasource", "tokenInternalId", "config", "errorMessage", "id", "requestSpy", "axios", "PACKAGE", "response0", "result", "caseName", "apiResponse"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var p=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of o(t))!g.call(e,n)&&n!==i&&s(e,n,{get:()=>t[n],enumerable:!(r=a(t,n))||r.enumerable});return e};var d=e=>p(s({},"__esModule",{value:!0}),e);var c={};module.exports=d(c);
2
+ //# sourceMappingURL=SolanaTokenDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaToken/data/SolanaTokenDataSource.ts"],
4
+ "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetSolanaTokenInfosParams = {\n tokenInternalId: string;\n};\n\nexport type Unit = {\n code: string;\n name: string;\n magnitude: number;\n};\n\nexport type TokenDataResponse = {\n id: string;\n blockchain_name: string;\n chain_id?: number;\n contract_address: string;\n decimals: number;\n descriptor: {\n data: string;\n descriptorType: string;\n signatures: {\n prod: string;\n test: string;\n };\n };\n descriptor_exchange_app: {\n data: string;\n descriptorType: string;\n signatures: {\n prod: string;\n test: string;\n };\n };\n exchange_app_config_serialized: string;\n name: string;\n network: string;\n network_family: string;\n network_type: \"main\" | \"test\";\n symbol: string;\n ticker: string;\n units: Unit[];\n};\n\nexport interface SolanaTokenDataSource {\n getTokenInfosPayload(\n params: GetSolanaTokenInfosParams,\n ): Promise<Either<Error, TokenDataResponse>>;\n}\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["SolanaTokenDataSource_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var t=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var k=(a,o)=>{for(var n in o)t(a,n,{get:o[n],enumerable:!0})},c=(a,o,n,S)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of r(o))!T.call(a,e)&&e!==n&&t(a,e,{get:()=>o[e],enumerable:!(S=l(o,e))||S.enumerable});return a};var s=a=>c(t({},"__esModule",{value:!0}),a);var y={};k(y,{solanaTokenTypes:()=>x});module.exports=s(y);const x={SolanaTokenDataSource:Symbol.for("SolanaTokenDataSource"),SolanaTokenContextLoader:Symbol.for("SolanaTokenContextLoader")};0&&(module.exports={solanaTokenTypes});
2
+ //# sourceMappingURL=solanaTokenTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaToken/di/solanaTokenTypes.ts"],
4
+ "sourcesContent": ["export const solanaTokenTypes = {\n SolanaTokenDataSource: Symbol.for(\"SolanaTokenDataSource\"),\n SolanaTokenContextLoader: Symbol.for(\"SolanaTokenContextLoader\"),\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAmB,CAC9B,sBAAuB,OAAO,IAAI,uBAAuB,EACzD,yBAA0B,OAAO,IAAI,0BAA0B,CACjE",
6
+ "names": ["solanaTokenTypes_exports", "__export", "solanaTokenTypes", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var f=(o,a)=>{for(var t in a)n(o,t,{get:a[t],enumerable:!0})},i=(o,a,t,l)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of S(a))!c.call(o,e)&&e!==t&&n(o,e,{get:()=>a[e],enumerable:!(l=k(a,e))||l.enumerable});return o};var s=o=>i(n({},"__esModule",{value:!0}),o);var d={};f(d,{solanaTokenModuleFactory:()=>u});module.exports=s(d);var m=require("inversify"),p=require("../../solanaToken/data/HttpSolanaTokenDataSource"),r=require("../../solanaToken/di/solanaTokenTypes"),T=require("../../solanaToken/domain/SolanaTokenContextLoader");const u=()=>new m.ContainerModule(({bind:o})=>{o(r.solanaTokenTypes.SolanaTokenDataSource).to(p.HttpSolanaTokenDataSource),o(r.solanaTokenTypes.SolanaTokenContextLoader).to(T.SolanaTokenContextLoader)});0&&(module.exports={solanaTokenModuleFactory});
2
+ //# sourceMappingURL=tokenModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaToken/di/tokenModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpSolanaTokenDataSource } from \"@/solanaToken/data/HttpSolanaTokenDataSource\";\nimport { solanaTokenTypes } from \"@/solanaToken/di/solanaTokenTypes\";\nimport { SolanaTokenContextLoader } from \"@/solanaToken/domain/SolanaTokenContextLoader\";\n\nexport const solanaTokenModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(solanaTokenTypes.SolanaTokenDataSource).to(HttpSolanaTokenDataSource);\n bind(solanaTokenTypes.SolanaTokenContextLoader).to(\n SolanaTokenContextLoader,\n );\n });\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAA0C,wDAC1CC,EAAiC,6CACjCC,EAAyC,yDAElC,MAAML,EAA2B,IACtC,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,mBAAiB,qBAAqB,EAAE,GAAG,2BAAyB,EACzEA,EAAK,mBAAiB,wBAAwB,EAAE,GAC9C,0BACF,CACF,CAAC",
6
+ "names": ["tokenModuleFactory_exports", "__export", "solanaTokenModuleFactory", "__toCommonJS", "import_inversify", "import_HttpSolanaTokenDataSource", "import_solanaTokenTypes", "import_SolanaTokenContextLoader", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of S(e))!I.call(n,a)&&a!==t&&s(n,a,{get:()=>e[a],enumerable:!(o=k(e,a))||o.enumerable});return n};var x=n=>g(s({},"__esModule",{value:!0}),n),f=(n,e,t,o)=>{for(var a=o>1?void 0:o?k(e,t):e,l=n.length-1,i;l>=0;l--)(i=n[l])&&(a=(o?i(e,t,a):i(a))||a);return o&&a&&s(e,t,a),a},c=(n,e)=>(t,o)=>e(t,o,n);var D={};C(D,{SolanaTokenContextLoader:()=>p});module.exports=x(D);var r=require("inversify"),u=require("../../config/di/configTypes"),m=require("../../pki/di/pkiTypes"),T=require("../../pki/model/KeyUsage"),d=require("../../shared/model/SolanaContextTypes"),y=require("../../solanaToken/di/solanaTokenTypes");let p=class{constructor(e,t,o){this.dataSource=e;this.config=t;this._certificateLoader=o}canHandle(e,t){if(t!==d.SolanaContextTypes.SOLANA_TOKEN||typeof e!="object"||e===null||!("tokenInternalId"in e))return!1;const o=e.tokenInternalId;return typeof o=="string"&&o.length>0}async loadField(e){const{tokenInternalId:t,deviceModelId:o}=e,a=await this.dataSource.getTokenInfosPayload({tokenInternalId:t}),l=await this._certificateLoader.loadCertificate({keyId:"token_metadata_key",keyUsage:T.KeyUsage.CoinMeta,targetDevice:o});return a.caseOf({Left:i=>({type:d.SolanaContextTypes.ERROR,error:i}),Right:i=>({type:d.SolanaContextTypes.SOLANA_TOKEN,payload:this.pluckTokenData(i),certificate:l})})}pluckTokenData(e){const t=this.config.cal.mode||"prod";return{solanaTokenDescriptor:{data:e.descriptor.data,signature:e.descriptor.signatures[t]}}}};p=f([(0,r.injectable)(),c(0,(0,r.inject)(y.solanaTokenTypes.SolanaTokenDataSource)),c(1,(0,r.inject)(u.configTypes.Config)),c(2,(0,r.inject)(m.pkiTypes.PkiCertificateLoader))],p);0&&(module.exports={SolanaTokenContextLoader});
2
+ //# sourceMappingURL=SolanaTokenContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/solanaToken/domain/SolanaTokenContextLoader.ts"],
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n SolanaContextTypes,\n SolanaTokenContextResult,\n SolanaTokenData,\n} from \"@/shared/model/SolanaContextTypes\";\nimport { SolanaTransactionContext } from \"@/solana/domain/solanaContextTypes\";\nimport {\n type SolanaTokenDataSource,\n type TokenDataResponse,\n} from \"@/solanaToken/data/SolanaTokenDataSource\";\nimport { solanaTokenTypes } from \"@/solanaToken/di/solanaTokenTypes\";\n\ntype SolanaTokenFieldInput = SolanaTransactionContext & {\n deviceModelId: DeviceModelId;\n tokenInternalId: string;\n};\n\n@injectable()\nexport class SolanaTokenContextLoader\n implements\n ContextFieldLoader<\n SolanaTokenFieldInput,\n SolanaContextTypes,\n SolanaTokenContextResult\n >\n{\n constructor(\n @inject(solanaTokenTypes.SolanaTokenDataSource)\n private readonly dataSource: SolanaTokenDataSource,\n @inject(configTypes.Config) private readonly config: ContextModuleConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n ) {}\n\n public canHandle(\n field: unknown,\n expectedType: SolanaContextTypes,\n ): field is SolanaTokenFieldInput {\n if (expectedType !== SolanaContextTypes.SOLANA_TOKEN) {\n return false;\n }\n\n if (\n typeof field !== \"object\" ||\n field === null ||\n !(\"tokenInternalId\" in field)\n ) {\n return false;\n }\n\n const tokenInternalId = (field as { tokenInternalId: unknown })\n .tokenInternalId;\n\n return typeof tokenInternalId === \"string\" && tokenInternalId.length > 0;\n }\n\n public async loadField(\n solanaTokenContextInput: SolanaTokenFieldInput,\n ): Promise<SolanaTokenContextResult> {\n const { tokenInternalId, deviceModelId } = solanaTokenContextInput;\n\n const payload = await this.dataSource.getTokenInfosPayload({\n tokenInternalId,\n });\n\n const certificate: PkiCertificate | undefined =\n await this._certificateLoader.loadCertificate({\n keyId: \"token_metadata_key\",\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: deviceModelId,\n });\n\n return payload.caseOf({\n Left: (error): SolanaTokenContextResult => ({\n type: SolanaContextTypes.ERROR,\n error,\n }),\n Right: (value): SolanaTokenContextResult => ({\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: this.pluckTokenData(value),\n certificate,\n }),\n });\n }\n\n private pluckTokenData(tokenData: TokenDataResponse): SolanaTokenData {\n const signatureKind = this.config.cal.mode || \"prod\";\n return {\n solanaTokenDescriptor: {\n data: tokenData.descriptor.data,\n signature: tokenData.descriptor.signatures[signatureKind],\n },\n };\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBAEnCC,EAA4B,mCAE5BC,EAAyB,6BAEzBC,EAAyB,gCAGzBC,EAIO,6CAMPC,EAAiC,6CAQ1B,IAAMC,EAAN,KAOP,CACE,YAEmBC,EAC4BC,EAE5BC,EACjB,CAJiB,gBAAAF,EAC4B,YAAAC,EAE5B,wBAAAC,CAChB,CAEI,UACLC,EACAC,EACgC,CAKhC,GAJIA,IAAiB,qBAAmB,cAKtC,OAAOD,GAAU,UACjBA,IAAU,MACV,EAAE,oBAAqBA,GAEvB,MAAO,GAGT,MAAME,EAAmBF,EACtB,gBAEH,OAAO,OAAOE,GAAoB,UAAYA,EAAgB,OAAS,CACzE,CAEA,MAAa,UACXC,EACmC,CACnC,KAAM,CAAE,gBAAAD,EAAiB,cAAAE,CAAc,EAAID,EAErCE,EAAU,MAAM,KAAK,WAAW,qBAAqB,CACzD,gBAAAH,CACF,CAAC,EAEKI,EACJ,MAAM,KAAK,mBAAmB,gBAAgB,CAC5C,MAAO,qBACP,SAAU,WAAS,SACnB,aAAcF,CAChB,CAAC,EAEH,OAAOC,EAAQ,OAAO,CACpB,KAAOE,IAAqC,CAC1C,KAAM,qBAAmB,MACzB,MAAAA,CACF,GACA,MAAQC,IAAqC,CAC3C,KAAM,qBAAmB,aACzB,QAAS,KAAK,eAAeA,CAAK,EAClC,YAAAF,CACF,EACF,CAAC,CACH,CAEQ,eAAeG,EAA+C,CACpE,MAAMC,EAAgB,KAAK,OAAO,IAAI,MAAQ,OAC9C,MAAO,CACL,sBAAuB,CACrB,KAAMD,EAAU,WAAW,KAC3B,UAAWA,EAAU,WAAW,WAAWC,CAAa,CAC1D,CACF,CACF,CACF,EA5Ead,EAANe,EAAA,IADN,cAAW,EAUPC,EAAA,eAAO,mBAAiB,qBAAqB,GAE7CA,EAAA,eAAO,cAAY,MAAM,GACzBA,EAAA,eAAO,WAAS,oBAAoB,IAZ5BhB",
6
+ "names": ["SolanaTokenContextLoader_exports", "__export", "SolanaTokenContextLoader", "__toCommonJS", "import_inversify", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_SolanaContextTypes", "import_solanaTokenTypes", "SolanaTokenContextLoader", "dataSource", "config", "_certificateLoader", "field", "expectedType", "tokenInternalId", "solanaTokenContextInput", "deviceModelId", "payload", "certificate", "error", "value", "tokenData", "signatureKind", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var p=require("@ledgerhq/device-management-kit"),l=require("purify-ts"),e=require("vitest"),u=require("../../pki/model/KeyUsage"),n=require("../../shared/model/SolanaContextTypes"),f=require("./SolanaTokenContextLoader");(0,e.describe)("SolanaTokenContextLoader",()=>{let s,d;const i=new Uint8Array([240,202,204,26]),t={descriptor:{data:{symbol:"SOL",name:"Solana",decimals:9},signatures:{prod:"prod-sig",test:"test-sig"}}},c={tokenInternalId:"token-1",deviceModelId:p.DeviceModelId.FLEX};(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),s={getTokenInfosPayload:e.vi.fn()},d={loadCertificate:e.vi.fn()}});const r=a=>{const o={cal:{mode:a}};return new f.SolanaTokenContextLoader(s,o,d)};(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when tokenInternalId is provided",()=>{const a=r("prod");(0,e.expect)(a.canHandle({tokenInternalId:"abc123"},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!0)}),(0,e.it)("returns false when tokenInternalId is missing or falsy",()=>{const a=r("prod");(0,e.expect)(a.canHandle({tokenInternalId:""},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1),(0,e.expect)(a.canHandle({tokenInternalId:void 0},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1),(0,e.expect)(a.canHandle({},n.SolanaContextTypes.SOLANA_TOKEN)).toBe(!1)})}),(0,e.describe)("loadField",()=>{(0,e.it)("returns an error when datasource returns Left(error) (certificate still retrieved)",async()=>{const a=r("prod"),o=new Error("datasource failed");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Left)(o)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:i});const k=await a.loadField(c);(0,e.expect)(s.getTokenInfosPayload).toHaveBeenCalledWith({tokenInternalId:"token-1"}),(0,e.expect)(d.loadCertificate).toHaveBeenCalledWith({keyId:"token_metadata_key",keyUsage:u.KeyUsage.CoinMeta,targetDevice:c.deviceModelId}),(0,e.expect)(k).toEqual({type:n.SolanaContextTypes.ERROR,error:o})}),(0,e.it)("returns SOLANA_TOKEN with prod signature by default (falsy mode) and includes certificate",async()=>{const a=r("");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:0,payload:i});const o=await a.loadField({...c,tokenInternalId:"token-2"});(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}},certificate:{keyUsageNumber:0,payload:i}})}),(0,e.it)("returns SOLANA_TOKEN with signature matching config.cal.mode",async()=>{const a=r("test");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue({keyUsageNumber:1,payload:i});const o=await a.loadField({...c,tokenInternalId:"token-3"});(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"test-sig"}},certificate:{keyUsageNumber:1,payload:i}})}),(0,e.it)("works even if certificate loader returns undefined (certificate omitted)",async()=>{const a=r("prod");e.vi.spyOn(s,"getTokenInfosPayload").mockResolvedValue((0,l.Right)(t)),e.vi.spyOn(d,"loadCertificate").mockResolvedValue(void 0);const o=await a.loadField(c);(0,e.expect)(o).toEqual({type:n.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}},certificate:void 0})})}),(0,e.describe)("pluckTokenData (private)",()=>{(0,e.it)("picks the signature for the configured mode",()=>{const a=r("test"),k=a.pluckTokenData.bind(a)(t);(0,e.expect)(k).toEqual({solanaTokenDescriptor:{data:t.descriptor.data,signature:"test-sig"}})}),(0,e.it)("falls back to 'prod' when config.cal.mode is falsy",()=>{const o=r(void 0).pluckTokenData(t);(0,e.expect)(o).toEqual({solanaTokenDescriptor:{data:t.descriptor.data,signature:"prod-sig"}})})})});
2
+ //# sourceMappingURL=SolanaTokenContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 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(mockDataSource, config, mockCertLoader);\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": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_KeyUsage", "import_SolanaContextTypes", "import_SolanaTokenContextLoader", "mockDataSource", "mockCertLoader", "bytes", "tokenDataResponse", "baseCtx", "makeLoader", "mode", "config", "loader", "error", "result"]
7
+ }
@@ -58,5 +58,5 @@
58
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
59
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
60
60
  },
61
- "version": "0.0.0-test-attest-npmjs-20251126133407"
61
+ "version": "0.0.0-test-snapshot-versions-20251204142134"
62
62
  }
@@ -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 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(),\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 };\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"],
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 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 };\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
5
  "mappings": "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",
6
6
  "names": ["ClearSignContextType", "DefaultContextModule", "contextLoaderStubBuilder", "canHandle", "fieldLoaderStubBuilder", "typedDataLoader", "defaultContextModuleConfig", "res", "loader", "responses", "loader1", "loader2", "contextModule", "testInput", "fieldLoader", "testField", "result", "mockContext", "fieldLoader1", "fieldLoader2", "mockContext1", "mockContext2", "loadError"]
7
7
  }