wasm-ast-types 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,7 +16,7 @@ const getTypeStrFromRef = $ref => {
16
16
  }
17
17
  };
18
18
 
19
- const getTypeFromRef = $ref => {
19
+ export const getTypeFromRef = $ref => {
20
20
  switch ($ref) {
21
21
  case '#/definitions/Binary':
22
22
  return t.tsTypeReference(t.identifier('Binary'));
@@ -34,8 +34,16 @@ const getArrayTypeFromRef = $ref => {
34
34
  return t.tsArrayType(getTypeFromRef($ref));
35
35
  };
36
36
 
37
- const getArrayTypeFromType = type => {
38
- return t.tsArrayType(getType(type));
37
+ const getArrayTypeFromItems = items => {
38
+ if (items.type === 'array') {
39
+ if (Array.isArray(items.items)) {
40
+ return t.tsArrayType(t.tsArrayType(getType(items.items[0].type)));
41
+ } else {
42
+ return t.tsArrayType(getArrayTypeFromItems(items.items));
43
+ }
44
+ }
45
+
46
+ return t.tsArrayType(getType(items.type));
39
47
  };
40
48
 
41
49
  export const getType = type => {
@@ -48,8 +56,6 @@ export const getType = type => {
48
56
 
49
57
  case 'integer':
50
58
  return t.tsNumberKeyword();
51
- // case 'object':
52
- // return t.tsObjectKeyword();
53
59
 
54
60
  default:
55
61
  throw new Error('contact maintainers [unknown type]: ' + type);
@@ -101,7 +107,7 @@ export const getPropertyType = (schema, prop) => {
101
107
  } else if (info.items.title) {
102
108
  type = t.tsArrayType(t.tsTypeReference(t.identifier(info.items.title)));
103
109
  } else if (info.items.type) {
104
- type = getArrayTypeFromType(info.items.type);
110
+ type = getArrayTypeFromItems(info.items);
105
111
  } else {
106
112
  throw new Error('[info.items] case not handled by transpiler. contact maintainers.');
107
113
  }
@@ -144,65 +150,72 @@ export const getPropertyType = (schema, prop) => {
144
150
  optional
145
151
  };
146
152
  };
147
- export const createTypedObjectParams = (jsonschema, camelize = true) => {
148
- const keys = Object.keys(jsonschema.properties ?? {});
149
- if (!keys.length) return;
150
- const typedParams = keys.map(prop => {
151
- if (jsonschema.properties[prop].type === 'object') {
152
- if (jsonschema.properties[prop].title) {
153
- return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsTypeReference(t.identifier(jsonschema.properties[prop].title))));
154
- } else {
155
- throw new Error('createTypedObjectParams() contact maintainer');
156
- }
153
+ export function getPropertySignatureFromProp(jsonschema, prop, camelize) {
154
+ if (jsonschema.properties[prop].type === 'object') {
155
+ if (jsonschema.properties[prop].title) {
156
+ return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsTypeReference(t.identifier(jsonschema.properties[prop].title))));
157
+ } else {
158
+ throw new Error('createTypedObjectParams() contact maintainer');
157
159
  }
160
+ }
158
161
 
159
- if (Array.isArray(jsonschema.properties[prop].allOf)) {
160
- const isOptional = !jsonschema.required?.includes(prop);
161
- const unionTypes = jsonschema.properties[prop].allOf.map(el => {
162
- if (el.title) return el.title;
163
- if (el.$ref) return getTypeStrFromRef(el.$ref);
164
- return el.type;
165
- });
166
- const uniqUnionTypes = [...new Set(unionTypes)];
167
-
168
- if (uniqUnionTypes.length === 1) {
169
- return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsTypeReference(t.identifier(uniqUnionTypes[0]))), isOptional);
170
- } else {
171
- return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsUnionType(uniqUnionTypes.map(typ => t.tsTypeReference(t.identifier(typ))))), isOptional);
172
- }
173
- } else if (Array.isArray(jsonschema.properties[prop].oneOf)) {
174
- const isOptional = !jsonschema.required?.includes(prop);
175
- const unionTypes = jsonschema.properties[prop].oneOf.map(el => {
176
- if (el.title) return el.title;
177
- if (el.$ref) return getTypeStrFromRef(el.$ref);
178
- return el.type;
179
- });
180
- const uniqUnionTypes = [...new Set(unionTypes)];
181
-
182
- if (uniqUnionTypes.length === 1) {
183
- return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsTypeReference(t.identifier(uniqUnionTypes[0]))), isOptional);
184
- } else {
185
- return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsUnionType(uniqUnionTypes.map(typ => t.tsTypeReference(t.identifier(typ))))), isOptional);
186
- }
162
+ if (Array.isArray(jsonschema.properties[prop].allOf)) {
163
+ const isOptional = !jsonschema.required?.includes(prop);
164
+ const unionTypes = jsonschema.properties[prop].allOf.map(el => {
165
+ if (el.title) return el.title;
166
+ if (el.$ref) return getTypeStrFromRef(el.$ref);
167
+ return el.type;
168
+ });
169
+ const uniqUnionTypes = [...new Set(unionTypes)];
170
+
171
+ if (uniqUnionTypes.length === 1) {
172
+ return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsTypeReference(t.identifier(uniqUnionTypes[0]))), isOptional);
173
+ } else {
174
+ return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsUnionType(uniqUnionTypes.map(typ => t.tsTypeReference(t.identifier(typ))))), isOptional);
187
175
  }
