From b76210d53c7828c2769cbf6cf15c3f46ad2f63cc Mon Sep 17 00:00:00 2001 From: Griko Nibras Date: Thu, 26 Oct 2023 02:39:39 +0700 Subject: [PATCH] refactor: rewrite codegen script --- scripts/generate.js | 95 +++++++++++++++++++++++++++------------------ src/chains/index.ts | 24 ++++++++++++ src/utils/utils.ts | 5 +-- 3 files changed, 83 insertions(+), 41 deletions(-) create mode 100644 src/chains/index.ts diff --git a/scripts/generate.js b/scripts/generate.js index 64cb8db9..2ca2ff68 100644 --- a/scripts/generate.js +++ b/scripts/generate.js @@ -1,54 +1,73 @@ /* eslint-disable @typescript-eslint/no-var-requires */ -const { chains } = require("chain-registry"); -const fs = require("fs/promises"); +var { chains, assets } = require("chain-registry"); +var fs = require("fs/promises"); -async function generate() { - /** @type {string[]} */ - const chainIds = []; +/** @type {string[]} */ var chainIds = []; +/** @type {string[]} */ var chainNames = []; + +/** @type {Record} */ var chainIdToName = {}; +/** @type {Record} */ var chainNameToId = {}; +/** @type {Record} */ var chainRecord = {}; +/** @type {Record} */ var assetsRecord = {}; - /** @type {Record} */ - const chainRecord = {}; +async function generate() { + for (var chain of chains) { + delete chain.$schema; - for (const chain of chains) { if (!chain.chain_id) continue; + if (!chain.chain_name) continue; + chainIds.push(chain.chain_id); + chainNames.push(chain.chain_name); + + chainIdToName[chain.chain_id] = chain.chain_name; + chainIdToName[chain.chain_name] = chain.chain_name; + + chainNameToId[chain.chain_id] = chain.chain_id; + chainNameToId[chain.chain_name] = chain.chain_id; + chainRecord[chain.chain_id] = chain; } + for (var asset of assets) { + if (!asset.chain_name) continue; + delete asset.$schema; + assetsRecord[chainNameToId[asset.chain_name]] = asset.assets; + } + await fs.mkdir("src/chains/", { recursive: true }).catch(() => {}); - await fs.writeFile( - "src/chains/chainIds.js", - "module.exports=" + JSON.stringify(chainIds), - "utf-8", - ); - - const chainIdLiteralType = chainIds - .map((id) => `"${id}"`) - .concat("(string & {})") - .join("|"); - - const chainIdsDts = `/* eslint-disable */ -export type ChainId = ${chainIdLiteralType}; -declare const chainIds: ChainId[]; -export default chainIds; -`; - await fs.writeFile("src/chains/chainIds.d.ts", chainIdsDts, "utf-8"); - - await fs.writeFile( - "src/chains/chainRecord.js", - "module.exports=" + JSON.stringify(chainRecord), - "utf-8", - ); - - const chainRecordDts = `/* eslint-disable */ -import { Chain } from "@chain-registry/types"; -import { ChainId } from "./chainIds"; -declare const chainRecord: Record; -export default chainRecord; + var generatedTs = `/* eslint-disable */ +// @ts-nocheck +import { Asset, Chain } from "@chain-registry/types"; + +export const chainIds = ${JSON.stringify(chainIds)} as const; +export type ChainId = (typeof chainIds)[number] | (string & {}); + +export const chainNames = ${JSON.stringify(chainNames)} as const; +export type ChainName = (typeof chainNames)[number] | (string & {}); + +export type ChainIdOrName = ChainId | ChainName; +export const chainIdToName: Record = ${JSON.stringify( + chainIdToName, + )}; +export const chainNameToId: Record = ${JSON.stringify( + chainNameToId, + )}; + +export const chainRecord: Record = ${JSON.stringify( + chainRecord, + )}; + +export const assetsRecord: Record = ${JSON.stringify( + assetsRecord, + )}; `; - await fs.writeFile("src/chains/chainRecord.d.ts", chainRecordDts, "utf-8"); + + await fs.writeFile("src/chains/generated.ts", generatedTs, { + encoding: "utf-8", + }); } void generate(); diff --git a/src/chains/index.ts b/src/chains/index.ts new file mode 100644 index 00000000..16659c76 --- /dev/null +++ b/src/chains/index.ts @@ -0,0 +1,24 @@ +/* eslint-disable */ +// @ts-nocheck +import type { Asset, Chain } from "@chain-registry/types"; + +import { raise } from "@/utils/assert"; + +import type { ChainIdOrName } from "./generated"; +import { assetsRecord, chainNameToId, chainRecord } from "./generated"; + +export const getChain = (idOrName: ChainIdOrName): Chain => { + return ( + chainRecord[chainNameToId[idOrName]] || + raise(`chain '${idOrName}' does not exist in chainRecord`) + ); +}; + +export const getAssets = (idOrName: ChainIdOrName): Asset[] => { + return ( + assetsRecord[chainNameToId[idOrName]] || + raise(`chain '${idOrName}' does not exist in assetsRecord`) + ); +}; + +export * from "./generated"; diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 2fecb760..316ce6a3 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -34,14 +34,13 @@ import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; import { erc20ABI, PublicClient, usePublicClient } from "wagmi"; import { Chain } from "@/api/queries"; -import { ChainId } from "@/chains/chainIds"; -import chainRecord from "@/chains/chainRecord"; +import { ChainId, getChain } from "@/chains"; import { multicall3ABI } from "@/constants/abis"; import { EVM_CHAINS } from "@/constants/constants"; import { useSkipClient } from "@/solve"; export function getChainByID(chainID: ChainId) { - return chainRecord[chainID]; + return getChain(chainID); } // cache clients to reuse later