@cosmwasm/ts-codegen 0.30.0 → 0.31.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.
Files changed (66) hide show
  1. package/README.md +5 -2
  2. package/main/builder/builder.js +41 -4
  3. package/main/generators/create-helpers.js +38 -0
  4. package/main/helpers/contractContextBase.js +8 -0
  5. package/main/helpers/contractsContextTSX.js +8 -0
  6. package/main/helpers/index.js +31 -0
  7. package/main/plugins/client.js +11 -6
  8. package/main/plugins/message-composer.js +10 -6
  9. package/main/plugins/msg-builder.js +1 -1
  10. package/main/plugins/plugin-base.js +9 -2
  11. package/main/plugins/provider-bundle.js +146 -0
  12. package/main/plugins/provider.js +170 -0
  13. package/main/plugins/react-query.js +1 -1
  14. package/main/plugins/recoil.js +1 -1
  15. package/main/plugins/types.js +1 -1
  16. package/main/utils/files.js +77 -0
  17. package/main/utils/schemas.js +1 -2
  18. package/main/utils/unused.js +68 -0
  19. package/module/builder/builder.js +28 -2
  20. package/module/generators/create-helpers.js +25 -0
  21. package/module/helpers/contractContextBase.js +92 -0
  22. package/module/helpers/contractsContextTSX.js +73 -0
  23. package/module/helpers/index.js +2 -0
  24. package/module/plugins/client.js +13 -10
  25. package/module/plugins/message-composer.js +12 -10
  26. package/module/plugins/msg-builder.js +1 -1
  27. package/module/plugins/plugin-base.js +15 -8
  28. package/module/plugins/provider-bundle.js +65 -0
  29. package/module/plugins/provider.js +81 -0
  30. package/module/plugins/react-query.js +1 -1
  31. package/module/plugins/recoil.js +1 -1
  32. package/module/plugins/types.js +1 -1
  33. package/module/utils/files.js +44 -0
  34. package/module/utils/schemas.js +1 -2
  35. package/module/utils/unused.js +45 -0
  36. package/package.json +3 -3
  37. package/src/builder/builder.ts +36 -1
  38. package/src/generators/create-helpers.ts +28 -0
  39. package/src/helpers/contractContextBase.ts +92 -0
  40. package/src/helpers/contractsContextTSX.ts +73 -0
  41. package/src/helpers/index.ts +2 -0
  42. package/src/plugins/client.ts +30 -14
  43. package/src/plugins/message-composer.ts +23 -14
  44. package/src/plugins/msg-builder.ts +1 -1
  45. package/src/plugins/plugin-base.ts +30 -20
  46. package/src/plugins/provider-bundle.ts +97 -0
  47. package/src/plugins/provider.ts +114 -0
  48. package/src/plugins/react-query.ts +1 -1
  49. package/src/plugins/recoil.ts +1 -1
  50. package/src/plugins/types.ts +1 -1
  51. package/src/utils/files.ts +73 -0
  52. package/src/utils/schemas.ts +1 -3
  53. package/src/utils/unused.ts +52 -0
  54. package/types/src/builder/builder.d.ts +7 -1
  55. package/types/src/generators/create-helpers.d.ts +3 -0
  56. package/types/src/helpers/contractContextBase.d.ts +1 -0
  57. package/types/src/helpers/contractsContextTSX.d.ts +1 -0
  58. package/types/src/helpers/index.d.ts +2 -0
  59. package/types/src/plugins/client.d.ts +4 -3
  60. package/types/src/plugins/message-composer.d.ts +4 -3
  61. package/types/src/plugins/plugin-base.d.ts +7 -3
  62. package/types/src/plugins/provider-bundle.d.ts +13 -0
  63. package/types/src/plugins/provider.d.ts +15 -0
  64. package/types/src/plugins/use-contracts.d.ts +12 -0
  65. package/types/src/utils/files.d.ts +3 -0
  66. package/types/src/utils/unused.d.ts +5 -0
