solgen
Version:
A TypeScript SDK generator for Solana IDL - Automatically generates type definitions, account interfaces, and instruction builders
5 lines • 9.96 kB
JavaScript
;var J=Object.create;var k=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var L=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var Q=(n,e)=>{for(var r in e)k(n,r,{get:e[r],enumerable:!0})},N=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of L(e))!M.call(n,i)&&i!==r&&k(n,i,{get:()=>e[i],enumerable:!(t=V(e,i))||t.enumerable});return n};var K=(n,e,r)=>(r=n!=null?J(W(n)):{},N(e||!n||!n.__esModule?k(r,"default",{value:n,enumerable:!0}):r,n)),q=n=>N(k({},"__esModule",{value:!0}),n);var Z={};Q(Z,{genInstructions:()=>H});module.exports=q(Z);var f=require("ts-morph");var l=K(require("camelcase")),T=require("js-sha256"),D=require("snake-case");function _(n){return`${n}Fields`}function G(n){return`${n}Kind`}function m(n){return typeof n=="object"&&n!==null}function b(n,e,r="types.",t=!0){var i,s;switch(e){case"bool":return"boolean";case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"f32":return"number";case"u64":case"i64":return"BN";case"f64":return"number";case"u128":case"i128":return"BN";case"u256":case"i256":return"BN";case"bytes":return"Uint8Array";case"string":return"string";case"pubkey":return"PublicKey";default:if(m(e)&&"vec"in e)return`Array<${b(n,e.vec,r,t)}>`;if(m(e)&&"option"in e)return`${b(n,e.option,r,t)} | null`;if(m(e)&&"coption"in e)return`${b(n,e.coption,r,t)} | null`;if(m(e)&&"defined"in e){let o=(s=(i=n.types)==null?void 0:i.filter($=>$.name===e.defined.name))!=null?s:[];if(o.length!==1)throw new Error(`Defined type not found: ${JSON.stringify(e)}`);switch(o[0].type.kind){case"struct":{let $=t?_(e.defined.name):e.defined.name;return`${r}${$}`}case"enum":{let $=G(e.defined.name);return`${r}${$}`}case"type":throw new Error("type layout support not implemented")}}if(m(e)&&"array"in e)return`Array<${b(n,e.array[0],r,t)}>`;if(typeof e=="object"&&"generic"in e)throw new Error("generic type not supported")}throw new Error("Unreachable.")}function h(n,e,r="types."){let t=i=>i===void 0?"":`"${i}"`;switch(n){case"bool":return`solay.bool(${t(e)})`;case"u8":return`solay.u8(${t(e)})`;case"i8":return`solay.i8(${t(e)})`;case"u16":return`solay.u16(${t(e)})`;case"i16":return`solay.i16(${t(e)})`;case"u32":return`solay.u32(${t(e)})`;case"f32":return`solay.f32(${t(e)})`;case"i32":return`solay.i32(${t(e)})`;case"u64":return`solay.u64(${t(e)})`;case"i64":return`solay.i64(${t(e)})`;case"f64":return`solay.f64(${t(e)})`;case"u128":return`solay.u128(${t(e)})`;case"i128":return`solay.i128(${t(e)})`;case"u256":return`solay.u256(${t(e)})`;case"i256":return`solay.i256(${t(e)})`;case"bytes":return`solay.vecU8(${t(e)})`;case"string":return`solay.str(${t(e)})`;case"pubkey":return`solay.publicKey(${t(e)})`;default:if(m(n)&&"vec"in n)return`solay.vec(${h(n.vec)}, ${t(e)})`;if(m(n)&&"option"in n)return`solay.option(${h(n.option)}, ${t(e)})`;if(m(n)&&"coption"in n)throw new Error("coption layout support not implemented");if(m(n)&&"defined"in n)return`${r}${n.defined.name}.layout(${t(e)})`;if(m(n)&&"array"in n){let i=e&&`, ${t(e)}`||"",s=n.array[1],o=n.array[0];return typeof o=="object"&&"defined"in o?`solay.array(${r}${o.defined.name}.layout(), ${s}${i})`:`solay.array(${h(o)}, ${s}${i})`}if(typeof n=="object"&&"generic"in n)throw new Error("generic type not supported")}throw new Error("Unreachable.")}function U(n){let e="global",r=(0,D.snakeCase)(n),t=`${e}:${r}`;return T.sha256.digest(t).slice(0,8)}function I(n,e,r="",t="types."){var i,s;switch(e.type){case"bool":case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"f32":case"u64":case"i64":case"f64":case"u128":case"i128":case"u256":case"i256":case"string":case"pubkey":return`${r}${(0,l.default)(e.name)}`;case"bytes":{let o=`${r}${(0,l.default)(e.name)}`;return`Buffer.from(${o}.buffer, ${o}.byteOffset, ${o}.length)`}default:if(m(e.type)&&"vec"in e.type){let o=I(n,{name:"item",type:e.type.vec},"",t);return o==="item"?`${r}${(0,l.default)(e.name)}`:`${r}${(0,l.default)(e.name)}.map((item) => ${o})`}if(m(e.type)&&"option"in e.type){let o=I(n,{name:(0,l.default)(e.name),type:e.type.option},r,t);return o===`${r}${(0,l.default)(e.name)}`?o:`(${r}${(0,l.default)(e.name)} && ${o}) || null`}if(m(e.type)&&"coption"in e.type)throw new Error("coption layout support not implemented");if(m(e.type)&&"defined"in e.type){let o=e.type.defined,$=(s=(i=n.types)==null?void 0:i.filter(E=>E.name===o.name))!=null?s:[];if($.length!==1)throw new Error(`Defined type not found: ${JSON.stringify(e)}`);switch($[0].type.kind){case"struct":return`${t}${e.type.defined.name}.toEncodable(${r}${(0,l.default)(e.name)})`;case"enum":return`${r}${(0,l.default)(e.name)}.toEncodable()`;case"type":throw new Error("type layout support not implemented")}}if(m(e.type)&&"array"in e.type){let o=e.type.array[0];if(typeof o=="object"&&"defined"in o)return`${r}${(0,l.default)(e.name)}.map((item) => ${t}${o.defined.name}.toEncodable(item))`;let $=I(n,{name:"item",type:o},"",t);return $==="item"?`${r}${(0,l.default)(e.name)}`:`${r}${(0,l.default)(e.name)}.map((item) => ${$})`}throw typeof e.type=="object"&&"generic"in e.type?new Error("generic type not supported"):(e.type,new Error("Unreachable."))}}var p=K(require("camelcase"));function H(n,e,r){e.instructions.length!==0&&(X(n,e,r),Y(n,e,r))}function A(n){return n[0].toUpperCase()+n.slice(1)}function S(n){return`${A(n)}Args`}function j(n){return`${A(n)}Accounts`}function F(n){return`${A(n)}AccountsOptional`}function z(n){return`make${(0,p.default)(n,{pascalCase:!0})}Instruction`}function X(n,e,r){let t=n.createSourceFile(r("instructions/index.ts"),"",{overwrite:!0});e.instructions.forEach(i=>{let s=(0,p.default)(i.name);t.addExportDeclaration({namedExports:[z(s)],moduleSpecifier:`./${s}`});let o=[];i.args.length>0&&o.push(S(s)),i.accounts.length>0&&o.push(j(s)),o.length>0&&t.addExportDeclaration({namedExports:o,isTypeOnly:!0,moduleSpecifier:`./${s}`})})}function Y(n,e,r){e.instructions.forEach(t=>{let i=(0,p.default)(t.name),s=n.createSourceFile(r(`instructions/${i}.ts`),"",{overwrite:!0});s.addStatements(['import { TransactionInstruction, PublicKey, AccountMeta } from "@solana/web3.js"','import BN from "bn.js"','import * as solay from "solay"',...e.types&&e.types.length>0?['import * as types from "../types" // eslint-disable-line @typescript-eslint/no-unused-vars']:[]]),t.args.length>0&&s.addInterface({isExported:!0,name:S(i),properties:t.args.map(a=>({name:(0,p.default)(a.name),type:b(e,a.type)}))});function o(a,c){if(!("accounts"in a)){c.write("PublicKey");return}c.block(()=>{a.accounts.forEach(g=>{g.docs&&c.writeLine(`/** ${g.docs.join(" ")} */`),c.write(`${(0,p.default)(g.name)}: `),o(g,c),c.newLine()})})}let $=t.accounts.filter(a=>!("address"in a)&&!("pda"in a)),E=t.accounts.filter(a=>"address"in a||"pda"in a);t.accounts.length>0&&(s.addInterface({isExported:!0,name:j(i),properties:$.map(a=>({name:(0,p.default)(a.name),type:c=>{o(a,c)},docs:"docs"in a?[a.docs.join(`
`)]:void 0}))}),s.addInterface({isExported:!0,name:F(i),properties:E.map(a=>({name:(0,p.default)(a.name),type:c=>{o(a,c)},docs:"docs"in a?[a.docs.join(`
`)]:void 0,hasQuestionToken:!0}))})),t.args.length>0&&s.addVariableStatement({isExported:!0,declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"layout",initializer:a=>{a.write("solay.struct(["),t.args.forEach(c=>{a.writeLine(h(c.type,(0,p.default)(c.name))+",")}),a.write("])")}}]});let d=s.addFunction({isExported:!0,name:z(i),docs:t.docs&&[t.docs.join(`
`)]});t.args.length>0&&d.addParameter({name:"args",type:S(i)}),$.length>0&&d.addParameter({name:"accounts",type:j(i)}),d.addParameter({name:"programId",type:"PublicKey"}),E.length>0&&d.addParameter({name:"accountsOptional",type:F(i),hasQuestionToken:!0}),d.addVariableStatement({declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"keys",type:"Array<AccountMeta>",initializer:a=>{a.write("[");function c(g,w){g.forEach(u=>{var B,O;if("accounts"in u){c(u.accounts,[...w,(0,p.default)(u.name)]);return}if("address"in u){a.writeLine(`{ pubkey: accountsOptional?.${[...w,(0,p.default)(u.name)].join(".")} || new PublicKey("${u.address}"), isSigner: ${u.signer||!1}, isWritable: ${u.writable||!1} },`);return}if("pda"in u){let C=(B=u.pda)==null?void 0:B.seeds.map(y=>{if(y.kind==="const")return`Buffer.from([${y.value}])`;if(y.kind==="account")return`accounts.${[...w,(0,p.default)(y.path)].join(".")}.toBuffer()`;if(y.kind==="arg")return`Buffer.from(args.${(0,p.default)(y.path)})`});if(!C)throw new Error("Invalid pda seed kind: "+((O=u.pda)==null?void 0:O.seeds));a.writeLine(`{ pubkey: accountsOptional?.${[...w,(0,p.default)(u.name)].join(".")} || PublicKey.findProgramAddressSync([${C.join(",")}],programId)[0], isSigner: ${u.signer||!1}, isWritable: ${u.writable||!1} },`);return}a.writeLine(`{ pubkey: accounts.${[...w,(0,p.default)(u.name)].join(".")}, isSigner: ${u.signer||!1}, isWritable: ${u.writable||!1} },`)})}c(t.accounts,[]),a.write("]")}}]}),d.addVariableStatement({declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"identifier",initializer:`Buffer.from([${U(i).toString()}])`}]}),t.args.length>0?(d.addVariableStatement({declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"buffer",initializer:"Buffer.alloc(layout.span)"}]}),d.addStatements(a=>{a.write("layout.encode({"),t.args.forEach(c=>{a.writeLine(`${(0,p.default)(c.name)}: ${I(e,c,"args.")},`)}),a.write("}, buffer)")}),d.addVariableStatement({declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"data",initializer:"Buffer.concat([identifier, buffer])"}]})):d.addVariableStatement({declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"data",initializer:"identifier"}]}),d.addVariableStatement({declarationKind:f.VariableDeclarationKind.Const,declarations:[{name:"ix",initializer:"new TransactionInstruction({ keys, programId, data })"}]}),d.addStatements("return ix")})}0&&(module.exports={genInstructions});
//# sourceMappingURL=instructions.js.map