UNPKG

@cosmology/ast

Version:
271 lines (270 loc) 13.8 kB
"use strict"; 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.toAmino = void 0; const t = __importStar(require("@babel/types")); const utils_1 = require("../../../utils"); const utils_2 = require("../utils"); const index_1 = require("./index"); const proto_1 = require("../../proto"); exports.toAmino = { defaultType(args, omitEmpty) { const useOmitEmpty = !!args.context.pluginValue("aminoEncoding.legacy.useOmitEmpty"); if (!(useOmitEmpty && omitEmpty) && args.field.name === args.context.aminoCaseField(args.field) && args.scope.length === 1) { return (0, utils_1.shorthandProperty)(args.field.name); } let valueExpr = useOmitEmpty && omitEmpty ? this.omitDefaultMemberExpressionOrIdentifier(args, args.scope) : (0, utils_1.memberExpressionOrIdentifier)(args.scope); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), valueExpr); }, long(args, omitEmpty) { const useOmitEmpty = !!args.context.pluginValue("aminoEncoding.legacy.useOmitEmpty"); const useNullHandling = !!args.context.pluginValue("aminoEncoding.legacy.useNullHandling"); let valueExpr = useOmitEmpty && omitEmpty ? this.omitDefaultMemberExpressionOrIdentifier(args, args.scope) : (0, utils_1.memberExpressionOrIdentifier)(args.scope); const callExpression = useNullHandling ? t.optionalCallExpression : t.callExpression; return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), callExpression(useNullHandling ? t.optionalMemberExpression(valueExpr, t.identifier("toString"), false, true) : t.memberExpression(valueExpr, t.identifier("toString")), [], true)); }, string(args, omitEmpty) { const useCosmosSDKDec = args.context.pluginValue("aminoEncoding.customTypes.useCosmosSDKDec"); if (useCosmosSDKDec) { const isCosmosSDKDec = args.field.options?.["(gogoproto.customtype)"] == "github.com/cosmos/cosmos-sdk/types.Dec" || args.field.options?.["(gogoproto.customtype)"] == "cosmossdk.io/math.LegacyDec"; if (isCosmosSDKDec) { args.context.addUtil("padDecimal"); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), t.callExpression(t.identifier("padDecimal"), [ (0, utils_1.memberExpressionOrIdentifier)(args.scope), ])); } } if (args.field.name === args.context.aminoCaseField(args.field) && args.scope.length === 1) { return (0, utils_1.shorthandProperty)(args.field.name); } return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), (0, utils_1.memberExpressionOrIdentifier)(args.scope)); }, stringArray(args) { const useCosmosSDKDec = args.context.pluginValue("aminoEncoding.customTypes.useCosmosSDKDec"); if (useCosmosSDKDec) { const isCosmosSDKDec = args.field.options?.["(gogoproto.customtype)"] == "github.com/cosmos/cosmos-sdk/types.Dec" || args.field.options?.["(gogoproto.customtype)"] == "cosmossdk.io/math.LegacyDec"; if (isCosmosSDKDec) { return exports.toAmino.scalarArray(args, exports.arrayTypes.stringDec); } } if (args.field.name === args.context.aminoCaseField(args.field) && args.scope.length === 1) { return (0, utils_1.shorthandProperty)(args.field.name); } return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), (0, utils_1.memberExpressionOrIdentifier)(args.scope)); }, rawBytes(args) { args.context.addUtil("fromUtf8"); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), t.callExpression(t.memberExpression(t.identifier("JSON"), t.identifier("parse")), [ t.callExpression(t.identifier("fromUtf8"), [ (0, utils_1.memberExpressionOrIdentifier)(args.scope), ]), ])); }, wasmByteCode(args) { args.context.addUtil("toBase64"); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), t.callExpression(t.identifier("toBase64"), [ (0, utils_1.memberExpressionOrIdentifier)(args.scope), ])); }, duration(args) { const durationFormat = args.context.pluginValue("prototypes.typingsFormat.duration"); const updatedDuration = args.context.pluginValue("prototypes.typingsFormat.updatedDuration"); switch (durationFormat) { case "duration": if (updatedDuration) { return exports.toAmino.durationType(args); } case "string": default: return exports.toAmino.durationString(args); } }, // (duration * 1_000_000_000).toString(), durationString(args) { const exp = t.binaryExpression("*", (0, utils_1.memberExpressionOrIdentifier)(args.scope), utils_1.BILLION); exp.extra = { parenthesized: true }; const value = t.callExpression(t.memberExpression(exp, t.identifier("toString")), []); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), value); }, // (duration.seconds.toInt() * 1_000_000_000).toString(), // what about nanos? durationType(args) { const exp = t.binaryExpression("*", t.callExpression(t.memberExpression(t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), t.identifier("seconds")), t.identifier("toInt")), []), utils_1.BILLION); exp.extra = { parenthesized: true }; const value = t.callExpression(t.memberExpression(exp, t.identifier("toString")), []); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), value); }, height(args) { args.context.addUtil("omitDefault"); const value = t.objectExpression([ t.objectProperty(t.identifier(args.context.aminoCasingFn("revision_height")), t.optionalCallExpression(t.optionalMemberExpression(t.callExpression(t.identifier("omitDefault"), [ t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), t.identifier("revisionHeight")), ]), t.identifier("toString"), false, true), [], false)), // t.objectProperty(t.identifier(args.context.aminoCasingFn("revision_number")), t.optionalCallExpression(t.optionalMemberExpression(t.callExpression(t.identifier("omitDefault"), [ t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), t.identifier("revisionNumber")), ]), t.identifier("toString"), false, true), [], false)), ]); const cond = t.conditionalExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), value, t.objectExpression([])); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), cond); }, coinAmount(args) { const longType = utils_1.TypeLong.getType(args.context); switch (longType) { case "BigInt": return t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), t.identifier("amount")); case "Long": default: utils_1.TypeLong.addUtil(args.context); return t.callExpression(t.memberExpression(t.callExpression(utils_1.TypeLong.getFromValue(args.context), [ t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), t.identifier("amount")), ]), t.identifier("toString")), []); } }, coin(args) { const value = t.objectExpression([ t.objectProperty(t.identifier("denom"), t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(args.scope), t.identifier("denom"))), t.objectProperty(t.identifier("amount"), exports.toAmino.coinAmount(args)), ]); return t.objectProperty(t.identifier(args.context.aminoCaseField(args.field)), value); }, type({ context, field, currentProtoPath, scope, fieldPath, nested, isOptional, }) { /// TODO (can this be refactored out? e.g. no recursive calls in this file?) /// BEGIN const Type = context.getTypeFromCurrentPath(field, currentProtoPath); const parentField = field; const oneOfs = (0, proto_1.getOneOfs)(Type); const properties = (0, utils_2.protoFieldsToArray)(Type).map((field) => { const isOneOf = oneOfs.includes(field.name); const isOptional = (0, proto_1.getFieldOptionality)(context, field, isOneOf); if (parentField.import) currentProtoPath = parentField.import; return (0, index_1.toAminoParseField)({ context, field, currentProtoPath, scope: [...scope], fieldPath: [...fieldPath], nested, isOptional, // TODO how to handle nested optionality }); }); /// END return t.objectProperty(t.identifier(context.aminoCaseField(field)), t.objectExpression(properties)); }, typeArray({ context, field, currentProtoPath, scope, fieldPath, nested, isOptional, }) { ////// const variable = "el" + nested; const f = JSON.parse(JSON.stringify(field)); // clone const varProto = { ...f, }; varProto.name = variable; varProto.options["(telescope:orig)"] = variable; varProto.options["(telescope:name)"] = variable; varProto.options["(telescope:camel)"] = variable; ////// if (field.parsedType.type !== "Type") { throw new Error("Arrays only support types[Type] right now."); } const Type = context.getTypeFromCurrentPath(field, currentProtoPath); const parentField = field; const oneOfs = (0, proto_1.getOneOfs)(Type); const properties = (0, utils_2.protoFieldsToArray)(Type).map((field) => { const isOneOf = oneOfs.includes(field.name); const isOptional = (0, proto_1.getFieldOptionality)(context, field, isOneOf); if (parentField.import) currentProtoPath = parentField.import; return (0, index_1.toAminoParseField)({ context, field, currentProtoPath, scope: [variable], fieldPath: [varProto], nested: nested + 1, isOptional, // TODO how to handle nested optionality }); }); const expr = t.callExpression(t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(scope), t.identifier("map")), [ t.arrowFunctionExpression([t.identifier(variable)], t.objectExpression(properties)), ]); return t.objectProperty(t.identifier(context.aminoCaseField(field)), expr); }, scalarArray({ context, field, currentProtoPath, scope, nested, isOptional, }, arrayTypeAstFunc) { const variable = "el" + nested; const expr = t.callExpression(t.memberExpression((0, utils_1.memberExpressionOrIdentifier)(scope), t.identifier("map")), [ t.arrowFunctionExpression([t.identifier(variable)], arrayTypeAstFunc(variable, { context, field, currentProtoPath, scope, nested, isOptional, })), ]); return t.objectProperty(t.identifier(context.aminoCaseField(field)), expr); }, pubkey(args) { args.context.addUtil("decodePubkey"); return t.objectProperty(t.identifier(args.field.name), t.tsNonNullExpression(t.callExpression(t.identifier("decodePubkey"), [ t.identifier(args.field.name), ]))); }, omitDefaultMemberExpressionOrIdentifier(args, names) { args.context.addUtil("omitDefault"); return t.callExpression(t.identifier("omitDefault"), [ (0, utils_1.memberExpressionOrIdentifier)(names), ]); }, }; exports.arrayTypes = { long(varname) { return t.callExpression(t.memberExpression((0, utils_1.memberExpressionOrIdentifier)([varname]), t.identifier("toString")), []); }, stringDec(varname, args) { args.context.addUtil("padDecimal"); return t.callExpression(t.identifier("padDecimal"), [ (0, utils_1.memberExpressionOrIdentifier)([varname]), ]); }, };