@gnolang/tm2-js-client 1.0.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 (77) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +78 -0
  3. package/bin/index.d.ts +4 -0
  4. package/bin/index.js +20 -0
  5. package/bin/proto/google/protobuf/any.d.ts +151 -0
  6. package/bin/proto/google/protobuf/any.js +124 -0
  7. package/bin/proto/index.d.ts +2 -0
  8. package/bin/proto/index.js +20 -0
  9. package/bin/proto/tm2/tx.d.ts +540 -0
  10. package/bin/proto/tm2/tx.js +365 -0
  11. package/bin/provider/endpoints.d.ts +28 -0
  12. package/bin/provider/endpoints.js +36 -0
  13. package/bin/provider/index.d.ts +6 -0
  14. package/bin/provider/index.js +22 -0
  15. package/bin/provider/jsonrpc/index.d.ts +1 -0
  16. package/bin/provider/jsonrpc/index.js +17 -0
  17. package/bin/provider/jsonrpc/jsonrpc.d.ts +27 -0
  18. package/bin/provider/jsonrpc/jsonrpc.js +219 -0
  19. package/bin/provider/jsonrpc/jsonrpc.test.d.ts +1 -0
  20. package/bin/provider/jsonrpc/jsonrpc.test.js +374 -0
  21. package/bin/provider/provider.d.ts +86 -0
  22. package/bin/provider/provider.js +2 -0
  23. package/bin/provider/types/abci.d.ts +39 -0
  24. package/bin/provider/types/abci.js +4 -0
  25. package/bin/provider/types/common.d.ts +154 -0
  26. package/bin/provider/types/common.js +2 -0
  27. package/bin/provider/types/index.d.ts +3 -0
  28. package/bin/provider/types/index.js +19 -0
  29. package/bin/provider/types/jsonrpc.d.ts +26 -0
  30. package/bin/provider/types/jsonrpc.js +2 -0
  31. package/bin/provider/utility/index.d.ts +2 -0
  32. package/bin/provider/utility/index.js +18 -0
  33. package/bin/provider/utility/provider.utility.d.ts +28 -0
  34. package/bin/provider/utility/provider.utility.js +194 -0
  35. package/bin/provider/utility/requests.utility.d.ts +33 -0
  36. package/bin/provider/utility/requests.utility.js +74 -0
  37. package/bin/provider/websocket/index.d.ts +1 -0
  38. package/bin/provider/websocket/index.js +17 -0
  39. package/bin/provider/websocket/ws.d.ts +55 -0
  40. package/bin/provider/websocket/ws.js +303 -0
  41. package/bin/provider/websocket/ws.test.d.ts +1 -0
  42. package/bin/provider/websocket/ws.test.js +535 -0
  43. package/bin/services/index.d.ts +2 -0
  44. package/bin/services/index.js +18 -0
  45. package/bin/services/rest/restService.d.ts +4 -0
  46. package/bin/services/rest/restService.js +72 -0
  47. package/bin/services/rest/restService.types.d.ts +6 -0
  48. package/bin/services/rest/restService.types.js +2 -0
  49. package/bin/wallet/index.d.ts +5 -0
  50. package/bin/wallet/index.js +21 -0
  51. package/bin/wallet/key/index.d.ts +1 -0
  52. package/bin/wallet/key/index.js +17 -0
  53. package/bin/wallet/key/key.d.ts +21 -0
  54. package/bin/wallet/key/key.js +102 -0
  55. package/bin/wallet/key/key.test.d.ts +1 -0
  56. package/bin/wallet/key/key.test.js +121 -0
  57. package/bin/wallet/ledger/index.d.ts +1 -0
  58. package/bin/wallet/ledger/index.js +17 -0
  59. package/bin/wallet/ledger/ledger.d.ts +22 -0
  60. package/bin/wallet/ledger/ledger.js +109 -0
  61. package/bin/wallet/signer.d.ts +29 -0
  62. package/bin/wallet/signer.js +2 -0
  63. package/bin/wallet/types/index.d.ts +2 -0
  64. package/bin/wallet/types/index.js +18 -0
  65. package/bin/wallet/types/sign.d.ts +17 -0
  66. package/bin/wallet/types/sign.js +4 -0
  67. package/bin/wallet/types/wallet.d.ts +5 -0
  68. package/bin/wallet/types/wallet.js +2 -0
  69. package/bin/wallet/utility/index.d.ts +1 -0
  70. package/bin/wallet/utility/index.js +17 -0
  71. package/bin/wallet/utility/utility.d.ts +30 -0
  72. package/bin/wallet/utility/utility.js +105 -0
  73. package/bin/wallet/wallet.d.ts +94 -0
  74. package/bin/wallet/wallet.js +340 -0
  75. package/bin/wallet/wallet.test.d.ts +1 -0
  76. package/bin/wallet/wallet.test.js +345 -0
  77. package/package.json +64 -0
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var jest_mock_extended_1 = require("jest-mock-extended");
43
+ var wallet_1 = require("./wallet");
44
+ var crypto_1 = require("@cosmjs/crypto");
45
+ var utility_1 = require("./utility");
46
+ var bip39_1 = require("@cosmjs/crypto/build/bip39");
47
+ var key_1 = require("./key");
48
+ var long_1 = __importDefault(require("long"));
49
+ var types_1 = require("./types");
50
+ describe('Wallet', function () {
51
+ test('createRandom', function () { return __awaiter(void 0, void 0, void 0, function () {
52
+ var wallet, address;
53
+ return __generator(this, function (_a) {
54
+ switch (_a.label) {
55
+ case 0: return [4 /*yield*/, wallet_1.Wallet.createRandom()];
56
+ case 1:
57
+ wallet = _a.sent();
58
+ expect(wallet).not.toBeNull();
59
+ return [4 /*yield*/, wallet.getAddress()];
60
+ case 2:
61
+ address = _a.sent();
62
+ expect(address).toHaveLength(40);
63
+ return [2 /*return*/];
64
+ }
65
+ });
66
+ }); });
67
+ test('connect', function () { return __awaiter(void 0, void 0, void 0, function () {
68
+ var mockProvider, wallet;
69
+ return __generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0:
72
+ mockProvider = (0, jest_mock_extended_1.mock)();
73
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
74
+ case 1:
75
+ wallet = _a.sent();
76
+ // Connect the provider
77
+ wallet.connect(mockProvider);
78
+ expect(wallet.getProvider()).toBe(mockProvider);
79
+ return [2 /*return*/];
80
+ }
81
+ });
82
+ }); });
83
+ test('fromMnemonic', function () { return __awaiter(void 0, void 0, void 0, function () {
84
+ var mnemonic, wallet, address;
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ mnemonic = new crypto_1.EnglishMnemonic('lens balcony basic cherry half purchase balance soccer solar scissors process eager orchard fatigue rural retire approve crouch repair prepare develop clarify milk suffer');
89
+ return [4 /*yield*/, wallet_1.Wallet.fromMnemonic(mnemonic.toString())];
90
+ case 1:
91
+ wallet = _a.sent();
92
+ expect(wallet).not.toBeNull();
93
+ return [4 /*yield*/, wallet.getAddress()];
94
+ case 2:
95
+ address = _a.sent();
96
+ expect(address).toBe("".concat(utility_1.defaultAddressPrefix, "1vcjvkjdvckprkcpm7l44plrtg83asfu9geaz90"));
97
+ return [2 /*return*/];
98
+ }
99
+ });
100
+ }); });
101
+ test('fromPrivateKey', function () { return __awaiter(void 0, void 0, void 0, function () {
102
+ var _a, publicKey, privateKey, signer, wallet, walletSigner, _b, _c, _d, _e, _f, _g;
103
+ return __generator(this, function (_h) {
104
+ switch (_h.label) {
105
+ case 0: return [4 /*yield*/, (0, utility_1.generateKeyPair)((0, bip39_1.entropyToMnemonic)((0, utility_1.generateEntropy)()), 0)];
106
+ case 1:
107
+ _a = _h.sent(), publicKey = _a.publicKey, privateKey = _a.privateKey;
108
+ signer = new key_1.KeySigner(privateKey, crypto_1.Secp256k1.compressPubkey(publicKey));
109
+ return [4 /*yield*/, wallet_1.Wallet.fromPrivateKey(privateKey)];
110
+ case 2:
111
+ wallet = _h.sent();
112
+ walletSigner = wallet.getSigner();
113
+ expect(wallet).not.toBeNull();
114
+ _c = expect;
115
+ return [4 /*yield*/, wallet.getAddress()];
116
+ case 3:
117
+ _d = (_b = _c.apply(void 0, [_h.sent()])).toBe;
118
+ return [4 /*yield*/, signer.getAddress()];
119
+ case 4:
120
+ _d.apply(_b, [_h.sent()]);
121
+ _f = expect;
122
+ return [4 /*yield*/, walletSigner.getPublicKey()];
123
+ case 5:
124
+ _g = (_e = _f.apply(void 0, [_h.sent()])).toEqual;
125
+ return [4 /*yield*/, signer.getPublicKey()];
126
+ case 6:
127
+ _g.apply(_e, [_h.sent()]);
128
+ return [2 /*return*/];
129
+ }
130
+ });
131
+ }); });
132
+ test('getAccountSequence', function () { return __awaiter(void 0, void 0, void 0, function () {
133
+ var mockSequence, mockProvider, wallet, address, sequence;
134
+ return __generator(this, function (_a) {
135
+ switch (_a.label) {
136
+ case 0:
137
+ mockSequence = 5;
138
+ mockProvider = (0, jest_mock_extended_1.mock)();
139
+ mockProvider.getAccountSequence.mockResolvedValue(mockSequence);
140
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
141
+ case 1:
142
+ wallet = _a.sent();
143
+ wallet.connect(mockProvider);
144
+ return [4 /*yield*/, wallet.getAddress()];
145
+ case 2:
146
+ address = _a.sent();
147
+ return [4 /*yield*/, wallet.getAccountSequence()];
148
+ case 3:
149
+ sequence = _a.sent();
150
+ expect(mockProvider.getAccountSequence).toHaveBeenCalledWith(address, undefined);
151
+ expect(sequence).toBe(mockSequence);
152
+ return [2 /*return*/];
153
+ }
154
+ });
155
+ }); });
156
+ test('getAccountNumber', function () { return __awaiter(void 0, void 0, void 0, function () {
157
+ var mockAccountNumber, mockProvider, wallet, address, accountNumber;
158
+ return __generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0:
161
+ mockAccountNumber = 10;
162
+ mockProvider = (0, jest_mock_extended_1.mock)();
163
+ mockProvider.getAccountNumber.mockResolvedValue(mockAccountNumber);
164
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
165
+ case 1:
166
+ wallet = _a.sent();
167
+ wallet.connect(mockProvider);
168
+ return [4 /*yield*/, wallet.getAddress()];
169
+ case 2:
170
+ address = _a.sent();
171
+ return [4 /*yield*/, wallet.getAccountNumber()];
172
+ case 3:
173
+ accountNumber = _a.sent();
174
+ expect(mockProvider.getAccountNumber).toHaveBeenCalledWith(address, undefined);
175
+ expect(accountNumber).toBe(mockAccountNumber);
176
+ return [2 /*return*/];
177
+ }
178
+ });
179
+ }); });
180
+ test('getBalance', function () { return __awaiter(void 0, void 0, void 0, function () {
181
+ var mockBalance, mockProvider, wallet, address, balance;
182
+ return __generator(this, function (_a) {
183
+ switch (_a.label) {
184
+ case 0:
185
+ mockBalance = 100;
186
+ mockProvider = (0, jest_mock_extended_1.mock)();
187
+ mockProvider.getBalance.mockResolvedValue(mockBalance);
188
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
189
+ case 1:
190
+ wallet = _a.sent();
191
+ wallet.connect(mockProvider);
192
+ return [4 /*yield*/, wallet.getAddress()];
193
+ case 2:
194
+ address = _a.sent();
195
+ return [4 /*yield*/, wallet.getBalance()];
196
+ case 3:
197
+ balance = _a.sent();
198
+ expect(mockProvider.getBalance).toHaveBeenCalledWith(address, 'ugnot');
199
+ expect(balance).toBe(mockBalance);
200
+ return [2 /*return*/];
201
+ }
202
+ });
203
+ }); });
204
+ test('getGasPrice', function () { return __awaiter(void 0, void 0, void 0, function () {
205
+ var mockGasPrice, mockProvider, wallet, gasPrice;
206
+ return __generator(this, function (_a) {
207
+ switch (_a.label) {
208
+ case 0:
209
+ mockGasPrice = 1000;
210
+ mockProvider = (0, jest_mock_extended_1.mock)();
211
+ mockProvider.getGasPrice.mockResolvedValue(mockGasPrice);
212
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
213
+ case 1:
214
+ wallet = _a.sent();
215
+ wallet.connect(mockProvider);
216
+ return [4 /*yield*/, wallet.getGasPrice()];
217
+ case 2:
218
+ gasPrice = _a.sent();
219
+ expect(mockProvider.getGasPrice).toHaveBeenCalled();
220
+ expect(gasPrice).toBe(mockGasPrice);
221
+ return [2 /*return*/];
222
+ }
223
+ });
224
+ }); });
225
+ test('estimateGas', function () { return __awaiter(void 0, void 0, void 0, function () {
226
+ var mockTxEstimation, mockTx, mockProvider, wallet, estimation;
227
+ return __generator(this, function (_a) {
228
+ switch (_a.label) {
229
+ case 0:
230
+ mockTxEstimation = 1000;
231
+ mockTx = (0, jest_mock_extended_1.mock)();
232
+ mockProvider = (0, jest_mock_extended_1.mock)();
233
+ mockProvider.estimateGas.mockResolvedValue(mockTxEstimation);
234
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
235
+ case 1:
236
+ wallet = _a.sent();
237
+ wallet.connect(mockProvider);
238
+ return [4 /*yield*/, wallet.estimateGas(mockTx)];
239
+ case 2:
240
+ estimation = _a.sent();
241
+ expect(mockProvider.estimateGas).toHaveBeenCalledWith(mockTx);
242
+ expect(estimation).toBe(mockTxEstimation);
243
+ return [2 /*return*/];
244
+ }
245
+ });
246
+ }); });
247
+ test('signTransaction', function () { return __awaiter(void 0, void 0, void 0, function () {
248
+ var mockTx, mockStatus, mockProvider, wallet, emptyDecodeCallback, signedTx, sig;
249
+ var _a, _b;
250
+ return __generator(this, function (_c) {
251
+ switch (_c.label) {
252
+ case 0:
253
+ mockTx = (0, jest_mock_extended_1.mock)();
254
+ mockTx.signatures = [];
255
+ mockTx.fee = {
256
+ gasFee: '10',
257
+ gasWanted: new long_1.default(10),
258
+ };
259
+ mockTx.messages = [];
260
+ mockStatus = (0, jest_mock_extended_1.mock)();
261
+ mockStatus.node_info = {
262
+ version_set: [],
263
+ version: '',
264
+ net_address: '',
265
+ software: '',
266
+ channels: '',
267
+ monkier: '',
268
+ other: {
269
+ tx_index: '',
270
+ rpc_address: '',
271
+ },
272
+ network: 'testchain',
273
+ };
274
+ mockProvider = (0, jest_mock_extended_1.mock)();
275
+ mockProvider.getStatus.mockResolvedValue(mockStatus);
276
+ mockProvider.getAccountNumber.mockResolvedValue(10);
277
+ mockProvider.getAccountSequence.mockResolvedValue(10);
278
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
279
+ case 1:
280
+ wallet = _c.sent();
281
+ wallet.connect(mockProvider);
282
+ emptyDecodeCallback = function (_) {
283
+ return [];
284
+ };
285
+ return [4 /*yield*/, wallet.signTransaction(mockTx, emptyDecodeCallback)];
286
+ case 2:
287
+ signedTx = _c.sent();
288
+ expect(mockProvider.getStatus).toHaveBeenCalled();
289
+ expect(mockProvider.getAccountNumber).toHaveBeenCalled();
290
+ expect(mockProvider.getAccountSequence).toHaveBeenCalled();
291
+ expect(signedTx.signatures).toHaveLength(1);
292
+ sig = signedTx.signatures[0];
293
+ expect((_a = sig.pubKey) === null || _a === void 0 ? void 0 : _a.typeUrl).toBe(types_1.Secp256k1PubKeyType);
294
+ expect((_b = sig.pubKey) === null || _b === void 0 ? void 0 : _b.value).not.toBeNull();
295
+ expect(sig.signature).not.toBeNull();
296
+ return [2 /*return*/];
297
+ }
298
+ });
299
+ }); });
300
+ test('sendTransaction', function () { return __awaiter(void 0, void 0, void 0, function () {
301
+ var mockTx, mockTxHash, mockStatus, mockProvider, wallet, txHash;
302
+ return __generator(this, function (_a) {
303
+ switch (_a.label) {
304
+ case 0:
305
+ mockTx = (0, jest_mock_extended_1.mock)();
306
+ mockTx.signatures = [];
307
+ mockTx.fee = {
308
+ gasFee: '10',
309
+ gasWanted: new long_1.default(10),
310
+ };
311
+ mockTx.messages = [];
312
+ mockTx.memo = '';
313
+ mockTxHash = 'tx hash';
314
+ mockStatus = (0, jest_mock_extended_1.mock)();
315
+ mockStatus.node_info = {
316
+ version_set: [],
317
+ version: '',
318
+ net_address: '',
319
+ software: '',
320
+ channels: '',
321
+ monkier: '',
322
+ other: {
323
+ tx_index: '',
324
+ rpc_address: '',
325
+ },
326
+ network: 'testchain',
327
+ };
328
+ mockProvider = (0, jest_mock_extended_1.mock)();
329
+ mockProvider.getStatus.mockResolvedValue(mockStatus);
330
+ mockProvider.getAccountNumber.mockResolvedValue(10);
331
+ mockProvider.getAccountSequence.mockResolvedValue(10);
332
+ mockProvider.sendTransaction.mockResolvedValue(mockTxHash);
333
+ return [4 /*yield*/, wallet_1.Wallet.createRandom()];
334
+ case 1:
335
+ wallet = _a.sent();
336
+ wallet.connect(mockProvider);
337
+ return [4 /*yield*/, wallet.sendTransaction(mockTx)];
338
+ case 2:
339
+ txHash = _a.sent();
340
+ expect(txHash).toBe(mockTxHash);
341
+ return [2 /*return*/];
342
+ }
343
+ });
344
+ }); });
345
+ });
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@gnolang/tm2-js-client",
3
+ "version": "1.0.0",
4
+ "description": "Tendermint2 JS / TS Client",
5
+ "main": "./bin/index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/gnolang/tm2-js-client.git"
9
+ },
10
+ "keywords": [
11
+ "tm2",
12
+ "tendermint2",
13
+ "sdk",
14
+ "client",
15
+ "js"
16
+ ],
17
+ "author": "Milos Zivkovic <milos.zivkovic@tendermint.com>",
18
+ "license": "Apache-2.0",
19
+ "homepage": "https://gno.land/",
20
+ "files": [
21
+ "bin/**/*"
22
+ ],
23
+ "private": false,
24
+ "publishConfig": {
25
+ "access": "public",
26
+ "registry": "https://registry.npmjs.org/"
27
+ },
28
+ "devDependencies": {
29
+ "@types/jest": "^29.5.1",
30
+ "@types/long": "^5.0.0",
31
+ "@types/node": "^20.1.4",
32
+ "@types/ws": "^8.5.4",
33
+ "@typescript-eslint/eslint-plugin": "^5.59.5",
34
+ "@typescript-eslint/parser": "^5.59.5",
35
+ "eslint": "^8.40.0",
36
+ "eslint-config-prettier": "^8.8.0",
37
+ "eslint-plugin-prettier": "^4.2.1",
38
+ "jest": "^29.5.0",
39
+ "jest-mock-extended": "^3.0.4",
40
+ "jest-websocket-mock": "^2.4.0",
41
+ "prettier": "^2.8.8",
42
+ "ts-jest": "^29.1.0",
43
+ "ts-proto": "^1.147.2",
44
+ "typescript": "^5.0.4"
45
+ },
46
+ "dependencies": {
47
+ "@cosmjs/amino": "^0.30.1",
48
+ "@cosmjs/crypto": "^0.30.1",
49
+ "@cosmjs/ledger-amino": "^0.30.1",
50
+ "axios": "^1.4.0",
51
+ "long": "^5.2.3",
52
+ "protobufjs": "^7.2.3",
53
+ "ws": "^8.13.0"
54
+ },
55
+ "scripts": {
56
+ "tsc": "tsc",
57
+ "lint": "eslint '**/*.ts' --fix",
58
+ "prettier": "prettier --write .",
59
+ "build": "yarn tsc",
60
+ "test": "jest",
61
+ "prepare": "yarn build",
62
+ "prepublishOnly": "yarn lint && yarn prettier"
63
+ }
64
+ }