@honeycomb-protocol/solita
Version:
Generates SDK API from solana contract IDL.
142 lines • 5.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderTypeDataStruct = exports.renderDataStruct = exports.assertKnownSerdePackage = exports.isKnownSerdePackage = exports.serdePackageTypePrefix = exports.extractSerdePackageFromImportStatment = exports.serdePackageExportName = exports.serdePackages = void 0;
const assert_1 = require("assert");
const types_1 = require("./types");
const utils_1 = require("./utils");
exports.serdePackages = new Map([
[types_1.BEET_PACKAGE, types_1.BEET_EXPORT_NAME],
[types_1.BEET_SOLANA_PACKAGE, types_1.BEET_SOLANA_EXPORT_NAME],
[types_1.SOLANA_WEB3_PACKAGE, types_1.SOLANA_WEB3_EXPORT_NAME],
]);
const packsByLengthDesc = Array.from(exports.serdePackages.keys()).sort((a, b) => a.length > b.length ? -1 : 1);
function serdePackageExportName(pack) {
if (pack == null)
return null;
const exportName = exports.serdePackages.get(pack);
(0, assert_1.strict)(exportName != null, `Unknown serde package ${pack}`);
return exportName;
}
exports.serdePackageExportName = serdePackageExportName;
function extractSerdePackageFromImportStatment(importStatement) {
// Avoiding matching on 'beet' for 'beet-solana' by checking longer keys first
for (const pack of packsByLengthDesc) {
const exportName = exports.serdePackages.get(pack);
if (importStatement.includes(pack)) {
(0, assert_1.strict)(importStatement.includes(`as ${exportName}`), `${importStatement} should import ${pack} as ${exportName}`);
return pack;
}
}
return null;
}
exports.extractSerdePackageFromImportStatment = extractSerdePackageFromImportStatment;
function serdePackageTypePrefix(pack) {
const packExportName = serdePackageExportName(pack);
return packExportName == null ? '' : `${packExportName}.`;
}
exports.serdePackageTypePrefix = serdePackageTypePrefix;
function isKnownSerdePackage(pack) {
return (pack === types_1.BEET_PACKAGE ||
pack === types_1.BEET_SOLANA_PACKAGE ||
pack === types_1.SOLANA_WEB3_PACKAGE);
}
exports.isKnownSerdePackage = isKnownSerdePackage;
function assertKnownSerdePackage(pack) {
(0, assert_1.strict)(isKnownSerdePackage(pack), `${pack} is an unknown and thus not yet supported de/serializer package`);
}
exports.assertKnownSerdePackage = assertKnownSerdePackage;
// -----------------
// Rendering processed serdes to struct
// -----------------
function renderField(field, addSeparator = false) {
const sep = addSeparator ? ',' : '';
return field == null ? '' : `['${field.name}', ${field.type}]${sep}`;
}
function renderFields(fields) {
return fields == null || fields.length === 0
? ''
: fields.map((x) => renderField(x)).join(',\n ');
}
/**
* Renders DataStruct for Instruction Args and Account Args
*/
function renderDataStruct({ fields, structVarName, className, argsTypename, discriminatorField, discriminatorName, discriminatorType, paddingField, isFixable, }) {
const fieldDecls = renderFields(fields);
const discriminatorDecl = renderField(discriminatorField, true);
discriminatorType = discriminatorType !== null && discriminatorType !== void 0 ? discriminatorType : 'number[]';
const extraFields = [];
if (discriminatorName != null) {
extraFields.push(`${discriminatorName}: ${discriminatorType}`);
}
if (paddingField != null) {
extraFields.push(`${paddingField.name}: number[] /* size: ${paddingField.size} */`);
}
let structType = fields.length === 0
? `{ ${extraFields.join('\n ')} }`
: extraFields.length === 0
? argsTypename
: `${argsTypename} & {
${extraFields.join('\n ')}
}
`;
// -----------------
// Beet Struct (Account)
// -----------------
if (className != null) {
const beetStructType = isFixable ? 'FixableBeetStruct' : 'BeetStruct';
return `export const ${structVarName} = new ${types_1.BEET_EXPORT_NAME}.${beetStructType}<
${className},
${structType}
>(
[
${discriminatorDecl}
${fieldDecls}
],
${className}.fromArgs,
'${className}'
)`;
}
else {
const beetArgsStructType = isFixable
? 'FixableBeetArgsStruct'
: 'BeetArgsStruct';
// -----------------
// Beet Args Struct (Instruction)
// -----------------
return `export const ${structVarName} = new ${types_1.BEET_EXPORT_NAME}.${beetArgsStructType}<${structType}>(
[
${discriminatorDecl}
${fieldDecls}
],
'${argsTypename}'
)`;
}
}
exports.renderDataStruct = renderDataStruct;
/**
* Renders DataStruct for user defined types
*/
function renderTypeDataStruct(args) {
const { fields, beetVarName, isFixable, generics = [] } = args;
const { typeNameWithGenerics: typeName, renderBeetExport } = (0, utils_1.genericsToTokens)(args.typeName, generics);
(0, assert_1.strict)(fields.length > 0, `Rendering struct for ${typeName} should have at least 1 field`);
const fieldDecls = fields
.map((f) => {
return `['${f.name}', ${f.type}]`;
})
.join(',\n ');
const beetArgsStructType = isFixable
? 'FixableBeetArgsStruct'
: 'BeetArgsStruct';
// -----------------
// Beet Args Struct (Instruction)
// -----------------
return `${renderBeetExport(beetVarName)}new ${types_1.BEET_EXPORT_NAME}.${beetArgsStructType}<${typeName}>(
[
${fieldDecls}
],
'${typeName}'
)`;
}
exports.renderTypeDataStruct = renderTypeDataStruct;
//# sourceMappingURL=serdes.js.map