generate-clients.mjs.njk 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env zx
  2. import "zx/globals";
  3. import * as k from "@metaplex-foundation/kinobi";
  4. import { getAllProgramIdls } from "./utils.mjs";
  5. // Instanciate Kinobi.
  6. const [idl, ...additionalIdls] = getAllProgramIdls();
  7. const kinobi = k.createFromIdl(idl, additionalIdls);
  8. // Update programs.
  9. kinobi.update(
  10. k.updateProgramsVisitor({
  11. "{{ programCrateName | camelCase }}": { name: "{{ programName | camelCase }}" },
  12. })
  13. );
  14. // Update accounts.
  15. kinobi.update(
  16. k.updateAccountsVisitor({
  17. counter: {
  18. seeds: [
  19. k.constantPdaSeedNodeFromString("utf8", "counter"),
  20. k.variablePdaSeedNode(
  21. "authority",
  22. k.publicKeyTypeNode(),
  23. "The authority of the counter account"
  24. ),
  25. ],
  26. },
  27. })
  28. );
  29. // Update instructions.
  30. kinobi.update(
  31. k.updateInstructionsVisitor({
  32. create: {
  33. byteDeltas: [k.instructionByteDeltaNode(k.accountLinkNode("counter"))],
  34. accounts: {
  35. counter: { defaultValue: k.pdaValueNode("counter") },
  36. payer: { defaultValue: k.accountValueNode("authority") },
  37. },
  38. },
  39. increment: {
  40. accounts: {
  41. counter: { defaultValue: k.pdaValueNode("counter") },
  42. },
  43. arguments: {
  44. amount: { defaultValue: k.noneValueNode() },
  45. },
  46. },
  47. })
  48. );
  49. // Set account discriminators.
  50. const key = (name) => ({ field: "key", value: k.enumValueNode("Key", name) });
  51. kinobi.update(
  52. k.setAccountDiscriminatorFromFieldVisitor({
  53. counter: key("counter"),
  54. })
  55. );
  56. // Render JavaScript.
  57. const jsClient = path.join(__dirname, "..", "clients", "js");
  58. kinobi.accept(
  59. k.renderJavaScriptExperimentalVisitor(
  60. path.join(jsClient, "src", "generated"),
  61. { prettier: require(path.join(jsClient, ".prettierrc.json")) }
  62. )
  63. );
  64. // Render Rust.
  65. const rustClient = path.join(__dirname, "..", "clients", "rust");
  66. kinobi.accept(
  67. k.renderRustVisitor(path.join(rustClient, "src", "generated"), {
  68. formatCode: true,
  69. crateFolder: rustClient,
  70. })
  71. );