solgen
Version:
A TypeScript SDK generator for Solana IDL - Automatically generates type definitions, account interfaces, and instruction builders
35 lines (30 loc) • 4.92 kB
JavaScript
"use strict";var d=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var x=(o,r)=>{for(var s in r)d(o,s,{get:r[s],enumerable:!0})},C=(o,r,s,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of h(r))!E.call(o,n)&&n!==s&&d(o,n,{get:()=>r[n],enumerable:!(t=f(r,n))||t.enumerable});return o};var w=o=>C(d({},"__esModule",{value:!0}),o);var T={};x(T,{genAnchorErrors:()=>p,genCustomErrors:()=>m,genErrors:()=>b,genIndex:()=>l});module.exports=w(T);var c=require("@coral-xyz/anchor"),u=require("ts-morph");function b(o,r,s){l(o,r,s),m(o,r,s),p(o,r,s)}function l(o,r,s){let t=o.createSourceFile(s("errors/index.ts"),"",{overwrite:!0}),n=r.errors&&r.errors.length>0;t.addStatements(['import { PublicKey } from "@solana/web3.js"']),t.addImportDeclaration({namespaceImport:"anchor",moduleSpecifier:"./anchor"}),n&&t.addImportDeclaration({namespaceImport:"custom",moduleSpecifier:"./custom"});let a=t.addFunction({isExported:!0,name:"fromCode",parameters:[{name:"code",type:"number"},{name:"logs",type:"string[]",hasQuestionToken:!0}],returnType:n?"custom.CustomError | anchor.AnchorError | null":"anchor.AnchorError | null"});n?a.setBodyText("return code >= 6000 ? custom.fromCode(code, logs) : anchor.fromCode(code, logs)"):a.setBodyText("return anchor.fromCode(code, logs)"),t.addFunction({name:"hasOwnProperty",typeParameters:[{name:"X extends object"},{name:"Y extends PropertyKey"}],parameters:[{name:"obj",type:"X"},{name:"prop",type:"Y"}],returnType:"obj is X & Record<Y, unknown>"}).setBodyText("return Object.hasOwnProperty.call(obj, prop);"),t.addVariableStatement({declarationKind:u.VariableDeclarationKind.Const,declarations:[{name:"errorRe",initializer:"/Program (\\w+) failed: custom program error: (\\w+)/"}]}),t.addFunction({isExported:!0,name:"fromTxError",parameters:[{name:"err",type:"unknown"},{name:"programId",type:"PublicKey"}],returnType:n?"custom.CustomError | anchor.AnchorError | null":"anchor.AnchorError | null"}).setBodyText(`if (
typeof err !== "object" ||
err === null ||
!hasOwnProperty(err, "logs") ||
!Array.isArray(err.logs)
) {
return null
}
let firstMatch: RegExpExecArray | null = null
for (const logLine of err.logs) {
firstMatch = errorRe.exec(logLine)
if (firstMatch !== null) {
break
}
}
if (firstMatch === null) {
return null
}
const [programIdRaw, codeRaw] = firstMatch.slice(1)
if (programIdRaw !== programId.toString()) {
return null
}
let errorCode: number
try {
errorCode = parseInt(codeRaw, 16)
} catch (parseErr) {
return null
}
return fromCode(errorCode, err.logs)`)}function m(o,r,s){if(!r.errors||r.errors.length===0)return;let t=r.errors,n=o.createSourceFile(s("errors/custom.ts"),"",{overwrite:!0});n.addTypeAlias({name:"CustomError",type:t.map(e=>e.name).join(" | "),isExported:!0}),t.forEach(e=>{let i=[{name:"code",initializer:e.code.toString(),isReadonly:!0,isStatic:!0},{name:"code",initializer:e.code.toString(),isReadonly:!0},{name:"name",initializer:`"${e.name}"`,isReadonly:!0}];e.msg&&i.push({name:"msg",initializer:`"${e.msg}"`,isReadonly:!0}),n.addClass({isExported:!0,name:e.name,extends:"Error",properties:i}).addConstructor({parameters:[{name:"logs",isReadonly:!0,hasQuestionToken:!0,type:"string[]"}]}).setBodyText(`super("${e.code}: ${e.msg||""}")`)}),n.addFunction({isExported:!0,name:"fromCode",parameters:[{name:"code",type:"number"},{name:"logs",type:"string[]",hasQuestionToken:!0}],returnType:"CustomError | null"}).setBodyText(e=>{e.writeLine("switch (code)").block(()=>{t.forEach(i=>{e.writeLine(`case ${i.code}:`).indent(()=>{e.writeLine(`return new ${i.name}(logs);`)})})}).blankLine().writeLine("return null")})}function p(o,r,s){let t=o.createSourceFile(s("errors/anchor.ts"),"",{overwrite:!0});t.addTypeAlias({name:"AnchorError",type:Object.keys(c.LangErrorCode).join(" | "),isExported:!0}),Object.keys(c.LangErrorCode).forEach(a=>{let e=c.LangErrorCode[a],i=c.LangErrorMessage.get(e)||"";t.addClass({isExported:!0,name:a,extends:"Error",properties:[{name:"code",initializer:e.toString(),isReadonly:!0,isStatic:!0},{name:"code",initializer:e.toString(),isReadonly:!0},{name:"name",initializer:`"${a}"`,isReadonly:!0},{name:"msg",initializer:`"${i}"`,isReadonly:!0}]}).addConstructor({parameters:[{name:"logs",isReadonly:!0,hasQuestionToken:!0,type:"string[]"}]}).setBodyText(`super("${e}: ${i}")`)}),t.addFunction({isExported:!0,name:"fromCode",parameters:[{name:"code",type:"number"},{name:"logs",type:"string[]",hasQuestionToken:!0}],returnType:"AnchorError | null"}).setBodyText(a=>{a.writeLine("switch (code)").block(()=>{Object.keys(c.LangErrorCode).forEach(e=>{a.writeLine(`case ${c.LangErrorCode[e]}:`).indent(()=>{a.writeLine(`return new ${e}(logs);`)})})}).blankLine().writeLine("return null")})}0&&(module.exports={genAnchorErrors,genCustomErrors,genErrors,genIndex});
//# sourceMappingURL=errors.js.map