Skip to content

Commit 38d39a4

Browse files
authored
Allow for optional definitions in typegen (#4805)
* Allow for optional definitions in typegen * Adjust * Adjust
1 parent 6954ec7 commit 38d39a4

File tree

5 files changed

+57
-23
lines changed

5 files changed

+57
-23
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changes:
77
- Added support for typegen over `Range/RangeInclusive` types
88
- Add explicit support for `Call` typegen (inclusive of non-defaults)
99
- Deupe `wss://` handling in `polkadot-types-from-{chain, defs}`
10+
- Allow for optional `definitions.ts` in typegen (only use chain)
1011

1112

1213
## 8.3.2 May 8, 2022

packages/typegen/src/fromChain.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,44 @@ import { Definitions } from '@polkadot/types/types';
1010
import { formatNumber } from '@polkadot/util';
1111

1212
import { generateDefaultConsts, generateDefaultErrors, generateDefaultEvents, generateDefaultQuery, generateDefaultRpc, generateDefaultTx } from './generate';
13-
import { getMetadataViaWs, HEADER, writeFile } from './util';
13+
import { assertDir, assertFile, getMetadataViaWs, HEADER, writeFile } from './util';
1414

1515
function generate (metaHex: HexString, pkg: string | undefined, output: string, isStrict?: boolean): void {
1616
console.log(`Generating from metadata, ${formatNumber((metaHex.length - 2) / 2)} bytes`);
1717

18-
const base = path.join(process.cwd(), output);
19-
const extraTypes = pkg
20-
// eslint-disable-next-line @typescript-eslint/no-var-requires
21-
? { [pkg]: require(path.join(base, 'definitions')) as Record<string, any> }
22-
: {};
18+
const outputPath = assertDir(path.join(process.cwd(), output));
19+
let extraTypes: Record<string, any> = {};
20+
let customLookupDefinitions: Definitions = { rpc: {}, types: {} };
2321

24-
let customLookupDefinitions;
22+
if (pkg) {
23+
try {
24+
extraTypes = {
25+
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-argument
26+
[pkg]: require(assertFile(path.join(outputPath, 'definitions.ts'))) as Record<string, any>
27+
};
28+
} catch (error) {
29+
console.error('ERROR: No custom definitions found:', (error as Error).message);
30+
}
31+
}
2532

2633
try {
2734
customLookupDefinitions = {
2835
rpc: {},
2936
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires
30-
types: require(path.join(base, 'lookup.ts')).default
31-
} as Definitions;
37+
types: require(assertFile(path.join(outputPath, 'lookup.ts'))).default
38+
};
3239
} catch (error) {
33-
console.log('No custom definitions found.');
40+
console.error('ERROR: No lookup definitions found:', (error as Error).message);
3441
}
3542

36-
generateDefaultConsts(path.join(base, 'augment-api-consts.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
37-
generateDefaultErrors(path.join(base, 'augment-api-errors.ts'), metaHex, extraTypes, isStrict);
38-
generateDefaultEvents(path.join(base, 'augment-api-events.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
39-
generateDefaultQuery(path.join(base, 'augment-api-query.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
40-
generateDefaultRpc(path.join(base, 'augment-api-rpc.ts'), extraTypes);
41-
generateDefaultTx(path.join(base, 'augment-api-tx.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
43+
generateDefaultConsts(path.join(outputPath, 'augment-api-consts.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
44+
generateDefaultErrors(path.join(outputPath, 'augment-api-errors.ts'), metaHex, extraTypes, isStrict);
45+
generateDefaultEvents(path.join(outputPath, 'augment-api-events.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
46+
generateDefaultQuery(path.join(outputPath, 'augment-api-query.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
47+
generateDefaultRpc(path.join(outputPath, 'augment-api-rpc.ts'), extraTypes);
48+
generateDefaultTx(path.join(outputPath, 'augment-api-tx.ts'), metaHex, extraTypes, isStrict, customLookupDefinitions);
4249

43-
writeFile(path.join(base, 'augment-api.ts'), (): string =>
50+
writeFile(path.join(outputPath, 'augment-api.ts'), (): string =>
4451
[
4552
HEADER('chain'),
4653
...[
@@ -82,6 +89,6 @@ export function main (): void {
8289
.catch(() => process.exit(1));
8390
} else {
8491
// eslint-disable-next-line @typescript-eslint/no-var-requires
85-
generate((require(path.join(process.cwd(), endpoint)) as Record<string, HexString>).result, pkg, output, isStrict);
92+
generate((require(assertFile(path.join(process.cwd(), endpoint))) as Record<string, HexString>).result, pkg, output, isStrict);
8693
}
8794
}

packages/typegen/src/fromDefs.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import * as substrateDefs from '@polkadot/types/interfaces/definitions';
1111
import { generateInterfaceTypes } from './generate/interfaceRegistry';
1212
import { generateTsDef } from './generate/tsDef';
1313
import { generateDefaultLookup } from './generate';
14-
import { getMetadataViaWs } from './util';
14+
import { assertDir, assertFile, getMetadataViaWs } from './util';
1515

1616
type ArgV = { input: string; package: string; endpoint?: string; };
1717

@@ -33,8 +33,16 @@ export function main (): void {
3333
}
3434
}).argv as ArgV;
3535

36-
// eslint-disable-next-line @typescript-eslint/no-var-requires
37-
const userDefs = require(path.join(process.cwd(), input, 'definitions.ts')) as Record<string, any>;
36+
const inputPath = assertDir(path.join(process.cwd(), input));
37+
let userDefs: Record<string, any> = {};
38+
39+
try {
40+
// eslint-disable-next-line @typescript-eslint/no-var-requires
41+
userDefs = require(assertFile(path.join(inputPath, 'definitions.ts'))) as Record<string, any>;
42+
} catch (error) {
43+
console.error('ERROR: Unable to load user definitions:', (error as Error).message);
44+
}
45+
3846
const userKeys = Object.keys(userDefs);
3947
const filteredBase = Object
4048
.entries(substrateDefs as Record<string, unknown>)
@@ -57,7 +65,6 @@ export function main (): void {
5765
'@polkadot/types/interfaces': filteredBase,
5866
[pkg]: userDefs
5967
};
60-
const inputPath = path.join(process.cwd(), input);
6168

6269
generateTsDef(allDefs, inputPath, pkg);
6370
generateInterfaceTypes(allDefs, path.join(inputPath, 'augment-types.ts'));
@@ -69,7 +76,7 @@ export function main (): void {
6976
.catch(() => process.exit(1));
7077
} else {
7178
// eslint-disable-next-line @typescript-eslint/no-var-requires
72-
const metaHex = (require(path.join(process.cwd(), endpoint)) as Record<string, HexString>).result;
79+
const metaHex = (require(assertFile(path.join(process.cwd(), endpoint))) as Record<string, HexString>).result;
7380

7481
generateDefaultLookup(inputPath, metaHex);
7582
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2017-2022 @polkadot/typegen authors & contributors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import fs from 'fs';
5+
6+
import { assert } from '@polkadot/util';
7+
8+
export function assertDir (path: string): string {
9+
assert(fs.existsSync(path) && fs.lstatSync(path).isDirectory(), `${path} is not a directory`);
10+
11+
return path;
12+
}
13+
14+
export function assertFile (path: string): string {
15+
assert(fs.existsSync(path) && fs.lstatSync(path).isFile(), `${path} is not a file`);
16+
17+
return path;
18+
}

packages/typegen/src/util/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright 2017-2022 @polkadot/typegen authors & contributors
22
// SPDX-License-Identifier: Apache-2.0
33

4+
export * from './assert';
45
export * from './derived';
56
export * from './docs';
67
export * from './file';

0 commit comments

Comments
 (0)