@cosmwasm/ts-codegen
Version:
@cosmwasm/ts-codegen converts your CosmWasm smart contracts into dev-friendly TypeScript classes so you can focus on shipping code.
74 lines (73 loc) • 2.8 kB
JavaScript
import * as w from '@cosmwasm/ts-codegen-ast';
import { RenderContext, } from '@cosmwasm/ts-codegen-ast';
import { pascal } from 'case';
import { BuilderPluginBase } from './plugin-base';
export const GetLocalNameByContractName = (name) => `${pascal(name)}.provider.ts`;
export const GetLocalBaseNameByContractName = (name) => `${pascal(name)}.provider`;
export class ContractsContextProviderPlugin extends BuilderPluginBase {
constructor(opt) {
super(opt);
this.utils = {
ContractBase: '__contractContextBase__',
IContractConstructor: '__contractContextBase__',
IEmptyClient: '__contractContextBase__',
};
}
initContext(contract, options) {
return new RenderContext(contract, options, this.builder?.builderContext);
}
async doRender(name, context) {
if (!this.options?.useContractsHook?.enabled) {
return;
}
const providerInfo = context.getProviderInfos()[name];
if (!Object.keys(providerInfo || {})?.length) {
return;
}
context.addUtil('ContractBase');
context.addUtil('IContractConstructor');
const localname = GetLocalNameByContractName(name);
let needEmptyClientType = false;
let clientFile = null;
let clientClasses = [];
const body = [];
const signClientProviderInfo = providerInfo[w.PROVIDER_TYPES.SIGNING_CLIENT_TYPE];
if (signClientProviderInfo) {
clientFile = `./${signClientProviderInfo.basename}`;
clientClasses.push(signClientProviderInfo.classname);
}
else {
needEmptyClientType = true;
}
const queryClientProviderInfo = providerInfo[w.PROVIDER_TYPES.QUERY_CLIENT_TYPE];
if (queryClientProviderInfo) {
clientFile = `./${queryClientProviderInfo.basename}`;
clientClasses.push(queryClientProviderInfo.classname);
}
else {
needEmptyClientType = true;
}
if (clientFile) {
body.push(w.importStmt(clientClasses, clientFile));
}
const messageComposerProviderInfo = providerInfo[w.PROVIDER_TYPES.MESSAGE_COMPOSER_TYPE];
if (messageComposerProviderInfo) {
body.push(w.importStmt([messageComposerProviderInfo.classname], `./${messageComposerProviderInfo.basename}`));
}
else {
needEmptyClientType = true;
}
if (needEmptyClientType) {
context.addUtil('IEmptyClient');
}
body.push(w.createProvider(name, providerInfo));
return [
{
type: 'plugin',
pluginType: 'provider',
localname,
body,
},
];
}
}