solgen
Version:
A TypeScript SDK generator for Solana IDL - Automatically generates type definitions, account interfaces, and instruction builders
8 lines • 15.3 kB
JavaScript
;var A=Object.create;var S=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var U=(n,e)=>{for(var t in e)S(n,t,{get:e[t],enumerable:!0})},N=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of D(e))!C.call(n,c)&&c!==t&&S(n,c,{get:()=>e[c],enumerable:!(a=J(e,c))||a.enumerable});return n};var O=(n,e,t)=>(t=n!=null?A(F(n)):{},N(e||!n||!n.__esModule?S(t,"default",{value:n,enumerable:!0}):t,n)),K=n=>N(S({},"__esModule",{value:!0}),n);var _={};U(_,{genAccounts:()=>R});module.exports=K(_);var o=O(require("camelcase")),T=require("js-sha256"),M=require("snake-case");function k(n){return`${n}Fields`}function q(n){return`${n}Kind`}function g(n){return`${n}JSON`}function u(n){return typeof n=="object"&&n!==null}function f(n,e,t="types.",a=!0){var c,i;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(u(e)&&"vec"in e)return`Array<${f(n,e.vec,t,a)}>`;if(u(e)&&"option"in e)return`${f(n,e.option,t,a)} | null`;if(u(e)&&"coption"in e)return`${f(n,e.coption,t,a)} | null`;if(u(e)&&"defined"in e){let s=(i=(c=n.types)==null?void 0:c.filter(p=>p.name===e.defined.name))!=null?i:[];if(s.length!==1)throw new Error(`Defined type not found: ${JSON.stringify(e)}`);switch(s[0].type.kind){case"struct":{let p=a?k(e.defined.name):e.defined.name;return`${t}${p}`}case"enum":{let p=q(e.defined.name);return`${t}${p}`}case"type":throw new Error("type layout support not implemented")}}if(u(e)&&"array"in e)return`Array<${f(n,e.array[0],t,a)}>`;if(typeof e=="object"&&"generic"in e)throw new Error("generic type not supported")}throw new Error("Unreachable.")}function E(n,e,t="types."){let a=c=>c===void 0?"":`"${c}"`;switch(n){case"bool":return`solay.bool(${a(e)})`;case"u8":return`solay.u8(${a(e)})`;case"i8":return`solay.i8(${a(e)})`;case"u16":return`solay.u16(${a(e)})`;case"i16":return`solay.i16(${a(e)})`;case"u32":return`solay.u32(${a(e)})`;case"f32":return`solay.f32(${a(e)})`;case"i32":return`solay.i32(${a(e)})`;case"u64":return`solay.u64(${a(e)})`;case"i64":return`solay.i64(${a(e)})`;case"f64":return`solay.f64(${a(e)})`;case"u128":return`solay.u128(${a(e)})`;case"i128":return`solay.i128(${a(e)})`;case"u256":return`solay.u256(${a(e)})`;case"i256":return`solay.i256(${a(e)})`;case"bytes":return`solay.vecU8(${a(e)})`;case"string":return`solay.str(${a(e)})`;case"pubkey":return`solay.publicKey(${a(e)})`;default:if(u(n)&&"vec"in n)return`solay.vec(${E(n.vec)}, ${a(e)})`;if(u(n)&&"option"in n)return`solay.option(${E(n.option)}, ${a(e)})`;if(u(n)&&"coption"in n)throw new Error("coption layout support not implemented");if(u(n)&&"defined"in n)return`${t}${n.defined.name}.layout(${a(e)})`;if(u(n)&&"array"in n){let c=e&&`, ${a(e)}`||"",i=n.array[1],s=n.array[0];return typeof s=="object"&&"defined"in s?`solay.array(${t}${s.defined.name}.layout(), ${i}${c})`:`solay.array(${E(s)}, ${i}${c})`}if(typeof n=="object"&&"generic"in n)throw new Error("generic type not supported")}throw new Error("Unreachable.")}function L(n){return T.sha256.digest(`account:${(0,o.default)(n,{pascalCase:!0})}`).slice(0,8)}function I(n,e,t="",a="types."){var c,i;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`${t}${(0,o.default)(e.name)}`;case"bytes":{let s=`${t}${(0,o.default)(e.name)}`;return`new Uint8Array(${s}.buffer, ${s}.byteOffset, ${s}.length)`}default:if(u(e.type)&&"vec"in e.type){let s=I(n,{name:"item",type:e.type.vec},"",a);return s==="item"?`${t}${(0,o.default)(e.name)}`:`${t}${(0,o.default)(e.name)}.map((item: any /* eslint-disable-line @typescript-eslint/no-explicit-any */) => ${s})`}if(u(e.type)&&"option"in e.type){let s=I(n,{name:(0,o.default)(e.name),type:e.type.option},t);return s===`${t}${(0,o.default)(e.name)}`?s:`(${t}${(0,o.default)(e.name)} && ${s}) || null`}if(u(e.type)&&"coption"in e.type)throw new Error("coption layout support not implemented");if(u(e.type)&&"defined"in e.type){let s=e.type.defined,p=(i=(c=n.types)==null?void 0:c.filter(m=>m.name===s.name))!=null?i:[];if(p.length!==1)throw new Error(`Defined type not found: ${JSON.stringify(e)}`);switch(p[0].type.kind){case"struct":case"enum":return`${a}${e.type.defined.name}.fromDecoded(${t}${(0,o.default)(e.name)})`;case"type":throw new Error("type layout support not implemented");default:throw p[0].type,new Error("Unreachable.")}}if(u(e.type)&&"array"in e.type){let s=e.type.array[0];if(typeof s=="object"&&"defined"in s)return`${t}${(0,o.default)(e.name)}.map((item: any /* eslint-disable-line @typescript-eslint/no-explicit-any */) => ${a}${s.defined.name}.fromDecoded(item))`;let p=I(n,{name:"item",type:s},"",a);return p==="item"?`${t}${(0,o.default)(e.name)}`:`${t}${(0,o.default)(e.name)}.map((item: any /* eslint-disable-line @typescript-eslint/no-explicit-any */) => ${p})`}throw typeof e.type=="object"&&"generic"in e.type?new Error("generic type not supported"):(e.type,new Error("Unreachable."))}}function y(n,e,t="fields."){var a,c;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"bytes":case"string":case"pubkey":return`${t}${(0,o.default)(e.name)}`;default:if(u(e.type)&&"defined"in e.type){let i=e.type.defined,s=(c=(a=n.types)==null?void 0:a.filter(p=>p.name===i.name))!=null?c:[];if(s.length!==1)throw new Error(`Defined type not found: ${i}`);switch(s[0].type.kind){case"struct":return`new types.${s[0].name}({ ...${t}${(0,o.default)(e.name)} })`;case"enum":return s[0].type.kind,`${t}${(0,o.default)(e.name)}`;case"type":throw new Error("alias layout support not implemented");default:s[0].type;return}}if(u(e.type)&&"option"in e.type){let i=y(n,{name:(0,o.default)(e.name),type:e.type.option},t);return i===`${t}${(0,o.default)(e.name)}`?i:`(${t}${(0,o.default)(e.name)} && ${i}) || null`}if(u(e.type)&&"coption"in e.type){let i=y(n,{name:(0,o.default)(e.name),type:e.type.coption},t);return i===`${t}${(0,o.default)(e.name)}`?i:`(${t}${(0,o.default)(e.name)} && ${i}) || null`}if(u(e.type)&&"array"in e.type){let i=e.type.array[0];if(typeof i=="object"&&"defined"in i)return`${t}${(0,o.default)(e.name)}.map((item) => new types.${i.defined.name}({ ...item }))`;let s=y(n,{name:"item",type:i},"");return s==="item"?`${t}${(0,o.default)(e.name)}`:`${t}${(0,o.default)(e.name)}.map((item) => ${s})`}if(u(e.type)&&"vec"in e.type){let i=`${y(n,{name:"item",type:e.type.vec},"")}`;return i==="item"?`${t}${(0,o.default)(e.name)}`:`${t}${(0,o.default)(e.name)}.map((item) => ${i})`}if(typeof e.type=="object"&&"generic"in e.type)throw new Error("generic layout support not implemented");e.type}}function h(n,e,t=""){var a,c;switch(e.type){case"bool":case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"f32":case"f64":case"string":return`${t}${(0,o.default)(e.name)}`;case"u64":case"i64":case"u128":case"i128":case"u256":case"i256":case"pubkey":return`${t}${(0,o.default)(e.name)}.toString()`;case"bytes":return`Array.from(${t}${(0,o.default)(e.name)}.values())`;default:if(u(e.type)&&"vec"in e.type){let i=h(n,{name:"item",type:e.type.vec});return i==="item"?`${t}${(0,o.default)(e.name)}`:`${t}${(0,o.default)(e.name)}.map((item) => ${i})`}if(u(e.type)&&"array"in e.type){let i=e.type.array[0];if(typeof i=="object"&&"defined"in i)return`${t}${(0,o.default)(e.name)}.map((item) => item.toJSON())`;let s=h(n,{name:"item",type:i});return s==="item"?`${t}${(0,o.default)(e.name)}`:`${t}${(0,o.default)(e.name)}.map((item) => ${s})`}if(u(e.type)&&"option"in e.type){let i=h(n,{name:(0,o.default)(e.name),type:e.type.option},t);return i===`${t}${(0,o.default)(e.name)}`?i:`(${t}${(0,o.default)(e.name)} && ${i}) || null`}if(u(e.type)&&"coption"in e.type){let i=h(n,{name:(0,o.default)(e.name),type:e.type.coption},t);return i===`${t}${(0,o.default)(e.name)}`?i:`(${t}${(0,o.default)(e.name)} && ${i}) || null`}if(u(e.type)&&"defined"in e.type){let i=e.type.defined,s=(c=(a=n.types)==null?void 0:a.filter(p=>p.name===i.name))!=null?c:[];if(s.length!==1)throw new Error(`Defined type not found: ${JSON.stringify(e)}`);switch(s[0].type.kind){case"struct":case"enum":return`${t}${(0,o.default)(e.name)}.toJSON()`;case"type":throw new Error("type layout support not implemented");default:throw s[0].type,new Error("Unreachable.")}}throw typeof e.type=="object"&&"generic"in e.type?new Error("generic layout support not implemented"):(e.type,new Error("Unreachable."))}}function w(n,e="types."){switch(n){case"bool":return"boolean";case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"f32":case"f64":return"number";case"string":case"u64":case"i64":case"u128":case"i128":case"u256":case"i256":case"pubkey":return"string";case"bytes":return"Array<number>";default:if(u(n)&&"vec"in n)return`Array<${w(n.vec,e)}>`;if(u(n)&&"array"in n)return`Array<${w(n.array[0],e)}>`;if(u(n)&&"option"in n)return`${w(n.option,e)} | null`;if(u(n)&&"coption"in n)return`${w(n.coption,e)} | null`;if(u(n)&&"defined"in n)return`${e}${g(n.defined.name)}`;throw typeof n=="object"&&"generic"in n?new Error("generic type not supported"):new Error("Unreachable.")}}function b(n,e="obj",t="types."){let a=e?e+".":"";switch(n.type){case"bool":case"u8":case"i8":case"u16":case"i16":case"u32":case"i32":case"f32":case"f64":case"string":return`${a}${(0,o.default)(n.name)}`;case"bytes":return`Uint8Array.from(${a}${(0,o.default)(n.name)})`;case"u64":case"i64":case"u128":case"i128":return`new BN(${a}${(0,o.default)(n.name)})`;case"u256":case"i256":case"pubkey":return`new PublicKey(${a}${(0,o.default)(n.name)})`;default:if(u(n.type)&&"vec"in n.type){let c=b({name:"item",type:n.type.vec},"",t);return c==="item"?`${a}${(0,o.default)(n.name)}`:`${a}${(0,o.default)(n.name)}.map((item) => ${c})`}if(u(n.type)&&"array"in n.type){let c=b({name:"item",type:n.type.array[0]},"",t);return c==="item"?`${a}${(0,o.default)(n.name)}`:`${a}${(0,o.default)(n.name)}.map((item) => ${c})`}if(u(n.type)&&"option"in n.type){let c=b({name:(0,o.default)(n.name),type:n.type.option},e,t);return c===`${a}${(0,o.default)(n.name)}`?c:`(${a}${(0,o.default)(n.name)} && ${c}) || null`}if(u(n.type)&&"coption"in n.type){let c=b({name:(0,o.default)(n.name),type:n.type.coption},e,t);return c===`${a}${(0,o.default)(n.name)}`?c:`(${a}${(0,o.default)(n.name)} && ${c}) || null`}if(u(n.type)&&"defined"in n.type)return`${t}${n.type.defined.name}.fromJSON(${a}${(0,o.default)(n.name)})`;throw typeof n.type=="object"&&"generic"in n.type?new Error("generic type not supported"):(n.type,new Error("Unreachable."))}}var d=O(require("camelcase"));function R(n,e,t){e.accounts===void 0||e.accounts.length===0||(V(n,e,t),W(n,e,t))}function V(n,e,t){var c;let a=n.createSourceFile(t("accounts/index.ts"),"",{overwrite:!0});(c=e.accounts)==null||c.forEach(i=>{let s=(0,d.default)(i.name,{pascalCase:!0});a.addExportDeclaration({namedExports:[s],moduleSpecifier:`./${s}`}),a.addExportDeclaration({namedExports:[k(s),g(s)],isTypeOnly:!0,moduleSpecifier:`./${s}`})})}function W(n,e,t){var a;(a=e.accounts)==null||a.forEach(c=>{var B;let i=n.createSourceFile(t(`accounts/${(0,d.default)(c.name,{pascalCase:!0})}.ts`),"",{overwrite:!0});i.addStatements(['import { PublicKey, Connection } 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']:[]]);let s=(B=e.types)==null?void 0:B.find(r=>r.name===c.name);if(!s||s.type.kind!=="struct")throw new Error(`Type ${c.name} not found`);let p=s.type.fields;if(!p)throw new Error(`Fields for ${c.name} not found`);let m=(0,d.default)(c.name,{pascalCase:!0});i.addInterface({isExported:!0,name:k(m),properties:p.map(r=>({name:(0,d.default)(r.name),type:f(e,r.type),docs:r.docs&&[r.docs.join(`
`)]}))}),i.addInterface({isExported:!0,name:g(m),properties:p.map(r=>({name:(0,d.default)(r.name),type:w(r.type),docs:r.docs&&[r.docs.join(`
`)]}))});let l=i.addClass({isExported:!0,name:m,properties:p.map(r=>({isReadonly:!0,name:(0,d.default)(r.name),type:f(e,r.type,"types.",!1),docs:r.docs&&[r.docs.join(`
`)]})),docs:c.docs&&[c.docs.join(`
`)]});l.addProperty({isStatic:!0,isReadonly:!0,name:"discriminator",initializer:`Buffer.from([${L(m).toString()}])`}).prependWhitespace(`
`),l.addProperty({isStatic:!0,isReadonly:!0,name:"layout",initializer:r=>{r.write("solay.struct(["),p.forEach($=>{r.writeLine(E($.type,(0,d.default)($.name))+",")}),r.write("])")}}).prependWhitespace(`
`),l.addConstructor({parameters:[{name:"fields",type:k(m)}],statements:r=>{p.forEach($=>{let j=y(e,$);r.writeLine(`this.${(0,d.default)($.name)} = ${j}`)})}}),l.addMethod({isStatic:!0,isAsync:!0,name:"fetch",parameters:[{name:"c",type:"Connection"},{name:"address",type:"PublicKey"},{name:"programId",type:"PublicKey"}],returnType:`Promise<${m} | null>`,statements:[r=>{r.writeLine("const info = await c.getAccountInfo(address)"),r.blankLine(),r.write("if (info === null)"),r.inlineBlock(()=>{r.writeLine("return null")}),r.write("if (!info.owner.equals(programId))"),r.inlineBlock(()=>{r.writeLine(`throw new Error("account doesn't belong to this program")`)}),r.blankLine(),r.writeLine("return this.decode(info.data)")}]}),l.addMethod({isStatic:!0,isAsync:!0,name:"fetchMultiple",parameters:[{name:"c",type:"Connection"},{name:"addresses",type:"PublicKey[]"},{name:"programId",type:"PublicKey"}],returnType:`Promise<Array<${m} | null>>`,statements:[r=>{r.writeLine("const infos = await c.getMultipleAccountsInfo(addresses)"),r.blankLine(),r.write("return infos.map((info) => "),r.inlineBlock(()=>{r.write("if (info === null)"),r.inlineBlock(()=>{r.writeLine("return null")}),r.write(""),r.write("if (!info.owner.equals(programId))"),r.inlineBlock(()=>{r.writeLine(`throw new Error("account doesn't belong to this program")`)}),r.blankLine(),r.writeLine("return this.decode(info.data)")}),r.write(")")}]}),l.addMethod({isStatic:!0,name:"decode",parameters:[{name:"data",type:"Buffer"}],returnType:m,statements:[r=>{r.write(`if (!data.slice(0, 8).equals(${m}.discriminator))`),r.inlineBlock(()=>{r.writeLine('throw new Error("invalid account discriminator")')}),r.blankLine(),r.writeLine(`const dec = ${m}.layout.decode(data.slice(8))`),r.blankLine(),r.write(`return new ${m}({`),p.forEach($=>{let j=I(e,$,"dec.");r.writeLine(`${(0,d.default)($.name)}: ${j},`)}),r.write("})")}]}),l.addMethod({name:"toJSON",returnType:g(m),statements:[r=>{r.write("return {"),p.forEach($=>{r.writeLine(`${(0,d.default)($.name)}: ${h(e,$,"this.")},`)}),r.write("}")}]}),l.addMethod({isStatic:!0,name:"fromJSON",returnType:m,parameters:[{name:"obj",type:g(m)}],statements:[r=>{r.write(`return new ${m}({`),p.forEach($=>{r.writeLine(`${(0,d.default)($.name)}: ${b($)},`)}),r.write("})")}]})})}0&&(module.exports={genAccounts});
//# sourceMappingURL=accounts.js.map