wasm-ast-types 0.19.0 → 0.20.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 (30) hide show
  1. package/main/client/client.js +16 -7
  2. package/main/client/test/ts-client.issue-101.spec.js +27 -0
  3. package/main/message-composer/message-composer.js +13 -4
  4. package/main/message-composer/message-composer.spec.js +14 -4
  5. package/main/msg-builder/msg-builder.js +21 -7
  6. package/main/msg-builder/msg-builder.spec.js +7 -1
  7. package/main/react-query/react-query.spec.js +11 -0
  8. package/main/utils/types.js +10 -2
  9. package/module/client/client.js +18 -9
  10. package/module/client/test/ts-client.issue-101.spec.js +20 -0
  11. package/module/message-composer/message-composer.js +13 -4
  12. package/module/message-composer/message-composer.spec.js +16 -7
  13. package/module/msg-builder/msg-builder.js +26 -12
  14. package/module/msg-builder/msg-builder.spec.js +6 -1
  15. package/module/react-query/react-query.spec.js +10 -0
  16. package/module/utils/types.js +10 -3
  17. package/package.json +2 -2
  18. package/src/client/client.ts +29 -24
  19. package/src/client/test/__snapshots__/ts-client.issue-101.spec.ts.snap +47 -0
  20. package/src/client/test/__snapshots__/ts-client.vectis.spec.ts.snap +8 -8
  21. package/src/client/test/ts-client.issue-101.spec.ts +37 -0
  22. package/src/message-composer/__snapshots__/message-composer.spec.ts.snap +60 -0
  23. package/src/message-composer/message-composer.spec.ts +41 -20
  24. package/src/message-composer/message-composer.ts +13 -5
  25. package/src/msg-builder/__snapshots__/msg-builder.spec.ts.snap +21 -0
  26. package/src/msg-builder/msg-builder.spec.ts +9 -1
  27. package/src/msg-builder/msg-builder.ts +36 -24
  28. package/src/react-query/__snapshots__/react-query.spec.ts.snap +45 -0
  29. package/src/react-query/react-query.spec.ts +17 -1
  30. package/src/utils/types.ts +11 -4
@@ -34,10 +34,12 @@ var createWasmQueryMethod = function createWasmQueryMethod(context, jsonschema)
34
34
  var underscoreName = Object.keys(jsonschema.properties)[0];
35
35
  var methodName = (0, _case.camel)(underscoreName);
36
36
  var responseType = (0, _types2.getResponseType)(context, underscoreName);
37
- var obj = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
37
+ var param = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
38
38
  var args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]);
39
- var actionArg = t.objectProperty(t.identifier(underscoreName), t.objectExpression(args));
40
- return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)(obj ? [obj] : [], t.blockStatement([t.returnStatement(t.callExpression(t.memberExpression(t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('queryContractSmart')), [t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.objectExpression([actionArg])]))]), t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier(responseType))]))), true));
39
+ var msgAction = t.identifier(underscoreName); // If the param is an identifier, we can just use it as is
40
+
41
+ var msgActionValue = (param === null || param === void 0 ? void 0 : param.type) === 'Identifier' ? t.identifier(param.name) : t.objectExpression(args);
42
+ return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)(param ? [param] : [], t.blockStatement([t.returnStatement(t.callExpression(t.memberExpression(t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('queryContractSmart')), [t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.objectExpression([t.objectProperty(msgAction, msgActionValue)])]))]), t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier(responseType))]))), true));
41
43
  };
42
44
 
43
45
  exports.createWasmQueryMethod = createWasmQueryMethod;
@@ -68,12 +70,16 @@ var getWasmMethodArgs = function getWasmMethodArgs(context, jsonschema) {
68
70
  var keys = Object.keys((_jsonschema$propertie = jsonschema.properties) !== null && _jsonschema$propertie !== void 0 ? _jsonschema$propertie : {}); // only 1 degree $ref-lookup
69
71
 
70
72
  if (!keys.length && jsonschema.$ref) {
71
- var obj = context.refLookup(jsonschema.$ref);
73
+ var obj = context.refLookup(jsonschema.$ref); // properties
72
74
 
73
75
  if (obj) {
74
76
  var _obj$properties;
75
77
 
76
78
  keys = Object.keys((_obj$properties = obj.properties) !== null && _obj$properties !== void 0 ? _obj$properties : {});
79
+ } // tuple struct or otherwise, use the name of the reference
80
+
81
+
82
+ if (!keys.length && obj !== null && obj !== void 0 && obj.oneOf) {// TODO????? ADAIR
77
83
  }
78
84
  }
79
85
 
@@ -91,10 +97,13 @@ var createWasmExecMethod = function createWasmExecMethod(context, jsonschema) {
91
97
  context.addUtil('Coin');
92
98
  var underscoreName = Object.keys(jsonschema.properties)[0];
93
99
  var methodName = (0, _case.camel)(underscoreName);
94
- var obj = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
100
+ var param = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
95
101
  var args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]);
96
- return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)(obj ? [// props
97
- obj].concat(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((0, _toConsumableArray2["default"])(args)))]), t.identifier('fee'), t.identifier('memo'), t.identifier('funds')])))]), // return type
102
+ var msgAction = t.identifier(underscoreName); // If the param is an identifier, we can just use it as is
103
+
104
+ var msgActionValue = (param === null || param === void 0 ? void 0 : param.type) === 'Identifier' ? t.identifier(param.name) : t.objectExpression(args);
105
+ return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)(param ? [// props
106
+ param].concat(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(msgAction, msgActionValue)]), t.identifier('fee'), t.identifier('memo'), t.identifier('funds')])))]), // return type
98
107
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier('ExecuteResult'))]))), true));
99
108
  };
100
109
 
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _client = require("../client");
6
+
7
+ var _testUtils = require("../../../test-utils");
8
+
9
+ var _ownership = _interopRequireDefault(require("../../../../../__fixtures__/basic/ownership.json"));
10
+
11
+ // it('query classes', () => {
12
+ // const ctx = makeContext(cosmos_msg_for__empty);
13
+ // expectCode(createQueryClass(
14
+ // ctx,
15
+ // 'SG721QueryClient',
16
+ // 'SG721ReadOnlyInstance',
17
+ // cosmos_msg_for__empty
18
+ // ))
19
+ // });
20
+ it('execute interfaces no extends', function () {
21
+ var ctx = (0, _testUtils.makeContext)(_ownership["default"]);
22
+ (0, _testUtils.expectCode)((0, _client.createExecuteInterface)(ctx, 'OwnershipInstance', null, _ownership["default"]));
23
+ });
24
+ it('ownership client with tuple', function () {
25
+ var ctx = (0, _testUtils.makeContext)(_ownership["default"]);
26
+ (0, _testUtils.expectCode)((0, _client.createExecuteClass)(ctx, 'OwnershipClient', 'OwnershipInstance', null, _ownership["default"]));
27
+ });
@@ -34,11 +34,20 @@ var createWasmExecMethodMessageComposer = function createWasmExecMethodMessageCo
34
34
  context.addUtil('toUtf8');
35
35
  var underscoreName = Object.keys(jsonschema.properties)[0];
