From 84243e8cbe807a14ba123fda02e82cc8380556be Mon Sep 17 00:00:00 2001 From: Zeeshan Akram <97m.zeeshan@gmail.com> Date: Mon, 25 Sep 2023 09:44:35 +0500 Subject: [PATCH 1/3] fix(add typegen support for deprecated events/calls): add typegen support for deprecated events/call affects: @joystream/hydra-typegen --- .../src/commands/typegen/index.ts | 70 +++++++++++++++---- .../hydra-typegen/src/metadata/extract.ts | 61 ++++++++++------ packages/hydra-typegen/src/metadata/types.ts | 6 ++ 3 files changed, 100 insertions(+), 37 deletions(-) diff --git a/packages/hydra-typegen/src/commands/typegen/index.ts b/packages/hydra-typegen/src/commands/typegen/index.ts index aa7d93c17..a78911d68 100644 --- a/packages/hydra-typegen/src/commands/typegen/index.ts +++ b/packages/hydra-typegen/src/commands/typegen/index.ts @@ -136,34 +136,74 @@ types don't much the metadata definiton`, strict: flags.strict, } as IConfig } - - async buildGeneratorConfigs(config: IConfig): Promise { + async buildGeneratorConfigs(config: IConfig): Promise<{ + configs: GeneratorConfig[] + allMissingEvents: string[][] + allMissingCalls: string[][] + }> { const { outDir } = config const specsMetadata = await getAllMetadata(config.metadata) - return Promise.all( + const results = await Promise.all( specsMetadata.map(async ([originalMetadata, chainSpec]) => { - const modules = await extractMeta(config, originalMetadata) + const { extracted, missingEvents, missingCalls } = await extractMeta( + config, + originalMetadata + ) return { - importsRegistry: buildImportsRegistry(), - modules, - validateArgs: config.strict || false, // do not enforce validation by default - dest: path.resolve( - path.join(outDir, chainSpec.specVersion.toString()) - ), - originalMetadata, - specVersion: chainSpec.specVersion, + config: { + importsRegistry: buildImportsRegistry(), + modules: extracted, + validateArgs: config.strict || false, + dest: path.resolve( + path.join(outDir, chainSpec.specVersion.toString()) + ), + originalMetadata, + specVersion: chainSpec.specVersion, + }, + missingEvents, + missingCalls, } }) ) + + const generatorConfigs = results.map((r) => r.config) + const allMissingEvents = results.map((r) => r.missingEvents) + const allMissingCalls = results.map((r) => r.missingCalls) + + return { configs: generatorConfigs, allMissingEvents, allMissingCalls } } async generate(config: IConfig): Promise { - const generatorConfigs = await this.buildGeneratorConfigs(config) + const { configs, allMissingEvents, allMissingCalls } = + await this.buildGeneratorConfigs(config) + + const globalMissingEvents = config.events.filter( + (event) => + !allMissingEvents.some( + (missingEvents) => !missingEvents.includes(event) + ) + ) + + const globalMissingCalls = config.calls.filter( + (call) => + !allMissingCalls.some((missingCalls) => !missingCalls.includes(call)) + ) + + if (globalMissingEvents.length > 0) { + throw new Error( + `No metadata found for the events: ${globalMissingEvents.join(', ')}` + ) + } + if (globalMissingCalls.length > 0) { + throw new Error( + `No metadata found for the calls: ${globalMissingCalls.join(', ')}` + ) + } - for (const generatorConfig of generatorConfigs) { + for (const generatorConfig of configs) { const { dest } = generatorConfig debug(`Output dir: ${dest}`) @@ -175,6 +215,6 @@ types don't much the metadata definiton`, generateModuleTypes(generatorConfig) } - generateRootIndex(config, generatorConfigs) + generateRootIndex(config, configs) } } diff --git a/packages/hydra-typegen/src/metadata/extract.ts b/packages/hydra-typegen/src/metadata/extract.ts index bb9253e47..20dfdbf12 100644 --- a/packages/hydra-typegen/src/metadata/extract.ts +++ b/packages/hydra-typegen/src/metadata/extract.ts @@ -8,14 +8,14 @@ import { TypeDef } from '@polkadot/types/types' import { uniq } from 'lodash' import { IConfig } from '../commands/typegen' import { pushToDictionary } from '../util' -import { ExtractedModuleMeta, ExtractedVaraintData, weakEquals } from './types' +import { ExtractedVaraintData, MetaExtractionResult, weakEquals } from './types' const debug = require('debug')('hydra-typegen:extract') export async function extractMeta( { events, calls }: IConfig, originalMetadata: Metadata -): Promise { +): Promise { const modules: Record = {} const moduleEvents: Record = {} const moduleCalls: Record = {} @@ -23,34 +23,51 @@ export async function extractMeta( const metadata = originalMetadata.asLatest + const missingEvents: string[] = [] + const missingCalls: string[] = [] + for (const e of events) { - const [module, event, types] = extractEvent(metadata, e) - const name = module.name.toString() - modules[name] = module - pushToDictionary(moduleEvents, name, event) - pushToDictionary(moduleTypes, name, ...types) + const extractedEvent = extractEvent(metadata, e) + if (extractedEvent) { + const [module, event, types] = extractedEvent + const name = module.name.toString() + modules[name] = module + pushToDictionary(moduleEvents, name, event) + pushToDictionary(moduleTypes, name, ...types) + } else { + missingEvents.push(e) + } } for (const c of calls) { - const [module, call, types] = extractCall(metadata, c) - const name = module.name.toString() - modules[name] = module - pushToDictionary(moduleCalls, name, call) - pushToDictionary(moduleTypes, name, ...types) + const extractedCall = extractCall(metadata, c) + if (extractedCall) { + const [module, call, types] = extractedCall + const name = module.name.toString() + modules[name] = module + pushToDictionary(moduleCalls, name, call) + pushToDictionary(moduleTypes, name, ...types) + } else { + missingCalls.push(c) + } } - return Object.keys(modules).map((name) => ({ - module: modules[name], - events: moduleEvents[name], - calls: moduleCalls[name], - types: moduleTypes[name], - })) + return { + extracted: Object.keys(modules).map((name) => ({ + module: modules[name], + events: moduleEvents[name], + calls: moduleCalls[name], + types: moduleTypes[name], + })), + missingEvents, + missingCalls, + } } function extractCall( meta: MetadataLatest, callName: string -): [PalletMetadataLatest, ExtractedVaraintData, string[]] { +): [PalletMetadataLatest, ExtractedVaraintData, string[]] | undefined { const [moduleName, method] = callName.split('.') const module = meta.pallets.find((v) => weakEquals(v.name, moduleName)) @@ -69,7 +86,7 @@ function extractCall( } if (callVariant === undefined) { - throw new Error(`No metadata found for the call ${callName}`) + return undefined // extrinsic call not found } return [ @@ -82,7 +99,7 @@ function extractCall( function extractEvent( meta: MetadataLatest, eventName: string -): [PalletMetadataLatest, ExtractedVaraintData, string[]] { +): [PalletMetadataLatest, ExtractedVaraintData, string[]] | undefined { const [moduleName, method] = eventName.split('.') const module = meta.pallets.find((v) => weakEquals(v.name, moduleName)) @@ -101,7 +118,7 @@ function extractEvent( } if (eventVaraint === undefined) { - throw new Error(`No metadata found for the event ${eventName}`) + return undefined // Event variant not found } return [ diff --git a/packages/hydra-typegen/src/metadata/types.ts b/packages/hydra-typegen/src/metadata/types.ts index 0ca9cf1d3..4bcdfb3d2 100644 --- a/packages/hydra-typegen/src/metadata/types.ts +++ b/packages/hydra-typegen/src/metadata/types.ts @@ -20,6 +20,12 @@ export type ExtractedModuleMeta = { types: string[] } +export type MetaExtractionResult = { + extracted: ExtractedModuleMeta[] + missingEvents: string[] + missingCalls: string[] +} + export function weakEquals(s1: string | Text, s2: string | Text): boolean { if (s1 === undefined || s2 === undefined) { return false From 22d6c98a31f9aa050a97c461120fbf8ce1c223c3 Mon Sep 17 00:00:00 2001 From: Zeeshan Akram <97m.zeeshan@gmail.com> Date: Tue, 26 Sep 2023 17:54:07 +0500 Subject: [PATCH 2/3] support hydra-typegen for deprecated runtime modules --- packages/hydra-typegen/src/metadata/extract.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hydra-typegen/src/metadata/extract.ts b/packages/hydra-typegen/src/metadata/extract.ts index 20dfdbf12..14ad2c3ab 100644 --- a/packages/hydra-typegen/src/metadata/extract.ts +++ b/packages/hydra-typegen/src/metadata/extract.ts @@ -73,7 +73,7 @@ function extractCall( const module = meta.pallets.find((v) => weakEquals(v.name, moduleName)) if (module === undefined || module.calls === undefined) { - throw new Error(`No metadata found for module ${moduleName}`) + return undefined // extrinsic module not found } let callVariant: Si1Variant | undefined @@ -105,7 +105,7 @@ function extractEvent( const module = meta.pallets.find((v) => weakEquals(v.name, moduleName)) if (module === undefined || module.events === undefined) { - throw new Error(`No metadata found for module ${moduleName}`) + return undefined // Event module not found } let eventVaraint: Si1Variant | undefined From c49525904ebca1ddcf2c66289b1dda57eee44393 Mon Sep 17 00:00:00 2001 From: Zeeshan Akram <97m.zeeshan@gmail.com> Date: Tue, 26 Sep 2023 18:12:34 +0500 Subject: [PATCH 3/3] fix lint issue --- packages/hydra-typegen/src/commands/typegen/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hydra-typegen/src/commands/typegen/index.ts b/packages/hydra-typegen/src/commands/typegen/index.ts index a78911d68..34f59cdf5 100644 --- a/packages/hydra-typegen/src/commands/typegen/index.ts +++ b/packages/hydra-typegen/src/commands/typegen/index.ts @@ -136,6 +136,7 @@ types don't much the metadata definiton`, strict: flags.strict, } as IConfig } + async buildGeneratorConfigs(config: IConfig): Promise<{ configs: GeneratorConfig[] allMissingEvents: string[][]