From 2d0ce2ddff0e6a0de72ae40b5d920c07c7ebbb8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jerem=C3=ADas=20D=C3=ADaz?= Date: Tue, 25 Feb 2020 04:40:07 -0300 Subject: [PATCH] Make Strict Mode Strict Again (#1938) * fix: don't format "unorthodox" query input types Also add support for tuples in `getSimilarTypes` * fix: refactor type ignore logic into `formatType` Had to use a regexp solution because types like `([AccountId | string | Uint8Array, Data | { none: any } | { raw: any } | { blakeTwo256: any } | { sha256: any } | { keccak256: any } | { shaThree256: any } | string | Uint8Array])[]` were not being ignored with the current logic, so they were passed to `getTypeDef` and causing delimiter errors. * refactor: remove superfluous "FirstKeyType" param * fix: ignore tuples with structs when formatting * feat: eliminate all index signatures with --strict * docs: fix doc generation --- packages/api/src/augment/consts.ts | 1 + packages/api/src/augment/query.ts | 5 +++++ packages/api/src/augment/tx.ts | 6 ++++++ packages/api/src/types/storage.ts | 4 ---- packages/api/src/types/submittable.ts | 5 ----- packages/metadata/src/Decorated/consts/types.ts | 5 ++--- packages/typegen/src/generate/consts.ts | 1 + packages/typegen/src/generate/query.ts | 14 ++++++++++++-- packages/typegen/src/generate/tx.ts | 13 ++++++++++++- packages/typegen/src/util/formatting.ts | 2 +- 10 files changed, 40 insertions(+), 16 deletions(-) diff --git a/packages/api/src/augment/consts.ts b/packages/api/src/augment/consts.ts index 6982492581..fd3372bba0 100644 --- a/packages/api/src/augment/consts.ts +++ b/packages/api/src/augment/consts.ts @@ -10,6 +10,7 @@ import { EraIndex } from '@polkadot/types/interfaces/staking'; declare module '@polkadot/metadata/Decorated/consts/types' { export interface Constants { + [index: string]: ModuleConstants; babe: { [index: string]: Codec; /** diff --git a/packages/api/src/augment/query.ts b/packages/api/src/augment/query.ts index 6d62642bf8..89909cd72d 100644 --- a/packages/api/src/augment/query.ts +++ b/packages/api/src/augment/query.ts @@ -27,6 +27,7 @@ import { Multiplier } from '@polkadot/types/interfaces/txpayment'; import { Multisig } from '@polkadot/types/interfaces/utility'; import { VestingInfo } from '@polkadot/types/interfaces/vesting'; import { Observable } from 'rxjs'; +import { ApiTypes } from '@polkadot/api/types'; declare module '@polkadot/api/types/storage' { export interface AugmentedQueries { @@ -794,4 +795,8 @@ declare module '@polkadot/api/types/storage' { vesting: AugmentedQuery Observable>> & QueryableStorageEntry; }; } + + export interface QueryableStorage extends AugmentedQueries { + [index: string]: QueryableModuleStorage; + } } diff --git a/packages/api/src/augment/tx.ts b/packages/api/src/augment/tx.ts index fb7f058e68..cace3aa548 100644 --- a/packages/api/src/augment/tx.ts +++ b/packages/api/src/augment/tx.ts @@ -18,6 +18,7 @@ import { EraIndex, RewardDestination, ValidatorPrefs } from '@polkadot/types/int import { Key } from '@polkadot/types/interfaces/system'; import { Timepoint } from '@polkadot/types/interfaces/utility'; import { SubmittableExtrinsic } from '@polkadot/api/submittable/types'; +import { ApiTypes } from '@polkadot/api/types'; declare module '@polkadot/api/types/submittable' { export interface AugmentedSubmittables { @@ -1622,4 +1623,9 @@ declare module '@polkadot/api/types/submittable' { vestOther: AugmentedSubmittable<(target: LookupSource | Address | AccountId | AccountIndex | string | Uint8Array) => SubmittableExtrinsic>; }; } + + export interface SubmittableExtrinsics extends AugmentedSubmittables { + (extrinsic: Uint8Array | string): SubmittableExtrinsic; + [index: string]: SubmittableModuleExtrinsics; + } } diff --git a/packages/api/src/types/storage.ts b/packages/api/src/types/storage.ts index 2646d0b83a..da9d2c1d32 100644 --- a/packages/api/src/types/storage.ts +++ b/packages/api/src/types/storage.ts @@ -77,7 +77,3 @@ export type QueryableStorageMulti = ApiType extends 'rxjs' ? QueryableStorageMultiBase : QueryableStorageMultiPromise; - -export interface QueryableStorage extends AugmentedQueries { - [index: string]: QueryableModuleStorage; -} diff --git a/packages/api/src/types/submittable.ts b/packages/api/src/types/submittable.ts index 3dc92f0be4..db08671d75 100644 --- a/packages/api/src/types/submittable.ts +++ b/packages/api/src/types/submittable.ts @@ -19,8 +19,3 @@ export interface SubmittableExtrinsicFunction extends export interface SubmittableModuleExtrinsics { [index: string]: SubmittableExtrinsicFunction; } - -export interface SubmittableExtrinsics extends AugmentedSubmittables { - (extrinsic: Uint8Array | string): SubmittableExtrinsic; - [index: string]: SubmittableModuleExtrinsics; -} diff --git a/packages/metadata/src/Decorated/consts/types.ts b/packages/metadata/src/Decorated/consts/types.ts index 5a7a0221ac..3ec4bc91b0 100644 --- a/packages/metadata/src/Decorated/consts/types.ts +++ b/packages/metadata/src/Decorated/consts/types.ts @@ -10,9 +10,8 @@ export type AugmentedConst = T & ConstantCodec; export type ModuleConstants = Record; -export interface Constants { - [index: string]: ModuleConstants; -} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface Constants {} export interface ConstantCodec extends Codec { meta: ModuleConstantMetadataLatest; diff --git a/packages/typegen/src/generate/consts.ts b/packages/typegen/src/generate/consts.ts index bddd05d95a..e5cbb2edc6 100644 --- a/packages/typegen/src/generate/consts.ts +++ b/packages/typegen/src/generate/consts.ts @@ -57,6 +57,7 @@ function generateForMeta (meta: Metadata, dest: string, extraTypes: Record Observable<${returnType}>> & QueryableStorageEntry;`); + indent(6)(`${stringLowerFirst(storageEntry.name.toString())}: ${entryType} Observable<${returnType}>>${isStrict ? '' : ' & QueryableStorageEntry'};`); })) .concat([indent(4)('};')]); } @@ -110,18 +110,28 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr { file: 'rxjs', types: ['Observable'] + }, + { + file: '@polkadot/api/types', + types: ['ApiTypes'] } ]); const interfaceStart = [ "declare module '@polkadot/api/types/storage' {", indent(2)('export interface AugmentedQueries {\n') ].join('\n'); - const interfaceEnd = `\n${indent(2)('}')}\n}`; + const interfaceEnd = `\n${indent(2)('}')}\n\n`; + const queryableStorageInterface = indent(2)('export interface QueryableStorage extends AugmentedQueries {') + .concat('\n') + .concat(isStrict ? '' : indent(4)('[index: string]: QueryableModuleStorage;\n')) + .concat(indent(2)('}\n')); return header .concat(interfaceStart) .concat(body.join('\n')) .concat(interfaceEnd) + .concat(queryableStorageInterface) + .concat('}') .concat(FOOTER); }); } diff --git a/packages/typegen/src/generate/tx.ts b/packages/typegen/src/generate/tx.ts index a8c51a77ab..07a11b5256 100644 --- a/packages/typegen/src/generate/tx.ts +++ b/packages/typegen/src/generate/tx.ts @@ -78,18 +78,29 @@ function generateForMeta (registry: Registry, meta: Metadata, dest: string, extr { file: '@polkadot/api/submittable/types', types: ['SubmittableExtrinsic'] + }, + { + file: '@polkadot/api/types', + types: ['ApiTypes'] } ]); const interfaceStart = [ "declare module '@polkadot/api/types/submittable' {", indent(2)('export interface AugmentedSubmittables {\n') ].join('\n'); - const interfaceEnd = `\n${indent(2)('}')}\n}`; + const interfaceEnd = `\n${indent(2)('}')}\n\n`; + const submittableExtrinsicsInterface = indent(2)('export interface SubmittableExtrinsics extends AugmentedSubmittables {') + .concat('\n') + .concat(indent(4)('(extrinsic: Uint8Array | string): SubmittableExtrinsic;\n')) + .concat(isStrict ? '' : indent(4)('[index: string]: SubmittableModuleExtrinsics;\n')) + .concat(indent(2)('}\n')); return header .concat(interfaceStart) .concat(body.join('\n')) .concat(interfaceEnd) + .concat(submittableExtrinsicsInterface) + .concat('}') .concat(FOOTER); }); } diff --git a/packages/typegen/src/util/formatting.ts b/packages/typegen/src/util/formatting.ts index d128b9339d..4024aa7820 100644 --- a/packages/typegen/src/util/formatting.ts +++ b/packages/typegen/src/util/formatting.ts @@ -139,7 +139,7 @@ export function formatType (definitions: object, type: string | TypeDef, imports if (typeof type === 'string') { // If type is "unorthodox" (i.e. `{ something: any }` for an Enum input or `[a | b | c, d | e | f]` for a Tuple's similar types), // we return it as-is - if (/(^{.+:.+})|^\([^,]+\)|^\(.+\)\[\]|^\[([^;]+|)?[^;]+\]/.exec(type)) { + if (/(^{.+:.+})|^\([^,]+\)|^\(.+\)\[\]|^\[.+\]/.exec(type) && !/\[\w+;\w+\]/.exec(type)) { return type; }