36
36
  var methodName = (0, _case.camel)(underscoreName);
37
- var obj = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
38
- var args = (0, _client.getWasmMethodArgs)(context, jsonschema.properties[underscoreName]);
37
+ var param = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
38
+ var args = (0, _client.getWasmMethodArgs)(context, jsonschema.properties[underscoreName]); // what the underscore named property in the message is assigned to
39
+
40
+ var actionValue;
41
+
42
+ if ((param === null || param === void 0 ? void 0 : param.type) === 'Identifier') {
43
+ actionValue = t.identifier(param.name);
44
+ } else {
45
+ actionValue = t.objectExpression(args);
46
+ }
47
+
39
48
  var constantParams = [(0, _babel.identifier)('funds', t.tsTypeAnnotation(t.tsArrayType(t.tsTypeReference(t.identifier('Coin')))), true)];
40
- return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)(obj ? [// props
41
- obj].concat(constantParams) : constantParams, t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier('typeUrl'), t.stringLiteral('/cosmwasm.wasm.v1.MsgExecuteContract')), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.identifier('MsgExecuteContract'), t.identifier('fromPartial')), [t.objectExpression([t.objectProperty(t.identifier('sender'), t.memberExpression(t.thisExpression(), t.identifier('sender'))), t.objectProperty(t.identifier('contract'), t.memberExpression(t.thisExpression(), t.identifier('contractAddress'))), t.objectProperty(t.identifier('msg'), t.callExpression(t.identifier('toUtf8'), [t.callExpression(t.memberExpression(t.identifier('JSON'), t.identifier('stringify')), [t.objectExpression([t.objectProperty(t.identifier(underscoreName), t.objectExpression(args))])])])), t.objectProperty(t.identifier('funds'), t.identifier('funds'), false, true)])]))]))]), // return type
49
+ return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)(param ? [// props
50
+ param].concat(constantParams) : constantParams, t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier('typeUrl'), t.stringLiteral('/cosmwasm.wasm.v1.MsgExecuteContract')), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.identifier('MsgExecuteContract'), t.identifier('fromPartial')), [t.objectExpression([t.objectProperty(t.identifier('sender'), t.memberExpression(t.thisExpression(), t.identifier('sender'))), t.objectProperty(t.identifier('contract'), t.memberExpression(t.thisExpression(), t.identifier('contractAddress'))), t.objectProperty(t.identifier('msg'), t.callExpression(t.identifier('toUtf8'), [t.callExpression(t.memberExpression(t.identifier('JSON'), t.identifier('stringify')), [t.objectExpression([t.objectProperty(t.identifier(underscoreName), actionValue)])])])), t.objectProperty(t.identifier('funds'), t.identifier('funds'), false, true)])]))]))]), // return type
42
51
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier('MsgExecuteContractEncodeObject'))), false));
43
52
  };
44
53
 
@@ -4,15 +4,25 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
 
5
5
  var _execute_msg_for__empty = _interopRequireDefault(require("../../../../__fixtures__/basic/execute_msg_for__empty.json"));
6
6
 
7
+ var _ownership = _interopRequireDefault(require("../../../../__fixtures__/basic/ownership.json"));
8
+
7
9
  var _messageComposer = require("./message-composer");
8
10
 
9
11
  var _testUtils = require("../../test-utils");
10
12
 
11
- it('execute classes', function () {
13
+ it("execute classes", function () {
12
14
  var ctx = (0, _testUtils.makeContext)(_execute_msg_for__empty["default"]);
13
- (0, _testUtils.expectCode)((0, _messageComposer.createMessageComposerClass)(ctx, 'SG721MessageComposer', 'SG721Message', _execute_msg_for__empty["default"]));
15
+ (0, _testUtils.expectCode)((0, _messageComposer.createMessageComposerClass)(ctx, "SG721MessageComposer", "SG721Message", _execute_msg_for__empty["default"]));
14
16
  });
15
- it('createMessageComposerInterface', function () {
17
+ it("createMessageComposerInterface", function () {
16
18
  var ctx = (0, _testUtils.makeContext)(_execute_msg_for__empty["default"]);
17
- (0, _testUtils.expectCode)((0, _messageComposer.createMessageComposerInterface)(ctx, 'SG721Message', _execute_msg_for__empty["default"]));
19
+ (0, _testUtils.expectCode)((0, _messageComposer.createMessageComposerInterface)(ctx, "SG721Message", _execute_msg_for__empty["default"]));
20
+ });
21
+ it("ownershipClass", function () {
22
+ var ctx = (0, _testUtils.makeContext)(_ownership["default"]);
23
+ (0, _testUtils.expectCode)((0, _messageComposer.createMessageComposerClass)(ctx, "OwnershipMessageComposer", "OwnershipMessage", _ownership["default"]));
24
+ });
25
+ it("ownershipInterface", function () {
26
+ var ownershipCtx = (0, _testUtils.makeContext)(_ownership["default"]);
27
+ (0, _testUtils.expectCode)((0, _messageComposer.createMessageComposerInterface)(ownershipCtx, "OwnershipMessage", _ownership["default"]));
18
28
  });
@@ -36,19 +36,33 @@ var createMsgBuilderClass = function createMsgBuilderClass(context, className, m
36
36
  exports.createMsgBuilderClass = createMsgBuilderClass;
37
37
 
38
38
  function createExtractTypeAnnotation(underscoreName, msgTitle) {
39
- return t.tsTypeAnnotation(t.tsTypeReference(t.identifier("CamelCasedProperties"), t.tsTypeParameterInstantiation([t.tsIndexedAccessType(t.tsTypeReference(t.identifier("Extract"), t.tsTypeParameterInstantiation([t.tsTypeReference(t.identifier(msgTitle)), t.tsTypeLiteral([t.tsPropertySignature(t.identifier(underscoreName), t.tsTypeAnnotation(t.tsUnknownKeyword()))])])), t.tsLiteralType(t.stringLiteral(underscoreName)))])));
39
+ return t.tsTypeAnnotation(t.tsTypeReference(t.identifier('CamelCasedProperties'), t.tsTypeParameterInstantiation([t.tsIndexedAccessType(t.tsTypeReference(t.identifier('Extract'), t.tsTypeParameterInstantiation([t.tsTypeReference(t.identifier(msgTitle)), t.tsTypeLiteral([t.tsPropertySignature(t.identifier(underscoreName), t.tsTypeAnnotation(t.tsUnknownKeyword()))])])), t.tsLiteralType(t.stringLiteral(underscoreName)))])));
40
40
  }
41
41
 
42
42
  var createStaticExecMethodMsgBuilder = function createStaticExecMethodMsgBuilder(context, jsonschema, msgTitle) {
43
43
  var underscoreName = Object.keys(jsonschema.properties)[0];
44
44
  var methodName = (0, _case.camel)(underscoreName);
45
- var obj = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
46
- var args = (0, _client.getWasmMethodArgs)(context, jsonschema.properties[underscoreName]);
47
- if (obj) obj.typeAnnotation = createExtractTypeAnnotation(underscoreName, msgTitle);
45
+ var param = (0, _types2.createTypedObjectParams)(context, jsonschema.properties[underscoreName]);
46
+ var args = (0, _client.getWasmMethodArgs)(context, jsonschema.properties[underscoreName]); // what the underscore named property in the message is assigned to
47
+
48
+ var actionValue;
49
+
50
+ if ((param === null || param === void 0 ? void 0 : param.type) === 'Identifier') {
51
+ actionValue = t.identifier(param.name);
52
+ } else {
53
+ actionValue = t.tsAsExpression(t.objectExpression(args), t.tsTypeReference(t.identifier('const')));
54
+ } // TODO: this is a hack to get the type annotation to work
55
+ // all type annotations in the future should be the extracted and camelized type
56
+
57
+
58
+ if (param && param.typeAnnotation.type === 'TSTypeAnnotation' && param.typeAnnotation.typeAnnotation.type === 'TSTypeLiteral') {
59
+ param.typeAnnotation = createExtractTypeAnnotation(underscoreName, msgTitle);
60
+ }
61
+
48
62
  return t.classProperty(t.identifier(methodName), (0, _utils.arrowFunctionExpression)( // params
49
- obj ? [// props
50
- obj] : [], // body
51
- t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier(underscoreName), t.tsAsExpression(t.objectExpression(args), t.tsTypeReference(t.identifier('const'))))]))]), // return type
63
+ param ? [// props
64
+ param] : [], // body
65
+ t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier(underscoreName), actionValue)]))]), // return type
52
66
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier(msgTitle))), false), null, null, false, // static
53
67
  true);
