vasku
Version:
TVM-Solidity contract development framework
114 lines (113 loc) • 3.73 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getArtifactParentDirectories = exports.removeOldArtifacts = exports.buildsArtifactsExists = exports.TS = exports.CONTENT_TS = exports.ABI_JSON = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const glob_1 = require("glob");
exports.ABI_JSON = '.abi.json';
exports.CONTENT_TS = 'Content.ts';
exports.TS = '.ts';
const extensions = [exports.ABI_JSON, exports.TS, '.tvc', exports.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) {
////////////////
// Extensions //
////////////////
const directory = path_1.default.dirname(contract);
const nameWithoutExtension = path_1.default.parse(path_1.default.basename(contract)).name;
return extensions
.map(extension => path_1.default.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
*/
function buildsArtifactsExists(config, contract) {
return getBuildArtifacts(contract).reduce((result, value) => {
return result && fs_extra_1.default.existsSync(path_1.default.resolve(process.cwd(), config.build, value));
}, true);
}
exports.buildsArtifactsExists = buildsArtifactsExists;
/**
* Return true if artifact files (e.g. `*.abi.json`) exists in build directory
* @param config
* @param sources
* Set {'A.tsol', 'B.tsol'}
*/
function removeOldArtifacts(config, sources) {
const directory = path_1.default.resolve(process.cwd(), config.build);
const current = (0, glob_1.globSync)(`${path_1.default.resolve(process.cwd(), config.build)}/**/*`)
.map(value => path_1.default.relative(directory, value));
const required = getSourceArtifactsWithDirectories(sources);
required.add('index.ts');
current.forEach(value => {
if (!required.has(value))
fs_extra_1.default.removeSync(path_1.default.resolve(process.cwd(), config.build, value));
});
}
exports.removeOldArtifacts = removeOldArtifacts;
/**
* 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) {
return [...sources].reduce((set, value) => {
const artifacts = getBuildArtifacts(value);
const firstArtifactDirectory = path_1.default.parse(artifacts[0]).dir;
artifacts.forEach(artifact => set.add(artifact));
return getArtifactParentDirectories(firstArtifactDirectory).reduce((set, artifactDirectory) => set.add(artifactDirectory), set);
}, new Set());
}
/**
* Return parent directories in build directory
* @param directory
* 'a/b'
* @return
* ['a/b', 'a']
*/
function getArtifactParentDirectories(directory) {
const result = [];
while (directory !== '') {
result.push(directory);
directory = path_1.default.parse(directory).dir;
}
return result;
}
exports.getArtifactParentDirectories = getArtifactParentDirectories;