@cosmology/ast
Version:
Cosmos TypeScript AST generation
328 lines (327 loc) • 16.3 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.fromJSON = void 0;
const t = __importStar(require("@babel/types"));
const utils_1 = require("../../../utils");
const getPropNames = (field) => {
const messageProp = field.name;
const objProp = field.options?.json_name ?? field.name;
return {
messageProp,
objProp
};
};
exports.fromJSON = {
// OLD: sender: isSet(object.sender) ? String(object.sender) : ""
// NEW: if (isSet(object.sender)) { obj.sender = String(object.sender) }
string(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier('String'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
number(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier('Number'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
double(args) {
return exports.fromJSON.number(args);
},
float(args) {
return exports.fromJSON.number(args);
},
int32(args) {
return exports.fromJSON.number(args);
},
sint32(args) {
return exports.fromJSON.number(args);
},
uint32(args) {
return exports.fromJSON.number(args);
},
fixed32(args) {
return exports.fromJSON.number(args);
},
sfixed32(args) {
return exports.fromJSON.number(args);
},
// OLD disableMacros: isSet(object.disableMacros) ? Boolean(object.disableMacros) : false
// NEW if (isSet(object.disableMacros)) { obj.disableMacros = Boolean(object.disableMacros) }
bool(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier('Boolean'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
// OLD int64Value: isSet(object.int64Value) ? Long.fromValue(object.int64Value) : Long.UZERO,
// NEW if (isSet(object.int64Value)) { obj.int64Value = Long.fromValue(object.int64Value) }
long(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
utils_1.TypeLong.addUtil(args.context);
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), utils_1.TypeLong.getFromValueWithArgs(args.context, t.memberExpression(t.identifier('object'), t.identifier(objProp))))));
},
int64(args) {
return exports.fromJSON.long(args);
},
// OLD uint64Value: isSet(object.uint64Value) ? Long.fromString(object.uint64Value) : Long.ZERO,
// NEW if (isSet(object.uint64Value)) { obj.uint64Value = Long.fromString(object.uint64Value) }
uint64(args) {
return exports.fromJSON.long(args);
},
sint64(args) {
return exports.fromJSON.long(args);
},
fixed64(args) {
return exports.fromJSON.long(args);
},
sfixed64(args) {
return exports.fromJSON.long(args);
},
// signDoc: isSet(object.signDoc) ? SignDocDirectAux.fromJSON(object.signDoc) : undefined,
type(args) {
const { messageProp, objProp } = getPropNames(args.field);
let name = args.context.getTypeName(args.field);
args.context.addUtil('isSet');
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.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.memberExpression(t.identifier(name), t.identifier('fromJSON')), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
// OLD mode: isSet(object.mode) ? signModeFromJSON(object.mode) : 0,
// NEW if (isSet(object.mode)) { obj.mode = signModeFromJSON(object.mode) }
enum(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
const fromJSONFuncName = args.context.getFromEnum(args.field);
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier(fromJSONFuncName), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
// OLD queryData: isSet(object.queryData) ? bytesFromBase64(object.queryData) : new Uint8Array()
// NEW if (isSet(object.queryData)) { obj.queryData = bytesFromBase64(object.queryData) }
bytes(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
args.context.addUtil('bytesFromBase64');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier('bytesFromBase64'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
// period: isSet(object.period) ? Duration.fromJSON(object.period) : undefined,
duration(args) {
const durationFormat = args.context.pluginValue('prototypes.typingsFormat.duration');
switch (durationFormat) {
case 'string':
return exports.fromJSON.durationString(args);
case 'duration':
default:
return exports.fromJSON.type(args);
}
},
// OLD period: isSet(object.period) ? String(object.period) : undefined,
// NEW if (isSet(object.period)) { obj.period = String(object.period) }
durationString(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier('String'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
// periodReset: isSet(object.periodReset) ? fromJsonTimestamp(object.periodReset) : undefined
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.fromJSON.timestampTimestamp(args);
case 'date':
default:
return exports.fromJSON.timestampDate(args);
}
},
timestampTimestamp(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
args.context.addUtil('fromJsonTimestamp');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.callExpression(t.identifier('fromJsonTimestamp'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
timestampDate(args) {
const { messageProp, objProp } = getPropNames(args.field);
args.context.addUtil('isSet');
return t.ifStatement(t.callExpression(t.identifier('isSet'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), t.newExpression(t.identifier('Date'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]))));
},
// labels: isObject(object.labels) ? Object.entries(object.labels).reduce<{
// [key: string]: string;
// }>((acc, [key, value]) => {
// acc[key] = String(value);
// return acc;
// }, {}) : {},
// referenceMap: isObject(object.referenceMap) ? Object.entries(object.referenceMap).reduce<{
// [key: Long]: Reference;
// }>((acc, [key, value]) => {
// acc[Number(key)] = Reference.fromJSON(value);
// return acc;
// }, {}) : {},
keyHash(args) {
const { messageProp, objProp } = getPropNames(args.field);
const keyType = args.field.keyType;
const valueType = args.field.parsedType.name;
args.context.addUtil('isObject');
let fromJSON = null;
// valueTypeType: string for identifier
let valueTypeType = valueType;
switch (valueType) {
case 'string':
fromJSON = t.callExpression(t.identifier('String'), [
t.identifier('value')
]);
break;
case 'int32':
case 'uint32':
valueTypeType = 'number';
fromJSON = t.callExpression(t.identifier('Number'), [
t.identifier('value')
]);
break;
case 'int64':
case 'uint64':
case 'sint64':
case 'fixed64':
case 'sfixed64':
utils_1.TypeLong.addUtil(args.context);
valueTypeType = utils_1.TypeLong.getPropType(args.context);
fromJSON = utils_1.TypeLong.getFromValueWithArgs(args.context, t.tsAsExpression(t.identifier('value'), t.tsUnionType([
t.tsTypeReference(utils_1.TypeLong.getPropIdentifier(args.context)),
t.tsStringKeyword()
])));
break;
default:
fromJSON = t.callExpression(t.memberExpression(t.identifier(valueType), t.identifier('fromJSON')), [
t.identifier('value')
]);
}
let wrapKey = null;
let keyTypeType = null;
switch (keyType) {
case 'string':
wrapKey = (a) => a;
keyTypeType = t.tsStringKeyword();
break;
case 'int64':
case 'uint64':
case 'sint64':
case 'fixed64':
case 'sfixed64':
wrapKey = (a) => t.callExpression(t.identifier('Number'), [
a
]);
utils_1.TypeLong.addUtil(args.context);
keyTypeType = t.tsTypeReference(utils_1.TypeLong.getPropIdentifier(args.context));
break;
case 'uint32':
case 'int32':
wrapKey = (a) => t.callExpression(t.identifier('Number'), [
a
]);
keyTypeType = t.tsTypeReference(t.identifier('number'));
break;
default:
throw new Error('keyHash requires new type. Ask maintainers.');
}
return t.ifStatement(t.callExpression(t.identifier('isObject'), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('obj'), t.identifier(messageProp)), (0, utils_1.callExpression)(t.memberExpression(t.callExpression(t.memberExpression(t.identifier('Object'), t.identifier('entries')), [
t.memberExpression(t.identifier('object'), t.identifier(objProp))
]), t.identifier('reduce')), [
t.arrowFunctionExpression([
t.identifier('acc'),
t.arrayPattern([
t.identifier('key'),
t.identifier('value')
])
], t.blockStatement([
t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.identifier('acc'), wrapKey(t.identifier('key')), true), fromJSON)),
t.returnStatement(t.identifier('acc'))
])),
t.objectExpression([])
], t.tsTypeParameterInstantiation([
t.tsTypeLiteral([
t.tsIndexSignature([
(0, utils_1.identifier)('key', t.tsTypeAnnotation(keyTypeType))
], t.tsTypeAnnotation(t.tsTypeReference(t.identifier(valueTypeType))))
])
])))));
},
//OLD: codeIds: Array.isArray(object?.codeIds) ? object.codeIds.map((e: any) => Long.fromString(e)) : [],
//NEW: if (Array.isArray(object?.codeIds)) { obj.codeIds = object.codeIds.map((e: any) => Long.fromString(e)) }
array(args, expr) {
const { messageProp, objProp } = getPropNames(args.field);
return t.ifStatement(t.callExpression(t.memberExpression(t.identifier('Array'), t.identifier('isArray')), [
t.optionalMemberExpression(t.identifier('object'), t.identifier(objProp), false, true)
]), t.expressionStatement(t.assignmentExpression("=", t.memberExpression(t.identifier("obj"), t.identifier(objProp)), t.callExpression(t.memberExpression(t.memberExpression(t.identifier("object"), t.identifier(objProp)), t.identifier("map")), [
t.arrowFunctionExpression([(0, utils_1.identifier)("e", t.tsTypeAnnotation(t.tsAnyKeyword()))], expr, false),
]))));
}
};
;