Skip to content

Commit

Permalink
Merge pull request #913 from NexusMutual/feat/typescript
Browse files Browse the repository at this point in the history
Add typings
  • Loading branch information
shark0der committed Sep 8, 2023
2 parents c47a6a9 + 9b5092f commit 7a3b35e
Show file tree
Hide file tree
Showing 7 changed files with 1,631 additions and 158 deletions.
1 change: 1 addition & 0 deletions deployments/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
dist/
generated/
66 changes: 34 additions & 32 deletions deployments/pre-publish.js → deployments/build.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const fs = require('node:fs');
const path = require('node:path');
const { artifacts, config, run } = require('hardhat');
const { build } = require('tsup');

const rootPath = config.paths.root;
const contractList = [
Expand Down Expand Up @@ -67,51 +68,36 @@ const rimraf = file => {
};

const generateExports = () => {
// input
const addressesPath = path.join(__dirname, 'src/addresses.json');
const abiExportsDir = path.join(__dirname, 'generated/abis');

// output
const abiExportsDir = path.join(__dirname, 'dist/abis');
const abiExportsFile = path.join(__dirname, 'dist/abis.js');
const addressesExportsFile = path.join(__dirname, 'dist/addresses.js');
const entrypointExportsFile = path.join(__dirname, 'dist/index.js');

rimraf(abiExportsDir);
fs.mkdirSync(abiExportsDir, { recursive: true });

const abis = contractList.map(contract => {
const [, exportedName] = contract;
return typeof contract === 'string' ? contract : exportedName;
});

// make pairs of [filename, exportedName]
const pairs = contractList.map(contract => (typeof contract === 'string' ? [contract, contract] : contract));

for (const contract of pairs) {
const [contractName, exportedName] = contract;
for (const contract of contractList) {
const [contractName, exportedName] = typeof contract === 'string' ? [contract, contract] : contract;
const artifact = artifacts.readArtifactSync(contractName);
const abi = JSON.stringify(artifact.abi, null, 2);
fs.writeFileSync(path.join(abiExportsDir, `${exportedName}.js`), `module.exports = ${abi.trim()};\n`);
fs.writeFileSync(path.join(abiExportsDir, `${exportedName}.json`), abi.trim());
}
};

const imports = abis.map(contract => `const ${contract} = require('./abis/${contract}.js');`);
const moduleExports = `module.exports = {\n${abis.map(contract => ` ${contract},`).join('\n')}\n};`;
fs.writeFileSync(abiExportsFile, [...imports, '', moduleExports, ''].join('\n'));
const generateAbisTs = () => {
const outDir = path.join(__dirname, 'generated');

const addresses = fs.readFileSync(addressesPath).toString().trim().replace(/"/g, "'");
fs.writeFileSync(addressesExportsFile, `module.exports = ${addresses};\n`);
const contractNames = contractList.map(contract => (typeof contract === 'string' ? contract : contract[1]));

const entrypointExports = [
`const abis = require('./abis.js');`,
`const addresses = require('./addresses.js');`,
`module.exports = { abis, addresses };`,
'',
].join('\n');
const imports = contractNames.map(name => `import ${name} from './abis/${name}.json';`);
const exports = contractNames.map(name => `export { default as ${name} } from './abis/${name}.json';`);
const dict = `export const abis = {\n ${contractNames.join(',\n ')}\n};`;

fs.writeFileSync(entrypointExportsFile, entrypointExports);
const content = [...imports, ...exports, dict].join('\n') + '\n';

fs.writeFileSync(path.join(outDir, 'abis.ts'), content);
};

const main = async () => {
rimraf(path.join(__dirname, './deployments/dist'));
rimraf(path.join(__dirname, './deployments/generated'));

console.log('Recompiling contracts');
await run('compile');

Expand All @@ -121,6 +107,22 @@ const main = async () => {

console.log('Generating exports');
generateExports();
generateAbisTs();

console.log('Building source');
await build({
entry: ['deployments/src/index.ts'],
outDir: 'deployments/dist',
format: ['cjs', 'esm'],
splitting: false,
sourcemap: true,
clean: true,
dts: true,
publicDir: 'generated', // copy generated files to dist
});

// copy addresses.json to dist
fs.copyFileSync(path.join(__dirname, 'src/addresses.json'), path.join(__dirname, 'dist/addresses.json'));

console.log('Done');
};
Expand Down
12 changes: 4 additions & 8 deletions deployments/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@
"name": "@nexusmutual/deployments",
"version": "2.1.1",
"description": "Nexus Mutual deployed contract addresses and abis",
"exports": {
".": "./dist/index.js",
"./abis": "./dist/abis.js",
"./abis/*": "./dist/abis/*.js",
"./addresses": "./dist/addresses.js"
},
"typings": "./dist/index.d.ts",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"files": [
"dist",
"README.md"
"dist"
],
"repository": {
"type": "git",
Expand Down
2 changes: 2 additions & 0 deletions deployments/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { default as addresses } from './addresses.json';
export * from '../generated/abis';
13 changes: 13 additions & 0 deletions deployments/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"noUncheckedIndexedAccess": true,
"noEmit": true
}
}
Loading

0 comments on commit 7a3b35e

Please sign in to comment.