@@ -0,0 +1,73 @@
1
+ export const contractsContextTSX = `
2
+ import React, { useEffect, useMemo, useRef, useState, useContext } from 'react';
3
+ import {
4
+ CosmWasmClient,
5
+ SigningCosmWasmClient,
6
+ } from '@cosmjs/cosmwasm-stargate';
7
+
8
+ import { IContractsContext, getProviders } from './contractContextProviders';
9
+
10
+ interface ContractsConfig {
11
+ address: string | undefined;
12
+ getCosmWasmClient: () => Promise<CosmWasmClient>;
13
+ getSigningCosmWasmClient: () => Promise<SigningCosmWasmClient>;
14
+ }
15
+
16
+ const ContractsContext = React.createContext<IContractsContext | null>(null);
17
+
18
+ export const ContractsProvider = ({
19
+ children,
20
+ contractsConfig,
21
+ }: {
22
+ children: React.ReactNode;
23
+ contractsConfig: ContractsConfig;
24
+ }) => {
25
+ const [cosmWasmClient, setCosmWasmClient] = useState<CosmWasmClient>();
26
+ const [signingCosmWasmClient, setSigningCosmWasmClient] =
27
+ useState<SigningCosmWasmClient>();
28
+
29
+ const { address, getCosmWasmClient, getSigningCosmWasmClient } =
30
+ contractsConfig;
31
+
32
+ const prevAddressRef = useRef<string | undefined>(address);
33
+
34
+ const contracts: IContractsContext = useMemo(() => {
35
+ return getProviders(address, cosmWasmClient, signingCosmWasmClient);
36
+ }, [address, cosmWasmClient, signingCosmWasmClient]);
37
+
38
+ useEffect(() => {
39
+ const connectSigningCwClient = async () => {
40
+ if (address && prevAddressRef.current !== address) {
41
+ const signingCosmWasmClient = await getSigningCosmWasmClient();
42
+ setSigningCosmWasmClient(signingCosmWasmClient);
43
+ } else if (!address) {
44
+ setSigningCosmWasmClient(undefined);
45
+ }
46
+ prevAddressRef.current = address;
47
+ };
48
+ connectSigningCwClient();
49
+ }, [address, getSigningCosmWasmClient]);
50
+
51
+ useEffect(() => {
52
+ const connectCosmWasmClient = async () => {
53
+ const cosmWasmClient = await getCosmWasmClient();
54
+ setCosmWasmClient(cosmWasmClient);
55
+ };
56
+ connectCosmWasmClient();
57
+ }, [getCosmWasmClient]);
58
+
59
+ return (
60
+ <ContractsContext.Provider value={contracts}>
61
+ {children}
62
+ </ContractsContext.Provider>
63
+ );
64
+ };
65
+
66
+ export const useContracts = () => {
67
+ const contracts = useContext(ContractsContext);
68
+ if (contracts === null) {
69
+ throw new Error('useContracts must be used within a ContractsProvider');
70
+ }
71
+ return contracts;
72
+ };
73
+ `;
@@ -0,0 +1,2 @@
1
+ export * from './contractContextBase';
2
+ export * from './contractsContextTSX';
@@ -1,22 +1,24 @@
1
- import { pascal } from 'case';
2
- import * as w from 'wasm-ast-types';
3
- import { findExecuteMsg, findAndParseTypes, findQueryMsg } from '../utils';
1
+ import { pascal } from "case";
2
+ import * as w from "wasm-ast-types";
3
+ import { findExecuteMsg, findAndParseTypes, findQueryMsg } from "../utils";
4
4
  import {
5
5
  RenderContext,
6
6
  ContractInfo,
7
7
  RenderContextBase,
8
8
  getMessageProperties,
9
- RenderOptions
10
- } from 'wasm-ast-types';
11
- import { BuilderFileType } from '../builder';
12
- import { BuilderPluginBase } from './plugin-base';
9
+ RenderOptions,
10
+ } from "wasm-ast-types";
11
+ import { BuilderFileType } from "../builder";
12
+ import { BuilderPluginBase } from "./plugin-base";
13
+
14
+ export const TYPE = "client";
13
15
 
