locklift
Version:
Node JS framework for working with Ever contracts. Inspired by Truffle and Hardhat. Helps you to build, test, run and maintain your smart contracts.
88 lines (87 loc) • 4.18 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.copyExternalArtifacts = exports.typeGenerator = void 0;
const fs_1 = __importDefault(require("fs"));
const fsPath = __importStar(require("path"));
const utils_1 = require("../utils");
const typeGenerator = (pathToBuildFolder, ...additionalFiles) => {
const generatedCode = [...getAbiFiles(pathToBuildFolder)]
.map(file => getContractAbi(pathToBuildFolder, file))
.concat(additionalFiles.map(el => {
return {
abi: fs_1.default.readFileSync(el, "utf8"),
name: (0, utils_1.getContractNameFromAbiPath)(el),
};
}))
.map(({ abi, name }) => ({
contractName: name,
code: generateContractCode({ abiSource: abi, contractName: name }),
}));
const abiSources = generatedCode.reduce((acc, { code: { abi } }) => acc + abi + "\n", "");
const typingSources = generatedCode.reduce((acc, { code: { typing } }) => acc + typing + "\n", "");
const factorySources = generatedCode.reduce((acc, { code: { contractName, abiSourceName } }) => ({
...acc,
[contractName]: abiSourceName,
}), {});
const factorySourceObj = `export const factorySource = ${JSON.stringify(factorySources, null, 4).replace(/"/g, "")} as const\n\nexport type FactorySource = typeof factorySource`;
fs_1.default.writeFileSync(fsPath.join(pathToBuildFolder, "./factorySource.ts"), abiSources + "\n" + factorySourceObj + "\n" + typingSources);
};
exports.typeGenerator = typeGenerator;
const generateContractCode = ({ abiSource, contractName, }) => {
const abiSourceName = contractName.slice(0, 1).toLowerCase() + contractName.slice(1) + "Abi";
return {
abi: `const ${abiSourceName} = ${abiSource.replace(/\s/g, "")} as const`,
abiSourceName,
typing: `export type ${contractName}Abi = typeof ${abiSourceName}`,
contractName,
};
};
const getContractAbi = (pathToBuildFolder, fileName) => {
const contractAbi = fs_1.default.readFileSync(fsPath.join(pathToBuildFolder, fileName), "utf8");
const contractName = `${fileName.split(".abi.json")[0]}`;
return {
abi: contractAbi,
name: contractName,
};
};
const getAbiFiles = (buildPath) => {
return fs_1.default.readdirSync(buildPath).filter(el => el.endsWith(".abi.json"));
};
const copyExternalArtifacts = (externalContracts, destinationFolder) => {
Object.entries(externalContracts)
.flatMap(([folderName, contracts]) => {
const pathToFolder = fsPath.resolve(folderName);
const files = fs_1.default.readdirSync(pathToFolder);
return files
.filter(file => contracts.some(contract => contract === file.split(".")[0]))
.map(file => ({ file, pathToFolder }));
})
.forEach(({ pathToFolder, file }) => fs_1.default.copyFileSync(fsPath.join(pathToFolder, file), fsPath.join(destinationFolder, file)));
};
exports.copyExternalArtifacts = copyExternalArtifacts;