188
-
189
- try {
190
- getPropertyType(jsonschema, prop);
191
- } catch (e) {
192
- console.log(e);
193
- console.log(jsonschema, prop);
176
+ } else if (Array.isArray(jsonschema.properties[prop].oneOf)) {
177
+ const isOptional = !jsonschema.required?.includes(prop);
178
+ const unionTypes = jsonschema.properties[prop].oneOf.map(el => {
179
+ if (el.title) return el.title;
180
+ if (el.$ref) return getTypeStrFromRef(el.$ref);
181
+ return el.type;
182
+ });
183
+ const uniqUnionTypes = [...new Set(unionTypes)];
184
+
185
+ if (uniqUnionTypes.length === 1) {
186
+ return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsTypeReference(t.identifier(uniqUnionTypes[0]))), isOptional);
187
+ } else {
188
+ return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(t.tsUnionType(uniqUnionTypes.map(typ => t.tsTypeReference(t.identifier(typ))))), isOptional);
194
189
  }
190
+ }
191
+
192
+ try {
193
+ getPropertyType(jsonschema, prop);
194
+ } catch (e) {
195
+ console.log(e);
196
+ console.log(jsonschema, prop);
197
+ }
198
+
199
+ const {
200
+ type,
201
+ optional
202
+ } = getPropertyType(jsonschema, prop);
203
+ return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(type), optional);
204
+ }
205
+ export const getParamsTypeAnnotation = (jsonschema, camelize = true) => {
206
+ const keys = Object.keys(jsonschema.properties ?? {});
207
+ if (!keys.length) return undefined;
208
+ const typedParams = keys.map(prop => getPropertySignatureFromProp(jsonschema, prop, camelize));
209
+ return t.tsTypeAnnotation(t.tsTypeLiteral([...typedParams]));
210
+ };
211
+ export const createTypedObjectParams = (jsonschema, camelize = true) => {
212
+ const keys = Object.keys(jsonschema.properties ?? {});
213
+ if (!keys.length) return; // const typedParams = keys.map(prop => getPropertySignatureFromProp(jsonschema, prop, camelize));
195
214
 
196
- const {
197
- type,
198
- optional
199
- } = getPropertyType(jsonschema, prop);
200
- return propertySignature(camelize ? camel(prop) : prop, t.tsTypeAnnotation(type), optional);
201
- });
202
215
  const params = keys.map(prop => {
203
216
  return t.objectProperty(camelize ? t.identifier(camel(prop)) : t.identifier(prop), camelize ? t.identifier(camel(prop)) : t.identifier(prop), false, true);
204
217
  });
205
218
  const obj = t.objectPattern([...params]);
206
- obj.typeAnnotation = t.tsTypeAnnotation(t.tsTypeLiteral([...typedParams]));
219
+ obj.typeAnnotation = getParamsTypeAnnotation(jsonschema, camelize);
207
220
  return obj;
208
221
  };