14
16
  export class ClientPlugin extends BuilderPluginBase<RenderOptions> {
15
17
  initContext(
16
18
  contract: ContractInfo,
17
19
  options?: RenderOptions
18
20
  ): RenderContextBase<RenderOptions> {
19
- return new RenderContext(contract, options);
21
+ return new RenderContext(contract, options, this.builder.builderContext);
20
22
  }
21
23
 
22
24
  async doRender(
@@ -38,8 +40,8 @@ export class ClientPlugin extends BuilderPluginBase<RenderOptions> {
38
40
 
39
41
  const { schemas } = context.contract;
40
42
 
41
- const localname = pascal(name) + '.client.ts';
42
- const TypesFile = pascal(name) + '.types';
43
+ const localname = pascal(name) + ".client.ts";
44
+ const TypesFile = pascal(name) + ".types";
43
45
  const QueryMsg = findQueryMsg(schemas);
44
46
  const ExecuteMsg = findExecuteMsg(schemas);
45
47
  const typeHash = await findAndParseTypes(schemas);
@@ -62,6 +64,13 @@ export class ClientPlugin extends BuilderPluginBase<RenderOptions> {
62
64
  body.push(
63
65
  w.createQueryClass(context, QueryClient, ReadOnlyInstance, QueryMsg)
64
66
  );
67
+
68
+ context.addProviderInfo(
69
+ name,
70
+ w.PROVIDER_TYPES.QUERY_CLIENT_TYPE,
71
+ QueryClient,
72
+ localname
73
+ );
65
74
  }
66
75
 
67
76
  // execute messages
@@ -89,20 +98,27 @@ export class ClientPlugin extends BuilderPluginBase<RenderOptions> {
89
98
  ExecuteMsg
90
99
  )
91
100
  );
101
+
102
+ context.addProviderInfo(
103
+ name,
104
+ w.PROVIDER_TYPES.SIGNING_CLIENT_TYPE,
105
+ Client,
106
+ localname
107
+ );
92
108
  }
93
109
  }
94
110
 
95
- if (typeHash.hasOwnProperty('Coin')) {
111
+ if (typeHash.hasOwnProperty("Coin")) {
96
112
  // @ts-ignore
97
113
  delete context.utils.Coin;
98
114
  }
99
115
 
100
116
  return [
101
117
  {
102
- type: 'client',
118
+ type: TYPE,
103
119
  localname,
104
- body
105
- }
120
+ body,
121
+ },
106
122
  ];
107
123
  }
108
124
  }
@@ -1,23 +1,25 @@
1
- import { pascal } from 'case';
2
- import * as w from 'wasm-ast-types';
3
- import { findAndParseTypes, findExecuteMsg } from '../utils';
1
+ import { pascal } from "case";
2
+ import * as w from "wasm-ast-types";
3
+ import { findAndParseTypes, findExecuteMsg } from "../utils";
4
4
  import {
5
5
  MessageComposerOptions,
6
6
  getMessageProperties,
7
7
  ContractInfo,
8
8
  RenderContextBase,
9
9
  RenderContext,
10
- RenderOptions
11
- } from 'wasm-ast-types';
12
- import { BuilderFileType } from '../builder';
13
- import { BuilderPluginBase } from './plugin-base';
10
+ RenderOptions,
11
+ } from "wasm-ast-types";
12
+ import { BuilderFileType } from "../builder";
13
+ import { BuilderPluginBase } from "./plugin-base";
14
+
15
+ export const TYPE = "message-composer";
14
16
 
15
17
  export class MessageComposerPlugin extends BuilderPluginBase<RenderOptions> {
16
18
  initContext(
17
19
  contract: ContractInfo,
18
20
  options?: RenderOptions
19
21
  ): RenderContextBase<RenderOptions> {
20
- return new RenderContext(contract, options);
22
+ return new RenderContext(contract, options, this.builder.builderContext);
21
23
  }
22
24
 
23
25
  async doRender(
@@ -39,8 +41,8 @@ export class MessageComposerPlugin extends BuilderPluginBase<RenderOptions> {
39
41
 
40
42
  const { schemas } = context.contract;
41
43
 
42
- const localname = pascal(name) + '.message-composer.ts';
43
- const TypesFile = pascal(name) + '.types';
44
+ const localname = pascal(name) + ".message-composer.ts";
45
+ const TypesFile = pascal(name) + ".types";
44
46
  const ExecuteMsg = findExecuteMsg(schemas);
45
47
  const typeHash = await findAndParseTypes(schemas);
46
48
 
@@ -61,20 +63,27 @@ export class MessageComposerPlugin extends BuilderPluginBase<RenderOptions> {
61
63
  body.push(
62
64
  w.createMessageComposerClass(context, TheClass, Interface, ExecuteMsg)
63
65
  );
66
+
67
+ context.addProviderInfo(
68
+ name,
69
+ w.PROVIDER_TYPES.MESSAGE_COMPOSER_TYPE,
70
+ TheClass,
71
+ localname
72
+ );
64
73
  }
65
74
  }
66
75
 
67
- if (typeHash.hasOwnProperty('Coin')) {
76
+ if (typeHash.hasOwnProperty("Coin")) {
68
77
  // @ts-ignore
69
78
  delete context.utils.Coin;
70
79
  }
71
80
 
72
81
  return [
73
82
  {
74
- type: 'message-composer',
83
+ type: TYPE,
75
84
  localname,
76
- body
77
- }
85
+ body,
86
+ },
78
87
  ];
79
88
  }
80
89
  }