54
68
  };
@@ -6,6 +6,8 @@ var _execute_msg_for__empty = _interopRequireDefault(require("../../../../__fixt
6
6
 
7
7
  var _query_msg = _interopRequireDefault(require("../../../../__fixtures__/basic/query_msg.json"));
8
8
 
9
+ var _ownership = _interopRequireDefault(require("../../../../__fixtures__/basic/ownership.json"));
10
+
9
11
  var _msgBuilder = require("./msg-builder");
10
12
 
11
13
  var _testUtils = require("../../test-utils");
@@ -15,6 +17,10 @@ it('execute class', function () {
15
17
  (0, _testUtils.expectCode)((0, _msgBuilder.createMsgBuilderClass)(ctx, 'SG721MsgBuilder', _execute_msg_for__empty["default"]));
16
18
  });
17
19
  it('query class', function () {
18
- var ctx = (0, _testUtils.makeContext)(_execute_msg_for__empty["default"]);
20
+ var ctx = (0, _testUtils.makeContext)(_query_msg["default"]);
19
21
  (0, _testUtils.expectCode)((0, _msgBuilder.createMsgBuilderClass)(ctx, 'SG721MsgBuilder', _query_msg["default"]));
22
+ });
23
+ it('ownership', function () {
24
+ var ctx = (0, _testUtils.makeContext)(_ownership["default"]);
25
+ (0, _testUtils.expectCode)((0, _msgBuilder.createMsgBuilderClass)(ctx, 'Ownership', _ownership["default"]));
20
26
  });
@@ -10,6 +10,8 @@ var _query_msg = _interopRequireDefault(require("../../../../__fixtures__/basic/
10
10
 
11
11
  var _execute_msg_for__empty = _interopRequireDefault(require("../../../../__fixtures__/basic/execute_msg_for__empty.json"));
12
12
 
13
+ var _ownership = _interopRequireDefault(require("../../../../__fixtures__/basic/ownership.json"));
14
+
13
15
  var _reactQuery = require("./react-query");
14
16
 
15
17
  var _testUtils = require("../../test-utils");
@@ -77,4 +79,13 @@ it('createReactQueryHooks', function () {
77
79
  contractName: 'Sg721',
78
80
  ExecuteClient: 'Sg721Client'
79
81
  })));
82
+ });
83
+ it('ownership', function () {
84
+ var ownershipCtx = (0, _testUtils.makeContext)(_ownership["default"]);
85
+ (0, _testUtils.expectCode)(t.program((0, _reactQuery.createReactQueryMutationHooks)({
86
+ context: ownershipCtx,
87
+ execMsg: _ownership["default"],
88
+ contractName: 'Ownership',
89
+ ExecuteClient: 'OwnershipClient'
90
+ })));
80
91
  });
@@ -400,9 +400,17 @@ var createTypedObjectParams = function createTypedObjectParams(context, jsonsche
400
400
  if (!keys.length) {
401
401
  // is there a ref?
402
402
  if (jsonschema.$ref) {
403
- var _obj = context.refLookup(jsonschema.$ref);
403
+ var _obj = context.refLookup(jsonschema.$ref); // If there is a oneOf, then we need to create a type for it
404
404
 
405
- if (_obj) {
405
+
406
+ if (_obj !== null && _obj !== void 0 && _obj.oneOf) {
407
+ // the actual type of the ref
408
+ var refType = jsonschema.$ref.split('/').pop();
409
+ var refName = (0, _case.camel)(refType);
410
+ var id = t.identifier(refName);
411
+ id.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(refType)));
412
+ return id;
413
+ } else if (_obj) {
406
414
  return createTypedObjectParams(context, _obj, camelize);
407
415
  }
408
416
  } // no results...
@@ -1,7 +1,7 @@
1
1
  import * as t from '@babel/types';
2
2
  import { camel } from 'case';
3
- import { bindMethod, typedIdentifier, promiseTypeAnnotation, classDeclaration, classProperty, arrowFunctionExpression, getMessageProperties } from '../utils';
4
- import { getPropertyType, getType, createTypedObjectParams, getResponseType } from '../utils/types';
3
+ import { arrowFunctionExpression, bindMethod, classDeclaration, classProperty, getMessageProperties, promiseTypeAnnotation, typedIdentifier } from '../utils';
4
+ import { createTypedObjectParams, getPropertyType, getResponseType, getType } from '../utils/types';
5
5
  import { identifier, propertySignature } from '../utils/babel';
6
6
  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(t.tsArrayType(t.tsTypeReference(t.identifier('Coin')))), true)];
7
7
  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(t.tsArrayType(t.tsTypeReference(t.identifier('Coin')))), true)];
@@ -9,10 +9,12 @@ export const createWasmQueryMethod = (context, jsonschema) => {
9
9
  const underscoreName = Object.keys(jsonschema.properties)[0];
10
10
  const methodName = camel(underscoreName);
11
11
  const responseType = getResponseType(context, underscoreName);
12
- const obj = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
12
+ const param = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
13
13
  const args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]);
14
- const actionArg = t.objectProperty(t.identifier(underscoreName), t.objectExpression(args));
15
- return t.classProperty(t.identifier(methodName), arrowFunctionExpression(obj ? [obj] : [], t.blockStatement([t.returnStatement(t.callExpression(t.memberExpression(t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('queryContractSmart')), [t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.objectExpression([actionArg])]))]), t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier(responseType))]))), true));
14
+ const msgAction = t.identifier(underscoreName); // If the param is an identifier, we can just use it as is
15
+
16
+ const msgActionValue = param?.type === 'Identifier' ? t.identifier(param.name) : t.objectExpression(args);
17
+ return t.classProperty(t.identifier(methodName), arrowFunctionExpression(param ? [param] : [], t.blockStatement([t.returnStatement(t.callExpression(t.memberExpression(t.memberExpression(t.thisExpression(), t.identifier('client')), t.identifier('queryContractSmart')), [t.memberExpression(t.thisExpression(), t.identifier('contractAddress')), t.objectExpression([t.objectProperty(msgAction, msgActionValue)])]))]), t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier(responseType))]))), true));
16
18
  };
