From b2111f96ded50ca4fc5763a451db6d370a7e72c1 Mon Sep 17 00:00:00 2001 From: Jaco Date: Sun, 28 Aug 2022 08:40:07 +0200 Subject: [PATCH] Retrieve light specs via import(...) (#8062) * Retrieve light specs via import(...) * Dynamic paths * Remove assert --- packages/react-api/src/Api.tsx | 18 ++++++++++++------ .../src/{lightClient => light}/index.ts | 16 ++++++++-------- .../src/{lightClient => light}/kusama/gm.json | 0 .../src/{lightClient => light}/kusama/index.ts | 9 +++------ .../kusama/tinkernet.json | 0 5 files changed, 23 insertions(+), 20 deletions(-) rename packages/react-api/src/{lightClient => light}/index.ts (62%) rename packages/react-api/src/{lightClient => light}/kusama/gm.json (100%) rename packages/react-api/src/{lightClient => light}/kusama/index.ts (59%) rename packages/react-api/src/{lightClient => light}/kusama/tinkernet.json (100%) diff --git a/packages/react-api/src/Api.tsx b/packages/react-api/src/Api.tsx index b350db38df..1206bc66a7 100644 --- a/packages/react-api/src/Api.tsx +++ b/packages/react-api/src/Api.tsx @@ -25,7 +25,7 @@ import { formatBalance, isNumber, isTestChain, objectSpread, stringify } from '@ import { defaults as addressDefaults } from '@polkadot/util-crypto/address/defaults'; import ApiContext from './ApiContext'; -import { lightSpecs, relaySpecs } from './lightClient'; +import { lightSpecs, relaySpecs } from './light'; import registry from './typeRegistry'; import { decodeUrlTypes } from './urlTypes'; @@ -238,7 +238,7 @@ async function loadOnReady (api: ApiPromise, endpoint: LinkOption | null, inject * @internal * Creates a ScProvider from a [/parachain] string */ -function getLightProvider (chain: string): ScProvider { +async function getLightProvider (chain: string): Promise { const [sc, relayName, paraName] = chain.split('/'); if (sc !== 'substrate-connect') { @@ -249,9 +249,15 @@ function getLightProvider (chain: string): ScProvider { const relay = new ScProvider(relaySpecs[relayName]); - return paraName - ? new ScProvider(lightSpecs[relayName][paraName], relay) - : relay; + if (!paraName) { + return relay; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const specMod = await import(`${lightSpecs[relayName][paraName]}`); + + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return new ScProvider(JSON.stringify(specMod.default), relay); } /** @@ -263,7 +269,7 @@ async function createApi (apiUrl: string, signer: ApiSigner, onError: (error: un try { const provider = isLight - ? getLightProvider(apiUrl.replace('light://', '')) + ? await getLightProvider(apiUrl.replace('light://', '')) : new WsProvider(apiUrl); api = new ApiPromise({ diff --git a/packages/react-api/src/lightClient/index.ts b/packages/react-api/src/light/index.ts similarity index 62% rename from packages/react-api/src/lightClient/index.ts rename to packages/react-api/src/light/index.ts index 11985f1477..08b0d2db50 100644 --- a/packages/react-api/src/lightClient/index.ts +++ b/packages/react-api/src/light/index.ts @@ -7,17 +7,17 @@ import { specs as kusama } from './kusama'; export const lightSpecs: Record> = Object - .entries>({ kusama }) - .reduce((relays: Record>, [k, s]) => { - relays[k] = Object - .entries(s) - .reduce((paras: Record, [k, v]) => { - paras[k] = JSON.stringify(v); + .entries>({ kusama }) + .reduce((all: Record>, [r, v]) => { + all[r] = Object + .entries(v) + .reduce((specs: Record, [k, v]) => { + specs[k] = `./light/${r}/${v}`; - return paras; + return specs; }, {}); - return relays; + return all; }, {}); export const relaySpecs: Record = { diff --git a/packages/react-api/src/lightClient/kusama/gm.json b/packages/react-api/src/light/kusama/gm.json similarity index 100% rename from packages/react-api/src/lightClient/kusama/gm.json rename to packages/react-api/src/light/kusama/gm.json diff --git a/packages/react-api/src/lightClient/kusama/index.ts b/packages/react-api/src/light/kusama/index.ts similarity index 59% rename from packages/react-api/src/lightClient/kusama/index.ts rename to packages/react-api/src/light/kusama/index.ts index b8ec36e7e9..1ee3545916 100644 --- a/packages/react-api/src/lightClient/kusama/index.ts +++ b/packages/react-api/src/light/kusama/index.ts @@ -1,13 +1,10 @@ // Copyright 2017-2022 @polkadot/react-api authors & contributors // SPDX-License-Identifier: Apache-2.0 -import gm from './gm.json' assert { type: 'json' }; -import tinkernet from './tinkernet.json' assert { type: 'json' }; - // Add your imported spec here in alphabetical order. // The key here reflects the URL of the light client endpoint. // e.g. light://substrate-connect/kusama/gm -export const specs: Record = { - gm, - tinkernet +export const specs: Record = { + gm: 'gm.json', + tinkernet: 'tinkernet.json' }; diff --git a/packages/react-api/src/lightClient/kusama/tinkernet.json b/packages/react-api/src/light/kusama/tinkernet.json similarity index 100% rename from packages/react-api/src/lightClient/kusama/tinkernet.json rename to packages/react-api/src/light/kusama/tinkernet.json