@@ -16,7 +16,7 @@ export class MsgBuilderPlugin extends BuilderPluginBase<RenderOptions> {
16
16
  contract: ContractInfo,
17
17
  options?: RenderOptions
18
18
  ): RenderContextBase<RenderOptions> {
19
- return new RenderContext(contract, options);
19
+ return new RenderContext(contract, options, this.builder.builderContext);
20
20
  }
21
21
 
22
22
  async doRender(
@@ -1,15 +1,16 @@
1
- import { sync as mkdirp } from 'mkdirp';
2
- import { join } from 'path';
3
- import { writeFileSync } from 'fs';
4
- import { header } from '../utils/header';
1
+ import { sync as mkdirp } from "mkdirp";
2
+ import { join } from "path";
3
+ import { writeFileSync } from "fs";
4
+ import { header } from "../utils/header";
5
+ import { ContractInfo, UtilMapping, IContext } from "wasm-ast-types";
6
+ import generate from "@babel/generator";
7
+ import * as t from "@babel/types";
5
8
  import {
6
- ContractInfo,
7
- UtilMapping,
8
- IContext
9
- } from 'wasm-ast-types';
10
- import generate from '@babel/generator';
11
- import * as t from '@babel/types';
12
- import { BuilderFile, BuilderFileType, TSBuilderOptions } from '../builder';
9
+ BuilderFile,
10
+ BuilderFileType,
11
+ TSBuilder,
12
+ TSBuilderOptions,
13
+ } from "../builder";
13
14
 
14
15
  /**
15
16
  * IBuilderPlugin is a common plugin that render generated code.
@@ -20,6 +21,10 @@ export interface IBuilderPlugin {
20
21
  */
21
22
  utils: UtilMapping;
22
23
 
24
+ builder?: TSBuilder;
25
+
26
+ setBuilder(builder: TSBuilder);
27
+
23
28
  /**
24
29
  * render generated cdoe.
25
30
  * @param name the name of contract
@@ -30,19 +35,27 @@ export interface IBuilderPlugin {
30
35
  render(
31
36
  name: string,
32
37
  contractInfo: ContractInfo,
33
- outPath: string,
38
+ outPath: string
34
39
  ): Promise<BuilderFile[]>;
35
40
  }
36
41
 
37
42
  /**
38
43
  * BuilderPluginBase enable ts-codegen users implement their own plugins by only implement a few functions.
39
44
  */
