wasm-ast-types 0.19.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }