import * as fs from 'fs'; import * as _ from 'lodash'; import * as path from 'path'; import {ParamKind} from './types'; export const utils = { solTypeToTsType(paramKind: ParamKind, solType: string): string { const trailingArrayRegex = /\[\d*\]$/; if (solType.match(trailingArrayRegex)) { const arrayItemSolType = solType.replace(trailingArrayRegex, ''); const arrayItemTsType = utils.solTypeToTsType(paramKind, arrayItemSolType); const arrayTsType = `${arrayItemTsType}[]`; return arrayTsType; } else { const solTypeRegexToTsType = [ {regex: '^string$', tsType: 'string'}, {regex: '^address$', tsType: 'string'}, {regex: '^bool$', tsType: 'boolean'}, {regex: '^u?int\\d*$', tsType: 'BigNumber'}, {regex: '^bytes\\d*$', tsType: 'string'}, ]; if (paramKind === ParamKind.Input) { // web3 allows to pass those an non-bignumbers and that's nice // but it always returns stuff as BigNumbers solTypeRegexToTsType.unshift({regex: '^u?int(8|16|32)?$', tsType: 'number|BigNumber'}); } for (const regexAndTxType of solTypeRegexToTsType) { const {regex, tsType} = regexAndTxType; if (solType.match(regex)) { return tsType; } } throw new Error(`Unknown Solidity type found: ${solType}`); } }, log(...args: any[]): void { console.log(...args); // tslint:disable-line:no-console }, getPartialNameFromFileName(filename: string): string { const name = path.parse(filename).name; return name; }, getNamedContent(filename: string): {name: string; content: string} { const name = utils.getPartialNameFromFileName(filename); try { const content = fs.readFileSync(filename).toString(); return { name, content, }; } catch (err) { throw new Error(`Failed to read ${filename}: ${err}`); } }, };