@cosmwasm/ts-codegen
Version:
@cosmwasm/ts-codegen converts your CosmWasm smart contracts into dev-friendly TypeScript classes so you can focus on shipping code.
110 lines (109 loc) • 3.7 kB
JavaScript
import { readFileSync, writeFileSync } from 'fs';
import { globSync as glob } from 'glob';
import { sync as mkdirp } from 'mkdirp';
import { tmpdir } from 'os';
import { parse } from 'parse-package-name';
import { basename, dirname, extname, join, resolve } from 'path';
import { sync as rimraf } from 'rimraf';
import { exec } from 'shelljs';
import { prompt } from '../utils/prompt';
const TMPDIR = tmpdir();
const rnd = () => Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
const getPackages = (names) => {
return names
.map((pkg) => {
const { name, version } = parse(pkg);
return `${name}@${version}`;
})
.join(' ');
};
export default async (argv) => {
// don't prompt if we got this...
if (argv._.length) {
argv.pkg = argv._;
}
// current dir/package
const cur = process.cwd();
let thisPackage;
try {
thisPackage = JSON.parse(readFileSync(join(cur, 'package.json'), 'utf-8'));
}
catch {
throw new Error('make sure you are inside of a telescope package!');
}
// what are we installing?
let { pkg } = await prompt([
{
type: 'checkbox',
name: 'pkg',
message: 'which chain contracts do you want to support?',
choices: [
'stargaze-base-factory',
'stargaze-base-minter',
'stargaze-sg721-base',
'stargaze-sg721-metdata-onchain',
'stargaze-sg721-nt',
'stargaze-splits',
'stargaze-vending-factory',
'stargaze-vending-minter',
'stargaze-whitelist',
'wasmswap',
].map((name) => {
return {
name,
value: `@cosmjson/${name}`,
};
}),
},
], argv);
// install
if (!Array.isArray(pkg))
pkg = [pkg];
const tmp = join(TMPDIR, rnd());
mkdirp(tmp);
process.chdir(tmp);
exec(`npm install ${getPackages(pkg)} --production --prefix ./smart-contracts`);
// protos
const pkgs = glob('./smart-contracts/**/package.json').sort();
const cmds = pkgs
.filter((f) => {
return f !== './smart-contracts/package.json';
})
.map((f) => resolve(join(tmp, f)))
.map((conf) => {
const extDir = dirname(conf);
const dir = extDir.split('node_modules/')[1];
const dst = basename(dir);
const files = glob(`${extDir}/**/*`, { nodir: true }).sort();
files.forEach((f) => {
if (extname(f) === '.json' ||
f === 'package.json' ||
/license/i.test(f) ||
/readme/i.test(f))
return;
rimraf(f);
});
return [extDir, resolve(join(cur, 'contracts', dst)), dir];
});
// move protos
for (const [src, dst, pkg] of cmds) {
rimraf(dst);
console.log(`installing ${pkg}...`);
mkdirp(dirname(dst));
exec(`mv ${src} ${dst}`);
}
// package
const packageInfo = JSON.parse(readFileSync('./smart-contracts/package.json', 'utf-8'));
const deps = packageInfo.dependencies ?? {};
thisPackage.devDependencies = thisPackage.devDependencies ?? {};
thisPackage.devDependencies = {
...thisPackage.devDependencies,
...deps,
};
thisPackage.devDependencies = Object.fromEntries(Object.entries(thisPackage.devDependencies).sort());
writeFileSync(join(cur, 'package.json'), JSON.stringify(thisPackage, null, 2));
// cleanup
rimraf(tmp);
process.chdir(cur);
};