@cosmology/ast
Version:
Cosmos TypeScript AST generation
303 lines (302 loc) • 12.5 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.arrayTypes = exports.toTextualSig = exports.TEXTUAL_METHOD_NAME = exports.ARRAY_VAR_NAME = exports.MSG_VAR_NAME = void 0;
const t = __importStar(require("@babel/types"));
const utils_1 = require("../../../utils");
const types_1 = require("../../types");
exports.MSG_VAR_NAME = "message";
exports.ARRAY_VAR_NAME = "results";
exports.TEXTUAL_METHOD_NAME = "toTextualSig";
const setIfNotUndefinedAndNotNull = (prop, value) => {
return t.ifStatement(t.logicalExpression("&&", t.binaryExpression("!==", t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(prop)), t.identifier("undefined")), t.binaryExpression("!==", t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(prop)), t.nullLiteral())), t.blockStatement([value]));
};
exports.toTextualSig = {
scalar(args, expr, indentInc) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
return setIfNotUndefinedAndNotNull(propName, (0, types_1.getPushTextualSigLine)(exports.ARRAY_VAR_NAME, t.templateLiteral([
t.templateElement({
raw: `${(0, types_1.getTextualKeyName)(origName)}: `,
}),
t.templateElement({
raw: "",
}),
], [
expr ??
t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(propName)),
]), indentInc));
},
/**
* create code for formatted scalar with formatter
* @param args
* @param formatter
* @param isFormatterFromUtilHelper is formatter from util helper. default is true
* @returns
*/
formattedScalar(args, formatter, indentInc, expr, isFormatterFromUtilHelper = true) {
if (isFormatterFromUtilHelper) {
args.context.addUtil(formatter);
}
const { propName } = (0, types_1.getFieldNames)(args.field);
return exports.toTextualSig.scalar(args, t.callExpression(t.identifier(formatter), [
expr ??
t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(propName)),
]), indentInc);
},
// if (message.str !== undefined && message.str !== null) {
// results.push({
// text: `Str: ${message.str}`,
// indent: indent
// });
// }
string(args) {
const isCosmosSDKDec = args.field.options?.["(gogoproto.customtype)"] ==
"github.com/cosmos/cosmos-sdk/types.Dec" ||
args.field.options?.["(gogoproto.customtype)"] ==
"github.com/cosmos/cosmos-sdk/types.Int" ||
args.field.options?.["(gogoproto.customtype)"] ==
"cosmossdk.io/math.LegacyDec";
if (isCosmosSDKDec) {
return exports.toTextualSig.formattedScalar(args, "formatNumberWithThousandSeparator", 1);
}
else {
return exports.toTextualSig.scalar(args, null, 1);
}
},
// if (message.b !== undefined && message.b !== null) {
// results.push({
// text: `B: ${fromBooleanToString(message.b)}`,
// indent: indent
// });
// }
bool(args) {
return exports.toTextualSig.formattedScalar(args, "fromBooleanToString", 1);
},
// if (message.num !== undefined && message.num !== null) {
// results.push({
// text: `Num: ${formatNumberWithThousandSeparator(message.num)}`,
// indent: indent
// });
// }
number(args) {
return exports.toTextualSig.formattedScalar(args, "formatNumberWithThousandSeparator", 1);
},
int32(args) {
return exports.toTextualSig.number(args);
},
uint32(args) {
return exports.toTextualSig.number(args);
},
sint32(args) {
return exports.toTextualSig.number(args);
},
fixed32(args) {
return exports.toTextualSig.number(args);
},
sfixed32(args) {
return exports.toTextualSig.number(args);
},
double(args) {
return exports.toTextualSig.number(args);
},
float(args) {
return exports.toTextualSig.number(args);
},
// if (message.big !== undefined && message.big !== null) {
// results.push({
// text: `Big: ${formatNumberWithThousandSeparator(message.big)}`,
// indent: indent
// });
// }
long(args) {
return exports.toTextualSig.formattedScalar(args, "formatNumberWithThousandSeparator", 1);
},
int64(args) {
return exports.toTextualSig.long(args);
},
uint64(args) {
return exports.toTextualSig.long(args);
},
sint64(args) {
return exports.toTextualSig.long(args);
},
fixed64(args) {
return exports.toTextualSig.long(args);
},
sfixed64(args) {
return exports.toTextualSig.long(args);
},
type(args) {
if (!args.context.options.aminoEncoding.useLegacyInlineEncoding &&
args.context.options.interfaces.enabled &&
args.context.options.interfaces?.useGlobalDecoderRegistry &&
args.field.type === "google.protobuf.Any" &&
args.field.options["(cosmos_proto.accepts_interface)"]) {
return exports.toTextualSig.anyType(args);
}
return exports.toTextualSig.protoType(args);
},
anyType(args) {
const { propName } = (0, types_1.getFieldNames)(args.field);
return setIfNotUndefinedAndNotNull(propName, t.expressionStatement(t.callExpression(t.memberExpression(t.identifier("GlobalDecoderRegistry"), t.identifier(exports.TEXTUAL_METHOD_NAME)), [
t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(propName)),
t.identifier(exports.ARRAY_VAR_NAME),
t.conditionalExpression(t.identifier("indent"), t.binaryExpression("+", t.identifier("indent"), t.numericLiteral(1)), t.numericLiteral(1)),
t.identifier("expert"),
t.identifier("metadata"),
])));
},
protoType(args) {
const { propName } = (0, types_1.getFieldNames)(args.field);
const name = args.context.getTypeName(args.field);
return setIfNotUndefinedAndNotNull(propName, t.expressionStatement(t.callExpression(t.memberExpression(t.identifier(name), t.identifier(exports.TEXTUAL_METHOD_NAME)), [
t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(propName)),
t.identifier(exports.ARRAY_VAR_NAME),
t.conditionalExpression(t.identifier("indent"), t.binaryExpression("+", t.identifier("indent"), t.numericLiteral(1)), t.numericLiteral(1)),
t.identifier("expert"),
t.identifier("metadata"),
])));
},
// if (message.opt !== undefined && message.opt !== null) {
// results.push({
// text: `Opt: ${voteOptionToJSON(message.opt)}`,
// indent: indent
// });
// }
enum(args) {
const enumFuncName = args.context.getToEnum(args.field);
return exports.toTextualSig.formattedScalar(args, enumFuncName, 1, null, false);
},
// message.queryData = object.queryData ?? new Uint8Array()
bytes(args) {
const isCosmosSDKDec = args.field.options?.["(gogoproto.customtype)"] ==
"github.com/cosmos/cosmos-sdk/types.Dec" ||
args.field.options?.["(gogoproto.customtype)"] ==
"github.com/cosmos/cosmos-sdk/types.Int" ||
args.field.options?.["(gogoproto.customtype)"] ==
"cosmossdk.io/math.LegacyDec";
if (isCosmosSDKDec) {
args.context.addUtil("fromUtf8");
args.context.addUtil("formatNumberWithThousandSeparator");
const { propName } = (0, types_1.getFieldNames)(args.field);
return exports.toTextualSig.scalar(args, t.callExpression(t.identifier("formatNumberWithThousandSeparator"), [
t.callExpression(t.identifier("fromUtf8"), [
t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(propName)),
]),
]));
}
else {
return exports.toTextualSig.formattedScalar(args, "toByteTextual", 1);
}
},
duration(args) {
return exports.toTextualSig.formattedScalar(args, "toDurationTextual", 1);
},
timestamp(args) {
return exports.toTextualSig.formattedScalar(args, "toTimestampTextual", 1);
},
keyHash(args) {
return exports.toTextualSig.scalar(args, null, 1);
},
// message.codeIds = object.codeIds?.map(e => Long.fromValue(e)) || [];
array(args, expr) {
const prop = args.field.name;
return t.expressionStatement(t.assignmentExpression("=", t.memberExpression(t.identifier(exports.MSG_VAR_NAME), t.identifier(prop)), t.logicalExpression("||", t.optionalCallExpression(t.optionalMemberExpression(t.memberExpression(t.identifier("object"), t.identifier(prop)), t.identifier("map"), false, true), [t.arrowFunctionExpression([t.identifier("e")], expr)], false), t.arrayExpression([]))));
},
};
exports.arrayTypes = {
// message.overloadId = object.overloadId?.map(e => e) || [];
identity() {
return t.identifier("e");
},
string() {
return exports.arrayTypes.identity();
},
bool() {
return exports.arrayTypes.identity();
},
bytes() {
return exports.arrayTypes.identity();
},
double() {
return exports.arrayTypes.identity();
},
float() {
return exports.arrayTypes.identity();
},
int32() {
return exports.arrayTypes.identity();
},
uint32() {
return exports.arrayTypes.identity();
},
sint32() {
return exports.arrayTypes.identity();
},
fixed32() {
return exports.arrayTypes.identity();
},
sfixed32() {
return exports.arrayTypes.identity();
},
enum() {
return exports.arrayTypes.identity();
},
// message.codeIds = object.codeIds?.map(e => Long.fromValue(e)) || [];
long(args) {
utils_1.TypeLong.addUtil(args.context);
return utils_1.TypeLong.getFromValueWithArgs(args.context, t.identifier("e"));
},
int64(args) {
return exports.arrayTypes.long(args);
},
uint64(args) {
return exports.arrayTypes.long(args);
},
sint64(args) {
return exports.arrayTypes.long(args);
},
fixed64(args) {
return exports.arrayTypes.long(args);
},
sfixed64(args) {
return exports.arrayTypes.long(args);
},
// message.tokenInMaxs = object.tokenInMaxs?.map(e => Coin.toTextualSig(e)) || [];
type(args) {
let name = args.context.getTypeName(args.field);
let callee = t.memberExpression(t.identifier(name), t.identifier("toTextualSig"));
if (!args.context.options.aminoEncoding.useLegacyInlineEncoding &&
args.context.options.interfaces.enabled &&
args.context.options.interfaces?.useGlobalDecoderRegistry &&
args.field.type === "google.protobuf.Any" &&
args.field.options["(cosmos_proto.accepts_interface)"]) {
name = "GlobalDecoderRegistry";
callee = t.memberExpression(t.identifier(name), t.identifier("toTextualSig"));
return t.tsAsExpression(t.callExpression(callee, [t.identifier("e")]), t.tsAnyKeyword());
}
return t.callExpression(callee, [t.identifier("e")]);
},
};
;