@@ -0,0 +1,24 @@
1
+ import generate from '@babel/generator';
2
+ import message from './../../../__fixtures__/arrays/schema/schema.json';
3
+ import { createQueryClass, createExecuteClass, createExecuteInterface, createTypeInterface } from './wasm';
4
+
5
+ const expectCode = ast => {
6
+ expect(generate(ast).code).toMatchSnapshot();
7
+ };
8
+
9
+ const printCode = ast => {
10
+ console.log(generate(ast).code);
11
+ };
12
+
13
+ it('execute_msg_for__empty', () => {
14
+ expectCode(createTypeInterface(message));
15
+ });
16
+ it('query classes', () => {
17
+ expectCode(createQueryClass('SG721QueryClient', 'SG721ReadOnlyInstance', message));
18
+ });
19
+ it('execute classes array types', () => {
20
+ expectCode(createExecuteClass('SG721Client', 'SG721Instance', null, message));
21
+ });
22
+ it('execute interfaces no extends', () => {
23
+ expectCode(createExecuteInterface('SG721Instance', null, message));
24
+ });
package/module/wasm.js CHANGED
@@ -27,6 +27,7 @@ export const createQueryClass = (className, implementsClassName, queryMsg) => {
27
27
  t.classMethod('constructor', t.identifier('constructor'), [typedIdentifier('client', t.tsTypeAnnotation(t.tsTypeReference(t.identifier('CosmWasmClient')))), typedIdentifier('contractAddress', t.tsTypeAnnotation(t.tsStringKeyword()))], t.blockStatement([// client/contract set
28
28
  t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('client'))), t.expressionStatement(t.assignmentExpression('=', t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.identifier('contractAddress'))), ...bindings])), ...methods], [t.tSExpressionWithTypeArguments(t.identifier(implementsClassName))]));
29
29
  };
30
+ export const CONSTANT_EXEC_PARAMS = [t.assignmentPattern(identifier('fee', t.tsTypeAnnotation(t.tsUnionType([t.tSNumberKeyword(), t.tsTypeReference(t.identifier('StdFee')), t.tsLiteralType(t.stringLiteral('auto'))])), false), t.stringLiteral('auto')), identifier('memo', t.tsTypeAnnotation(t.tsStringKeyword()), true), identifier('funds', t.tsTypeAnnotation(tsTypeOperator(t.tsArrayType(t.tsTypeReference(t.identifier('Coin'))), 'readonly')), true)];
30
31
  export const createWasmExecMethod = jsonschema => {
31
32
  const underscoreName = Object.keys(jsonschema.properties)[0];
32
33
  const methodName = camel(underscoreName);
@@ -35,9 +36,8 @@ export const createWasmExecMethod = jsonschema => {
35
36
  const args = Object.keys(properties).map(prop => {
36
37
  return t.objectProperty(t.identifier(prop), t.identifier(camel(prop)), false, prop === camel(prop));
37
38
  });
38
- const constantParams = [t.assignmentPattern(identifier('fee', t.tsTypeAnnotation(t.tsUnionType([t.tSNumberKeyword(), t.tsTypeReference(t.identifier('StdFee')), t.tsLiteralType(t.stringLiteral('auto'))])), false), t.stringLiteral('auto')), identifier('memo', t.tsTypeAnnotation(t.tsStringKeyword()), true), identifier('funds', t.tsTypeAnnotation(tsTypeOperator(t.tsArrayType(t.tsTypeReference(t.identifier('Coin'))), 'readonly')), true)];
39
39
  return t.classProperty(t.identifier(methodName), arrowFunctionExpression(obj ? [// props
40
- obj, ...constantParams] : constantParams, t.blockStatement([t.returnStatement(t.awaitExpression(t.callExpression(t.memberExpression(t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('execute')), [t.memberExpression(t.thisExpression(), t.identifier('sender')), t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.objectExpression([t.objectProperty(t.identifier(underscoreName), t.objectExpression([...args]))]), t.identifier('fee'), t.identifier('memo'), t.identifier('funds')])))]), // return type
40
+ obj, ...CONSTANT_EXEC_PARAMS] : CONSTANT_EXEC_PARAMS, t.blockStatement([t.returnStatement(t.awaitExpression(t.callExpression(t.memberExpression(t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('execute')), [t.memberExpression(t.thisExpression(), t.identifier('sender')), t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.objectExpression([t.objectProperty(t.identifier(underscoreName), t.objectExpression([...args]))]), t.identifier('fee'), t.identifier('memo'), t.identifier('funds')])))]), // return type
41
41
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier('ExecuteResult'))]))), true));
42
42
  };
43
43
  export const createExecuteClass = (className, implementsClassName, extendsClassName, execMsg) => {
@@ -81,13 +81,13 @@ export const createPropertyFunctionWithObjectParams = (methodName, responseType,
81
81
  };
82
82
  return t.tSPropertySignature(t.identifier(methodName), t.tsTypeAnnotation(func));
83
83
  };