40
- export abstract class BuilderPluginBase<TOpt extends { enabled?: boolean }> implements IBuilderPlugin {
45
+ export abstract class BuilderPluginBase<TOpt extends { enabled?: boolean }>
46
+ implements IBuilderPlugin
47
+ {
48
+ builder?: TSBuilder;
41
49
  option: TOpt;
42
50
  utils: UtilMapping;
43
51
 
44
- constructor(opt: TOpt) {
52
+ constructor(opt: TOpt, builder?: TSBuilder) {
45
53
  this.option = opt;
54
+ this.builder = builder;
55
+ }
56
+
57
+ setBuilder(builder: TSBuilder) {
58
+ this.builder = builder;
46
59
  }
47
60
 
48
61
  async render(
@@ -65,7 +78,7 @@ export abstract class BuilderPluginBase<TOpt extends { enabled?: boolean }> impl
65
78
  }
66
79
 
67
80
  return results.map((result) => {
68
- const imports = context.getImports(this.utils);
81
+ const imports = context.getImports(this.utils, result.localname);
69
82
  const code =
70
83
  header + generate(t.program([...imports, ...result.body])).code;
71
84
 
@@ -78,7 +91,7 @@ export abstract class BuilderPluginBase<TOpt extends { enabled?: boolean }> impl
78
91
  pluginType: result.pluginType,
79
92
  contract: name,
80
93
  localname: result.localname,
81
- filename
94
+ filename,
82
95
  };
83
96
  });
84
97
  }
@@ -88,10 +101,7 @@ export abstract class BuilderPluginBase<TOpt extends { enabled?: boolean }> impl
88
101
  * @param contract
89
102
  * @param options
90
103
  */
91
- abstract initContext(
92
- contract: ContractInfo,
93
- options?: TOpt
94
- ): IContext;
104
+ abstract initContext(contract: ContractInfo, options?: TOpt): IContext;
95
105
 
96
106
  /**
97
107
  * render generated code here.
@@ -0,0 +1,97 @@
1
+ import { pascal } from "case";
2
+ import * as w from "wasm-ast-types";
3
+ import { ContractInfo, RenderContextBase, RenderContext } from "wasm-ast-types";
4
+ import { BuilderFileType, TSBuilderOptions } from "../builder";
5
+ import { BuilderPluginBase } from "./plugin-base";
6
+ import { GetLocalBaseNameByContractName } from "./provider";
7
+
8
+ export class ContractsProviderBundlePlugin extends BuilderPluginBase<TSBuilderOptions> {
9
+ constructor(opt: TSBuilderOptions) {
10
+ super(opt);
11
+
12
+ this.utils = {
13
+ CosmWasmClient: "@cosmjs/cosmwasm-stargate",
14
+ SigningCosmWasmClient: "@cosmjs/cosmwasm-stargate",
15
+ IQueryClientProvider: "__contractContextBase__",
16
+ ISigningClientProvider: "__contractContextBase__",
17
+ IMessageComposerProvider: "__contractContextBase__",
18
+ };
19
+ }
20
+
21
+ initContext(
22
+ contract: ContractInfo,
23
+ options?: TSBuilderOptions
24
+ ): RenderContextBase<TSBuilderOptions> {
25
+ return new RenderContext(contract, options, this.builder.builderContext);
26
+ }
27
+
28
+ async doRender(
29
+ name: string,
30
+ context: RenderContext
31
+ ): Promise<
32
+ {
33
+ type: BuilderFileType;
34
+ pluginType?: string;
35
+ localname: string;
36
+ body: any[];
37
+ }[]
38
+ > {
39
+ if (!this.option?.useContracts?.enabled) {
40
+ return;
41
+ }
42
+
43
+ const providerInfos = context.getProviderInfos();
44
+
45
+ if (!Object.keys(providerInfos)?.length) {
46
+ return;
47
+ }
48
+
49
+ const localname = "contractContextProviders.ts";
50
+
51
+ const body = [];
52
+
53
+ context.addUtil("CosmWasmClient");
54
+ context.addUtil("SigningCosmWasmClient");
55
+
56
+ context.addUtil("IQueryClientProvider");
57
+ context.addUtil("ISigningClientProvider");
58
+ context.addUtil("IMessageComposerProvider");
59
+
60
+ for (const name in providerInfos) {
61
+ if (Object.prototype.hasOwnProperty.call(providerInfos, name)) {
62
+ const providerInfo = providerInfos[name];
63
+
64
+ for (const key in providerInfo) {
65
+ if (Object.prototype.hasOwnProperty.call(providerInfo, key)) {
66
+ const info = providerInfo[key];
67
+
68
+ body.push(
69
+ w.importStmt(
70
+ [info.classname],
71
+ `./${info.basename}`
72
+ )
73
+ );
74
+ }
75
+ }
76
+
77
+ body.push(
78
+ w.importStmt(
79
+ [pascal(name)],
80
+ `./${GetLocalBaseNameByContractName(name)}`
81
+ )
82
+ );
83
+ }
84
+ }
85
+
86
+ body.push(w.createIContractsContext(providerInfos));
87
+ body.push(w.createGettingProviders(providerInfos));
88
+
89
+ return [
90
+ {
91
+ type: "plugin",
92
+ localname,
93
+ body,
94
+ },
95
+ ];
96
+ }
97
+ }
@@ -0,0 +1,114 @@
1
+ import { pascal } from "case";
2
+ import * as w from "wasm-ast-types";
3
+ import { ContractInfo, RenderContextBase, RenderContext } from "wasm-ast-types";
4
+ import { BuilderFileType, TSBuilderOptions } from "../builder";
5
+ import { BuilderPluginBase } from "./plugin-base";
6
+
7
+ export const GetLocalNameByContractName = (name) =>
8
+ `${pascal(name)}.provider.ts`;
9
+
10
+ export const GetLocalBaseNameByContractName = (name) =>
11
+ `${pascal(name)}.provider`;
12
+
13
+ export class ContractsContextProviderPlugin extends BuilderPluginBase<TSBuilderOptions> {
14
+ constructor(opt: TSBuilderOptions) {
15
+ super(opt);
16
+
17
+ this.utils = {
18
+ ContractBase: "__contractContextBase__",
19
+ IContractConstructor: "__contractContextBase__",
20
+ IEmptyClient: "__contractContextBase__",
21
+ };
22
+ }
23
+
24
+ initContext(
25
+ contract: ContractInfo,
26
+ options?: TSBuilderOptions
27
+ ): RenderContextBase<TSBuilderOptions> {
28
+ return new RenderContext(contract, options, this.builder.builderContext);
29
+ }
30
+
31
+ async doRender(
32
+ name: string,
33
+ context: RenderContext
34
+ ): Promise<
35
+ {
36
+ type: BuilderFileType;
37
+ pluginType?: string;
38
+ localname: string;
39
+ body: any[];
40
+ }[]
41
+ > {
42
+ if (!this.option?.useContracts?.enabled) {
43
+ return;
44
+ }
45
+
46
+ const providerInfo = context.getProviderInfos()[name];
47
+
48
+ if (!Object.keys(providerInfo)?.length) {
49
+ return;
50
+ }
51
+
52
+ context.addUtil("ContractBase");
53
+ context.addUtil("IContractConstructor");
54
+
55
+ const localname = GetLocalNameByContractName(name);
56
+ let needEmptyClientType = false;
57
+ let clientFile = null;
58
+ let clientClasses = [];
59
+
60
+ const body = [];
61
+
62
+ const signClientProviderInfo =
63
+ providerInfo[w.PROVIDER_TYPES.SIGNING_CLIENT_TYPE];
64
+
65
+ if (signClientProviderInfo) {
66
+ clientFile = `./${signClientProviderInfo.basename}`;
67
+ clientClasses.push(signClientProviderInfo.classname);
68
+ } else {
69
+ needEmptyClientType = true;
70
+ }
71
+
72
+ const queryClientProviderInfo =
73
+ providerInfo[w.PROVIDER_TYPES.QUERY_CLIENT_TYPE];
74
+
75
+ if (queryClientProviderInfo) {
76
+ clientFile = `./${queryClientProviderInfo.basename}`;
77
+ clientClasses.push(queryClientProviderInfo.classname);
78
+ } else {
79
+ needEmptyClientType = true;
80
+ }
81
+
82
+ if (clientFile) {
83
+ body.push(w.importStmt(clientClasses, clientFile));
84
+ }
85
+
86
+ const messageComposerProviderInfo =
87
+ providerInfo[w.PROVIDER_TYPES.MESSAGE_COMPOSER_TYPE];
88
+
89
+ if (messageComposerProviderInfo) {
90
+ body.push(
91
+ w.importStmt(
92
+ [messageComposerProviderInfo.classname],
93
+ `./${messageComposerProviderInfo.basename}`
94
+ )
95
+ );
96
+ } else {
97
+ needEmptyClientType = true;
98
+ }
99
+
100
+ if (needEmptyClientType) {
101
+ context.addUtil("IEmptyClient");
102
+ }
103
+
104
+ body.push(w.createProvider(name, providerInfo));
105
+
106
+ return [
107
+ {
108
+ type: "plugin",
109
+ localname,
110
+ body,
111
+ },
112
+ ];
113
+ }
114
+ }
@@ -16,7 +16,7 @@ export class ReactQueryPlugin extends BuilderPluginBase<RenderOptions> {
16
16
  contract: ContractInfo,
17
17
  options?: RenderOptions
18
18
  ): RenderContextBase<RenderOptions> {
19
- return new RenderContext(contract, options);
19
+ return new RenderContext(contract, options, this.builder.builderContext);
20
20
  }
21
21
 
22
22
  async doRender(
@@ -19,7 +19,7 @@ export class RecoilPlugin extends BuilderPluginBase<RenderOptions> {
19
19
  contract: ContractInfo,
20
20
  options?: RenderOptions
21
21
  ): RenderContextBase<RenderOptions> {
22
- return new RenderContext(contract, options);
22
+ return new RenderContext(contract, options, this.builder.builderContext);
23
23
  }
24
24
 
25
25
  async doRender(
@@ -16,7 +16,7 @@ export class TypesPlugin extends BuilderPluginBase<RenderOptions> {
16
16
  contract: ContractInfo,
17
17
  options?: RenderOptions
18
18
  ): RenderContextBase<RenderOptions> {
19
- return new RenderContext(contract, options);
19
+ return new RenderContext(contract, options, this.builder.builderContext);
20
20
  }
21
21
 
22
22
  async doRender(
@@ -0,0 +1,73 @@
1
+ import * as t from "@babel/types";
2
+ import { parse, ParserPlugin } from "@babel/parser";
3
+ import { sync as mkdirp } from "mkdirp";
4
+ import { writeFileSync } from "fs";
5
+ import { dirname } from "path";
6
+ import generate from "@babel/generator";
7
+ import { unused } from "./unused";
8
+ import traverse from "@babel/traverse";
9
+
10
+ export const writeAstToFile = (
11
+ outPath: string,
12
+ program: t.Statement[],
13
+ filename: string,
14
+ removeUnusedImports = false,
15
+ isTsDisable = false,
16
+ isEslintDisable = false
17
+ ) => {
18
+ const ast = t.program(program);
19
+ const content = generate(ast).code;
20
+
21
+ if (removeUnusedImports) {
22
+ const plugins: ParserPlugin[] = ["typescript"];
23
+ const newAst = parse(content, {
24
+ sourceType: "module",
25
+ plugins,
26
+ });
27
+ traverse(newAst, unused);
28
+ const content2 = generate(newAst).code;
29
+ writeContentToFile(
30
+ outPath,
31
+ content2,
32
+ filename,
33
+ isTsDisable,
34
+ isEslintDisable
35
+ );
36
+ } else {
37
+ writeContentToFile(
38
+ outPath,
39
+ content,
40
+ filename,
41
+ isTsDisable,
42
+ isEslintDisable
43
+ );
44
+ }
45
+ };
46
+
47
+ export const writeContentToFile = (
48
+ outPath: string,
49
+ content: string,
50
+ filename: string,
51
+ isTsDisable = false,
52
+ isEslintDisable = false
53
+ ) => {
54
+ let esLintPrefix = "";
55
+ let tsLintPrefix = "";
56
+
57
+ let nameWithoutPath = filename.replace(outPath, "");
58
+ // strip off leading slash
59
+ if (nameWithoutPath.startsWith("/"))
60
+ nameWithoutPath = nameWithoutPath.replace(/^\//, "");
61
+
62
+ if (isTsDisable) {
63
+ tsLintPrefix = `//@ts-nocheck\n`;
64
+ }
65
+
66
+ if (isEslintDisable) {
67
+ esLintPrefix = `/* eslint-disable */\n`;
68
+ }
69
+
70
+ const text = tsLintPrefix + esLintPrefix + content;
71
+ mkdirp(dirname(filename));
72
+ writeFileSync(filename, text);
73
+ };
@@ -79,9 +79,7 @@ export const findQueryMsg = (schemas) => {
79
79
 
80
80
  export const findExecuteMsg = (schemas) => {
81
81
  const ExecuteMsg = schemas.find(schema =>
82
- schema.title === 'ExecuteMsg' ||
83
- schema.title === 'ExecuteMsg_for_Empty' || // if cleanse is used, this is never
84
- schema.title === 'ExecuteMsgForEmpty'
82
+ schema.title.startsWith('ExecuteMsg')
85
83
  );
86
84
  return ExecuteMsg;
87
85
  };