linkOverrides.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { KINOBI_ERROR__UNEXPECTED_NODE_KIND, KinobiError } from '@kinobi-so/errors';
  2. import {
  3. AccountLinkNode,
  4. DefinedTypeLinkNode,
  5. InstructionLinkNode,
  6. PdaLinkNode,
  7. ProgramLinkNode,
  8. ResolverValueNode,
  9. } from '@kinobi-so/nodes';
  10. import { ParsedCustomDataOptions } from './customData';
  11. export type LinkOverrides = {
  12. accounts?: Record<string, string>;
  13. definedTypes?: Record<string, string>;
  14. instructions?: Record<string, string>;
  15. pdas?: Record<string, string>;
  16. programs?: Record<string, string>;
  17. resolvers?: Record<string, string>;
  18. };
  19. type OverridableNodes =
  20. | AccountLinkNode
  21. | DefinedTypeLinkNode
  22. | InstructionLinkNode
  23. | PdaLinkNode
  24. | ProgramLinkNode
  25. | ResolverValueNode;
  26. export type GetImportFromFunction = (node: OverridableNodes, fallback?: string) => string;
  27. export function getImportFromFactory(
  28. overrides: LinkOverrides,
  29. customAccountData: ParsedCustomDataOptions,
  30. customInstructionData: ParsedCustomDataOptions,
  31. ): GetImportFromFunction {
  32. const customDataOverrides = Object.fromEntries(
  33. [...customAccountData.values(), ...customInstructionData.values()].map(({ importFrom, importAs }) => [
  34. importAs,
  35. importFrom,
  36. ]),
  37. );
  38. const linkOverrides = {
  39. accounts: overrides.accounts ?? {},
  40. definedTypes: { ...customDataOverrides, ...overrides.definedTypes },
  41. instructions: overrides.instructions ?? {},
  42. pdas: overrides.pdas ?? {},
  43. programs: overrides.programs ?? {},
  44. resolvers: overrides.resolvers ?? {},
  45. };
  46. return (node: OverridableNodes) => {
  47. const kind = node.kind;
  48. switch (kind) {
  49. case 'accountLinkNode':
  50. return linkOverrides.accounts[node.name] ?? 'generatedAccounts';
  51. case 'definedTypeLinkNode':
  52. return linkOverrides.definedTypes[node.name] ?? 'generatedTypes';
  53. case 'instructionLinkNode':
  54. return linkOverrides.instructions[node.name] ?? 'generatedInstructions';
  55. case 'pdaLinkNode':
  56. return linkOverrides.pdas[node.name] ?? 'generatedPdas';
  57. case 'programLinkNode':
  58. return linkOverrides.programs[node.name] ?? 'generatedPrograms';
  59. case 'resolverValueNode':
  60. return linkOverrides.resolvers[node.name] ?? 'hooked';
  61. default:
  62. throw new KinobiError(KINOBI_ERROR__UNEXPECTED_NODE_KIND, {
  63. expectedKinds: [
  64. 'AccountLinkNode',
  65. 'DefinedTypeLinkNode',
  66. 'InstructionLinkNode',
  67. 'PdaLinkNode',
  68. 'ProgramLinkNode',
  69. 'resolverValueNode',
  70. ],
  71. kind: kind satisfies never,
  72. node,
  73. });
  74. }
  75. };
  76. }