84
+ export const FIXED_EXECUTE_PARAMS = [identifier('fee', t.tsTypeAnnotation(t.tsUnionType([t.tsNumberKeyword(), t.tsTypeReference(t.identifier('StdFee')), t.tsLiteralType(t.stringLiteral('auto'))])), true), identifier('memo', t.tsTypeAnnotation(t.tsStringKeyword()), true), identifier('funds', t.tsTypeAnnotation(tsTypeOperator(t.tsArrayType(t.tsTypeReference(t.identifier('Coin'))), 'readonly')), true)];
84
85
  export const createPropertyFunctionWithObjectParamsForExec = (methodName, responseType, jsonschema) => {
85
86
  const obj = createTypedObjectParams(jsonschema);
86
- const fixedParams = [identifier('fee', t.tsTypeAnnotation(t.tsUnionType([t.tsNumberKeyword(), t.tsTypeReference(t.identifier('StdFee')), t.tsLiteralType(t.stringLiteral('auto'))])), true), identifier('memo', t.tsTypeAnnotation(t.tsStringKeyword()), true), identifier('funds', t.tsTypeAnnotation(tsTypeOperator(t.tsArrayType(t.tsTypeReference(t.identifier('Coin'))), 'readonly')), true)];
87
87
  const func = {
88
88
  type: 'TSFunctionType',
89
89
  typeAnnotation: promiseTypeAnnotation(responseType),
90
- parameters: obj ? [obj, ...fixedParams] : fixedParams
90
+ parameters: obj ? [obj, ...FIXED_EXECUTE_PARAMS] : FIXED_EXECUTE_PARAMS
91
91
  };
92
92
  return t.tSPropertySignature(t.identifier(methodName), t.tsTypeAnnotation(func));
93
93
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wasm-ast-types",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "CosmWasm TypeScript AST generation",
5
5
  "author": "Dan Lynch <pyramation@gmail.com>",
6
6
  "homepage": "https://github.com/pyramation/cosmwasm-typescript-gen/tree/master/packages/wasm-ast-types#readme",
@@ -84,5 +84,5 @@
84
84
  "ast-stringify": "0.1.0",
85
85
  "case": "1.6.3"
86
86
  },
87
- "gitHead": "b0312f7e16b8fd1c4892da6d91d3f7cf6c1bd49e"
87
+ "gitHead": "871479982969e89f40b75ca5c85e8bed34a824da"
88
88
  }
@@ -1,5 +1,5 @@
1
1
  import * as t from '@babel/types';
2
- import { QueryMsg } from './types';
2
+ import { QueryMsg, ExecuteMsg } from './types';
3
3
 
4
4
  interface ReactQueryHooks {
5
5
  queryMsg: QueryMsg
@@ -18,6 +18,8 @@ interface ReactQueryHookQuery {
18
18
 
19
19
  export declare interface ReactQueryOptions {
20
20
  optionalClient?: boolean
21
+ v4?: boolean
22
+ mutations?: boolean
21
23
  }
22
24
  export declare const createReactQueryHooks: ({ queryMsg, contractName, QueryClient, options }: ReactQueryHooks) => any;
23
25
  export declare const createReactQueryHook: ({ hookName, hookParamsTypeName, responseType, hookKeyName, methodName, jsonschema }: ReactQueryHookQuery) => t.ExportNamedDeclaration;
@@ -28,4 +30,41 @@ interface ReactQueryHookQueryInterface {
28
30
  jsonschema: any;
29
31
  }
30
32
  export declare const createReactQueryHookInterface: ({ QueryClient, hookParamsTypeName, responseType, jsonschema }: ReactQueryHookQueryInterface) => t.ExportNamedDeclaration;
33
+
34
+ interface ReactQueryMutationHooks {
35
+ execMsg: ExecuteMsg
36
+ contractName: string
37
+ ExecuteClient: string
38
+ options?: ReactQueryOptions
39
+ }
40
+ export declare const createReactQueryMutationHooks: ({ execMsg, contractName, ExecuteClient, options }: ReactQueryMutationHooks) => any
41
+
42
+ interface ReactQueryMutationHook {
43
+ mutationHookName: string;
44
+ mutationHookParamsTypeName: string;
45
+ execMethodName: string;
46
+ execArgs: t.ObjectProperty[]
47
+ options?: ReactQueryOptions
48
+ }
49
+
50
+ export declare const createReactQueryMutationHook: ({
51
+ mutationHookName,
52
+ mutationHookParamsTypeName,
53
+ execMethodName,
54
+ execArgs,
55
+ options,
56
+ }: ReactQueryMutationHook) => any
57
+
58
+ interface ReactQueryMutationHookInterface {
59
+ ExecuteClient: string
60
+ mutationHookParamsTypeName: string;
61
+ jsonschema: any
62
+ }
63
+
64
+ export declare const createReactQueryMutationArgsInterface: ({
65
+ ExecuteClient,
66
+ mutationHookParamsTypeName,
67
+ jsonschema
68
+ }: ReactQueryMutationHookInterface) => t.ExportNamedDeclaration;
69
+
31
70
  export { };