@cosmology/ast
Version:
Cosmos TypeScript AST generation
271 lines (270 loc) • 13.8 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.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]),
]);
},
};
;