UNPKG

vasku

Version:

TVM-Solidity contract development framework

115 lines (107 loc) 3.13 kB
import path from 'path' import fs from 'fs-extra' import { type PathsConfig } from '../../config/types' import { globSync } from 'glob' export const ABI_JSON: string = '.abi.json' export const CONTENT_TS: string = 'Content.ts' export const TS: string = '.ts' const extensions = [ABI_JSON, TS, '.tvc', CONTENT_TS] /** * Return a set of contract assembly artifacts * @param config * @param contract * 'A.tsol' * 'x/C.tsol' * @return * [ * 'AContent.ts' * 'A.tvc' * 'A.ts', * 'A.abi.json', * 'x/CContent.ts' * 'x/C.tvc' * 'x/C.ts', * 'x/C.abi.json', * ] */ function getBuildArtifacts (contract: string): string[] { //////////////// // Extensions // //////////////// const directory = path.dirname(contract) const nameWithoutExtension = path.parse(path.basename(contract)).name return extensions .map(extension => path.relative('.', `${directory}/${nameWithoutExtension}${extension}`)) } /** * Return true if artifact files (e.g. `*.abi.json`) exists in build directory * @param config * @param contract * 'A.tsol' * @return * true */ export function buildsArtifactsExists (config: PathsConfig, contract: string): boolean { return getBuildArtifacts(contract).reduce((result, value) => { return result && fs.existsSync(path.resolve(process.cwd(), config.build, value)) } , true) } /** * Return true if artifact files (e.g. `*.abi.json`) exists in build directory * @param config * @param sources * Set {'A.tsol', 'B.tsol'} */ export function removeOldArtifacts (config: PathsConfig, sources: Set<string>): void { const directory = path.resolve(process.cwd(), config.build) const current = globSync(`${path.resolve(process.cwd(), config.build)}/**/*`) .map(value => path.relative(directory, value)) const required = getSourceArtifactsWithDirectories(sources) required.add('index.ts') current.forEach(value => { if (!required.has(value)) fs.removeSync(path.resolve(process.cwd(), config.build, value)) }) } /** * Return artifact for source files * @param sources * Set {'A.tsol', 'b/B.tsol'} * @return * [ * 'AContent.ts' * 'A.tvc' * 'A.ts', * 'A.abi.json' * 'b' * 'b/BContent.ts' * 'b/B.tvc' * 'b/B.ts', * 'b/B.abi.json' * ] */ function getSourceArtifactsWithDirectories (sources: Set<string>): Set<string> { return [...sources].reduce((set, value): Set<string> => { const artifacts = getBuildArtifacts(value) const firstArtifactDirectory = path.parse(artifacts[0]).dir artifacts.forEach(artifact => set.add(artifact)) return getArtifactParentDirectories(firstArtifactDirectory).reduce((set, artifactDirectory) => set.add(artifactDirectory), set) }, new Set<string>()) } /** * Return parent directories in build directory * @param directory * 'a/b' * @return * ['a/b', 'a'] */ export function getArtifactParentDirectories (directory: string): string[] { const result: string[] = [] while (directory !== '') { result.push(directory) directory = path.parse(directory).dir } return result }