@neo-one/smart-contract-codegen-esnext-esm
Version:
NEO•ONE TypeScript smart contract codegen.
74 lines (72 loc) • 3.44 kB
JavaScript
import _ from 'lodash';
import { toTypeScriptType } from '../utils';
const getOptions = (abi, { withConfirmedOptions = false } = {}) => {
if (abi.constant) {
return withConfirmedOptions ? ['options?: GetOptions'] : [];
}
const type = withConfirmedOptions ? ' & GetOptions' : '';
if (abi.sendUnsafe && abi.receive) {
return [`options?: InvokeSendUnsafeReceiveTransactionOptions${type}`];
}
if (abi.sendUnsafe) {
return [`options?: InvokeSendUnsafeTransactionOptions${type}`];
}
if (abi.receive) {
return [`options?: InvokeReceiveTransactionOptions${type}`];
}
if (abi.refundAssets) {
return [`hash: Hash256String, options?: TransactionOptions${type}`];
}
if (abi.send) {
return [`transfer: Transfer, options?: TransactionOptions${type}`];
}
if (abi.completeSend) {
return [`hash: Hash256String, options?: TransactionOptions${type}`];
}
return [`options?: TransactionOptions${type}`];
};
const getRestParameter = (param, migration = false) => `...${param.name}: ${toTypeScriptType(param, { isParameter: true, includeOptional: false, migration })}[]`;
export const genFunctionParameters = (abi, parameters = abi.parameters === undefined ? [] : abi.parameters, options = {}) => {
const [otherParameters, restParameter] = parameters.length > 0 && parameters[parameters.length - 1].rest
? [parameters.slice(0, -1), parameters[parameters.length - 1]]
: [parameters.slice(), undefined];
const paramStrings = _.reverse(_.reverse([...otherParameters]).reduce((acc, param) => ({
hasRequired: acc.hasRequired || !param.optional,
acc: acc.acc.concat(`${param.name}${!acc.hasRequired && param.optional ? '?' : ''}: ${toTypeScriptType(param, {
isParameter: true,
includeOptional: false,
migration: options.migration,
})}`),
}), { hasRequired: false, acc: [] }).acc);
const paramOptions = getOptions(abi, options);
let forwardOptions = [];
if (restParameter !== undefined && restParameter.type === 'ForwardValue') {
forwardOptions = [`forwardOptions?: ${abi.constant ? 'ForwardOptions' : 'TForwardOptions'}`];
}
const withParamOptions = paramStrings
.concat(paramOptions)
.concat(restParameter === undefined ? [] : [getRestParameter(restParameter, options.migration)])
.join(', ');
const withForwardOptions = paramStrings
.concat(forwardOptions)
.concat(restParameter === undefined ? [] : [getRestParameter(restParameter, options.migration)])
.join(', ');
const withParamForwardOptions = paramStrings
.concat(paramOptions)
.concat(forwardOptions)
.concat(restParameter === undefined ? [] : [getRestParameter(restParameter, options.migration)])
.join(', ');
const withoutOptions = paramStrings
.concat(restParameter === undefined ? [] : [getRestParameter(restParameter, options.migration)])
.join(', ');
if (restParameter === undefined) {
return [withParamOptions];
}
if (paramOptions.length === 0) {
return forwardOptions.length === 0 ? [withoutOptions] : [withForwardOptions];
}
return forwardOptions.length === 0
? [withParamOptions, withoutOptions]
: [withForwardOptions, withParamForwardOptions];
};
//# sourceMappingURL=genFunctionParameters.js.map