From 6c5ef6ecd658b689be71fe3e146d642fa3884ffa Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 23 Feb 2020 10:22:55 +0100 Subject: [PATCH] Generation scripts register user types (#1925) * Generation scripts register user types * Create augment.ts output * Remove stray package --- copy-to-apps.sh | 1 + .../typegen/scripts/polkadot-types-from-defs.js | 2 +- packages/typegen/src/fromChain.ts | 8 ++++++++ packages/typegen/src/generate/consts.ts | 10 ++++++---- packages/typegen/src/generate/query.ts | 10 ++++++---- packages/typegen/src/generate/tx.ts | 10 ++++++---- packages/typegen/src/util/derived.ts | 4 +++- packages/typegen/src/util/index.ts | 1 + packages/typegen/src/util/register.ts | 13 +++++++++++++ 9 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 packages/typegen/src/util/register.ts diff --git a/copy-to-apps.sh b/copy-to-apps.sh index dbf2cce6d1..5d96b56077 100755 --- a/copy-to-apps.sh +++ b/copy-to-apps.sh @@ -20,3 +20,4 @@ copy_folder "rpc-core" copy_folder "rpc-provider" copy_folder "jsonrpc" copy_folder "types" +copy_folder "typegen" diff --git a/packages/typegen/scripts/polkadot-types-from-defs.js b/packages/typegen/scripts/polkadot-types-from-defs.js index c81ef2340c..873ba7ada2 100755 --- a/packages/typegen/scripts/polkadot-types-from-defs.js +++ b/packages/typegen/scripts/polkadot-types-from-defs.js @@ -22,7 +22,7 @@ try { ] }); - main = require('../sr/fromDefs.ts').default; + main = require('../src/fromDefs.ts').default; } main(); diff --git a/packages/typegen/src/fromChain.ts b/packages/typegen/src/fromChain.ts index 187d2aa3ae..f8f1b20060 100644 --- a/packages/typegen/src/fromChain.ts +++ b/packages/typegen/src/fromChain.ts @@ -10,6 +10,7 @@ import { formatNumber } from '@polkadot/util'; import generateConst from './generate/consts'; import generateQuery from './generate/query'; import generateTx from './generate/tx'; +import { HEADER, writeFile } from './util'; let websocket: any = null; @@ -24,6 +25,13 @@ function generate (metaHex: string, pkg: string | undefined, output: string, isS generateQuery(path.join(process.cwd(), output, 'augment.query.ts'), metaHex, extraTypes, isStrict); generateTx(path.join(process.cwd(), output, 'augment.tx.ts'), metaHex, extraTypes, isStrict); + writeFile(path.join(process.cwd(), output, 'augment.ts'), (): string => + [ + HEADER, + ...['./augment.consts', './augment.query', './augment.tx', '@polkadot/api/types/augment/rpc'].map((path) => `import '${path}';\n`) + ].join('') + ); + process.exit(0); } diff --git a/packages/typegen/src/generate/consts.ts b/packages/typegen/src/generate/consts.ts index a41da9f116..91965002a8 100644 --- a/packages/typegen/src/generate/consts.ts +++ b/packages/typegen/src/generate/consts.ts @@ -10,7 +10,7 @@ import Metadata from '@polkadot/metadata/Metadata'; import { TypeRegistry } from '@polkadot/types/create'; import { stringCamelCase } from '@polkadot/util'; -import { FOOTER, HEADER, TypeImports, createDocComments, createImportCode, createImports, indent, setImports, writeFile } from '../util'; +import { FOOTER, HEADER, TypeImports, createDocComments, createImportCode, createImports, indent, registerDefinitions, setImports, writeFile } from '../util'; // Generate types for one module /** @internal */ @@ -33,9 +33,9 @@ function generateModule (allDefs: object, { constants, name }: ModuleMetadataLat } /** @internal */ -function generateForMeta (meta: Metadata, dest: string, extraTypes: Record>, isStrict: boolean): void { +function generateForMeta (meta: Metadata, dest: string, extraTypes: Record }>>, isStrict: boolean): void { writeFile(dest, (): string => { - const allTypes: Record> = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; + const allTypes: Record }>> = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const imports = createImports(allTypes); const allDefs = Object.entries(allTypes).reduce((defs, [, obj]) => { return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [key]: value }), defs); @@ -65,8 +65,10 @@ function generateForMeta (meta: Metadata, dest: string, extraTypes: Record> = {}, isStrict = false): void { +export default function generateConsts (dest = 'packages/api/src/types/augment/consts.ts', data = staticData, extraTypes: Record }>> = {}, isStrict = false): void { const registry = new TypeRegistry(); + registerDefinitions(registry, extraTypes); + return generateForMeta(new Metadata(registry, data), dest, extraTypes, isStrict); } diff --git a/packages/typegen/src/generate/query.ts b/packages/typegen/src/generate/query.ts index 0b8c36bbe2..3154fcaa1b 100644 --- a/packages/typegen/src/generate/query.ts +++ b/packages/typegen/src/generate/query.ts @@ -11,7 +11,7 @@ import Metadata from '@polkadot/metadata/Metadata'; import { TypeRegistry } from '@polkadot/types/create'; import { stringLowerFirst } from '@polkadot/util'; -import { FOOTER, HEADER, TypeImports, createDocComments, createImportCode, createImports, formatType, getSimilarTypes, indent, setImports, writeFile } from '../util'; +import { FOOTER, HEADER, TypeImports, createDocComments, createImportCode, createImports, formatType, getSimilarTypes, indent, registerDefinitions, setImports, writeFile } from '../util'; // If the StorageEntry returns T, output `Option` if the modifier is optional /** @internal */ @@ -93,9 +93,9 @@ function generateModule (allDefs: object, registry: Registry, { name, storage }: } /** @internal */ -function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: Record>, isStrict: boolean): void { +function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: Record }>>, isStrict: boolean): void { writeFile(dest, (): string => { - const allTypes: Record> = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; + const allTypes: Record }>> = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const imports = createImports(allTypes); const allDefs = Object.entries(allTypes).reduce((defs, [, obj]) => { return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [key]: value }), defs); @@ -129,8 +129,10 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr // Call `generateForMeta()` with current static metadata /** @internal */ -export default function generateQuery (dest = 'packages/api/src/types/augment/query.ts', data = staticData, extraTypes: Record> = {}, isStrict = false): void { +export default function generateQuery (dest = 'packages/api/src/types/augment/query.ts', data = staticData, extraTypes: Record }>> = {}, isStrict = false): void { const registry = new TypeRegistry(); + registerDefinitions(registry, extraTypes); + return generateForMeta(registry, new Metadata(registry, data), dest, extraTypes, isStrict); } diff --git a/packages/typegen/src/generate/tx.ts b/packages/typegen/src/generate/tx.ts index a7adb00588..5bd5f07654 100644 --- a/packages/typegen/src/generate/tx.ts +++ b/packages/typegen/src/generate/tx.ts @@ -12,7 +12,7 @@ import { Text } from '@polkadot/types/primitive'; import { TypeRegistry } from '@polkadot/types/create'; import { stringCamelCase } from '@polkadot/util'; -import { FOOTER, HEADER, TypeImports, createDocComments, createImportCode, createImports, formatType, getSimilarTypes, indent, setImports, writeFile } from '../util'; +import { FOOTER, HEADER, TypeImports, createDocComments, createImportCode, createImports, formatType, getSimilarTypes, indent, registerDefinitions, setImports, writeFile } from '../util'; const MAPPED_NAMES: Record = { new: 'updated' @@ -64,9 +64,9 @@ function generateModule (registry: Registry, allDefs: object, { calls, name }: M } /** @internal */ -function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: Record>, isStrict: boolean): void { +function generateForMeta (registry: Registry, meta: Metadata, dest: string, extraTypes: Record }>>, isStrict: boolean): void { writeFile(dest, (): string => { - const allTypes: Record> = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; + const allTypes: Record }>> = { '@polkadot/types/interfaces': defaultDefs, ...extraTypes }; const imports = createImports(allTypes); const allDefs = Object.entries(allTypes).reduce((defs, [, obj]) => { return Object.entries(obj).reduce((defs, [key, value]) => ({ ...defs, [key]: value }), defs); @@ -100,8 +100,10 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr // Call `generateForMeta()` with current static metadata /** @internal */ -export default function generateTx (dest = 'packages/api/src/types/augment/tx.ts', data = staticData, extraTypes: Record> = {}, isStrict = false): void { +export default function generateTx (dest = 'packages/api/src/types/augment/tx.ts', data = staticData, extraTypes: Record }>> = {}, isStrict = false): void { const registry = new TypeRegistry(); + registerDefinitions(registry, extraTypes); + return generateForMeta(registry, new Metadata(registry, data), dest, extraTypes, isStrict); } diff --git a/packages/typegen/src/util/derived.ts b/packages/typegen/src/util/derived.ts index 9ed5b77c14..7ce394378e 100644 --- a/packages/typegen/src/util/derived.ts +++ b/packages/typegen/src/util/derived.ts @@ -69,7 +69,9 @@ export function getDerivedTypes (definitions: object, type: string, primitiveNam // - if param instanceof AbstractInt, then param: u64 | Uint8array | AnyNumber // etc /** @internal */ -export function getSimilarTypes (definitions: object, registry: Registry, type: string, imports: TypeImports): string[] { +export function getSimilarTypes (definitions: object, registry: Registry, _type: string, imports: TypeImports): string[] { + const typeParts = _type.split('::'); + const type = typeParts[typeParts.length - 1]; const possibleTypes = [type]; if (type === 'Extrinsic') { diff --git a/packages/typegen/src/util/index.ts b/packages/typegen/src/util/index.ts index 846e1d5b63..18fe8767aa 100644 --- a/packages/typegen/src/util/index.ts +++ b/packages/typegen/src/util/index.ts @@ -7,3 +7,4 @@ export * from './docs'; export * from './file'; export * from './formatting'; export * from './imports'; +export * from './register'; diff --git a/packages/typegen/src/util/register.ts b/packages/typegen/src/util/register.ts new file mode 100644 index 0000000000..4a146b49f7 --- /dev/null +++ b/packages/typegen/src/util/register.ts @@ -0,0 +1,13 @@ +// Copyright 2017-2020 @polkadot/typegen authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { TypeRegistry } from '@polkadot/types/create'; + +export function registerDefinitions (registry: TypeRegistry, extras: Record }>>): void { + Object.values(extras).forEach((def): void => { + Object.values(def).forEach(({ types }): void => { + registry.register(types); + }); + }); +}