@cosmology/ast
Version:
Cosmos TypeScript AST generation
102 lines (101 loc) • 4.97 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.createInterfaceFromAminoHelper = exports.createInterfaceFromAmino = exports.getInterfaceFromAminoName = void 0;
const t = __importStar(require("@babel/types"));
const utils_1 = require("@cosmology/utils");
const utils_2 = require("../../../utils");
const firstUpper = (s) => s = s.charAt(0).toUpperCase() + s.slice(1);
const getInterfaceFromAminoName = (str) => {
return firstUpper((0, utils_1.slugify)(str) + '_FromAmino');
};
exports.getInterfaceFromAminoName = getInterfaceFromAminoName;
const makeFunctionWrapper = (functionName, stmt) => {
let arrowFunction = t.arrowFunctionExpression([
(0, utils_2.identifier)('content', t.tsTypeAnnotation(t.tsTypeReference(t.identifier('AnyAmino'))))
], t.blockStatement([
stmt
]));
arrowFunction.returnType = t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Any')));
return t.exportNamedDeclaration(t.variableDeclaration('const', [
t.variableDeclarator(t.identifier(functionName), arrowFunction)
]));
};
const createInterfaceFromAmino = (context, ref, interfaceName) => {
if (interfaceName === 'cosmos.crypto.PubKey') {
// return a helper!
context.addUtil('encodePubkey');
const functionName = (0, exports.getInterfaceFromAminoName)(interfaceName);
return makeFunctionWrapper(functionName, t.returnStatement(t.callExpression(t.identifier('encodePubkey'), [t.identifier('content')])));
}
const typeMap = context.store.getTypeUrlMap(ref);
const typeRefs = typeMap[interfaceName];
return (0, exports.createInterfaceFromAminoHelper)(context, (0, exports.getInterfaceFromAminoName)(interfaceName), typeRefs);
};
exports.createInterfaceFromAmino = createInterfaceFromAmino;
const createInterfaceFromAminoHelper = (context, functionName, typeRefs) => {
context.addUtil('DeepPartial');
// MARKED AS NOT DRY
const allTypes = typeRefs?.reduce((m, typeRef) => {
return [...m, ...typeRef.types];
}, []) ?? [];
const switchCases = allTypes.map(type => {
if (!type.aminoType)
return;
return t.switchCase(t.stringLiteral(type.aminoType), [
t.returnStatement(t.callExpression(t.memberExpression(t.identifier('Any'), t.identifier('fromPartial')), [
t.objectExpression([
t.objectProperty(t.identifier('typeUrl'), t.stringLiteral(type.typeUrl)),
t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.callExpression(t.memberExpression(t.identifier(type.importAs), t.identifier('encode')), [
t.callExpression(t.memberExpression(t.identifier(type.importAs), t.identifier('fromPartial')), [
t.callExpression(t.memberExpression(t.identifier(type.importAs), t.identifier('fromAmino')), [
t.memberExpression(t.identifier('content'), t.identifier('value'))
])
])
]), t.identifier('finish')), [])),
])
]))
]);
}).filter(Boolean);
let ast;
if (!switchCases.length) {
ast = t.returnStatement(t.callExpression(t.memberExpression(t.identifier('Any'), t.identifier('fromAmino')), [
t.identifier('content')
]));
}
else {
ast = t.switchStatement(t.memberExpression(t.identifier('content'), t.identifier('type')), [
...switchCases,
/// default
t.switchCase(null, [
t.returnStatement(t.callExpression(t.memberExpression(t.identifier('Any'), t.identifier('fromAmino')), [
t.identifier('content')
]))
])
]);
}
return makeFunctionWrapper(functionName, ast);
};
exports.createInterfaceFromAminoHelper = createInterfaceFromAminoHelper;
;