UNPKG

@cosmology/ast

Version:
71 lines (70 loc) 4.07 kB
import * as t from '@babel/types'; import { identifier } from '../../utils'; import { camel } from '@cosmology/utils'; export const addMsgMethod = ({ methodName, typeUrl, TypeName, methodToCall }) => { return t.objectMethod('method', t.identifier(methodName), [ identifier('value', t.tsTypeAnnotation(t.tsTypeReference(t.identifier(TypeName)))) ], t.blockStatement([ t.returnStatement(t.objectExpression([ t.objectProperty(t.identifier('typeUrl'), t.stringLiteral(typeUrl)), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.identifier(TypeName), t.identifier(methodToCall)), [t.identifier('value')])) ])) ])); }; export const addFromJSONMethod = ({ methodName, typeUrl, TypeName }) => { return t.objectMethod('method', t.identifier(methodName), [ identifier('value', t.tsTypeAnnotation(t.tsTypeReference(t.identifier('any')))) ], t.blockStatement([ t.returnStatement(t.objectExpression([ t.objectProperty(t.identifier('typeUrl'), t.stringLiteral(typeUrl)), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.identifier(TypeName), t.identifier('fromJSON')), [t.identifier('value')])) ])) ])); }; export const addFromPartialMethod = ({ methodName, typeUrl, TypeName }) => { return addMsgMethod({ methodName, typeUrl, TypeName, methodToCall: 'fromPartial' }); }; export const addToJSONMethod = ({ methodName, typeUrl, TypeName }) => { return addMsgMethod({ methodName, typeUrl, TypeName, methodToCall: 'toJSON' }); }; export const addJsonMethod = ({ methodName, typeUrl, TypeName }) => { return t.objectMethod('method', t.identifier(methodName), [ identifier('value', t.tsTypeAnnotation(t.tsTypeReference(t.identifier(TypeName)))) ], t.blockStatement([ t.returnStatement(t.objectExpression([ t.objectProperty(t.identifier('typeUrl'), t.stringLiteral(typeUrl)), t.objectProperty(t.identifier('value'), t.identifier('value'), false, true) ])) ])); }; export const addEncodedMethod = ({ methodName, typeUrl, TypeName }) => { return t.objectMethod('method', t.identifier(methodName), [ identifier('value', t.tsTypeAnnotation(t.tsTypeReference(t.identifier(TypeName)))) ], t.blockStatement([ t.returnStatement(t.objectExpression([ t.objectProperty(t.identifier('typeUrl'), t.stringLiteral(typeUrl)), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.callExpression(t.memberExpression(t.identifier(TypeName), t.identifier('encode')), [ t.identifier('value') ]), t.identifier('finish')), [])) ])) ])); }; export const createHelperObject = ({ context, // for future plugins name, mutations }) => { mutations = mutations.map(mutation => { return { ...mutation, methodName: camel(mutation.methodName) }; }); const methods = [ context.pluginValue('prototypes.methods.encode') && (t.objectProperty(t.identifier('encoded'), t.objectExpression(mutations.map(mutation => addEncodedMethod(mutation))))), t.objectProperty(t.identifier('withTypeUrl'), t.objectExpression(mutations.map(mutation => addJsonMethod(mutation)))), context.pluginValue('prototypes.methods.toJSON') && (t.objectProperty(t.identifier('toJSON'), t.objectExpression(mutations.map(mutation => addToJSONMethod(mutation))))), context.pluginValue('prototypes.methods.fromJSON') && (t.objectProperty(t.identifier('fromJSON'), t.objectExpression(mutations.map(mutation => addFromJSONMethod(mutation))))), context.pluginValue('prototypes.methods.fromPartial') && (t.objectProperty(t.identifier('fromPartial'), t.objectExpression(mutations.map(mutation => addFromPartialMethod(mutation))))) ].filter(Boolean); return t.exportNamedDeclaration(t.variableDeclaration('const', [ t.variableDeclarator(t.identifier(name), t.objectExpression(methods)) ])); };