@cosmology/ast
Version:
Cosmos TypeScript AST generation
264 lines (263 loc) • 10.4 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.toSDK = void 0;
const t = __importStar(require("@babel/types"));
const types_1 = require("../../types");
const notUndefinedSetValue = (sdkName, msgName, expr) => {
return t.expressionStatement(t.logicalExpression('&&', t.binaryExpression('!==', t.memberExpression(t.identifier('message'), t.identifier(msgName)), t.identifier('undefined')), t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(sdkName)), expr)));
};
exports.toSDK = {
scalar(args) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
return t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(origName)), t.memberExpression(t.identifier('message'), t.identifier(propName))));
},
string(args) {
return exports.toSDK.scalar(args);
},
double(args) {
return exports.toSDK.scalar(args);
},
float(args) {
return exports.toSDK.scalar(args);
},
bool(args) {
return exports.toSDK.scalar(args);
},
number(args) {
return exports.toSDK.scalar(args);
},
int32(args) {
return exports.toSDK.scalar(args);
},
uint32(args) {
return exports.toSDK.scalar(args);
},
sint32(args) {
return exports.toSDK.scalar(args);
},
fixed32(args) {
return exports.toSDK.scalar(args);
},
sfixed32(args) {
return exports.toSDK.scalar(args);
},
long(args) {
return exports.toSDK.scalar(args);
},
int64(args) {
return exports.toSDK.scalar(args);
},
uint64(args) {
return exports.toSDK.scalar(args);
},
sint64(args) {
return exports.toSDK.scalar(args);
},
fixed64(args) {
return exports.toSDK.scalar(args);
},
sfixed64(args) {
return exports.toSDK.scalar(args);
},
type(args) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
let name = args.context.getTypeName(args.field);
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';
}
// TODO isn't the nested conditional a waste? (using ts-proto as reference)
// maybe null is OK?
return notUndefinedSetValue(origName, propName, t.conditionalExpression(t.memberExpression(t.identifier('message'), t.identifier(propName)), t.callExpression(t.memberExpression(t.identifier(name), t.identifier('toSDK')), [
t.memberExpression(t.identifier('message'), t.identifier(propName))
]), t.identifier('undefined')));
},
enum(args) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
const enumFuncName = args.context.getToEnum(args.field);
return notUndefinedSetValue(origName, propName, t.callExpression(t.identifier(enumFuncName), [
t.memberExpression(t.identifier('message'), t.identifier(propName))
]));
},
bytes(args) {
return exports.toSDK.scalar(args);
},
duration(args) {
return exports.toSDK.type(args);
},
timestamp(args) {
let timestampFormat = args.context.pluginValue('prototypes.typingsFormat.timestamp');
const env = args.context.pluginValue('env');
if (!env || env == 'default') {
timestampFormat = 'timestamp';
}
switch (timestampFormat) {
case 'timestamp':
return exports.toSDK.type(args);
case 'date':
default:
args.context.addUtil('toTimestamp');
return exports.toSDK.timestampDate(args);
}
},
timestampDate(args) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
return notUndefinedSetValue(origName, propName, t.logicalExpression('??', t.memberExpression(t.identifier('message'), t.identifier(propName)), t.identifier('undefined')));
},
keyHash(args) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
const keyType = args.field.keyType;
const valueType = args.field.parsedType.name;
let toSDK = null;
switch (valueType) {
case 'string':
toSDK = t.identifier('v');
break;
case 'uint32':
case 'int32':
toSDK = t.callExpression(t.memberExpression(t.identifier('Math'), t.identifier('round')), [
t.identifier('v')
]);
break;
case 'int64':
case 'uint64':
toSDK = t.callExpression(t.memberExpression(t.identifier('v'), t.identifier('toString')), []);
break;
default:
toSDK = t.callExpression(t.memberExpression(t.identifier(valueType), t.identifier('toSDK')), [
t.identifier('v')
]);
}
return [
t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(origName)), t.objectExpression([]))),
//
t.ifStatement(t.memberExpression(t.identifier('message'), t.identifier(propName)), t.blockStatement([
t.expressionStatement(t.callExpression(t.memberExpression(t.callExpression(t.memberExpression(t.identifier('Object'), t.identifier('entries')), [
t.memberExpression(t.identifier('message'), t.identifier(propName))
]), t.identifier('forEach')), [
t.arrowFunctionExpression([
t.arrayPattern([
t.identifier('k'),
t.identifier('v')
])
], t.blockStatement([
t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.memberExpression(t.identifier('obj'), t.identifier(origName)), t.identifier('k'), true), toSDK))
]))
]))
]))
];
},
array(args, expr) {
const { propName, origName } = (0, types_1.getFieldNames)(args.field);
return t.ifStatement(t.memberExpression(t.identifier('message'), t.identifier(propName)), t.blockStatement([
t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(origName)), t.callExpression(t.memberExpression(t.memberExpression(t.identifier('message'), t.identifier(propName)), t.identifier('map')), [
t.arrowFunctionExpression([
t.identifier('e')
], expr)
])))
]), t.blockStatement([
t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(origName)), t.arrayExpression([])))
]));
}
};
exports.arrayTypes = {
scalar() {
return t.identifier('e');
},
string() {
return exports.arrayTypes.scalar();
},
double() {
return exports.arrayTypes.scalar();
},
float() {
return exports.arrayTypes.scalar();
},
bool() {
return exports.arrayTypes.scalar();
},
number() {
return exports.arrayTypes.scalar();
},
int32() {
return exports.arrayTypes.number();
},
uint32() {
return exports.arrayTypes.number();
},
sint32() {
return exports.arrayTypes.number();
},
fixed32() {
return exports.arrayTypes.number();
},
sfixed32() {
return exports.arrayTypes.number();
},
long(args) {
return exports.arrayTypes.scalar();
},
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);
},
bytes(args) {
return exports.arrayTypes.scalar();
},
enum(args) {
const enumFuncName = args.context.getToEnum(args.field);
return t.callExpression(t.identifier(enumFuncName), [
t.identifier('e')
]);
},
type(args) {
let name = args.context.getTypeName(args.field);
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';
}
return t.conditionalExpression(t.identifier('e'), t.callExpression(t.memberExpression(t.identifier(name), t.identifier('toSDK')), [
t.identifier('e')
]), t.identifier('undefined'));
}
};
;