const YAML = require('yaml') const path = require('path') const fs = require('fs') const {filterPublicExternalFunctions} = require('./ast_parser') const functions = filterPublicExternalFunctions('ast.json') let abi = "" var project = process.argv[2] const capitalize = str => { return str.charAt(0).toUpperCase() + str.slice(1); } const processYAML = () => { const subgraph_path = path.join('contracts', project, 'subgraph.yaml') console.log("reading subgraph yaml from", subgraph_path) const sg_yaml = fs.readFileSync(subgraph_path, 'utf8') const sg = YAML.parse(sg_yaml) delete sg.dataSources[0].mapping.eventHandlers sg.dataSources[0].mapping.callHandlers = [] abi = sg.dataSources[0].mapping.abis[0].name functions.forEach( fn => { const paramTypes = fn.parameters.map(p => p.type) const types = paramTypes.join(',') const ch = { function: `${fn.function_name}(${types})`, handler: `handle${capitalize(fn.function_name)}` } sg.dataSources[0].mapping.callHandlers.push(ch) }) fs.writeFileSync(subgraph_path, YAML.stringify(sg)) } const template = "export function handle<FN_NAME_UC> (call: <FN_NAME_UC>Call): void {paramHandler(call, \"<FN_NAME_LC>\")}" function applyTemplate(){ const templateFile = fs.readFileSync('template.ts', 'utf8') const appliedTemplates = functions.map(fn => { const function_name_uppercase = `${capitalize(fn.function_name)}` const function_name_lowercase = `${fn.function_name}` const replaced = template .replaceAll("<FN_NAME_LC>", function_name_lowercase) .replaceAll("<FN_NAME_UC>", function_name_uppercase) return replaced }) const callObjects = functions.map(fn => { return `${capitalize(fn.function_name)}Call` }) const joinedCallObjects = callObjects.join(',\n') const joinedTemplates = appliedTemplates.join('\n') const newFile = templateFile .replaceAll("<ABI>", abi) .replaceAll("<HANDLERS>", joinedTemplates) .replaceAll("<CALL_OBJECTS>", joinedCallObjects) // console.log(newFile) fs.writeFileSync(path.join('contracts', project, `src/${project.toLowerCase()}.ts`), newFile) } function copyTSTemplate(){ fs.copyFileSync('./schema.graphql', path.join('contracts', project, 'schema.graphql')) } processYAML() copyTSTemplate() applyTemplate()