17
19
  export const createQueryClass = (context, className, implementsClassName, queryMsg) => {
18
20
  context.addUtil('CosmWasmClient');
@@ -31,10 +33,14 @@ export const getWasmMethodArgs = (context, jsonschema) => {
31
33
  let keys = Object.keys(jsonschema.properties ?? {}); // only 1 degree $ref-lookup
32
34
 
33
35
  if (!keys.length && jsonschema.$ref) {
34
- const obj = context.refLookup(jsonschema.$ref);
36
+ const obj = context.refLookup(jsonschema.$ref); // properties
35
37
 
36
38
  if (obj) {
37
39
  keys = Object.keys(obj.properties ?? {});
40
+ } // tuple struct or otherwise, use the name of the reference
41
+
42
+
43
+ if (!keys.length && obj?.oneOf) {// TODO????? ADAIR
38
44
  }
39
45
  }
40
46
 
@@ -49,10 +55,13 @@ export const createWasmExecMethod = (context, jsonschema) => {
49
55
  context.addUtil('Coin');
50
56
  const underscoreName = Object.keys(jsonschema.properties)[0];
51
57
  const methodName = camel(underscoreName);
52
- const obj = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
58
+ const param = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
53
59
  const args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]);
54
- return t.classProperty(t.identifier(methodName), arrowFunctionExpression(obj ? [// props
55
- 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
60
+ const msgAction = t.identifier(underscoreName); // If the param is an identifier, we can just use it as is
61
+
62
+ const msgActionValue = param?.type === 'Identifier' ? t.identifier(param.name) : t.objectExpression(args);
63
+ return t.classProperty(t.identifier(methodName), arrowFunctionExpression(param ? [// props
64
+ param, ...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(msgAction, msgActionValue)]), t.identifier('fee'), t.identifier('memo'), t.identifier('funds')])))]), // return type
56
65
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier('Promise'), t.tsTypeParameterInstantiation([t.tSTypeReference(t.identifier('ExecuteResult'))]))), true));
57
66
  };
58
67
  export const createExecuteClass = (context, className, implementsClassName, extendsClassName, execMsg) => {
@@ -0,0 +1,20 @@
1
+ import { createExecuteClass, createExecuteInterface } from '../client';
2
+ import { expectCode, makeContext } from '../../../test-utils';
3
+ import ownership from '../../../../../__fixtures__/basic/ownership.json'; // it('query classes', () => {
4
+ // const ctx = makeContext(cosmos_msg_for__empty);
5
+ // expectCode(createQueryClass(
6
+ // ctx,
7
+ // 'SG721QueryClient',
8
+ // 'SG721ReadOnlyInstance',
9
+ // cosmos_msg_for__empty
10
+ // ))
11
+ // });
12
+
13
+ it('execute interfaces no extends', () => {
14
+ const ctx = makeContext(ownership);
15
+ expectCode(createExecuteInterface(ctx, 'OwnershipInstance', null, ownership));
16
+ });
17
+ it('ownership client with tuple', () => {
18
+ const ctx = makeContext(ownership);
19
+ expectCode(createExecuteClass(ctx, 'OwnershipClient', 'OwnershipInstance', null, ownership));
20
+ });
@@ -12,11 +12,20 @@ const createWasmExecMethodMessageComposer = (context, jsonschema) => {
12
12
  context.addUtil('toUtf8');
13
13
  const underscoreName = Object.keys(jsonschema.properties)[0];
14
14
  const methodName = camel(underscoreName);
15
- const obj = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
16
- const args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]);
15
+ const param = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
16
+ const args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]); // what the underscore named property in the message is assigned to
17
+
18
+ let actionValue;
19
+
20
+ if (param?.type === 'Identifier') {
21
+ actionValue = t.identifier(param.name);
22
+ } else {
23
+ actionValue = t.objectExpression(args);
24
+ }
25
+
17
26
  const constantParams = [identifier('funds', t.tsTypeAnnotation(t.tsArrayType(t.tsTypeReference(t.identifier('Coin')))), true)];
18
- return t.classProperty(t.identifier(methodName), arrowFunctionExpression(obj ? [// props
19
- obj, ...constantParams] : constantParams, t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier('typeUrl'), t.stringLiteral('/cosmwasm.wasm.v1.MsgExecuteContract')), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.identifier('MsgExecuteContract'), t.identifier('fromPartial')), [t.objectExpression([t.objectProperty(t.identifier('sender'), t.memberExpression(t.thisExpression(), t.identifier('sender'))), t.objectProperty(t.identifier('contract'), t.memberExpression(t.thisExpression(), t.identifier('contractAddress'))), t.objectProperty(t.identifier('msg'), t.callExpression(t.identifier('toUtf8'), [t.callExpression(t.memberExpression(t.identifier('JSON'), t.identifier('stringify')), [t.objectExpression([t.objectProperty(t.identifier(underscoreName), t.objectExpression(args))])])])), t.objectProperty(t.identifier('funds'), t.identifier('funds'), false, true)])]))]))]), // return type
27
+ return t.classProperty(t.identifier(methodName), arrowFunctionExpression(param ? [// props
28
+ param, ...constantParams] : constantParams, t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier('typeUrl'), t.stringLiteral('/cosmwasm.wasm.v1.MsgExecuteContract')), t.objectProperty(t.identifier('value'), t.callExpression(t.memberExpression(t.identifier('MsgExecuteContract'), t.identifier('fromPartial')), [t.objectExpression([t.objectProperty(t.identifier('sender'), t.memberExpression(t.thisExpression(), t.identifier('sender'))), t.objectProperty(t.identifier('contract'), t.memberExpression(t.thisExpression(), t.identifier('contractAddress'))), t.objectProperty(t.identifier('msg'), t.callExpression(t.identifier('toUtf8'), [t.callExpression(t.memberExpression(t.identifier('JSON'), t.identifier('stringify')), [t.objectExpression([t.objectProperty(t.identifier(underscoreName), actionValue)])])])), t.objectProperty(t.identifier('funds'), t.identifier('funds'), false, true)])]))]))]), // return type
20
29
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier('MsgExecuteContractEncodeObject'))), false));
21
30
  };
22
31
 
