diff options
author | Leonid Logvinov <logvinov.leon@gmail.com> | 2017-12-02 12:42:27 +0800 |
---|---|---|
committer | Leonid Logvinov <logvinov.leon@gmail.com> | 2017-12-02 13:31:11 +0800 |
commit | f285a46d05c8d30e516459b243106659c7351f6f (patch) | |
tree | d341ac79e4236d2242cbc4d53b6e331dd2711741 /packages/typed-contracts/src/index.ts | |
parent | 1e1c99d8d6f27c9da878e9ca4285691569051f3e (diff) | |
download | dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.tar dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.tar.gz dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.tar.bz2 dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.tar.lz dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.tar.xz dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.tar.zst dexon-sol-tools-f285a46d05c8d30e516459b243106659c7351f6f.zip |
Add generator CLI util
Diffstat (limited to 'packages/typed-contracts/src/index.ts')
-rw-r--r-- | packages/typed-contracts/src/index.ts | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/packages/typed-contracts/src/index.ts b/packages/typed-contracts/src/index.ts new file mode 100644 index 000000000..baa3ebc91 --- /dev/null +++ b/packages/typed-contracts/src/index.ts @@ -0,0 +1,85 @@ +#!/usr/bin/env node + +import chalk from 'chalk'; +import * as fs from 'fs'; +import {sync as globSync} from 'glob'; +import * as Handlebars from 'handlebars'; +import * as _ from 'lodash'; +import * as mkdirp from 'mkdirp'; +import * as yargs from 'yargs'; + +import * as toSnakeCase from 'to-snake-case'; +import * as Web3 from 'web3'; + +import {ParamKind} from './types'; +import {utils} from './utils'; + +const args = yargs + .option('abiGlob', { + describe: 'Glob pattern to search for ABI JSON files', + type: 'string', + demand: true, + }) + .option('templates', { + describe: 'Folder where to search for templates', + type: 'string', + demand: true, + }) + .option('output', { + describe: 'Folder where to put the output files', + type: 'string', + demand: true, + }) + .argv; + +function writeOutputFile(name: string, renderedTsCode: string): void { + const fileName = toSnakeCase(name); + const filePath = `${args.output}/${fileName}.ts`; + fs.writeFileSync(filePath, renderedTsCode); + utils.log(`Created: ${chalk.bold(filePath)}`); +} + +Handlebars.registerHelper('parameterType', utils.solTypeToTsType.bind(utils, ParamKind.Input)); +Handlebars.registerHelper('returnType', utils.solTypeToTsType.bind(utils, ParamKind.Output)); +const partialTemplateFileNames = globSync(`${args.templates}/partials/**/*.mustache`); +for (const partialTemplateFileName of partialTemplateFileNames) { + const namedContent = utils.getNamedContent(partialTemplateFileName); + Handlebars.registerPartial(namedContent.name, namedContent.content); +} + +const mainTemplate = utils.getNamedContent(`${args.templates}/contract.mustache`); +const template = Handlebars.compile(mainTemplate.content); +const abiFileNames = globSync(args.abiGlob); +if (_.isEmpty(abiFileNames)) { + utils.log(`${chalk.red(`No ABI files found.`)}`); + utils.log(`Please make sure you've passed a correct folder and they have ${chalk.bold('*.json')} extensions`); + process.exit(1); +} else { + utils.log(`Found ${chalk.green(`${abiFileNames.length}`)} ${chalk.bold('ABI')} files`); + mkdirp.sync(args.output); +} +for (const abiFileName of abiFileNames) { + const namedContent = utils.getNamedContent(abiFileName); + utils.log(`Processing: ${chalk.bold(namedContent.name)}...`); + const parsedContent = JSON.parse(namedContent.content); + const ABI = _.isArray(parsedContent) ? + parsedContent : // ABI file + parsedContent.abi; // Truffle contracts file + const methodAbis = ABI.filter((abi: Web3.AbiDefinition) => abi.type === 'function') as Web3.MethodAbi[]; + methodAbis.map(methodAbi => { + methodAbi.inputs.map(input => { + if (_.isEmpty(input.name)) { + // Auto-generated getters don't have parameter names + input.name = 'index'; + } + }); + // This will make temlates simpler + (methodAbi.outputs as any).singleReturnValue = methodAbi.outputs.length === 1; + }); + const templateData = { + contractName: namedContent.name, + methodAbis, + }; + const renderedTsCode = template(templateData); + writeOutputFile(namedContent.name, renderedTsCode); +} |