/** * generates the output-files from the * compiled data */ import * as fs from 'fs'; import * as util from 'util'; import * as path from 'path'; const readFile = util.promisify(fs.readFile); import { SolcCompiledFile } from '../compiled.d'; import { SourceCode } from '../read-code'; import { Options } from '../options'; import paths from '../paths'; let javascriptTemplatePromise: any = null; export async function createJavascriptFile( source: SourceCode, compiled: SolcCompiledFile ): Promise { if (!javascriptTemplatePromise) { javascriptTemplatePromise = readFile( path.join(paths.base, './src/output-files/javascript.template.js'), 'utf-8' ); } let template = await javascriptTemplatePromise; template = template.replace('', source.codeHash); template = template.replace('', JSON.stringify(compiled, null, 2)); return template; } export async function createTypescriptFile( source: SourceCode, compiled: SolcCompiledFile ): Promise { const template = `/* tslint:disable */ /** * generated via solidity-cli * @link https://www.npmjs.com/package/solidity-cli * do not edit this file manually * source-code-hash: ${source.codeHash} */ import { SolcCompiledContract, SolcCompiledFile } from 'solidity-cli'; declare type CompiledType = { ${Object.keys(compiled).map(k => `'${k}': SolcCompiledContract;`)} }; const compiled: CompiledType = ${JSON.stringify(compiled, null, 2)}; export default compiled; `; return template; } /** * determines where the output should be written */ export function outputPath(options: Options, source: SourceCode): string { const DEBUG = false; if (DEBUG) console.log('sourceFolder: ' + options.sourceFolder); let globBase = options.sourceFolder.replace(/\*.*/, ''); if (globBase.endsWith('.sol')) // single file globBase = path.join(globBase, '../'); if (DEBUG) console.log('globBase: ' + globBase); const optDestination = options.destinationFolder ? options.destinationFolder : globBase; if (DEBUG) console.log('optDestination: ' + optDestination); let destinationFolder = path.join(globBase, optDestination); if (optDestination === globBase) destinationFolder = globBase; if (DEBUG) console.log('destinationFolder: ' + destinationFolder); // destination-folder is absolut if (options.destinationFolder && options.destinationFolder.startsWith('/')) destinationFolder = path.join(options.destinationFolder, './'); const fileNameRelative = source.filename.replace(globBase, ''); if (DEBUG) console.log('fileNameRelative: ' + fileNameRelative); const goalPath = path.join( destinationFolder, fileNameRelative ); return goalPath; }