@@ -1,11 +1,20 @@
1
- import execute_msg from '../../../../__fixtures__/basic/execute_msg_for__empty.json';
2
- import { createMessageComposerClass, createMessageComposerInterface } from './message-composer';
3
- import { expectCode, makeContext } from '../../test-utils';
4
- it('execute classes', () => {
1
+ import execute_msg from "../../../../__fixtures__/basic/execute_msg_for__empty.json";
2
+ import ownership from "../../../../__fixtures__/basic/ownership.json";
3
+ import { createMessageComposerClass, createMessageComposerInterface } from "./message-composer";
4
+ import { expectCode, makeContext } from "../../test-utils";
5
+ it("execute classes", () => {
5
6
  const ctx = makeContext(execute_msg);
6
- expectCode(createMessageComposerClass(ctx, 'SG721MessageComposer', 'SG721Message', execute_msg));
7
+ expectCode(createMessageComposerClass(ctx, "SG721MessageComposer", "SG721Message", execute_msg));
7
8
  });
8
- it('createMessageComposerInterface', () => {
9
+ it("createMessageComposerInterface", () => {
9
10
  const ctx = makeContext(execute_msg);
10
- expectCode(createMessageComposerInterface(ctx, 'SG721Message', execute_msg));
11
+ expectCode(createMessageComposerInterface(ctx, "SG721Message", execute_msg));
12
+ });
13
+ it("ownershipClass", () => {
14
+ const ctx = makeContext(ownership);
15
+ expectCode(createMessageComposerClass(ctx, "OwnershipMessageComposer", "OwnershipMessage", ownership));
16
+ });
17
+ it("ownershipInterface", () => {
18
+ const ownershipCtx = makeContext(ownership);
19
+ expectCode(createMessageComposerInterface(ownershipCtx, "OwnershipMessage", ownership));
11
20
  });
@@ -1,8 +1,8 @@
1
- import * as t from "@babel/types";
2
- import { camel } from "case";
3
- import { abstractClassDeclaration, arrowFunctionExpression, getMessageProperties } from "../utils";
4
- import { createTypedObjectParams } from "../utils/types";
5
- import { getWasmMethodArgs } from "../client/client";
1
+ import * as t from '@babel/types';
2
+ import { camel } from 'case';
3
+ import { abstractClassDeclaration, arrowFunctionExpression, getMessageProperties } from '../utils';
4
+ import { createTypedObjectParams } from '../utils/types';
5
+ import { getWasmMethodArgs } from '../client/client';
6
6
  export const createMsgBuilderClass = (context, className, msg) => {
7
7
  const staticMethods = getMessageProperties(msg).map(schema => {
8
8
  return createStaticExecMethodMsgBuilder(context, schema, msg.title);
@@ -15,19 +15,33 @@ export const createMsgBuilderClass = (context, className, msg) => {
15
15
  */
16
16
 
17
17
  function createExtractTypeAnnotation(underscoreName, msgTitle) {
18
- return t.tsTypeAnnotation(t.tsTypeReference(t.identifier("CamelCasedProperties"), t.tsTypeParameterInstantiation([t.tsIndexedAccessType(t.tsTypeReference(t.identifier("Extract"), t.tsTypeParameterInstantiation([t.tsTypeReference(t.identifier(msgTitle)), t.tsTypeLiteral([t.tsPropertySignature(t.identifier(underscoreName), t.tsTypeAnnotation(t.tsUnknownKeyword()))])])), t.tsLiteralType(t.stringLiteral(underscoreName)))])));
18
+ return t.tsTypeAnnotation(t.tsTypeReference(t.identifier('CamelCasedProperties'), t.tsTypeParameterInstantiation([t.tsIndexedAccessType(t.tsTypeReference(t.identifier('Extract'), t.tsTypeParameterInstantiation([t.tsTypeReference(t.identifier(msgTitle)), t.tsTypeLiteral([t.tsPropertySignature(t.identifier(underscoreName), t.tsTypeAnnotation(t.tsUnknownKeyword()))])])), t.tsLiteralType(t.stringLiteral(underscoreName)))])));
19
19
  }
20
20
 
21
21
  const createStaticExecMethodMsgBuilder = (context, jsonschema, msgTitle) => {
22
22
  const underscoreName = Object.keys(jsonschema.properties)[0];
23
23
  const methodName = camel(underscoreName);
24
- const obj = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
25
- const args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]);
26
- if (obj) obj.typeAnnotation = createExtractTypeAnnotation(underscoreName, msgTitle);
24
+ const param = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
25
+ const args = getWasmMethodArgs(context, jsonschema.properties[underscoreName]); // what the underscore named property in the message is assigned to
26
+
27
+ let actionValue;
28
+
29
+ if (param?.type === 'Identifier') {
30
+ actionValue = t.identifier(param.name);
31
+ } else {
32
+ actionValue = t.tsAsExpression(t.objectExpression(args), t.tsTypeReference(t.identifier('const')));
33
+ } // TODO: this is a hack to get the type annotation to work
34
+ // all type annotations in the future should be the extracted and camelized type
35
+
36
+
37
+ if (param && param.typeAnnotation.type === 'TSTypeAnnotation' && param.typeAnnotation.typeAnnotation.type === 'TSTypeLiteral') {
38
+ param.typeAnnotation = createExtractTypeAnnotation(underscoreName, msgTitle);
39
+ }
40
+
27
41
  return t.classProperty(t.identifier(methodName), arrowFunctionExpression( // params
28
- obj ? [// props
29
- obj] : [], // body
30
- t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier(underscoreName), t.tsAsExpression(t.objectExpression(args), t.tsTypeReference(t.identifier('const'))))]))]), // return type
42
+ param ? [// props
43
+ param] : [], // body
44
+ t.blockStatement([t.returnStatement(t.objectExpression([t.objectProperty(t.identifier(underscoreName), actionValue)]))]), // return type
31
45
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier(msgTitle))), false), null, null, false, // static
32
46
  true);
33
47
  };
@@ -1,5 +1,6 @@
1
1
  import execute_msg from '../../../../__fixtures__/basic/execute_msg_for__empty.json';
2
2
  import query_msg from '../../../../__fixtures__/basic/query_msg.json';
3
+ import ownership from '../../../../__fixtures__/basic/ownership.json';
3
4
  import { createMsgBuilderClass } from './msg-builder';
4
5
  import { expectCode, makeContext } from '../../test-utils';
5
6
  it('execute class', () => {
@@ -7,6 +8,10 @@ it('execute class', () => {
7
8
  expectCode(createMsgBuilderClass(ctx, 'SG721MsgBuilder', execute_msg));
8
9
  });
9
10
  it('query class', () => {
10
- const ctx = makeContext(execute_msg);
11
+ const ctx = makeContext(query_msg);
11
12
  expectCode(createMsgBuilderClass(ctx, 'SG721MsgBuilder', query_msg));
13
+ });
14
+ it('ownership', () => {
15
+ const ctx = makeContext(ownership);
16
+ expectCode(createMsgBuilderClass(ctx, 'Ownership', ownership));
12
17
  });
@@ -1,6 +1,7 @@
1
1
  import * as t from '@babel/types';
2
2
  import query_msg from '../../../../__fixtures__/basic/query_msg.json';
3
3
  import execute_msg from '../../../../__fixtures__/basic/execute_msg_for__empty.json';
4
+ import ownership from '../../../../__fixtures__/basic/ownership.json';
4
5
  import { createReactQueryHooks, createReactQueryMutationHooks } from './react-query';
5
6
  import { expectCode, makeContext } from '../../test-utils';
6
7
  const execCtx = makeContext(execute_msg);
@@ -62,4 +63,13 @@ it('createReactQueryHooks', () => {
62
63
  contractName: 'Sg721',
63
64
  ExecuteClient: 'Sg721Client'
64
65
  })));
