@dedot/cli 0.4.1 → 0.4.2-next.5d9d02c1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/{chaintypes.d.ts → chaintypes/index.d.ts} +2 -0
- package/commands/chaintypes/index.js +118 -0
- package/commands/chaintypes/types.d.ts +9 -0
- package/commands/chaintypes/types.js +1 -0
- package/commands/chaintypes/utils.d.ts +8 -0
- package/commands/chaintypes/utils.js +62 -0
- package/commands/index.d.ts +1 -1
- package/commands/index.js +1 -1
- package/commands/typink.js +2 -2
- package/dedot.js +1 -0
- package/package.json +8 -7
- package/commands/chaintypes.js +0 -91
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { generateTypes, generateTypesFromEndpoint } from '@dedot/codegen';
|
|
2
|
+
import { stringCamelCase, stringPascalCase } from '@dedot/utils';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { parseMetadataFromRaw, parseMetadataFromWasm, parseStaticSubstrate } from './utils.js';
|
|
6
|
+
export const chaintypes = {
|
|
7
|
+
command: 'chaintypes',
|
|
8
|
+
describe: 'Generate Types & APIs for Substrate-based chains',
|
|
9
|
+
handler: async (yargs) => {
|
|
10
|
+
const { wsUrl, wasm, metadata, output = '', chain = '', dts = true, subpath = true } = yargs;
|
|
11
|
+
const outDir = path.resolve(output);
|
|
12
|
+
const extension = dts ? 'd.ts' : 'ts';
|
|
13
|
+
const spinner = ora().start();
|
|
14
|
+
const shouldGenerateGenericTypes = wsUrl === 'substrate';
|
|
15
|
+
let generatedResult;
|
|
16
|
+
let parsedResult;
|
|
17
|
+
try {
|
|
18
|
+
if (metadata) {
|
|
19
|
+
spinner.text = `Parsing metadata file ${metadata}...`;
|
|
20
|
+
parsedResult = await parseMetadataFromRaw(metadata);
|
|
21
|
+
spinner.succeed(`Parsed metadata file ${metadata}`);
|
|
22
|
+
}
|
|
23
|
+
else if (wasm) {
|
|
24
|
+
spinner.text = `Parsing runtime wasm file ${wasm}`;
|
|
25
|
+
parsedResult = await parseMetadataFromWasm(wasm);
|
|
26
|
+
spinner.succeed(`Parsed runtime wasm file ${wasm}`);
|
|
27
|
+
}
|
|
28
|
+
else if (shouldGenerateGenericTypes) {
|
|
29
|
+
spinner.text = 'Parsing static substrate generic chaintypes...';
|
|
30
|
+
parsedResult = await parseStaticSubstrate();
|
|
31
|
+
spinner.succeed(`Parsed static substrate generic chaintypes`);
|
|
32
|
+
}
|
|
33
|
+
if (parsedResult) {
|
|
34
|
+
const { metadata, runtimeVersion, runtimeApis, rpcMethods } = parsedResult;
|
|
35
|
+
const chainName = chain || stringCamelCase(runtimeVersion.specName) || (shouldGenerateGenericTypes ? 'substrate' : 'local');
|
|
36
|
+
spinner.text = `Generating ${stringPascalCase(chainName)} generic chaintypes`;
|
|
37
|
+
generatedResult = await generateTypes(chainName, metadata.latest, rpcMethods, runtimeApis, outDir, extension, subpath);
|
|
38
|
+
spinner.succeed(`Generated ${stringPascalCase(chainName)} generic chaintypes`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
spinner.text = `Generating chaintypes via endpoint: ${wsUrl}`;
|
|
42
|
+
generatedResult = await generateTypesFromEndpoint(chain, wsUrl, outDir, extension, subpath);
|
|
43
|
+
spinner.succeed(`Generated chaintypes via endpoint: ${wsUrl}`);
|
|
44
|
+
}
|
|
45
|
+
const { interfaceName, outputFolder } = generatedResult;
|
|
46
|
+
console.log(` ➡ Output directory: file://${outputFolder}`);
|
|
47
|
+
console.log(` ➡ ChainApi interface: ${interfaceName}`);
|
|
48
|
+
console.log('🌈 Done!');
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
if (shouldGenerateGenericTypes) {
|
|
52
|
+
spinner.fail(`Failed to generate Substrate generic chaintypes`);
|
|
53
|
+
}
|
|
54
|
+
else if (wasm) {
|
|
55
|
+
spinner.fail(`Failed to generate chaintypes via runtime wasm file: ${wasm}`);
|
|
56
|
+
}
|
|
57
|
+
else if (metadata) {
|
|
58
|
+
spinner.fail(`Failed to generate chaintypes via metadata file: ${metadata}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
spinner.fail(`Failed to generate chaintypes via endpoint: ${wsUrl}`);
|
|
62
|
+
}
|
|
63
|
+
console.error(e);
|
|
64
|
+
}
|
|
65
|
+
spinner.stop();
|
|
66
|
+
},
|
|
67
|
+
builder: (yargs) => {
|
|
68
|
+
return yargs
|
|
69
|
+
.option('wsUrl', {
|
|
70
|
+
type: 'string',
|
|
71
|
+
describe: 'Websocket URL to fetch metadata',
|
|
72
|
+
alias: 'w',
|
|
73
|
+
})
|
|
74
|
+
.option('wasm', {
|
|
75
|
+
type: 'string',
|
|
76
|
+
describe: 'Runtime wasm file to fetch metadata (.wasm)',
|
|
77
|
+
alias: 'r',
|
|
78
|
+
})
|
|
79
|
+
.option('metadata', {
|
|
80
|
+
type: 'string',
|
|
81
|
+
describe: 'Raw encoded metadata file (.scale)',
|
|
82
|
+
alias: 'm',
|
|
83
|
+
})
|
|
84
|
+
.option('output', {
|
|
85
|
+
type: 'string',
|
|
86
|
+
describe: 'Output folder to put generated files',
|
|
87
|
+
alias: 'o',
|
|
88
|
+
})
|
|
89
|
+
.option('chain', {
|
|
90
|
+
type: 'string',
|
|
91
|
+
describe: 'Custom chain name',
|
|
92
|
+
alias: 'c',
|
|
93
|
+
})
|
|
94
|
+
.option('dts', {
|
|
95
|
+
type: 'boolean',
|
|
96
|
+
describe: 'Generate d.ts files',
|
|
97
|
+
alias: 'd',
|
|
98
|
+
default: true,
|
|
99
|
+
})
|
|
100
|
+
.option('subpath', {
|
|
101
|
+
type: 'boolean',
|
|
102
|
+
describe: 'Using subpath for shared packages (e.g: dedot/types)',
|
|
103
|
+
alias: 's',
|
|
104
|
+
default: true,
|
|
105
|
+
})
|
|
106
|
+
.check((argv) => {
|
|
107
|
+
const inputs = ['wsUrl', 'wasm', 'metadata'];
|
|
108
|
+
const providedInputs = inputs.filter((input) => argv[input]);
|
|
109
|
+
if (providedInputs.length > 1) {
|
|
110
|
+
throw new Error(`Please provide only one of the following options: ${inputs.join(', ')}`);
|
|
111
|
+
}
|
|
112
|
+
if (providedInputs.length === 0) {
|
|
113
|
+
throw new Error(`Please provide one of the following options: ${inputs.join(', ')}`);
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Metadata, RuntimeVersion } from '@dedot/codecs';
|
|
2
|
+
export interface ParsedResult extends DecodedMetadataInfo {
|
|
3
|
+
rpcMethods: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface DecodedMetadataInfo {
|
|
6
|
+
metadata: Metadata;
|
|
7
|
+
runtimeVersion: RuntimeVersion;
|
|
8
|
+
runtimeApis: Record<string, number>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Metadata, RuntimeVersion } from '@dedot/codecs';
|
|
2
|
+
import { HexString } from '@dedot/utils';
|
|
3
|
+
import { DecodedMetadataInfo, ParsedResult } from './types.js';
|
|
4
|
+
export declare const getRuntimeVersion: (metadata: Metadata) => RuntimeVersion;
|
|
5
|
+
export declare const decodeMetadata: (metadataHex: HexString) => DecodedMetadataInfo;
|
|
6
|
+
export declare const parseMetadataFromRaw: (metadataFile: string) => Promise<ParsedResult>;
|
|
7
|
+
export declare const parseMetadataFromWasm: (runtimeFile: string) => Promise<ParsedResult>;
|
|
8
|
+
export declare const parseStaticSubstrate: () => Promise<ParsedResult>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { rpc } from '@polkadot/types-support/metadata/static-substrate';
|
|
2
|
+
import staticSubstrate from '@polkadot/types-support/metadata/v15/substrate-hex';
|
|
3
|
+
import { ConstantExecutor } from '@dedot/api';
|
|
4
|
+
import { $Metadata, PortableRegistry } from '@dedot/codecs';
|
|
5
|
+
import * as $ from '@dedot/shape';
|
|
6
|
+
import { hexToU8a, u8aToHex } from '@dedot/utils';
|
|
7
|
+
import { getMetadataFromRuntime } from '@polkadot-api/wasm-executor';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
export const getRuntimeVersion = (metadata) => {
|
|
10
|
+
const registry = new PortableRegistry(metadata.latest);
|
|
11
|
+
const executor = new ConstantExecutor({
|
|
12
|
+
registry,
|
|
13
|
+
metadata,
|
|
14
|
+
});
|
|
15
|
+
return executor.execute('system', 'version');
|
|
16
|
+
};
|
|
17
|
+
export const decodeMetadata = (metadataHex) => {
|
|
18
|
+
const metadata = $Metadata.tryDecode(metadataHex);
|
|
19
|
+
const runtimeVersion = getRuntimeVersion(metadata);
|
|
20
|
+
const runtimeApis = runtimeVersion.apis.reduce((acc, [name, version]) => {
|
|
21
|
+
acc[name] = version;
|
|
22
|
+
return acc;
|
|
23
|
+
}, {});
|
|
24
|
+
return {
|
|
25
|
+
metadata,
|
|
26
|
+
runtimeVersion,
|
|
27
|
+
runtimeApis,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const parseMetadataFromRaw = async (metadataFile) => {
|
|
31
|
+
const metadataHex = fs.readFileSync(metadataFile, 'utf-8').trim();
|
|
32
|
+
const { metadata, runtimeVersion, runtimeApis } = decodeMetadata(metadataHex);
|
|
33
|
+
return {
|
|
34
|
+
metadata,
|
|
35
|
+
runtimeVersion,
|
|
36
|
+
runtimeApis,
|
|
37
|
+
rpcMethods: [],
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export const parseMetadataFromWasm = async (runtimeFile) => {
|
|
41
|
+
const u8aMetadata = hexToU8a(getMetadataFromRuntime(('0x' + fs.readFileSync(runtimeFile).toString('hex'))));
|
|
42
|
+
// Because this u8aMetadata has compactInt prefixed for it length, we need to get rid of it.
|
|
43
|
+
const length = $.compactU32.tryDecode(u8aMetadata);
|
|
44
|
+
const offset = $.compactU32.tryEncode(length).length;
|
|
45
|
+
const metadataHex = u8aToHex(u8aMetadata.subarray(offset));
|
|
46
|
+
const { metadata, runtimeVersion, runtimeApis } = decodeMetadata(metadataHex);
|
|
47
|
+
return {
|
|
48
|
+
metadata,
|
|
49
|
+
runtimeVersion,
|
|
50
|
+
runtimeApis,
|
|
51
|
+
rpcMethods: [],
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
export const parseStaticSubstrate = async () => {
|
|
55
|
+
const { runtimeVersion, metadata, runtimeApis } = decodeMetadata(staticSubstrate);
|
|
56
|
+
return {
|
|
57
|
+
metadata,
|
|
58
|
+
runtimeVersion,
|
|
59
|
+
runtimeApis,
|
|
60
|
+
rpcMethods: rpc.methods,
|
|
61
|
+
};
|
|
62
|
+
};
|
package/commands/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './chaintypes.js';
|
|
1
|
+
export * from './chaintypes/index.js';
|
|
2
2
|
export * from './typink.js';
|
package/commands/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './chaintypes.js';
|
|
1
|
+
export * from './chaintypes/index.js';
|
|
2
2
|
export * from './typink.js';
|
package/commands/typink.js
CHANGED
|
@@ -19,9 +19,9 @@ export const typink = {
|
|
|
19
19
|
const contractMetadata = parseRawMetadata(fs.readFileSync(metadataFile, 'utf-8'));
|
|
20
20
|
spinner.succeed(`Parsed contract metadata file: ${metadata}`);
|
|
21
21
|
spinner.text = 'Generating contract Types & APIs';
|
|
22
|
-
const { interfaceName } = await generateContractTypes(contractMetadata, contract, outDir, extension, subpath);
|
|
22
|
+
const { interfaceName, outputFolder } = await generateContractTypes(contractMetadata, contract, outDir, extension, subpath);
|
|
23
23
|
spinner.succeed('Generated contract Types & APIs');
|
|
24
|
-
console.log(` ➡ Output directory: file://${
|
|
24
|
+
console.log(` ➡ Output directory: file://${outputFolder}`);
|
|
25
25
|
console.log(` ➡ ContractApi interface: ${interfaceName}`);
|
|
26
26
|
console.log('🌈 Done!');
|
|
27
27
|
spinner.stop();
|
package/dedot.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dedot/cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2-next.5d9d02c1.7+5d9d02c",
|
|
4
4
|
"author": "Thang X. Vu <thang@coongcrafts.io>",
|
|
5
5
|
"homepage": "https://github.com/dedotdev/dedot/tree/main/packages/cli",
|
|
6
6
|
"repository": {
|
|
@@ -21,22 +21,23 @@
|
|
|
21
21
|
"start": "ts-node src/index.ts"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@dedot/api": "0.4.
|
|
25
|
-
"@dedot/codecs": "0.4.
|
|
26
|
-
"@dedot/codegen": "0.4.
|
|
27
|
-
"@polkadot/
|
|
24
|
+
"@dedot/api": "0.4.2-next.5d9d02c1.7+5d9d02c",
|
|
25
|
+
"@dedot/codecs": "0.4.2-next.5d9d02c1.7+5d9d02c",
|
|
26
|
+
"@dedot/codegen": "0.4.2-next.5d9d02c1.7+5d9d02c",
|
|
27
|
+
"@polkadot-api/wasm-executor": "^0.1.1",
|
|
28
|
+
"@polkadot/types-support": "^12.3.1",
|
|
28
29
|
"ora": "^8.0.1",
|
|
29
30
|
"yargs": "^17.7.2"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
|
-
"@types/yargs": "^17.0.
|
|
33
|
+
"@types/yargs": "^17.0.33"
|
|
33
34
|
},
|
|
34
35
|
"publishConfig": {
|
|
35
36
|
"access": "public",
|
|
36
37
|
"directory": "dist"
|
|
37
38
|
},
|
|
38
39
|
"license": "Apache-2.0",
|
|
39
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "5d9d02c17067074674ae588eb266a46f36742cb4",
|
|
40
41
|
"module": "./index.js",
|
|
41
42
|
"types": "./index.d.ts"
|
|
42
43
|
}
|
package/commands/chaintypes.js
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { rpc } from '@polkadot/types-support/metadata/static-substrate';
|
|
2
|
-
import staticSubstrate from '@polkadot/types-support/metadata/v15/substrate-hex';
|
|
3
|
-
import { ConstantExecutor } from '@dedot/api';
|
|
4
|
-
import { $Metadata, PortableRegistry } from '@dedot/codecs';
|
|
5
|
-
import { generateTypes, generateTypesFromEndpoint } from '@dedot/codegen';
|
|
6
|
-
import ora from 'ora';
|
|
7
|
-
import * as path from 'path';
|
|
8
|
-
export const chaintypes = {
|
|
9
|
-
command: 'chaintypes',
|
|
10
|
-
describe: 'Generate Types & APIs for Substrate-based chains',
|
|
11
|
-
handler: async (yargs) => {
|
|
12
|
-
const { wsUrl, output = '', chain = '', dts = true, subpath = true } = yargs;
|
|
13
|
-
const outDir = path.resolve(output);
|
|
14
|
-
const extension = dts ? 'd.ts' : 'ts';
|
|
15
|
-
const spinner = ora().start();
|
|
16
|
-
const shouldGenerateGenericTypes = wsUrl === 'substrate';
|
|
17
|
-
try {
|
|
18
|
-
let generatedResult;
|
|
19
|
-
if (shouldGenerateGenericTypes) {
|
|
20
|
-
spinner.text = 'Generating Substrate generic chaintypes';
|
|
21
|
-
const metadataHex = staticSubstrate;
|
|
22
|
-
const rpcMethods = rpc.methods;
|
|
23
|
-
const metadata = $Metadata.tryDecode(metadataHex);
|
|
24
|
-
const runtimeVersion = getRuntimeVersion(metadata);
|
|
25
|
-
const runtimeApis = runtimeVersion.apis.reduce((acc, [name, version]) => {
|
|
26
|
-
acc[name] = version;
|
|
27
|
-
return acc;
|
|
28
|
-
}, {});
|
|
29
|
-
generatedResult = await generateTypes(chain || 'substrate', metadata.latest, rpcMethods, runtimeApis, outDir, extension, subpath);
|
|
30
|
-
spinner.succeed('Generated Substrate generic chaintypes');
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
spinner.text = `Generating chaintypes via endpoint: ${wsUrl}`;
|
|
34
|
-
generatedResult = await generateTypesFromEndpoint(chain, wsUrl, outDir, extension, subpath);
|
|
35
|
-
spinner.succeed(`Generated chaintypes via endpoint: ${wsUrl}`);
|
|
36
|
-
}
|
|
37
|
-
console.log(` ➡ Output directory: file://${outDir}`);
|
|
38
|
-
console.log(` ➡ ChainApi interface: ${generatedResult.interfaceName}`);
|
|
39
|
-
console.log('🌈 Done!');
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
if (shouldGenerateGenericTypes) {
|
|
43
|
-
spinner.fail(`Failed to generate Substrate generic chaintypes`);
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
spinner.fail(`Failed to generate chaintypes via endpoint: ${wsUrl}`);
|
|
47
|
-
}
|
|
48
|
-
console.error(e);
|
|
49
|
-
}
|
|
50
|
-
spinner.stop();
|
|
51
|
-
},
|
|
52
|
-
builder: (yargs) => {
|
|
53
|
-
return yargs
|
|
54
|
-
.option('wsUrl', {
|
|
55
|
-
type: 'string',
|
|
56
|
-
describe: 'Websocket URL to fetch metadata',
|
|
57
|
-
alias: 'w',
|
|
58
|
-
default: 'ws://127.0.0.1:9944',
|
|
59
|
-
})
|
|
60
|
-
.option('output', {
|
|
61
|
-
type: 'string',
|
|
62
|
-
describe: 'Output folder to put generated files',
|
|
63
|
-
alias: 'o',
|
|
64
|
-
})
|
|
65
|
-
.option('chain', {
|
|
66
|
-
type: 'string',
|
|
67
|
-
describe: 'Custom chain name',
|
|
68
|
-
alias: 'c',
|
|
69
|
-
})
|
|
70
|
-
.option('dts', {
|
|
71
|
-
type: 'boolean',
|
|
72
|
-
describe: 'Generate d.ts files',
|
|
73
|
-
alias: 'd',
|
|
74
|
-
default: true,
|
|
75
|
-
})
|
|
76
|
-
.option('subpath', {
|
|
77
|
-
type: 'boolean',
|
|
78
|
-
describe: 'Using subpath for shared packages (e.g: dedot/types)',
|
|
79
|
-
alias: 's',
|
|
80
|
-
default: true,
|
|
81
|
-
}); // TODO check to verify inputs
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
const getRuntimeVersion = (metadata) => {
|
|
85
|
-
const registry = new PortableRegistry(metadata.latest);
|
|
86
|
-
const executor = new ConstantExecutor({
|
|
87
|
-
registry,
|
|
88
|
-
metadata,
|
|
89
|
-
});
|
|
90
|
-
return executor.execute('system', 'version');
|
|
91
|
-
};
|