wasm-ast-types 0.19.0 → 0.21.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 (34) 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/client/test/ts-client.issue-103.test.js +48 -0
  4. package/main/message-composer/message-composer.js +13 -4
  5. package/main/message-composer/message-composer.spec.js +14 -4
  6. package/main/msg-builder/msg-builder.js +21 -7
  7. package/main/msg-builder/msg-builder.spec.js +7 -1
  8. package/main/react-query/react-query.spec.js +11 -0
  9. package/main/utils/types.js +10 -2
  10. package/module/client/client.js +18 -9
  11. package/module/client/test/ts-client.issue-101.spec.js +20 -0
  12. package/module/client/test/ts-client.issue-103.test.js +41 -0
  13. package/module/message-composer/message-composer.js +13 -4
  14. package/module/message-composer/message-composer.spec.js +16 -7
  15. package/module/msg-builder/msg-builder.js +26 -12
  16. package/module/msg-builder/msg-builder.spec.js +6 -1
  17. package/module/react-query/react-query.spec.js +10 -0
  18. package/module/utils/types.js +10 -3
  19. package/package.json +2 -2
  20. package/src/client/client.ts +29 -24
  21. package/src/client/test/__snapshots__/ts-client.issue-101.spec.ts.snap +47 -0
  22. package/src/client/test/__snapshots__/ts-client.issue-103.test.ts.snap +79 -0
  23. package/src/client/test/__snapshots__/ts-client.vectis.spec.ts.snap +8 -8
  24. package/src/client/test/ts-client.issue-101.spec.ts +37 -0
  25. package/src/client/test/ts-client.issue-103.test.ts +106 -0
  26. package/src/message-composer/__snapshots__/message-composer.spec.ts.snap +60 -0
  27. package/src/message-composer/message-composer.spec.ts +41 -20
  28. package/src/message-composer/message-composer.ts +13 -5
  29. package/src/msg-builder/__snapshots__/msg-builder.spec.ts.snap +21 -0
  30. package/src/msg-builder/msg-builder.spec.ts +9 -1
  31. package/src/msg-builder/msg-builder.ts +36 -24
  32. package/src/react-query/__snapshots__/react-query.spec.ts.snap +45 -0
  33. package/src/react-query/react-query.spec.ts +17 -1
  34. 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
+ });
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _schema = _interopRequireDefault(require("../../../../../__fixtures__/issues/103/schema.json"));
6
+
7
+ var _client = require("../client");
8
+
9
+ var _testUtils = require("../../../test-utils");
10
+
11
+ var queryMessage = _schema["default"].query;
12
+ var executeMessage = _schema["default"].execute;
13
+ var queryCtx = (0, _testUtils.makeContext)(queryMessage);
14
+ var executeCtx = (0, _testUtils.makeContext)(executeMessage);
15
+ describe('query', function () {
16
+ it('execute_msg_for__empty', function () {
17
+ (0, _testUtils.expectCode)((0, _client.createTypeInterface)(queryCtx, queryMessage));
18
+ });
19
+ it('query classes', function () {
20
+ (0, _testUtils.expectCode)((0, _client.createQueryClass)(queryCtx, 'QueryClient', 'ReadOnlyInstance', queryMessage));
21
+ });
22
+ it('query classes response', function () {
23
+ (0, _testUtils.expectCode)((0, _client.createTypeInterface)(queryCtx, _schema["default"].query));
24
+ });
25
+ it('execute classes array types', function () {
26
+ (0, _testUtils.expectCode)((0, _client.createExecuteClass)(queryCtx, 'Client', 'Instance', null, queryMessage));
27
+ });
28
+ it('execute interfaces no extends', function () {
29
+ (0, _testUtils.expectCode)((0, _client.createExecuteInterface)(queryCtx, 'SG721Instance', null, queryMessage));
30
+ });
31
+ });
32
+ describe('execute', function () {
33
+ it('execute_msg_for__empty', function () {
34
+ (0, _testUtils.expectCode)((0, _client.createTypeInterface)(executeCtx, executeMessage));
35
+ });
36
+ it('query classes', function () {
37
+ (0, _testUtils.expectCode)((0, _client.createQueryClass)(executeCtx, 'QueryClient', 'ReadOnlyInstance', executeMessage));
38
+ });
39
+ it('query classes response', function () {
40
+ (0, _testUtils.expectCode)((0, _client.createTypeInterface)(executeCtx, _schema["default"].query));
41
+ });
42
+ it('execute classes array types', function () {
43
+ (0, _testUtils.expectCode)((0, _client.createExecuteClass)(executeCtx, 'Client', 'Instance', null, executeMessage));
44
+ });
45
+ it('execute interfaces no extends', function () {
46
+ (0, _testUtils.expectCode)((0, _client.createExecuteInterface)(executeCtx, 'SG721Instance', null, executeMessage));
47
+ });
48
+ });
@@ -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
+ });
@@ -0,0 +1,41 @@
1
+ import contract from '../../../../../__fixtures__/issues/103/schema.json';
2
+ import { createQueryClass, createExecuteClass, createExecuteInterface, createTypeInterface } from '../client';
3
+ import { expectCode, makeContext } from '../../../test-utils';
4
+ const queryMessage = contract.query;
5
+ const executeMessage = contract.execute;
6
+ const queryCtx = makeContext(queryMessage);
7
+ const executeCtx = makeContext(executeMessage);
8
+ describe('query', () => {
9
+ it('execute_msg_for__empty', () => {
10
+ expectCode(createTypeInterface(queryCtx, queryMessage));
11
+ });
12
+ it('query classes', () => {
13
+ expectCode(createQueryClass(queryCtx, 'QueryClient', 'ReadOnlyInstance', queryMessage));
14
+ });
15
+ it('query classes response', () => {
16
+ expectCode(createTypeInterface(queryCtx, contract.query));
17
+ });
18
+ it('execute classes array types', () => {
19
+ expectCode(createExecuteClass(queryCtx, 'Client', 'Instance', null, queryMessage));
20
+ });
21
+ it('execute interfaces no extends', () => {
22
+ expectCode(createExecuteInterface(queryCtx, 'SG721Instance', null, queryMessage));
23
+ });
24
+ });
25
+ describe('execute', () => {
26
+ it('execute_msg_for__empty', () => {
27
+ expectCode(createTypeInterface(executeCtx, executeMessage));
28
+ });
29
+ it('query classes', () => {
30
+ expectCode(createQueryClass(executeCtx, 'QueryClient', 'ReadOnlyInstance', executeMessage));
31
+ });
32
+ it('query classes response', () => {
33
+ expectCode(createTypeInterface(executeCtx, contract.query));
34
+ });
35
+ it('execute classes array types', () => {
36
+ expectCode(createExecuteClass(executeCtx, 'Client', 'Instance', null, executeMessage));
37
+ });
38
+ it('execute interfaces no extends', () => {
39
+ expectCode(createExecuteInterface(executeCtx, 'SG721Instance', null, executeMessage));
40
+ });
41
+ });
@@ -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.21.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": "90fb688d19f477d246f9021ac91d824c96b8f3fc"
92
92
  }