66
+ });
67
+ it('ownership', () => {
68
+ const ownershipCtx = makeContext(ownership);
69
+ expectCode(t.program(createReactQueryMutationHooks({
70
+ context: ownershipCtx,
71
+ execMsg: ownership,
72
+ contractName: 'Ownership',
73
+ ExecuteClient: 'OwnershipClient'
74
+ })));
65
75
  });
@@ -322,9 +322,16 @@ export const createTypedObjectParams = (context, jsonschema, camelize = true) =>
322
322
  if (!keys.length) {
323
323
  // is there a ref?
324
324
  if (jsonschema.$ref) {
325
- const obj = context.refLookup(jsonschema.$ref);
326
-
327
- if (obj) {
325
+ const obj = context.refLookup(jsonschema.$ref); // If there is a oneOf, then we need to create a type for it
326
+
327
+ if (obj?.oneOf) {
328
+ // the actual type of the ref
329
+ const refType = jsonschema.$ref.split('/').pop();
330
+ const refName = camel(refType);
331
+ const id = t.identifier(refName);
332
+ id.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(refType)));
333
+ return id;
334
+ } else if (obj) {
328
335
  return createTypedObjectParams(context, obj, camelize);
329
336
  }
330
337
  } // no results...
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wasm-ast-types",
3
- "version": "0.19.0",
3
+ "version": "0.20.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",
@@ -88,5 +88,5 @@
88
88
  "case": "1.6.3",
89
89
  "deepmerge": "4.2.2"
90
90
  },
91
- "gitHead": "dccd0edd182dc4d5e58b30e7f46732e0be483bc1"
91
+ "gitHead": "d2edba320c63e2db5fe2db0bfb1f4cd5e44f2188"
92
92
  }
@@ -1,23 +1,19 @@
1
1
  import * as t from '@babel/types';
2
- import { camel, pascal } from 'case';
2
+ import { camel } from 'case';
3
3
  import {
4
+ arrowFunctionExpression,
4
5
  bindMethod,
5
- typedIdentifier,
6
- promiseTypeAnnotation,
7
6
  classDeclaration,
8
7
  classProperty,
9
- arrowFunctionExpression,
10
- getMessageProperties
11
- } from '../utils'
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 { getPropertyType, getType, createTypedObjectParams, getResponseType } from '../utils/types';
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 obj = createTypedObjectParams(
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 actionArg =
103
- t.objectProperty(t.identifier(underscoreName), t.objectExpression(args));
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
- obj ? [obj] : [],
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
- actionArg
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 obj = createTypedObjectParams(
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
- obj ? [
287
+ param ? [
281
288
  // props
282
- obj,
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
- t.identifier(underscoreName),
310
- t.objectExpression([
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
+ `;
@@ -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
+
@@ -269,3 +269,63 @@ exports[`execute classes 1`] = `
269
269
  };
270
270
  }"
271
271
  `;
272
+
273
+ exports[`ownershipClass 1`] = `
274
+ "export class OwnershipMessageComposer implements OwnershipMessage {
275
+ sender: string;
276
+ contractAddress: string;
277
+
278
+ constructor(sender: string, contractAddress: string) {
279
+ this.sender = sender;
280
+ this.contractAddress = contractAddress;
281
+ this.setFactory = this.setFactory.bind(this);
282
+ this.updateOwnership = this.updateOwnership.bind(this);
283
+ }
284
+
285
+ setFactory = ({
286
+ newFactory
287
+ }: {
288
+ newFactory: string;
289
+ }, funds?: Coin[]): MsgExecuteContractEncodeObject => {
290
+ return {
291
+ typeUrl: \\"/cosmwasm.wasm.v1.MsgExecuteContract\\",
292
+ value: MsgExecuteContract.fromPartial({
293
+ sender: this.sender,
294
+ contract: this.contractAddress,
295
+ msg: toUtf8(JSON.stringify({
296
+ set_factory: {
297
+ new_factory: newFactory
298
+ }
299
+ })),
300
+ funds
301
+ })
302
+ };
303
+ };
304
+ updateOwnership = (action: Action, funds?: Coin[]): MsgExecuteContractEncodeObject => {
305
+ return {
306
+ typeUrl: \\"/cosmwasm.wasm.v1.MsgExecuteContract\\",
307
+ value: MsgExecuteContract.fromPartial({
308
+ sender: this.sender,
309
+ contract: this.contractAddress,
310
+ msg: toUtf8(JSON.stringify({
311
+ update_ownership: action
312
+ })),
313
+ funds
314
+ })
315
+ };
316
+ };
317
+ }"
318
+ `;
319
+
320
+ exports[`ownershipInterface 1`] = `
321
+ "export interface OwnershipMessage {
322
+ contractAddress: string;
323
+ sender: string;
324
+ setFactory: ({
325
+ newFactory
326
+ }: {
327
+ newFactory: string;
328
+ }, funds?: Coin[]) => MsgExecuteContractEncodeObject;
329
+ updateOwnership: (action: Action, funds?: Coin[]) => MsgExecuteContractEncodeObject;
330
+ }"
331
+ `;
@@ -1,25 +1,46 @@
1
- import execute_msg from '../../../../__fixtures__/basic/execute_msg_for__empty.json';
1
+ import execute_msg from "../../../../__fixtures__/basic/execute_msg_for__empty.json";
2
+ import ownership from "../../../../__fixtures__/basic/ownership.json";
3
+
2
4
  import {
3
- createMessageComposerClass,
4
- createMessageComposerInterface
5
- } from './message-composer'
6
- import { expectCode, makeContext } from '../../test-utils';
5
+ createMessageComposerClass,
6
+ createMessageComposerInterface,
7
+ } from "./message-composer";
8
+ import { expectCode, makeContext } from "../../test-utils";
9
+ import * as t from "@babel/types";
10
+ import { createReactQueryMutationHooks } from "../react-query";
11
+
12
+ it("execute classes", () => {
13
+ const ctx = makeContext(execute_msg);
14
+ expectCode(
15
+ createMessageComposerClass(
16
+ ctx,
17
+ "SG721MessageComposer",
18
+ "SG721Message",
19
+ execute_msg
20
+ )
21
+ );
22
+ });
23
+
24
+ it("createMessageComposerInterface", () => {
25
+ const ctx = makeContext(execute_msg);
26
+ expectCode(createMessageComposerInterface(ctx, "SG721Message", execute_msg));
27
+ });
7
28
 
8
- it('execute classes', () => {
9
- const ctx = makeContext(execute_msg);
10
- expectCode(createMessageComposerClass(
11
- ctx,
12
- 'SG721MessageComposer',
13
- 'SG721Message',
14
- execute_msg
15
- ))
29
+ it("ownershipClass", () => {
30
+ const ctx = makeContext(ownership);
31
+ expectCode(
32
+ createMessageComposerClass(
33
+ ctx,
34
+ "OwnershipMessageComposer",
35
+ "OwnershipMessage",
36
+ ownership
37
+ )
38
+ );
16
39
  });
17
40
 
18
- it('createMessageComposerInterface', () => {
19
- const ctx = makeContext(execute_msg);
20
- expectCode(createMessageComposerInterface(
21
- ctx,
22
- 'SG721Message',
23
- execute_msg
24
- ))
41
+ it("ownershipInterface", () => {
42
+ const ownershipCtx = makeContext(ownership);
43
+ expectCode(
44
+ createMessageComposerInterface(ownershipCtx, "OwnershipMessage", ownership)
45
+ );
25
46
  });
@@ -14,6 +14,7 @@ import { JSONSchema } from '../types';
14
14
  import { RenderContext } from '../context';
15
15
  import { identifier } from '../utils/babel';
16
16
  import { getWasmMethodArgs } from '../client/client';
17
+ import { Expression } from '@babel/types';
17
18
 
18
19
  const createWasmExecMethodMessageComposer = (
19
20
  context: RenderContext,
@@ -27,12 +28,20 @@ const createWasmExecMethodMessageComposer = (
27
28
 
28
29
  const underscoreName = Object.keys(jsonschema.properties)[0];
29
30
  const methodName = camel(underscoreName);
30
- const obj = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
31
+ const param = createTypedObjectParams(context, jsonschema.properties[underscoreName]);
31
32
  const args = getWasmMethodArgs(
32
33
  context,
33
34
  jsonschema.properties[underscoreName]
34
35
  );
35
36
 
37
+ // what the underscore named property in the message is assigned to
38
+ let actionValue: Expression
39
+ if (param?.type === 'Identifier') {
40
+ actionValue = t.identifier(param.name);
41
+ } else {
42
+ actionValue = t.objectExpression(args)
43
+ }
44
+
36
45
  const constantParams = [
37
46
  identifier('funds', t.tsTypeAnnotation(
38
47
  t.tsArrayType(
@@ -46,9 +55,9 @@ const createWasmExecMethodMessageComposer = (
46
55
  return t.classProperty(
47
56
  t.identifier(methodName),
48
57
  arrowFunctionExpression(
49
- obj ? [
58
+ param ? [
50
59
  // props
51
- obj,
60
+ param,
52
61
  ...constantParams
53
62
  ] : constantParams,
54
63
  t.blockStatement(
@@ -95,10 +104,9 @@ const createWasmExecMethodMessageComposer = (
95
104
  ),
96
105
  [
97
106
  t.objectExpression(
98
-
99
107
  [
100
108
  t.objectProperty(
101
- t.identifier(underscoreName), t.objectExpression(args)
109
+ t.identifier(underscoreName), actionValue
102
110
  )
103
111
  ]
104
112
 
@@ -113,6 +113,27 @@ exports[`execute class 1`] = `
113
113
  }"
114
114
  `;
115
115
 
116
+ exports[`ownership 1`] = `
117
+ "export abstract class Ownership {
118
+ static setFactory = ({
119
+ newFactory
120
+ }: CamelCasedProperties<Extract<ExecuteMsg, {
121
+ set_factory: unknown;
122
+ }>[\\"set_factory\\"]>): ExecuteMsg => {
123
+ return {
124
+ set_factory: ({
125
+ new_factory: newFactory
126
+ } as const)
127
+ };
128
+ };
129
+ static updateOwnership = (action: Action): ExecuteMsg => {
130
+ return {
131
+ update_ownership: action
132
+ };
133
+ };
134
+ }"
135
+ `;
136
+
116
137
  exports[`query class 1`] = `
