@cosmology/ast
Version:
Cosmos TypeScript AST generation
98 lines (97 loc) • 4.61 kB
JavaScript
import * as t from '@babel/types';
import { arrayTypeNDim } from '../utils';
import { protoFieldsToArray } from '../utils';
import { getTSAminoType } from '../../types';
import { getOneOfs, getFieldOptionality } from '../../proto';
import { renderAminoField } from '.';
export const aminoInterface = {
defaultType(args) {
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(getTSAminoType(args.context, args.field.type, args.field.options)));
},
string(args) {
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(t.tsStringKeyword()));
},
long(args) {
// longs become strings...
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(t.tSStringKeyword()));
},
height(args) {
args.context.addUtil('AminoHeight');
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(t.tsTypeReference(t.identifier('AminoHeight'))));
},
duration(args) {
const durationFormat = args.context.pluginValue('prototypes.typingsFormat.duration');
switch (durationFormat) {
case 'string':
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(t.tsStringKeyword()));
case 'duration':
default:
return aminoInterface.type(args);
}
},
timestamp(args) {
return aminoInterface.string(args);
},
enum(args) {
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(t.tSNumberKeyword()));
},
pubkey(args) {
args.context.addUtil('Pubkey');
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Pubkey'))));
},
enumArray(args) {
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(arrayTypeNDim(t.tSNumberKeyword(), 1)));
},
type({ context, field, currentProtoPath, isOptional }) {
const parentField = field;
const Type = context.getTypeFromCurrentPath(field, currentProtoPath);
const oneOfs = getOneOfs(Type);
const properties = protoFieldsToArray(Type).map(field => {
const isOneOf = oneOfs.includes(field.name);
const isOptional = getFieldOptionality(context, field, isOneOf);
// TODO how to handle isOptional from parent to child...
if (parentField.import)
currentProtoPath = parentField.import;
return renderAminoField({
context,
field,
currentProtoPath,
isOptional // TODO how to handle nested optionality
});
});
//
return t.tsPropertySignature(t.identifier(context.aminoCaseField(field)), t.tsTypeAnnotation(t.tsTypeLiteral(properties)));
},
typeArray({ context, field, currentProtoPath, isOptional }) {
const parentField = field;
const Type = context.getTypeFromCurrentPath(field, currentProtoPath);
// TODO how to handle isOptional from parent to child...
const oneOfs = getOneOfs(Type);
const properties = protoFieldsToArray(Type).map(field => {
const isOneOf = oneOfs.includes(field.name);
const isOptional = getFieldOptionality(context, field, isOneOf);
if (parentField.import)
currentProtoPath = parentField.import;
return renderAminoField({
context,
field,
currentProtoPath,
isOptional // TODO how to handle nested optionality
});
});
//
return t.tsPropertySignature(t.identifier(context.aminoCaseField(field)), t.tsTypeAnnotation(arrayTypeNDim(t.tsTypeLiteral(properties), 1)));
},
array(args) {
// TODO write test case
// return t.tsPropertySignature(
// t.identifier(options.aminoCasingFn(field.name)),
// t.tsTypeAnnotation(
// arrayTypeNDim(t.tsTypeLiteral(
// properties
// ), 1)
// )
// );
return t.tsPropertySignature(t.identifier(args.context.aminoCaseField(args.field)), t.tsTypeAnnotation(arrayTypeNDim(getTSAminoType(args.context, args.field.type, args.field.options), 1)));
}
};