@dedot/codegen 0.2.0 → 0.4.0
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/chaintypes/generator/IndexGen.d.ts +2 -2
- package/chaintypes/generator/IndexGen.js +4 -5
- package/chaintypes/index.d.ts +3 -2
- package/chaintypes/index.js +10 -8
- package/chaintypes/templates/index.hbs +4 -4
- package/cjs/chaintypes/generator/IndexGen.js +4 -5
- package/cjs/chaintypes/index.js +9 -7
- package/cjs/chaintypes/templates/index.hbs +4 -4
- package/cjs/index.js +1 -0
- package/cjs/types.js +2 -0
- package/cjs/typink/generator/EventsGen.js +1 -0
- package/cjs/typink/generator/IndexGen.js +5 -5
- package/cjs/typink/index.js +6 -3
- package/cjs/typink/templates/events.hbs +0 -1
- package/cjs/typink/templates/index.hbs +4 -2
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +10 -10
- package/types.d.ts +3 -0
- package/types.js +1 -0
- package/typink/generator/EventsGen.js +1 -0
- package/typink/generator/IndexGen.d.ts +2 -1
- package/typink/generator/IndexGen.js +5 -5
- package/typink/index.d.ts +2 -1
- package/typink/index.js +6 -3
- package/typink/templates/events.hbs +0 -1
- package/typink/templates/index.hbs +4 -2
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { stringPascalCase } from '@dedot/utils';
|
|
2
1
|
import { TypeImports } from '../../shared/index.js';
|
|
3
2
|
import { beautifySourceCode, compileTemplate } from '../../utils.js';
|
|
4
3
|
export class IndexGen {
|
|
5
|
-
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
4
|
+
interfaceName;
|
|
5
|
+
constructor(interfaceName) {
|
|
6
|
+
this.interfaceName = interfaceName;
|
|
8
7
|
}
|
|
9
8
|
async generate(useSubPaths = false) {
|
|
10
|
-
const interfaceName =
|
|
9
|
+
const interfaceName = this.interfaceName;
|
|
11
10
|
const typeImports = new TypeImports();
|
|
12
11
|
typeImports.addKnownType('GenericSubstrateApi', 'RpcLegacy', 'RpcV2', 'RpcVersion');
|
|
13
12
|
const importTypes = typeImports.toImports({ useSubPaths });
|
package/chaintypes/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { MetadataLatest } from '@dedot/codecs';
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
2
|
+
import { GeneratedResult } from '../types.js';
|
|
3
|
+
export declare function generateTypesFromEndpoint(chain: string, endpoint: string, outDir?: string, extension?: string, useSubPaths?: boolean): Promise<GeneratedResult>;
|
|
4
|
+
export declare function generateTypes(chain: string, metadata: MetadataLatest, rpcMethods: string[], runtimeApis: Record<string, number>, outDir?: string, extension?: string, useSubPaths?: boolean): Promise<GeneratedResult>;
|
package/chaintypes/index.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { LegacyClient } from '@dedot/api';
|
|
2
2
|
import { WsProvider } from '@dedot/providers';
|
|
3
|
-
import {
|
|
3
|
+
import { stringDashCase, stringPascalCase } from '@dedot/utils';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
5
|
import * as path from 'path';
|
|
6
6
|
import { ConstsGen, ErrorsGen, EventsGen, IndexGen, JsonRpcGen, QueryGen, RuntimeApisGen, TxGen, TypesGen, } from './generator/index.js';
|
|
7
7
|
export async function generateTypesFromEndpoint(chain, endpoint, outDir, extension = 'd.ts', useSubPaths = false) {
|
|
8
|
-
|
|
8
|
+
// Immediately throw error if cannot connect to provider for the first time.
|
|
9
|
+
const api = await LegacyClient.new(new WsProvider({ endpoint, retryDelayMs: 0, timeout: 0 }));
|
|
9
10
|
const { methods } = await api.rpc.rpc_methods();
|
|
10
11
|
const apis = api.runtimeVersion.apis || {};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
await generateTypes(chain, api.metadata.latest, methods, apis, outDir, extension, useSubPaths);
|
|
12
|
+
chain = chain || api.runtimeVersion.specName || 'local';
|
|
13
|
+
const result = await generateTypes(chain, api.metadata.latest, methods, apis, outDir, extension, useSubPaths);
|
|
15
14
|
await api.disconnect();
|
|
15
|
+
return result;
|
|
16
16
|
}
|
|
17
17
|
export async function generateTypes(chain, metadata, rpcMethods, runtimeApis, outDir = '.', extension = 'd.ts', useSubPaths = false) {
|
|
18
|
-
const dirPath = path.resolve(outDir, chain);
|
|
18
|
+
const dirPath = path.resolve(outDir, stringDashCase(chain));
|
|
19
19
|
const defTypesFileName = path.join(dirPath, `types.${extension}`);
|
|
20
20
|
const constsTypesFileName = path.join(dirPath, `consts.${extension}`);
|
|
21
21
|
const queryTypesFileName = path.join(dirPath, `query.${extension}`);
|
|
@@ -28,11 +28,12 @@ export async function generateTypes(chain, metadata, rpcMethods, runtimeApis, ou
|
|
|
28
28
|
if (!fs.existsSync(dirPath)) {
|
|
29
29
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
30
30
|
}
|
|
31
|
+
const interfaceName = `${stringPascalCase(chain)}Api`;
|
|
31
32
|
const typesGen = new TypesGen(metadata);
|
|
32
33
|
const constsGen = new ConstsGen(typesGen);
|
|
33
34
|
const queryGen = new QueryGen(typesGen);
|
|
34
35
|
const jsonRpcGen = new JsonRpcGen(typesGen, rpcMethods);
|
|
35
|
-
const indexGen = new IndexGen(
|
|
36
|
+
const indexGen = new IndexGen(interfaceName);
|
|
36
37
|
const errorsGen = new ErrorsGen(typesGen);
|
|
37
38
|
const eventsGen = new EventsGen(typesGen);
|
|
38
39
|
const runtimeApisGen = new RuntimeApisGen(typesGen, runtimeApis);
|
|
@@ -46,4 +47,5 @@ export async function generateTypes(chain, metadata, rpcMethods, runtimeApis, ou
|
|
|
46
47
|
fs.writeFileSync(txFileName, await txGen.generate(useSubPaths));
|
|
47
48
|
fs.writeFileSync(indexFileName, await indexGen.generate(useSubPaths));
|
|
48
49
|
fs.writeFileSync(runtimeApisFileName, await runtimeApisGen.generate(useSubPaths));
|
|
50
|
+
return { interfaceName };
|
|
49
51
|
}
|
|
@@ -11,7 +11,7 @@ import { ChainTx } from './tx';
|
|
|
11
11
|
|
|
12
12
|
export * from './types';
|
|
13
13
|
|
|
14
|
-
export interface Versioned{{{interfaceName}}}
|
|
14
|
+
export interface Versioned{{{interfaceName}}}<Rv extends RpcVersion> extends GenericSubstrateApi<Rv> {
|
|
15
15
|
rpc: ChainJsonRpcApis<Rv>;
|
|
16
16
|
consts: ChainConsts<Rv>;
|
|
17
17
|
query: ChainStorage<Rv>;
|
|
@@ -21,7 +21,7 @@ export interface Versioned{{{interfaceName}}}Api<Rv extends RpcVersion> extends
|
|
|
21
21
|
tx: ChainTx<Rv>;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export interface {{{interfaceName}}}
|
|
25
|
-
legacy: Versioned{{{interfaceName}}}
|
|
26
|
-
v2: Versioned{{{interfaceName}}}
|
|
24
|
+
export interface {{{interfaceName}}} {
|
|
25
|
+
legacy: Versioned{{{interfaceName}}}<RpcLegacy>;
|
|
26
|
+
v2: Versioned{{{interfaceName}}}<RpcV2>;
|
|
27
27
|
}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IndexGen = void 0;
|
|
4
|
-
const utils_1 = require("@dedot/utils");
|
|
5
4
|
const index_js_1 = require("../../shared/index.js");
|
|
6
5
|
const utils_js_1 = require("../../utils.js");
|
|
7
6
|
class IndexGen {
|
|
8
|
-
|
|
9
|
-
constructor(
|
|
10
|
-
this.
|
|
7
|
+
interfaceName;
|
|
8
|
+
constructor(interfaceName) {
|
|
9
|
+
this.interfaceName = interfaceName;
|
|
11
10
|
}
|
|
12
11
|
async generate(useSubPaths = false) {
|
|
13
|
-
const interfaceName =
|
|
12
|
+
const interfaceName = this.interfaceName;
|
|
14
13
|
const typeImports = new index_js_1.TypeImports();
|
|
15
14
|
typeImports.addKnownType('GenericSubstrateApi', 'RpcLegacy', 'RpcV2', 'RpcVersion');
|
|
16
15
|
const importTypes = typeImports.toImports({ useSubPaths });
|
package/cjs/chaintypes/index.js
CHANGED
|
@@ -31,18 +31,18 @@ const fs = __importStar(require("fs"));
|
|
|
31
31
|
const path = __importStar(require("path"));
|
|
32
32
|
const index_js_1 = require("./generator/index.js");
|
|
33
33
|
async function generateTypesFromEndpoint(chain, endpoint, outDir, extension = 'd.ts', useSubPaths = false) {
|
|
34
|
-
|
|
34
|
+
// Immediately throw error if cannot connect to provider for the first time.
|
|
35
|
+
const api = await api_1.LegacyClient.new(new providers_1.WsProvider({ endpoint, retryDelayMs: 0, timeout: 0 }));
|
|
35
36
|
const { methods } = await api.rpc.rpc_methods();
|
|
36
37
|
const apis = api.runtimeVersion.apis || {};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
await generateTypes(chain, api.metadata.latest, methods, apis, outDir, extension, useSubPaths);
|
|
38
|
+
chain = chain || api.runtimeVersion.specName || 'local';
|
|
39
|
+
const result = await generateTypes(chain, api.metadata.latest, methods, apis, outDir, extension, useSubPaths);
|
|
41
40
|
await api.disconnect();
|
|
41
|
+
return result;
|
|
42
42
|
}
|
|
43
43
|
exports.generateTypesFromEndpoint = generateTypesFromEndpoint;
|
|
44
44
|
async function generateTypes(chain, metadata, rpcMethods, runtimeApis, outDir = '.', extension = 'd.ts', useSubPaths = false) {
|
|
45
|
-
const dirPath = path.resolve(outDir, chain);
|
|
45
|
+
const dirPath = path.resolve(outDir, (0, utils_1.stringDashCase)(chain));
|
|
46
46
|
const defTypesFileName = path.join(dirPath, `types.${extension}`);
|
|
47
47
|
const constsTypesFileName = path.join(dirPath, `consts.${extension}`);
|
|
48
48
|
const queryTypesFileName = path.join(dirPath, `query.${extension}`);
|
|
@@ -55,11 +55,12 @@ async function generateTypes(chain, metadata, rpcMethods, runtimeApis, outDir =
|
|
|
55
55
|
if (!fs.existsSync(dirPath)) {
|
|
56
56
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
57
57
|
}
|
|
58
|
+
const interfaceName = `${(0, utils_1.stringPascalCase)(chain)}Api`;
|
|
58
59
|
const typesGen = new index_js_1.TypesGen(metadata);
|
|
59
60
|
const constsGen = new index_js_1.ConstsGen(typesGen);
|
|
60
61
|
const queryGen = new index_js_1.QueryGen(typesGen);
|
|
61
62
|
const jsonRpcGen = new index_js_1.JsonRpcGen(typesGen, rpcMethods);
|
|
62
|
-
const indexGen = new index_js_1.IndexGen(
|
|
63
|
+
const indexGen = new index_js_1.IndexGen(interfaceName);
|
|
63
64
|
const errorsGen = new index_js_1.ErrorsGen(typesGen);
|
|
64
65
|
const eventsGen = new index_js_1.EventsGen(typesGen);
|
|
65
66
|
const runtimeApisGen = new index_js_1.RuntimeApisGen(typesGen, runtimeApis);
|
|
@@ -73,5 +74,6 @@ async function generateTypes(chain, metadata, rpcMethods, runtimeApis, outDir =
|
|
|
73
74
|
fs.writeFileSync(txFileName, await txGen.generate(useSubPaths));
|
|
74
75
|
fs.writeFileSync(indexFileName, await indexGen.generate(useSubPaths));
|
|
75
76
|
fs.writeFileSync(runtimeApisFileName, await runtimeApisGen.generate(useSubPaths));
|
|
77
|
+
return { interfaceName };
|
|
76
78
|
}
|
|
77
79
|
exports.generateTypes = generateTypes;
|
|
@@ -11,7 +11,7 @@ import { ChainTx } from './tx';
|
|
|
11
11
|
|
|
12
12
|
export * from './types';
|
|
13
13
|
|
|
14
|
-
export interface Versioned{{{interfaceName}}}
|
|
14
|
+
export interface Versioned{{{interfaceName}}}<Rv extends RpcVersion> extends GenericSubstrateApi<Rv> {
|
|
15
15
|
rpc: ChainJsonRpcApis<Rv>;
|
|
16
16
|
consts: ChainConsts<Rv>;
|
|
17
17
|
query: ChainStorage<Rv>;
|
|
@@ -21,7 +21,7 @@ export interface Versioned{{{interfaceName}}}Api<Rv extends RpcVersion> extends
|
|
|
21
21
|
tx: ChainTx<Rv>;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export interface {{{interfaceName}}}
|
|
25
|
-
legacy: Versioned{{{interfaceName}}}
|
|
26
|
-
v2: Versioned{{{interfaceName}}}
|
|
24
|
+
export interface {{{interfaceName}}} {
|
|
25
|
+
legacy: Versioned{{{interfaceName}}}<RpcLegacy>;
|
|
26
|
+
v2: Versioned{{{interfaceName}}}<RpcV2>;
|
|
27
27
|
}
|
package/cjs/index.js
CHANGED
|
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types.js"), exports);
|
|
17
18
|
__exportStar(require("./chaintypes/index.js"), exports);
|
|
18
19
|
__exportStar(require("./typink/index.js"), exports);
|
package/cjs/types.js
ADDED
|
@@ -7,6 +7,7 @@ const QueryGen_js_1 = require("./QueryGen.js");
|
|
|
7
7
|
class EventsGen extends QueryGen_js_1.QueryGen {
|
|
8
8
|
generate(useSubPaths = false) {
|
|
9
9
|
this.typesGen.clearCache();
|
|
10
|
+
this.typesGen.typeImports.addKnownType('GenericSubstrateApi');
|
|
10
11
|
this.typesGen.typeImports.addContractType('GenericContractEvents', 'GenericContractEvent');
|
|
11
12
|
const { events } = this.contractMetadata.spec;
|
|
12
13
|
let eventsOut = '';
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IndexGen = void 0;
|
|
4
|
-
const utils_1 = require("@dedot/utils");
|
|
5
4
|
const index_js_1 = require("../../shared/index.js");
|
|
6
5
|
const utils_js_1 = require("../../utils.js");
|
|
7
|
-
const SUFFIX = 'contract_api';
|
|
8
6
|
class IndexGen {
|
|
7
|
+
interfaceName;
|
|
9
8
|
contractMetadata;
|
|
10
9
|
typesGen;
|
|
11
|
-
constructor(contractMetadata, typesGen) {
|
|
10
|
+
constructor(interfaceName, contractMetadata, typesGen) {
|
|
11
|
+
this.interfaceName = interfaceName;
|
|
12
12
|
this.contractMetadata = contractMetadata;
|
|
13
13
|
this.typesGen = typesGen;
|
|
14
14
|
}
|
|
15
15
|
generate(useSubPaths = false) {
|
|
16
|
-
const
|
|
16
|
+
const interfaceName = this.interfaceName;
|
|
17
17
|
const langErrorId = this.contractMetadata.spec.lang_error.type;
|
|
18
18
|
const langErrorName = this.typesGen.cleanPath(this.contractMetadata.types[langErrorId].type.path);
|
|
19
19
|
const typeImports = new index_js_1.TypeImports();
|
|
@@ -23,7 +23,7 @@ class IndexGen {
|
|
|
23
23
|
typeImports.addPortableType(langErrorName);
|
|
24
24
|
const importTypes = typeImports.toImports({ useSubPaths });
|
|
25
25
|
const template = (0, utils_js_1.compileTemplate)('typink/templates/index.hbs');
|
|
26
|
-
return (0, utils_js_1.beautifySourceCode)(template({
|
|
26
|
+
return (0, utils_js_1.beautifySourceCode)(template({ interfaceName, langErrorName, importTypes }));
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
exports.IndexGen = IndexGen;
|
package/cjs/typink/index.js
CHANGED
|
@@ -5,13 +5,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.generateContractTypes = void 0;
|
|
7
7
|
const contracts_1 = require("@dedot/contracts");
|
|
8
|
+
const utils_1 = require("@dedot/utils");
|
|
8
9
|
const fs_1 = __importDefault(require("fs"));
|
|
9
10
|
const path_1 = __importDefault(require("path"));
|
|
10
11
|
const index_js_1 = require("./generator/index.js");
|
|
11
12
|
async function generateContractTypes(metadata, contract, outDir = '.', extension = 'd.ts', useSubPaths = false) {
|
|
12
13
|
let contractMetadata = typeof metadata === 'string' ? (0, contracts_1.parseRawMetadata)(metadata) : metadata;
|
|
13
|
-
|
|
14
|
-
const dirPath = path_1.default.resolve(outDir,
|
|
14
|
+
const contractName = contract || contractMetadata.contract.name;
|
|
15
|
+
const dirPath = path_1.default.resolve(outDir, (0, utils_1.stringDashCase)(contractName));
|
|
15
16
|
const typesFileName = path_1.default.join(dirPath, `types.${extension}`);
|
|
16
17
|
const queryTypesFileName = path_1.default.join(dirPath, `query.${extension}`);
|
|
17
18
|
const txTypesFileName = path_1.default.join(dirPath, `tx.${extension}`);
|
|
@@ -22,13 +23,14 @@ async function generateContractTypes(metadata, contract, outDir = '.', extension
|
|
|
22
23
|
if (!fs_1.default.existsSync(dirPath)) {
|
|
23
24
|
fs_1.default.mkdirSync(dirPath, { recursive: true });
|
|
24
25
|
}
|
|
26
|
+
const interfaceName = `${(0, utils_1.stringPascalCase)(`${contractName}`)}ContractApi`;
|
|
25
27
|
const typesGen = new index_js_1.TypesGen(contractMetadata);
|
|
26
28
|
const queryGen = new index_js_1.QueryGen(contractMetadata, typesGen);
|
|
27
29
|
const txGen = new index_js_1.TxGen(contractMetadata, typesGen);
|
|
28
30
|
const constructorTxGen = new index_js_1.ConstructorTxGen(contractMetadata, typesGen);
|
|
29
31
|
const constructorQueryGen = new index_js_1.ConstructorQueryGen(contractMetadata, typesGen);
|
|
30
32
|
const eventsGen = new index_js_1.EventsGen(contractMetadata, typesGen);
|
|
31
|
-
const indexGen = new index_js_1.IndexGen(contractMetadata, typesGen);
|
|
33
|
+
const indexGen = new index_js_1.IndexGen(interfaceName, contractMetadata, typesGen);
|
|
32
34
|
fs_1.default.writeFileSync(typesFileName, await typesGen.generate(useSubPaths));
|
|
33
35
|
fs_1.default.writeFileSync(queryTypesFileName, await queryGen.generate(useSubPaths));
|
|
34
36
|
fs_1.default.writeFileSync(txTypesFileName, await txGen.generate(useSubPaths));
|
|
@@ -36,5 +38,6 @@ async function generateContractTypes(metadata, contract, outDir = '.', extension
|
|
|
36
38
|
fs_1.default.writeFileSync(constructorTxTypesFileName, await constructorTxGen.generate(useSubPaths));
|
|
37
39
|
fs_1.default.writeFileSync(eventsTypesFile, await eventsGen.generate(useSubPaths));
|
|
38
40
|
fs_1.default.writeFileSync(indexTypesFileName, await indexGen.generate(useSubPaths));
|
|
41
|
+
return { interfaceName };
|
|
39
42
|
}
|
|
40
43
|
exports.generateContractTypes = generateContractTypes;
|
|
@@ -5,9 +5,11 @@ import { ContractQuery } from './query';
|
|
|
5
5
|
import { ContractTx } from './tx';
|
|
6
6
|
import { ConstructorQuery } from './constructor-query';
|
|
7
7
|
import { ConstructorTx } from './constructor-tx';
|
|
8
|
-
import { ContractEvents } from './events'
|
|
8
|
+
import { ContractEvents } from './events';
|
|
9
9
|
|
|
10
|
-
export
|
|
10
|
+
export * from './types';
|
|
11
|
+
|
|
12
|
+
export interface {{{interfaceName}}}<Rv extends RpcVersion = RpcV2, ChainApi extends VersionedGenericSubstrateApi = SubstrateApi> extends GenericContractApi<Rv, ChainApi> {
|
|
11
13
|
query: ContractQuery<ChainApi[Rv]>;
|
|
12
14
|
tx: ContractTx<ChainApi[Rv]>;
|
|
13
15
|
constructorQuery: ConstructorQuery<ChainApi[Rv]>;
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dedot/codegen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Generate types",
|
|
5
5
|
"author": "Thang X. Vu <thang@coongcrafts.io>",
|
|
6
6
|
"homepage": "https://github.com/dedotdev/dedot/tree/main/packages/codegen",
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
"copy": "cp -R ./src/chaintypes/templates ./dist/chaintypes && cp -R ./src/chaintypes/templates ./dist/cjs/chaintypes && cp -R ./src/typink/templates ./dist/typink && cp -R ./src/typink/templates ./dist/cjs/typink"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@dedot/api": "0.
|
|
22
|
-
"@dedot/codecs": "0.
|
|
23
|
-
"@dedot/contracts": "0.
|
|
24
|
-
"@dedot/providers": "0.
|
|
25
|
-
"@dedot/runtime-specs": "0.
|
|
26
|
-
"@dedot/shape": "0.
|
|
27
|
-
"@dedot/types": "0.
|
|
28
|
-
"@dedot/utils": "0.
|
|
21
|
+
"@dedot/api": "0.4.0",
|
|
22
|
+
"@dedot/codecs": "0.4.0",
|
|
23
|
+
"@dedot/contracts": "0.4.0",
|
|
24
|
+
"@dedot/providers": "0.4.0",
|
|
25
|
+
"@dedot/runtime-specs": "0.4.0",
|
|
26
|
+
"@dedot/shape": "0.4.0",
|
|
27
|
+
"@dedot/types": "0.4.0",
|
|
28
|
+
"@dedot/utils": "0.4.0",
|
|
29
29
|
"handlebars": "^4.7.8",
|
|
30
30
|
"prettier": "^3.3.3"
|
|
31
31
|
},
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"directory": "dist"
|
|
35
35
|
},
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "f6271b5c12d8bf909e4b1a186417bf26db504c63",
|
|
38
38
|
"module": "./index.js",
|
|
39
39
|
"types": "./index.d.ts",
|
|
40
40
|
"exports": {
|
package/types.d.ts
ADDED
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -4,6 +4,7 @@ import { QueryGen } from './QueryGen.js';
|
|
|
4
4
|
export class EventsGen extends QueryGen {
|
|
5
5
|
generate(useSubPaths = false) {
|
|
6
6
|
this.typesGen.clearCache();
|
|
7
|
+
this.typesGen.typeImports.addKnownType('GenericSubstrateApi');
|
|
7
8
|
this.typesGen.typeImports.addContractType('GenericContractEvents', 'GenericContractEvent');
|
|
8
9
|
const { events } = this.contractMetadata.spec;
|
|
9
10
|
let eventsOut = '';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ContractMetadata } from '@dedot/contracts';
|
|
2
2
|
import { TypesGen } from './TypesGen.js';
|
|
3
3
|
export declare class IndexGen {
|
|
4
|
+
interfaceName: string;
|
|
4
5
|
contractMetadata: ContractMetadata;
|
|
5
6
|
typesGen: TypesGen;
|
|
6
|
-
constructor(contractMetadata: ContractMetadata, typesGen: TypesGen);
|
|
7
|
+
constructor(interfaceName: string, contractMetadata: ContractMetadata, typesGen: TypesGen);
|
|
7
8
|
generate(useSubPaths?: boolean): Promise<string>;
|
|
8
9
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { stringPascalCase } from '@dedot/utils';
|
|
2
1
|
import { TypeImports } from '../../shared/index.js';
|
|
3
2
|
import { beautifySourceCode, compileTemplate } from '../../utils.js';
|
|
4
|
-
const SUFFIX = 'contract_api';
|
|
5
3
|
export class IndexGen {
|
|
4
|
+
interfaceName;
|
|
6
5
|
contractMetadata;
|
|
7
6
|
typesGen;
|
|
8
|
-
constructor(contractMetadata, typesGen) {
|
|
7
|
+
constructor(interfaceName, contractMetadata, typesGen) {
|
|
8
|
+
this.interfaceName = interfaceName;
|
|
9
9
|
this.contractMetadata = contractMetadata;
|
|
10
10
|
this.typesGen = typesGen;
|
|
11
11
|
}
|
|
12
12
|
generate(useSubPaths = false) {
|
|
13
|
-
const
|
|
13
|
+
const interfaceName = this.interfaceName;
|
|
14
14
|
const langErrorId = this.contractMetadata.spec.lang_error.type;
|
|
15
15
|
const langErrorName = this.typesGen.cleanPath(this.contractMetadata.types[langErrorId].type.path);
|
|
16
16
|
const typeImports = new TypeImports();
|
|
@@ -20,6 +20,6 @@ export class IndexGen {
|
|
|
20
20
|
typeImports.addPortableType(langErrorName);
|
|
21
21
|
const importTypes = typeImports.toImports({ useSubPaths });
|
|
22
22
|
const template = compileTemplate('typink/templates/index.hbs');
|
|
23
|
-
return beautifySourceCode(template({
|
|
23
|
+
return beautifySourceCode(template({ interfaceName, langErrorName, importTypes }));
|
|
24
24
|
}
|
|
25
25
|
}
|
package/typink/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { ContractMetadata } from '@dedot/contracts';
|
|
2
|
-
|
|
2
|
+
import { GeneratedResult } from '../types.js';
|
|
3
|
+
export declare function generateContractTypes(metadata: ContractMetadata | string, contract?: string, outDir?: string, extension?: string, useSubPaths?: boolean): Promise<GeneratedResult>;
|
package/typink/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { parseRawMetadata } from '@dedot/contracts';
|
|
2
|
+
import { stringDashCase, stringPascalCase } from '@dedot/utils';
|
|
2
3
|
import fs from 'fs';
|
|
3
4
|
import path from 'path';
|
|
4
5
|
import { IndexGen, QueryGen, EventsGen, TxGen, TypesGen, ConstructorTxGen, ConstructorQueryGen, } from './generator/index.js';
|
|
5
6
|
export async function generateContractTypes(metadata, contract, outDir = '.', extension = 'd.ts', useSubPaths = false) {
|
|
6
7
|
let contractMetadata = typeof metadata === 'string' ? parseRawMetadata(metadata) : metadata;
|
|
7
|
-
|
|
8
|
-
const dirPath = path.resolve(outDir,
|
|
8
|
+
const contractName = contract || contractMetadata.contract.name;
|
|
9
|
+
const dirPath = path.resolve(outDir, stringDashCase(contractName));
|
|
9
10
|
const typesFileName = path.join(dirPath, `types.${extension}`);
|
|
10
11
|
const queryTypesFileName = path.join(dirPath, `query.${extension}`);
|
|
11
12
|
const txTypesFileName = path.join(dirPath, `tx.${extension}`);
|
|
@@ -16,13 +17,14 @@ export async function generateContractTypes(metadata, contract, outDir = '.', ex
|
|
|
16
17
|
if (!fs.existsSync(dirPath)) {
|
|
17
18
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
18
19
|
}
|
|
20
|
+
const interfaceName = `${stringPascalCase(`${contractName}`)}ContractApi`;
|
|
19
21
|
const typesGen = new TypesGen(contractMetadata);
|
|
20
22
|
const queryGen = new QueryGen(contractMetadata, typesGen);
|
|
21
23
|
const txGen = new TxGen(contractMetadata, typesGen);
|
|
22
24
|
const constructorTxGen = new ConstructorTxGen(contractMetadata, typesGen);
|
|
23
25
|
const constructorQueryGen = new ConstructorQueryGen(contractMetadata, typesGen);
|
|
24
26
|
const eventsGen = new EventsGen(contractMetadata, typesGen);
|
|
25
|
-
const indexGen = new IndexGen(contractMetadata, typesGen);
|
|
27
|
+
const indexGen = new IndexGen(interfaceName, contractMetadata, typesGen);
|
|
26
28
|
fs.writeFileSync(typesFileName, await typesGen.generate(useSubPaths));
|
|
27
29
|
fs.writeFileSync(queryTypesFileName, await queryGen.generate(useSubPaths));
|
|
28
30
|
fs.writeFileSync(txTypesFileName, await txGen.generate(useSubPaths));
|
|
@@ -30,4 +32,5 @@ export async function generateContractTypes(metadata, contract, outDir = '.', ex
|
|
|
30
32
|
fs.writeFileSync(constructorTxTypesFileName, await constructorTxGen.generate(useSubPaths));
|
|
31
33
|
fs.writeFileSync(eventsTypesFile, await eventsGen.generate(useSubPaths));
|
|
32
34
|
fs.writeFileSync(indexTypesFileName, await indexGen.generate(useSubPaths));
|
|
35
|
+
return { interfaceName };
|
|
33
36
|
}
|
|
@@ -5,9 +5,11 @@ import { ContractQuery } from './query';
|
|
|
5
5
|
import { ContractTx } from './tx';
|
|
6
6
|
import { ConstructorQuery } from './constructor-query';
|
|
7
7
|
import { ConstructorTx } from './constructor-tx';
|
|
8
|
-
import { ContractEvents } from './events'
|
|
8
|
+
import { ContractEvents } from './events';
|
|
9
9
|
|
|
10
|
-
export
|
|
10
|
+
export * from './types';
|
|
11
|
+
|
|
12
|
+
export interface {{{interfaceName}}}<Rv extends RpcVersion = RpcV2, ChainApi extends VersionedGenericSubstrateApi = SubstrateApi> extends GenericContractApi<Rv, ChainApi> {
|
|
11
13
|
query: ContractQuery<ChainApi[Rv]>;
|
|
12
14
|
tx: ContractTx<ChainApi[Rv]>;
|
|
13
15
|
constructorQuery: ConstructorQuery<ChainApi[Rv]>;
|