wasm-ast-types 0.18.2 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- package/main/client/client.js +16 -7
- package/main/client/test/ts-client.issue-101.spec.js +27 -0
- package/main/client/test/ts-client.issue-98.test.js +30 -0
- package/main/context/context.js +59 -13
- package/main/context/imports.js +37 -15
- package/main/index.js +13 -0
- package/main/message-composer/message-composer.js +13 -4
- package/main/message-composer/message-composer.spec.js +14 -4
- package/main/msg-builder/index.js +18 -0
- package/main/msg-builder/msg-builder.js +68 -0
- package/main/msg-builder/msg-builder.spec.js +26 -0
- package/main/react-query/react-query.spec.js +11 -0
- package/main/utils/babel.js +56 -5
- package/main/utils/index.js +13 -0
- package/main/utils/ref.js +15 -0
- package/main/utils/types.js +10 -2
- package/module/client/client.js +18 -9
- package/module/client/test/ts-client.issue-101.spec.js +20 -0
- package/module/client/test/ts-client.issue-98.test.js +23 -0
- package/module/context/context.js +29 -6
- package/module/context/imports.js +33 -14
- package/module/index.js +2 -1
- package/module/message-composer/message-composer.js +13 -4
- package/module/message-composer/message-composer.spec.js +16 -7
- package/module/msg-builder/index.js +1 -0
- package/module/msg-builder/msg-builder.js +47 -0
- package/module/msg-builder/msg-builder.spec.js +17 -0
- package/module/react-query/react-query.spec.js +10 -0
- package/module/utils/babel.js +31 -5
- package/module/utils/index.js +2 -1
- package/module/utils/ref.js +4 -0
- package/module/utils/types.js +10 -3
- package/package.json +2 -2
- package/src/client/client.ts +29 -24
- package/src/client/test/__snapshots__/ts-client.issue-101.spec.ts.snap +47 -0
- package/src/client/test/__snapshots__/ts-client.issue-98.test.ts.snap +117 -0
- package/src/client/test/__snapshots__/ts-client.vectis.spec.ts.snap +8 -8
- package/src/client/test/ts-client.issue-101.spec.ts +37 -0
- package/src/client/test/ts-client.issue-98.test.ts +55 -0
- package/src/context/context.ts +45 -10
- package/src/context/imports.ts +49 -15
- package/src/index.ts +2 -1
- package/src/message-composer/__snapshots__/message-composer.spec.ts.snap +60 -0
- package/src/message-composer/message-composer.spec.ts +41 -20
- package/src/message-composer/message-composer.ts +13 -5
- package/src/msg-builder/__snapshots__/msg-builder.spec.ts.snap +270 -0
- package/src/msg-builder/index.ts +1 -0
- package/src/msg-builder/msg-builder.spec.ts +25 -0
- package/src/msg-builder/msg-builder.ts +119 -0
- package/src/react-query/__snapshots__/react-query.spec.ts.snap +45 -0
- package/src/react-query/react-query.spec.ts +17 -1
- package/src/react-query/react-query.ts +1 -1
- package/src/utils/babel.ts +34 -5
- package/src/utils/index.ts +1 -0
- package/src/utils/ref.ts +6 -0
- package/src/utils/types.ts +11 -4
- package/types/context/context.d.ts +30 -5
- package/types/context/imports.d.ts +7 -2
- package/types/index.d.ts +1 -0
- package/types/msg-builder/index.d.ts +1 -0
- package/types/msg-builder/msg-builder.d.ts +4 -0
- package/types/react-query/react-query.d.ts +11 -10
- package/types/recoil/recoil.d.ts +1 -1
- package/types/utils/babel.d.ts +3 -2
- package/types/utils/index.d.ts +1 -0
- package/types/utils/ref.d.ts +2 -0
package/src/client/client.ts
CHANGED
@@ -1,23 +1,19 @@
|
|
1
1
|
import * as t from '@babel/types';
|
2
|
-
import { camel
|
2
|
+
import { camel } from 'case';
|
3
3
|
import {
|
4
|
+
arrowFunctionExpression,
|
4
5
|
bindMethod,
|
5
|
-
typedIdentifier,
|
6
|
-
promiseTypeAnnotation,
|
7
6
|
classDeclaration,
|
8
7
|
classProperty,
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
getMessageProperties,
|
9
|
+
promiseTypeAnnotation,
|
10
|
+
typedIdentifier
|
11
|
+
} from '../utils';
|
12
12
|
|
13
|
-
import {
|
14
|
-
QueryMsg,
|
15
|
-
ExecuteMsg
|
16
|
-
} from '../types';
|
13
|
+
import { ExecuteMsg, JSONSchema, QueryMsg } from '../types';
|
17
14
|
|
18
|
-
import {
|
15
|
+
import { createTypedObjectParams, getPropertyType, getResponseType, getType } from '../utils/types';
|
19
16
|
import { RenderContext } from '../context';
|
20
|
-
import { JSONSchema } from '../types';
|
21
17
|
import { identifier, propertySignature } from '../utils/babel';
|
22
18
|
|
23
19
|
export const CONSTANT_EXEC_PARAMS = [
|
@@ -89,7 +85,7 @@ export const createWasmQueryMethod = (
|
|
89
85
|
const methodName = camel(underscoreName);
|
90
86
|
const responseType = getResponseType(context, underscoreName);
|
91
87
|
|
92
|
-
const
|
88
|
+
const param = createTypedObjectParams(
|
93
89
|
context,
|
94
90
|
jsonschema.properties[underscoreName]
|
95
91
|
);
|
@@ -99,13 +95,14 @@ export const createWasmQueryMethod = (
|
|
99
95
|
jsonschema.properties[underscoreName]
|
100
96
|
);
|
101
97
|
|
102
|
-
const
|
103
|
-
|
98
|
+
const msgAction = t.identifier(underscoreName);
|
99
|
+
// If the param is an identifier, we can just use it as is
|
100
|
+
const msgActionValue = param?.type === 'Identifier' ? t.identifier(param.name) : t.objectExpression(args)
|
104
101
|
|
105
102
|
return t.classProperty(
|
106
103
|
t.identifier(methodName),
|
107
104
|
arrowFunctionExpression(
|
108
|
-
|
105
|
+
param ? [param] : [],
|
109
106
|
t.blockStatement(
|
110
107
|
[
|
111
108
|
t.returnStatement(
|
@@ -120,7 +117,7 @@ export const createWasmQueryMethod = (
|
|
120
117
|
[
|
121
118
|
t.memberExpression(t.thisExpression(), t.identifier('contractAddress')),
|
122
119
|
t.objectExpression([
|
123
|
-
|
120
|
+
t.objectProperty(msgAction, msgActionValue)
|
124
121
|
])
|
125
122
|
]
|
126
123
|
)
|
@@ -237,9 +234,15 @@ export const getWasmMethodArgs = (
|
|
237
234
|
// only 1 degree $ref-lookup
|
238
235
|
if (!keys.length && jsonschema.$ref) {
|
239
236
|
const obj = context.refLookup(jsonschema.$ref);
|
237
|
+
// properties
|
240
238
|
if (obj) {
|
241
239
|
keys = Object.keys(obj.properties ?? {})
|
242
240
|
}
|
241
|
+
|
242
|
+
// tuple struct or otherwise, use the name of the reference
|
243
|
+
if (!keys.length && obj?.oneOf) {
|
244
|
+
// TODO????? ADAIR
|
245
|
+
}
|
243
246
|
}
|
244
247
|
|
245
248
|
const args = keys.map(prop => {
|
@@ -265,7 +268,7 @@ export const createWasmExecMethod = (
|
|
265
268
|
|
266
269
|
const underscoreName = Object.keys(jsonschema.properties)[0];
|
267
270
|
const methodName = camel(underscoreName);
|
268
|
-
const
|
271
|
+
const param = createTypedObjectParams(
|
269
272
|
context,
|
270
273
|
jsonschema.properties[underscoreName]
|
271
274
|
);
|
@@ -274,12 +277,16 @@ export const createWasmExecMethod = (
|
|
274
277
|
jsonschema.properties[underscoreName]
|
275
278
|
);
|
276
279
|
|
280
|
+
const msgAction = t.identifier(underscoreName);
|
281
|
+
// If the param is an identifier, we can just use it as is
|
282
|
+
const msgActionValue = param?.type === 'Identifier' ? t.identifier(param.name) : t.objectExpression(args)
|
283
|
+
|
277
284
|
return t.classProperty(
|
278
285
|
t.identifier(methodName),
|
279
286
|
arrowFunctionExpression(
|
280
|
-
|
287
|
+
param ? [
|
281
288
|
// props
|
282
|
-
|
289
|
+
param,
|
283
290
|
...CONSTANT_EXEC_PARAMS
|
284
291
|
] : CONSTANT_EXEC_PARAMS,
|
285
292
|
t.blockStatement(
|
@@ -306,10 +313,8 @@ export const createWasmExecMethod = (
|
|
306
313
|
t.objectExpression(
|
307
314
|
[
|
308
315
|
t.objectProperty(
|
309
|
-
|
310
|
-
|
311
|
-
...args
|
312
|
-
])
|
316
|
+
msgAction,
|
317
|
+
msgActionValue
|
313
318
|
)
|
314
319
|
|
315
320
|
]
|
@@ -0,0 +1,47 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`execute interfaces no extends 1`] = `
|
4
|
+
"export interface OwnershipInstance {
|
5
|
+
contractAddress: string;
|
6
|
+
sender: string;
|
7
|
+
setFactory: ({
|
8
|
+
newFactory
|
9
|
+
}: {
|
10
|
+
newFactory: string;
|
11
|
+
}, fee?: number | StdFee | \\"auto\\", memo?: string, funds?: Coin[]) => Promise<ExecuteResult>;
|
12
|
+
updateOwnership: (action: Action, fee?: number | StdFee | \\"auto\\", memo?: string, funds?: Coin[]) => Promise<ExecuteResult>;
|
13
|
+
}"
|
14
|
+
`;
|
15
|
+
|
16
|
+
exports[`ownership client with tuple 1`] = `
|
17
|
+
"export class OwnershipClient implements OwnershipInstance {
|
18
|
+
client: SigningCosmWasmClient;
|
19
|
+
sender: string;
|
20
|
+
contractAddress: string;
|
21
|
+
|
22
|
+
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
23
|
+
this.client = client;
|
24
|
+
this.sender = sender;
|
25
|
+
this.contractAddress = contractAddress;
|
26
|
+
this.setFactory = this.setFactory.bind(this);
|
27
|
+
this.updateOwnership = this.updateOwnership.bind(this);
|
28
|
+
}
|
29
|
+
|
30
|
+
setFactory = async ({
|
31
|
+
newFactory
|
32
|
+
}: {
|
33
|
+
newFactory: string;
|
34
|
+
}, fee: number | StdFee | \\"auto\\" = \\"auto\\", memo?: string, funds?: Coin[]): Promise<ExecuteResult> => {
|
35
|
+
return await this.client.execute(this.sender, this.contractAddress, {
|
36
|
+
set_factory: {
|
37
|
+
new_factory: newFactory
|
38
|
+
}
|
39
|
+
}, fee, memo, funds);
|
40
|
+
};
|
41
|
+
updateOwnership = async (action: Action, fee: number | StdFee | \\"auto\\" = \\"auto\\", memo?: string, funds?: Coin[]): Promise<ExecuteResult> => {
|
42
|
+
return await this.client.execute(this.sender, this.contractAddress, {
|
43
|
+
update_ownership: action
|
44
|
+
}, fee, memo, funds);
|
45
|
+
};
|
46
|
+
}"
|
47
|
+
`;
|
@@ -0,0 +1,117 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`execute classes array types 1`] = `
|
4
|
+
"export class SG721Client implements SG721Instance {
|
5
|
+
client: SigningCosmWasmClient;
|
6
|
+
sender: string;
|
7
|
+
contractAddress: string;
|
8
|
+
|
9
|
+
constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) {
|
10
|
+
this.client = client;
|
11
|
+
this.sender = sender;
|
12
|
+
this.contractAddress = contractAddress;
|
13
|
+
this.getConfig = this.getConfig.bind(this);
|
14
|
+
this.getPlugins = this.getPlugins.bind(this);
|
15
|
+
this.getPluginById = this.getPluginById.bind(this);
|
16
|
+
}
|
17
|
+
|
18
|
+
getConfig = async (fee: number | StdFee | \\"auto\\" = \\"auto\\", memo?: string, funds?: Coin[]): Promise<ExecuteResult> => {
|
19
|
+
return await this.client.execute(this.sender, this.contractAddress, {
|
20
|
+
get_config: {}
|
21
|
+
}, fee, memo, funds);
|
22
|
+
};
|
23
|
+
getPlugins = async ({
|
24
|
+
limit,
|
25
|
+
startAfter
|
26
|
+
}: {
|
27
|
+
limit?: number;
|
28
|
+
startAfter?: number;
|
29
|
+
}, fee: number | StdFee | \\"auto\\" = \\"auto\\", memo?: string, funds?: Coin[]): Promise<ExecuteResult> => {
|
30
|
+
return await this.client.execute(this.sender, this.contractAddress, {
|
31
|
+
get_plugins: {
|
32
|
+
limit,
|
33
|
+
start_after: startAfter
|
34
|
+
}
|
35
|
+
}, fee, memo, funds);
|
36
|
+
};
|
37
|
+
getPluginById = async ({
|
38
|
+
id
|
39
|
+
}: {
|
40
|
+
id: number;
|
41
|
+
}, fee: number | StdFee | \\"auto\\" = \\"auto\\", memo?: string, funds?: Coin[]): Promise<ExecuteResult> => {
|
42
|
+
return await this.client.execute(this.sender, this.contractAddress, {
|
43
|
+
get_plugin_by_id: {
|
44
|
+
id
|
45
|
+
}
|
46
|
+
}, fee, memo, funds);
|
47
|
+
};
|
48
|
+
}"
|
49
|
+
`;
|
50
|
+
|
51
|
+
exports[`execute interfaces no extends 1`] = `
|
52
|
+
"export interface SG721Instance {
|
53
|
+
contractAddress: string;
|
54
|
+
sender: string;
|
55
|
+
getConfig: (fee?: number | StdFee | \\"auto\\", memo?: string, funds?: Coin[]) => Promise<ExecuteResult>;
|
56
|
+
getPlugins: ({
|
57
|
+
limit,
|
58
|
+
startAfter
|
59
|
+
}: {
|
60
|
+
limit?: number;
|
61
|
+
startAfter?: number;
|
62
|
+
}, fee?: number | StdFee | \\"auto\\", memo?: string, funds?: Coin[]) => Promise<ExecuteResult>;
|
63
|
+
getPluginById: ({
|
64
|
+
id
|
65
|
+
}: {
|
66
|
+
id: number;
|
67
|
+
}, fee?: number | StdFee | \\"auto\\", memo?: string, funds?: Coin[]) => Promise<ExecuteResult>;
|
68
|
+
}"
|
69
|
+
`;
|
70
|
+
|
71
|
+
exports[`execute_msg_for__empty 1`] = `"export type QueryMsg = QueryMsg;"`;
|
72
|
+
|
73
|
+
exports[`query classes 1`] = `
|
74
|
+
"export class SG721QueryClient implements SG721ReadOnlyInstance {
|
75
|
+
client: CosmWasmClient;
|
76
|
+
contractAddress: string;
|
77
|
+
|
78
|
+
constructor(client: CosmWasmClient, contractAddress: string) {
|
79
|
+
this.client = client;
|
80
|
+
this.contractAddress = contractAddress;
|
81
|
+
this.getConfig = this.getConfig.bind(this);
|
82
|
+
this.getPlugins = this.getPlugins.bind(this);
|
83
|
+
this.getPluginById = this.getPluginById.bind(this);
|
84
|
+
}
|
85
|
+
|
86
|
+
getConfig = async (): Promise<GetConfigResponse> => {
|
87
|
+
return this.client.queryContractSmart(this.contractAddress, {
|
88
|
+
get_config: {}
|
89
|
+
});
|
90
|
+
};
|
91
|
+
getPlugins = async ({
|
92
|
+
limit,
|
93
|
+
startAfter
|
94
|
+
}: {
|
95
|
+
limit?: number;
|
96
|
+
startAfter?: number;
|
97
|
+
}): Promise<GetPluginsResponse> => {
|
98
|
+
return this.client.queryContractSmart(this.contractAddress, {
|
99
|
+
get_plugins: {
|
100
|
+
limit,
|
101
|
+
start_after: startAfter
|
102
|
+
}
|
103
|
+
});
|
104
|
+
};
|
105
|
+
getPluginById = async ({
|
106
|
+
id
|
107
|
+
}: {
|
108
|
+
id: number;
|
109
|
+
}): Promise<GetPluginByIdResponse> => {
|
110
|
+
return this.client.queryContractSmart(this.contractAddress, {
|
111
|
+
get_plugin_by_id: {
|
112
|
+
id
|
113
|
+
}
|
114
|
+
});
|
115
|
+
};
|
116
|
+
}"
|
117
|
+
`;
|
@@ -193,9 +193,9 @@ exports[`query classes 1`] = `
|
|
193
193
|
this.wasm = this.wasm.bind(this);
|
194
194
|
}
|
195
195
|
|
196
|
-
bank = async (): Promise<BankResponse> => {
|
196
|
+
bank = async (bankMsg: BankMsg): Promise<BankResponse> => {
|
197
197
|
return this.client.queryContractSmart(this.contractAddress, {
|
198
|
-
bank:
|
198
|
+
bank: bankMsg
|
199
199
|
});
|
200
200
|
};
|
201
201
|
custom = async (): Promise<CustomResponse> => {
|
@@ -203,19 +203,19 @@ exports[`query classes 1`] = `
|
|
203
203
|
custom: {}
|
204
204
|
});
|
205
205
|
};
|
206
|
-
staking = async (): Promise<StakingResponse> => {
|
206
|
+
staking = async (stakingMsg: StakingMsg): Promise<StakingResponse> => {
|
207
207
|
return this.client.queryContractSmart(this.contractAddress, {
|
208
|
-
staking:
|
208
|
+
staking: stakingMsg
|
209
209
|
});
|
210
210
|
};
|
211
|
-
distribution = async (): Promise<DistributionResponse> => {
|
211
|
+
distribution = async (distributionMsg: DistributionMsg): Promise<DistributionResponse> => {
|
212
212
|
return this.client.queryContractSmart(this.contractAddress, {
|
213
|
-
distribution:
|
213
|
+
distribution: distributionMsg
|
214
214
|
});
|
215
215
|
};
|
216
|
-
wasm = async (): Promise<WasmResponse> => {
|
216
|
+
wasm = async (wasmMsg: WasmMsg): Promise<WasmResponse> => {
|
217
217
|
return this.client.queryContractSmart(this.contractAddress, {
|
218
|
-
wasm:
|
218
|
+
wasm: wasmMsg
|
219
219
|
});
|
220
220
|
};
|
221
221
|
}"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import { createExecuteClass, createExecuteInterface } from '../client';
|
2
|
+
import { expectCode, makeContext } from '../../../test-utils';
|
3
|
+
import ownership from '../../../../../__fixtures__/basic/ownership.json';
|
4
|
+
|
5
|
+
|
6
|
+
// it('query classes', () => {
|
7
|
+
// const ctx = makeContext(cosmos_msg_for__empty);
|
8
|
+
// expectCode(createQueryClass(
|
9
|
+
// ctx,
|
10
|
+
// 'SG721QueryClient',
|
11
|
+
// 'SG721ReadOnlyInstance',
|
12
|
+
// cosmos_msg_for__empty
|
13
|
+
// ))
|
14
|
+
// });
|
15
|
+
|
16
|
+
it('execute interfaces no extends', () => {
|
17
|
+
const ctx = makeContext(ownership);
|
18
|
+
expectCode(createExecuteInterface(
|
19
|
+
ctx,
|
20
|
+
'OwnershipInstance',
|
21
|
+
null,
|
22
|
+
ownership
|
23
|
+
))
|
24
|
+
});
|
25
|
+
|
26
|
+
it('ownership client with tuple', () => {
|
27
|
+
const ctx = makeContext(ownership);
|
28
|
+
expectCode(createExecuteClass(
|
29
|
+
ctx,
|
30
|
+
'OwnershipClient',
|
31
|
+
'OwnershipInstance',
|
32
|
+
null,
|
33
|
+
ownership
|
34
|
+
))
|
35
|
+
});
|
36
|
+
|
37
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import contract from '../../../../../__fixtures__/issues/98/schema.json';
|
2
|
+
|
3
|
+
import {
|
4
|
+
createQueryClass,
|
5
|
+
createExecuteClass,
|
6
|
+
createExecuteInterface,
|
7
|
+
createTypeInterface
|
8
|
+
} from '../client'
|
9
|
+
import { expectCode, printCode, makeContext } from '../../../test-utils';
|
10
|
+
|
11
|
+
const message = contract.query
|
12
|
+
const ctx = makeContext(message);
|
13
|
+
|
14
|
+
it('execute_msg_for__empty', () => {
|
15
|
+
expectCode(createTypeInterface(
|
16
|
+
ctx,
|
17
|
+
message
|
18
|
+
))
|
19
|
+
})
|
20
|
+
|
21
|
+
|
22
|
+
it('query classes', () => {
|
23
|
+
expectCode(createQueryClass(
|
24
|
+
ctx,
|
25
|
+
'SG721QueryClient',
|
26
|
+
'SG721ReadOnlyInstance',
|
27
|
+
message
|
28
|
+
))
|
29
|
+
});
|
30
|
+
|
31
|
+
// it('query classes response', () => {
|
32
|
+
// expectCode(createTypeInterface(
|
33
|
+
// ctx,
|
34
|
+
// contract.responses.all_debt_shares
|
35
|
+
// ))
|
36
|
+
// });
|
37
|
+
|
38
|
+
it('execute classes array types', () => {
|
39
|
+
expectCode(createExecuteClass(
|
40
|
+
ctx,
|
41
|
+
'SG721Client',
|
42
|
+
'SG721Instance',
|
43
|
+
null,
|
44
|
+
message
|
45
|
+
))
|
46
|
+
});
|
47
|
+
|
48
|
+
it('execute interfaces no extends', () => {
|
49
|
+
expectCode(createExecuteInterface(
|
50
|
+
ctx,
|
51
|
+
'SG721Instance',
|
52
|
+
null,
|
53
|
+
message
|
54
|
+
))
|
55
|
+
});
|
package/src/context/context.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import { JSONSchema } from "../types";
|
2
|
-
import {
|
2
|
+
import { refLookup } from "../utils";
|
3
|
+
import { convertUtilsToImportList, getImportStatements, UtilMapping } from "./imports";
|
3
4
|
import deepmerge from "deepmerge";
|
4
5
|
|
5
6
|
/// Plugin Types
|
@@ -21,6 +22,9 @@ export interface TSClientOptions {
|
|
21
22
|
export interface MessageComposerOptions {
|
22
23
|
enabled?: boolean;
|
23
24
|
}
|
25
|
+
export interface MsgBuilderOptions {
|
26
|
+
enabled?: boolean;
|
27
|
+
}
|
24
28
|
export interface RecoilOptions {
|
25
29
|
enabled?: boolean;
|
26
30
|
}
|
@@ -52,19 +56,29 @@ export interface ContractInfo {
|
|
52
56
|
idlObject?: IDLObject;
|
53
57
|
};
|
54
58
|
export interface RenderOptions {
|
59
|
+
enabled?: boolean;
|
55
60
|
types?: TSTypesOptions;
|
56
61
|
recoil?: RecoilOptions;
|
57
62
|
messageComposer?: MessageComposerOptions;
|
63
|
+
msgBuilder?: MsgBuilderOptions;
|
58
64
|
client?: TSClientOptions;
|
59
65
|
reactQuery?: ReactQueryOptions;
|
60
66
|
}
|
61
67
|
|
62
|
-
|
68
|
+
|
69
|
+
export interface IContext {
|
70
|
+
refLookup($ref: string);
|
71
|
+
addUtil(util: string);
|
72
|
+
getImports(registeredUtils?: UtilMapping);
|
73
|
+
}
|
74
|
+
|
75
|
+
export interface IRenderContext<TOpt = RenderOptions> extends IContext {
|
63
76
|
contract: ContractInfo;
|
64
|
-
options:
|
77
|
+
options: TOpt;
|
65
78
|
}
|
66
79
|
|
67
80
|
export const defaultOptions: RenderOptions = {
|
81
|
+
enabled: true,
|
68
82
|
types: {
|
69
83
|
enabled: true,
|
70
84
|
aliasExecuteMsg: false
|
@@ -80,6 +94,9 @@ export const defaultOptions: RenderOptions = {
|
|
80
94
|
messageComposer: {
|
81
95
|
enabled: false
|
82
96
|
},
|
97
|
+
msgBuilder: {
|
98
|
+
enabled: false,
|
99
|
+
},
|
83
100
|
reactQuery: {
|
84
101
|
enabled: false,
|
85
102
|
optionalClient: false,
|
@@ -107,31 +124,49 @@ export const getDefinitionSchema = (schemas: JSONSchema[]): JSONSchema => {
|
|
107
124
|
|
108
125
|
return aggregateSchema;
|
109
126
|
};
|
110
|
-
|
127
|
+
|
128
|
+
/**
|
129
|
+
* context object for generating code.
|
130
|
+
* only mergeDefaultOpt needs to implementing for combine options and default options.
|
131
|
+
* @param TOpt option type
|
132
|
+
*/
|
133
|
+
export abstract class RenderContextBase<TOpt = RenderOptions> implements IRenderContext<TOpt> {
|
111
134
|
contract: ContractInfo;
|
112
135
|
utils: string[] = [];
|
113
136
|
schema: JSONSchema;
|
137
|
+
options: TOpt;
|
114
138
|
constructor(
|
115
139
|
contract: ContractInfo,
|
116
|
-
options?:
|
140
|
+
options?: TOpt
|
117
141
|
) {
|
118
142
|
this.contract = contract;
|
119
143
|
this.schema = getDefinitionSchema(contract.schemas);
|
120
|
-
this.options =
|
144
|
+
this.options = this.mergeDefaultOpt(options);
|
121
145
|
}
|
146
|
+
/**
|
147
|
+
* merge options and default options
|
148
|
+
* @param options
|
149
|
+
*/
|
150
|
+
abstract mergeDefaultOpt(options: TOpt): TOpt;
|
122
151
|
refLookup($ref: string) {
|
123
|
-
|
124
|
-
return this.schema.definitions?.[refName];
|
152
|
+
return refLookup($ref, this.schema)
|
125
153
|
}
|
126
154
|
addUtil(util: string) {
|
127
155
|
this.utils[util] = true;
|
128
156
|
}
|
129
|
-
getImports() {
|
157
|
+
getImports(registeredUtils?: UtilMapping) {
|
130
158
|
return getImportStatements(
|
131
159
|
convertUtilsToImportList(
|
132
160
|
this,
|
133
|
-
Object.keys(this.utils)
|
161
|
+
Object.keys(this.utils),
|
162
|
+
registeredUtils,
|
134
163
|
)
|
135
164
|
);
|
136
165
|
}
|
137
166
|
}
|
167
|
+
|
168
|
+
export class RenderContext extends RenderContextBase{
|
169
|
+
mergeDefaultOpt(options: RenderOptions): RenderOptions {
|
170
|
+
return deepmerge(defaultOptions, options ?? {});
|
171
|
+
}
|
172
|
+
}
|
package/src/context/imports.ts
CHANGED
@@ -2,6 +2,7 @@ import * as t from '@babel/types';
|
|
2
2
|
import { importAs, importStmt } from "../utils";
|
3
3
|
import { RenderContext } from './context';
|
4
4
|
|
5
|
+
|
5
6
|
export interface ImportObj {
|
6
7
|
type: 'import' | 'default' | 'namespace';
|
7
8
|
name: string;
|
@@ -9,6 +10,14 @@ export interface ImportObj {
|
|
9
10
|
importAs?: string;
|
10
11
|
}
|
11
12
|
|
13
|
+
export type GetUtilFn = (<TContext = RenderContext>(...args: any[]) => (context: TContext) => ImportObj);
|
14
|
+
export type UtilMapping = {
|
15
|
+
[key: string]:
|
16
|
+
| ImportObj
|
17
|
+
| string
|
18
|
+
| GetUtilFn
|
19
|
+
};
|
20
|
+
|
12
21
|
const makeReactQuerySwitch = (varName) => {
|
13
22
|
return (context: RenderContext) => {
|
14
23
|
switch (context.options.reactQuery.version) {
|
@@ -30,11 +39,11 @@ const makeReactQuerySwitch = (varName) => {
|
|
30
39
|
}
|
31
40
|
|
32
41
|
export const UTILS = {
|
42
|
+
selectorFamily: 'recoil',
|
33
43
|
MsgExecuteContract: 'cosmjs-types/cosmwasm/wasm/v1/tx',
|
34
44
|
MsgExecuteContractEncodeObject: 'cosmwasm',
|
35
45
|
Coin: '@cosmjs/amino',
|
36
46
|
toUtf8: '@cosmjs/encoding',
|
37
|
-
selectorFamily: 'recoil',
|
38
47
|
StdFee: '@cosmjs/amino',
|
39
48
|
CosmWasmClient: '@cosmjs/cosmwasm-stargate',
|
40
49
|
ExecuteResult: '@cosmjs/cosmwasm-stargate',
|
@@ -50,23 +59,48 @@ export const UTILS = {
|
|
50
59
|
|
51
60
|
export const convertUtilsToImportList = (
|
52
61
|
context: RenderContext,
|
53
|
-
utils: string[]
|
62
|
+
utils: string[],
|
63
|
+
registeredUtils?: UtilMapping
|
54
64
|
): ImportObj[] => {
|
55
|
-
return utils.map(util => {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
return UTILS[util](context);
|
65
|
-
} else {
|
66
|
-
UTILS[util];
|
65
|
+
return utils.map((util) => {
|
66
|
+
let result = null;
|
67
|
+
|
68
|
+
if(registeredUtils){
|
69
|
+
result = convertUtil(context, util, registeredUtils);
|
70
|
+
|
71
|
+
if (result) {
|
72
|
+
return result;
|
73
|
+
}
|
67
74
|
}
|
75
|
+
|
76
|
+
result = convertUtil(context, util, UTILS);
|
77
|
+
|
78
|
+
if (result) {
|
79
|
+
return result;
|
80
|
+
}
|
81
|
+
|
82
|
+
throw new Error(`missing Util! ::[${util}]`);
|
68
83
|
});
|
69
|
-
}
|
84
|
+
};
|
85
|
+
|
86
|
+
export const convertUtil = (
|
87
|
+
context: RenderContext,
|
88
|
+
util: string,
|
89
|
+
registeredUtils: object
|
90
|
+
): ImportObj => {
|
91
|
+
if (!registeredUtils.hasOwnProperty(util)) return null;
|
92
|
+
if (typeof registeredUtils[util] === 'string') {
|
93
|
+
return {
|
94
|
+
type: 'import',
|
95
|
+
path: registeredUtils[util],
|
96
|
+
name: util
|
97
|
+
};
|
98
|
+
} else if (typeof registeredUtils[util] === 'function') {
|
99
|
+
return registeredUtils[util](context);
|
100
|
+
} else {
|
101
|
+
return registeredUtils[util];
|
102
|
+
}
|
103
|
+
};
|
70
104
|
|
71
105
|
export const getImportStatements = (list: ImportObj[]) => {
|
72
106
|
const imports = list.reduce((m, obj) => {
|
package/src/index.ts
CHANGED