117
138
  "export abstract class SG721MsgBuilder {
118
139
  static ownerOf = ({
@@ -1,9 +1,12 @@
1
1
  import execute_msg from '../../../../__fixtures__/basic/execute_msg_for__empty.json';
2
2
  import query_msg from '../../../../__fixtures__/basic/query_msg.json';
3
+ import ownership from '../../../../__fixtures__/basic/ownership.json';
4
+
3
5
  import {
4
6
  createMsgBuilderClass,
5
7
  } from './msg-builder'
6
8
  import { expectCode, makeContext } from '../../test-utils';
9
+ import { findExecuteMsg } from '@cosmwasm/ts-codegen/src';
7
10
 
8
11
  it('execute class', () => {
9
12
  const ctx = makeContext(execute_msg);
@@ -12,6 +15,11 @@ it('execute class', () => {
12
15
 
13
16
 
14
17
  it('query class', () => {
15
- const ctx = makeContext(execute_msg);
18
+ const ctx = makeContext(query_msg);
16
19
  expectCode(createMsgBuilderClass(ctx, 'SG721MsgBuilder', query_msg))
17
20
  });
21
+
22
+ it('ownership', () => {
23
+ const ctx = makeContext(ownership);
24
+ expectCode(createMsgBuilderClass(ctx, 'Ownership', ownership))
25
+ });
@@ -1,16 +1,11 @@
1
- import * as t from "@babel/types";
2
- import { camel } from "case";
3
- import {
4
- abstractClassDeclaration,
5
- arrowFunctionExpression,
6
- bindMethod,
7
- classDeclaration,
8
- getMessageProperties,
9
- } from "../utils";
10
- import { ExecuteMsg, QueryMsg } from "../types";
11
- import { createTypedObjectParams } from "../utils/types";
12
- import { RenderContext } from "../context";
13
- import { getWasmMethodArgs } from "../client/client";
1
+ import * as t from '@babel/types';
2
+ import { camel } from 'case';
3
+ import { abstractClassDeclaration, arrowFunctionExpression, getMessageProperties } from '../utils';
4
+ import { ExecuteMsg, QueryMsg } from '../types';
5
+ import { createTypedObjectParams } from '../utils/types';
6
+ import { RenderContext } from '../context';
7
+ import { getWasmMethodArgs } from '../client/client';
8
+ import { Expression, Identifier, PatternLike, TSAsExpression } from '@babel/types';
14
9
 
15
10
  export const createMsgBuilderClass = (
16
11
  context: RenderContext,
@@ -34,10 +29,10 @@ export const createMsgBuilderClass = (
34
29
  function createExtractTypeAnnotation(underscoreName: string, msgTitle: string) {
35
30
  return t.tsTypeAnnotation(
36
31
  t.tsTypeReference(
37
- t.identifier("CamelCasedProperties"),
32
+ t.identifier('CamelCasedProperties'),
38
33
  t.tsTypeParameterInstantiation([
39
34
  t.tsIndexedAccessType(
40
- t.tsTypeReference(t.identifier("Extract"),
35
+ t.tsTypeReference(t.identifier('Extract'),
41
36
  t.tsTypeParameterInstantiation([
42
37
  t.tsTypeReference(t.identifier(msgTitle)),
43
38
  t.tsTypeLiteral([
@@ -62,7 +57,7 @@ const createStaticExecMethodMsgBuilder = (
62
57
  ) => {
63
58
  const underscoreName = Object.keys(jsonschema.properties)[0];
64
59
  const methodName = camel(underscoreName);
65
- const obj = createTypedObjectParams(
60
+ const param = createTypedObjectParams(
66
61
  context,
67
62
  jsonschema.properties[underscoreName]
68
63
  );
@@ -71,17 +66,34 @@ const createStaticExecMethodMsgBuilder = (
71
66
  jsonschema.properties[underscoreName]
72
67
  );
73
68
 
74
- if (obj) obj.typeAnnotation = createExtractTypeAnnotation(underscoreName, msgTitle)
69
+ // what the underscore named property in the message is assigned to
70
+ let actionValue: Expression
71
+ if (param?.type === 'Identifier') {
72
+ actionValue = t.identifier(param.name);
73
+ } else {
74
+ actionValue = t.tsAsExpression(t.objectExpression(args), t.tsTypeReference(t.identifier('const')));
75
+ }
76
+
77
+
78
+ // TODO: this is a hack to get the type annotation to work
79
+ // all type annotations in the future should be the extracted and camelized type
80
+ if (
81
+ param &&
82
+ param.typeAnnotation.type === 'TSTypeAnnotation' &&
83
+ param.typeAnnotation.typeAnnotation.type === 'TSTypeLiteral'
84
+ ) {
85
+ param.typeAnnotation = createExtractTypeAnnotation(underscoreName, msgTitle);
86
+ }
75
87
 
76
88
  return t.classProperty(
77
89
  t.identifier(methodName),
78
90
  arrowFunctionExpression(
79
91
  // params
80
- obj
92
+ param
81
93
  ? [
82
- // props
83
- obj,
84
- ]
94
+ // props
95
+ param
96
+ ]
85
97
  : [],
86
98
  // body
87
99
  t.blockStatement([
@@ -89,10 +101,10 @@ const createStaticExecMethodMsgBuilder = (
89
101
  t.objectExpression([
90
102
  t.objectProperty(
91
103
  t.identifier(underscoreName),
92
- t.tsAsExpression(t.objectExpression(args), t.tsTypeReference(t.identifier('const')))
93
- ),
104
+ actionValue
105
+ )
94
106
  ])
95
- ),
107
+ )
96
108
  ]),
97
109
  // return type
98
110
  t.tsTypeAnnotation(t.tsTypeReference(t.identifier(msgTitle))),
@@ -1312,3 +1312,48 @@ export function useSg721TransferNftMutation(options?: Omit<UseMutationOptions<Ex
1312
1312
  }) => client.transferNft(msg, fee, memo, funds), options);
1313
1313
  }"
1314
1314
  `;
1315
+
1316
+ exports[`ownership 1`] = `
1317
+ "export interface OwnershipUpdateOwnershipMutation {
1318
+ client: OwnershipClient;
1319
+ msg: Action;
1320
+ args?: {
1321
+ fee?: number | StdFee | \\"auto\\";
1322
+ memo?: string;
1323
+ funds?: Coin[];
1324
+ };
1325
+ }
1326
+ export function useOwnershipUpdateOwnershipMutation(options?: Omit<UseMutationOptions<ExecuteResult, Error, OwnershipUpdateOwnershipMutation>, \\"mutationFn\\">) {
1327
+ return useMutation<ExecuteResult, Error, OwnershipUpdateOwnershipMutation>(({
1328
+ client,
1329
+ msg,
1330
+ args: {
1331
+ fee,
1332
+ memo,
1333
+ funds
1334
+ } = {}
1335
+ }) => client.updateOwnership(msg, fee, memo, funds), options);
1336
+ }
1337
+ export interface OwnershipSetFactoryMutation {
1338
+ client: OwnershipClient;
1339
+ msg: {
1340
+ newFactory: string;
1341
+ };
1342
+ args?: {
1343
+ fee?: number | StdFee | \\"auto\\";
1344
+ memo?: string;
1345
+ funds?: Coin[];
1346
+ };
1347
+ }
1348
+ export function useOwnershipSetFactoryMutation(options?: Omit<UseMutationOptions<ExecuteResult, Error, OwnershipSetFactoryMutation>, \\"mutationFn\\">) {
1349
+ return useMutation<ExecuteResult, Error, OwnershipSetFactoryMutation>(({
1350
+ client,
1351
+ msg,
1352
+ args: {
1353
+ fee,
1354
+ memo,
1355
+ funds
1356
+ } = {}
1357
+ }) => client.setFactory(msg, fee, memo, funds), options);
1358
+ }"
1359
+ `;
@@ -1,13 +1,15 @@
1
1
  import * as t from '@babel/types';
2
2
  import query_msg from '../../../../__fixtures__/basic/query_msg.json';
3
3
  import execute_msg from '../../../../__fixtures__/basic/execute_msg_for__empty.json';
4
- import { RenderContext } from '../context';
4
+ import ownership from '../../../../__fixtures__/basic/ownership.json';
5
+
5
6
 
6
7
  import {
7
8
  createReactQueryHooks,
8
9
  createReactQueryMutationHooks,
9
10
  } from './react-query'
10
11
  import { expectCode, makeContext } from '../../test-utils';
12
+ import { createMsgBuilderClass } from '../msg-builder';
11
13
 
12
14
  const execCtx = makeContext(execute_msg);
13
15
  const queryCtx = makeContext(query_msg);
@@ -90,3 +92,17 @@ it('createReactQueryHooks', () => {
90
92
  )))
91
93
  });
92
94
 
95
+ it('ownership', () => {
96
+ const ownershipCtx = makeContext(ownership);
97
+ expectCode(t.program(
98
+ createReactQueryMutationHooks(
99
+ {
100
+ context: ownershipCtx,
101
+ execMsg: ownership,
102
+ contractName: 'Ownership',
103
+ ExecuteClient: 'OwnershipClient',
104
+ }
105
+ )))
106
+ });
107
+
108
+
@@ -1,5 +1,5 @@
1
1
  import * as t from '@babel/types';
2
- import { camel, pascal } from 'case';
2
+ import { camel, pascal, snake } from 'case';
3
3
  import { propertySignature } from './babel';
4
4
  import { TSTypeAnnotation } from '@babel/types';
5
5
  import { RenderContext } from '../context';
@@ -425,15 +425,22 @@ export const createTypedObjectParams = (
425
425
  context: RenderContext,
426
426
  jsonschema: JSONSchema,
427
427
  camelize: boolean = true
428
- ): t.ObjectPattern => {
428
+ ): (t.Identifier | t.Pattern | t.RestElement) => {
429
429
 
430
430
  const keys = Object.keys(jsonschema.properties ?? {});
431
431
  if (!keys.length) {
432
-
433
432
  // is there a ref?
434
433
  if (jsonschema.$ref) {
435
434
  const obj = context.refLookup(jsonschema.$ref);
436
- if (obj) {
435
+ // If there is a oneOf, then we need to create a type for it
436
+ if (obj?.oneOf) {
437
+ // the actual type of the ref
438
+ const refType = jsonschema.$ref.split('/').pop();
439
+ const refName = camel(refType);
440
+ const id = t.identifier(refName);
441
+ id.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(refType)));
442
+ return id
443
+ } else if (obj) {
437
444
  return createTypedObjectParams(
438
445
  context,
439
446
  obj,