ccxt 4.5.8 → 4.5.9

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 (95) hide show
  1. package/README.md +4 -7
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/base/Exchange.js +111 -17
  5. package/dist/cjs/src/base/ws/Client.js +4 -0
  6. package/dist/cjs/src/bitget.js +59 -72
  7. package/dist/cjs/src/coinbaseexchange.js +15 -0
  8. package/dist/cjs/src/hyperliquid.js +0 -3
  9. package/dist/cjs/src/latoken.js +1 -0
  10. package/dist/cjs/src/phemex.js +15 -6
  11. package/dist/cjs/src/pro/alpaca.js +1 -1
  12. package/dist/cjs/src/pro/apex.js +4 -4
  13. package/dist/cjs/src/pro/binance.js +2 -1
  14. package/dist/cjs/src/pro/bitfinex.js +1 -1
  15. package/dist/cjs/src/pro/bitget.js +1 -1
  16. package/dist/cjs/src/pro/bitmart.js +1 -1
  17. package/dist/cjs/src/pro/bitmex.js +1 -1
  18. package/dist/cjs/src/pro/bitvavo.js +6 -6
  19. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  20. package/dist/cjs/src/pro/bybit.js +2 -1
  21. package/dist/cjs/src/pro/cex.js +2 -2
  22. package/dist/cjs/src/pro/coincatch.js +1 -1
  23. package/dist/cjs/src/pro/coinex.js +3 -3
  24. package/dist/cjs/src/pro/cryptocom.js +1 -1
  25. package/dist/cjs/src/pro/derive.js +1 -1
  26. package/dist/cjs/src/pro/gate.js +1 -1
  27. package/dist/cjs/src/pro/hitbtc.js +1 -1
  28. package/dist/cjs/src/pro/htx.js +2 -2
  29. package/dist/cjs/src/pro/kraken.js +8 -8
  30. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  31. package/dist/cjs/src/pro/kucoin.js +4 -4
  32. package/dist/cjs/src/pro/kucoinfutures.js +4 -4
  33. package/dist/cjs/src/pro/mexc.js +6 -1
  34. package/dist/cjs/src/pro/modetrade.js +2 -2
  35. package/dist/cjs/src/pro/okx.js +4 -2
  36. package/dist/cjs/src/pro/onetrading.js +1 -1
  37. package/dist/cjs/src/pro/oxfun.js +1 -1
  38. package/dist/cjs/src/pro/toobit.js +1 -1
  39. package/dist/cjs/src/pro/whitebit.js +1 -1
  40. package/dist/cjs/src/pro/woo.js +1 -1
  41. package/dist/cjs/src/pro/woofipro.js +2 -2
  42. package/js/ccxt.d.ts +1 -1
  43. package/js/ccxt.js +1 -1
  44. package/js/src/abstract/coinbaseexchange.d.ts +15 -0
  45. package/js/src/base/Exchange.d.ts +13 -5
  46. package/js/src/base/Exchange.js +111 -17
  47. package/js/src/base/ws/Client.d.ts +1 -0
  48. package/js/src/base/ws/Client.js +4 -0
  49. package/js/src/bitget.js +59 -72
  50. package/js/src/coinbaseexchange.js +15 -0
  51. package/js/src/hyperliquid.js +0 -3
  52. package/js/src/latoken.js +1 -0
  53. package/js/src/phemex.js +15 -6
  54. package/js/src/pro/alpaca.js +1 -1
  55. package/js/src/pro/apex.js +4 -4
  56. package/js/src/pro/binance.d.ts +1 -1
  57. package/js/src/pro/binance.js +2 -1
  58. package/js/src/pro/bitfinex.js +1 -1
  59. package/js/src/pro/bitget.js +1 -1
  60. package/js/src/pro/bitmart.js +1 -1
  61. package/js/src/pro/bitmex.js +1 -1
  62. package/js/src/pro/bitvavo.d.ts +3 -3
  63. package/js/src/pro/bitvavo.js +6 -6
  64. package/js/src/pro/blockchaincom.js +1 -1
  65. package/js/src/pro/bybit.js +2 -1
  66. package/js/src/pro/cex.js +2 -2
  67. package/js/src/pro/coincatch.js +1 -1
  68. package/js/src/pro/coinex.js +3 -3
  69. package/js/src/pro/cryptocom.d.ts +1 -1
  70. package/js/src/pro/cryptocom.js +1 -1
  71. package/js/src/pro/derive.js +1 -1
  72. package/js/src/pro/gate.d.ts +1 -1
  73. package/js/src/pro/gate.js +1 -1
  74. package/js/src/pro/hitbtc.d.ts +1 -1
  75. package/js/src/pro/hitbtc.js +1 -1
  76. package/js/src/pro/htx.js +2 -2
  77. package/js/src/pro/hyperliquid.d.ts +1 -1
  78. package/js/src/pro/kraken.d.ts +2 -2
  79. package/js/src/pro/kraken.js +8 -8
  80. package/js/src/pro/krakenfutures.js +1 -1
  81. package/js/src/pro/kucoin.js +4 -4
  82. package/js/src/pro/kucoinfutures.js +4 -4
  83. package/js/src/pro/mexc.js +6 -1
  84. package/js/src/pro/modetrade.js +2 -2
  85. package/js/src/pro/okx.d.ts +2 -2
  86. package/js/src/pro/okx.js +4 -2
  87. package/js/src/pro/onetrading.js +1 -1
  88. package/js/src/pro/oxfun.d.ts +1 -1
  89. package/js/src/pro/oxfun.js +1 -1
  90. package/js/src/pro/poloniex.d.ts +2 -2
  91. package/js/src/pro/toobit.js +1 -1
  92. package/js/src/pro/whitebit.js +1 -1
  93. package/js/src/pro/woo.js +1 -1
  94. package/js/src/pro/woofipro.js +2 -2
  95. package/package.json +21 -10
@@ -299,7 +299,7 @@ export default class kraken extends krakenRest {
299
299
  const market = this.market(symbol);
300
300
  const url = this.urls['api']['ws']['privateV2'];
301
301
  const requestId = this.requestId();
302
- const messageHash = requestId;
302
+ const messageHash = this.numberToString(requestId);
303
303
  let request = {
304
304
  'method': 'add_order',
305
305
  'params': {
@@ -343,7 +343,7 @@ export default class kraken extends krakenRest {
343
343
  //
344
344
  const result = this.safeDict(message, 'result', {});
345
345
  const order = this.parseOrder(result);
346
- const messageHash = this.safeValue2(message, 'reqid', 'req_id');
346
+ const messageHash = this.safeString2(message, 'reqid', 'req_id');
347
347
  client.resolve(order, messageHash);
348
348
  }
349
349
  /**
@@ -365,7 +365,7 @@ export default class kraken extends krakenRest {
365
365
  const token = await this.authenticate();
366
366
  const url = this.urls['api']['ws']['privateV2'];
367
367
  const requestId = this.requestId();
368
- const messageHash = requestId;
368
+ const messageHash = this.numberToString(requestId);
369
369
  let request = {
370
370
  'method': 'amend_order',
371
371
  'params': {
@@ -396,7 +396,7 @@ export default class kraken extends krakenRest {
396
396
  const token = await this.authenticate();
397
397
  const url = this.urls['api']['ws']['privateV2'];
398
398
  const requestId = this.requestId();
399
- const messageHash = requestId;
399
+ const messageHash = this.numberToString(requestId);
400
400
  const request = {
401
401
  'method': 'cancel_order',
402
402
  'params': {
@@ -425,7 +425,7 @@ export default class kraken extends krakenRest {
425
425
  const token = await this.authenticate();
426
426
  const url = this.urls['api']['ws']['privateV2'];
427
427
  const requestId = this.requestId();
428
- const messageHash = requestId;
428
+ const messageHash = this.numberToString(requestId);
429
429
  const request = {
430
430
  'method': 'cancel_order',
431
431
  'params': {
@@ -449,7 +449,7 @@ export default class kraken extends krakenRest {
449
449
  // "time_out": "2023-09-21T14:36:57.437952Z"
450
450
  // }
451
451
  //
452
- const reqId = this.safeValue(message, 'req_id');
452
+ const reqId = this.safeString(message, 'req_id');
453
453
  client.resolve(message, reqId);
454
454
  }
455
455
  /**
@@ -469,7 +469,7 @@ export default class kraken extends krakenRest {
469
469
  const token = await this.authenticate();
470
470
  const url = this.urls['api']['ws']['privateV2'];
471
471
  const requestId = this.requestId();
472
- const messageHash = requestId;
472
+ const messageHash = this.numberToString(requestId);
473
473
  const request = {
474
474
  'method': 'cancel_all',
475
475
  'params': {
@@ -492,7 +492,7 @@ export default class kraken extends krakenRest {
492
492
  // "time_out": "2023-09-21T14:36:57.437952Z"
493
493
  // }
494
494
  //
495
- const reqId = this.safeValue(message, 'req_id');
495
+ const reqId = this.safeString(message, 'req_id');
496
496
  client.resolve(message, reqId);
497
497
  }
498
498
  handleTicker(client, message) {
@@ -79,7 +79,7 @@ export default class krakenfutures extends krakenfuturesRest {
79
79
  const url = this.urls['api']['ws'];
80
80
  const messageHash = 'challenge';
81
81
  const client = this.client(url);
82
- const future = client.future(messageHash);
82
+ const future = client.reusableFuture(messageHash);
83
83
  const authenticated = this.safeValue(client.subscriptions, messageHash);
84
84
  if (authenticated === undefined) {
85
85
  const request = {
@@ -63,16 +63,16 @@ export default class kucoin extends kucoinRest {
63
63
  async negotiate(privateChannel, params = {}) {
64
64
  const connectId = privateChannel ? 'private' : 'public';
65
65
  const urls = this.safeValue(this.options, 'urls', {});
66
- const spawaned = this.safeValue(urls, connectId);
67
- if (spawaned !== undefined) {
68
- return await spawaned;
66
+ let future = this.safeValue(urls, connectId);
67
+ if (future !== undefined) {
68
+ return await future;
69
69
  }
70
70
  // we store an awaitable to the url
71
71
  // so that multiple calls don't asynchronously
72
72
  // fetch different urls and overwrite each other
73
73
  urls[connectId] = this.spawn(this.negotiateHelper, privateChannel, params);
74
74
  this.options['urls'] = urls;
75
- const future = urls[connectId];
75
+ future = urls[connectId];
76
76
  return await future;
77
77
  }
78
78
  async negotiateHelper(privateChannel, params = {}) {
@@ -82,16 +82,16 @@ export default class kucoinfutures extends kucoinfuturesRest {
82
82
  async negotiate(privateChannel, params = {}) {
83
83
  const connectId = privateChannel ? 'private' : 'public';
84
84
  const urls = this.safeValue(this.options, 'urls', {});
85
- const spawaned = this.safeValue(urls, connectId);
86
- if (spawaned !== undefined) {
87
- return await spawaned;
85
+ let future = this.safeValue(urls, connectId);
86
+ if (future !== undefined) {
87
+ return await future;
88
88
  }
89
89
  // we store an awaitable to the url
90
90
  // so that multiple calls don't asynchronously
91
91
  // fetch different urls and overwrite each other
92
92
  urls[connectId] = this.spawn(this.negotiateHelper, privateChannel, params); // we have to wait here otherwsie in c# will not work
93
93
  this.options['urls'] = urls;
94
- const future = urls[connectId];
94
+ future = urls[connectId];
95
95
  return await future;
96
96
  }
97
97
  async negotiateHelper(privateChannel, params = {}) {
@@ -866,6 +866,7 @@ export default class mexc extends mexcRest {
866
866
  }
867
867
  const storedOrderBook = this.orderbooks[symbol];
868
868
  const nonce = this.safeInteger(storedOrderBook, 'nonce');
869
+ let shouldReturn = false;
869
870
  if (nonce === undefined) {
870
871
  const cacheLength = storedOrderBook.cache.length;
871
872
  const snapshotDelay = this.handleOption('watchOrderBook', 'snapshotDelay', 25);
@@ -884,7 +885,11 @@ export default class mexc extends mexcRest {
884
885
  catch (e) {
885
886
  delete client.subscriptions[messageHash];
886
887
  client.reject(e, messageHash);
887
- return;
888
+ // return;
889
+ shouldReturn = true;
890
+ }
891
+ if (shouldReturn) {
892
+ return; // go requirement
888
893
  }
889
894
  client.resolve(storedOrderBook, messageHash);
890
895
  }
@@ -80,7 +80,7 @@ export default class modetrade extends modetradeRest {
80
80
  async watchPublic(messageHash, message) {
81
81
  // the default id
82
82
  let id = 'OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY';
83
- if (this.accountId !== undefined) {
83
+ if (this.accountId !== undefined && this.accountId !== '') {
84
84
  id = this.accountId;
85
85
  }
86
86
  const url = this.urls['api']['ws']['public'] + '/' + id;
@@ -595,7 +595,7 @@ export default class modetrade extends modetradeRest {
595
595
  const client = this.client(url);
596
596
  const messageHash = 'authenticated';
597
597
  const event = 'auth';
598
- const future = client.future(messageHash);
598
+ const future = client.reusableFuture(messageHash);
599
599
  const authenticated = this.safeValue(client.subscriptions, messageHash);
600
600
  if (authenticated === undefined) {
601
601
  const ts = this.nonce().toString();
@@ -388,7 +388,7 @@ export default class okx extends okxRest {
388
388
  * @param {object} [params] extra parameters specific to the exchange API endpoint
389
389
  * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
390
390
  */
391
- cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any>;
391
+ cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<Order[]>;
392
392
  /**
393
393
  * @method
394
394
  * @name okx#cancelAllOrdersWs
@@ -398,7 +398,7 @@ export default class okx extends okxRest {
398
398
  * @param {object} [params] extra parameters specific to the exchange API endpoint
399
399
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
400
400
  */
401
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
401
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
402
402
  handleCancelAllOrders(client: Client, message: any): void;
403
403
  handleSubscriptionStatus(client: Client, message: any): any;
404
404
  handleAuthenticate(client: Client, message: any): void;
package/js/src/pro/okx.js CHANGED
@@ -1349,7 +1349,9 @@ export default class okx extends okxRest {
1349
1349
  }
1350
1350
  if (error !== undefined) {
1351
1351
  delete client.subscriptions[messageHash];
1352
- delete this.orderbooks[symbol];
1352
+ if (symbol !== undefined) {
1353
+ delete this.orderbooks[symbol];
1354
+ }
1353
1355
  client.reject(error, messageHash);
1354
1356
  }
1355
1357
  }
@@ -1503,7 +1505,7 @@ export default class okx extends okxRest {
1503
1505
  const url = this.getUrl('users', access);
1504
1506
  const messageHash = 'authenticated';
1505
1507
  const client = this.client(url);
1506
- const future = client.future(messageHash);
1508
+ const future = client.reusableFuture(messageHash);
1507
1509
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1508
1510
  if (authenticated === undefined) {
1509
1511
  const timestamp = this.seconds().toString();
@@ -1328,7 +1328,7 @@ export default class onetrading extends onetradingRest {
1328
1328
  const url = this.urls['api']['ws'];
1329
1329
  const client = this.client(url);
1330
1330
  const messageHash = 'authenticated';
1331
- const future = client.future('authenticated');
1331
+ const future = client.reusableFuture('authenticated');
1332
1332
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1333
1333
  if (authenticated === undefined) {
1334
1334
  this.checkRequiredCredentials();
@@ -225,7 +225,7 @@ export default class oxfun extends oxfunRest {
225
225
  * @param {object} [params] extra parameters specific to the exchange API endpoint
226
226
  * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
227
227
  */
228
- cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any>;
228
+ cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<Order[]>;
229
229
  authenticate(params?: {}): Promise<any>;
230
230
  handleAuthenticationMessage(client: Client, message: any): void;
231
231
  ping(client: Client): string;
@@ -1023,7 +1023,7 @@ export default class oxfun extends oxfunRest {
1023
1023
  const url = this.urls['api']['ws'];
1024
1024
  const client = this.client(url);
1025
1025
  const messageHash = 'authenticated';
1026
- const future = client.future(messageHash);
1026
+ const future = client.reusableFuture(messageHash);
1027
1027
  const authenticated = this.safeDict(client.subscriptions, messageHash);
1028
1028
  if (authenticated === undefined) {
1029
1029
  this.checkRequiredCredentials();
@@ -78,7 +78,7 @@ export default class poloniex extends poloniexRest {
78
78
  * @param {string[]} [params.clientOrderIds] client order ids
79
79
  * @returns {object} an list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
80
80
  */
81
- cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any>;
81
+ cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<Order[]>;
82
82
  /**
83
83
  * @method
84
84
  * @name poloniex#cancelAllOrdersWs
@@ -88,7 +88,7 @@ export default class poloniex extends poloniexRest {
88
88
  * @param {object} [params] extra parameters specific to the poloniex api endpoint
89
89
  * @returns {object[]} a list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
90
90
  */
91
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
91
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
92
92
  handleOrderRequest(client: Client, message: any): void;
93
93
  /**
94
94
  * @method
@@ -1089,7 +1089,7 @@ export default class toobit extends toobitRest {
1089
1089
  async authenticate(params = {}) {
1090
1090
  const client = this.client(this.getUserStreamUrl());
1091
1091
  const messageHash = 'authenticated';
1092
- const future = client.future(messageHash);
1092
+ const future = client.reusableFuture(messageHash);
1093
1093
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1094
1094
  if (authenticated === undefined) {
1095
1095
  this.checkRequiredCredentials();
@@ -832,7 +832,7 @@ export default class whitebit extends whitebitRest {
832
832
  const url = this.urls['api']['ws'];
833
833
  const messageHash = 'authenticated';
834
834
  const client = this.client(url);
835
- const future = client.future('authenticated');
835
+ const future = client.reusableFuture('authenticated');
836
836
  const authenticated = this.safeValue(client.subscriptions, messageHash);
837
837
  if (authenticated === undefined) {
838
838
  const authToken = await this.v4PrivatePostProfileWebsocketToken();
package/js/src/pro/woo.js CHANGED
@@ -843,7 +843,7 @@ export default class woo extends wooRest {
843
843
  const client = this.client(url);
844
844
  const messageHash = 'authenticated';
845
845
  const event = 'auth';
846
- const future = client.future(messageHash);
846
+ const future = client.reusableFuture(messageHash);
847
847
  const authenticated = this.safeValue(client.subscriptions, messageHash);
848
848
  if (authenticated === undefined) {
849
849
  const ts = this.nonce().toString();
@@ -80,7 +80,7 @@ export default class woofipro extends woofiproRest {
80
80
  async watchPublic(messageHash, message) {
81
81
  // the default id
82
82
  let id = 'OqdphuyCtYWxwzhxyLLjOWNdFP7sQt8RPWzmb5xY';
83
- if (this.accountId !== undefined) {
83
+ if (this.accountId !== undefined && this.accountId !== '') {
84
84
  id = this.accountId;
85
85
  }
86
86
  const url = this.urls['api']['ws']['public'] + '/' + id;
@@ -595,7 +595,7 @@ export default class woofipro extends woofiproRest {
595
595
  const client = this.client(url);
596
596
  const messageHash = 'authenticated';
597
597
  const event = 'auth';
598
- const future = client.future(messageHash);
598
+ const future = client.reusableFuture(messageHash);
599
599
  const authenticated = this.safeValue(client.subscriptions, messageHash);
600
600
  if (authenticated === undefined) {
601
601
  const ts = this.nonce().toString();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.5.8",
3
+ "version": "4.5.9",
4
4
  "description": "A cryptocurrency trading API with more than 100 exchanges in JavaScript / TypeScript / Python / C# / PHP / Go",
5
5
  "unpkg": "dist/ccxt.browser.min.js",
6
6
  "type": "module",
@@ -31,9 +31,12 @@
31
31
  "transpileCS": "tsx build/csharpTranspiler.ts --multi",
32
32
  "transpileCSWs": "tsx build/csharpTranspiler.ts --ws",
33
33
  "buildCS": "dotnet build cs/ccxt.sln",
34
+ "buildGO": "go build -C go ./v4 && go build -C go ./v4/pro",
35
+ "formatGO": "go fmt -C go v4 tests",
36
+ "transpileGOWs": "tsx build/goTranspiler.ts --ws",
37
+ "transpileGORest": "tsx build/goTranspiler.ts && tsx build/goTranspiler.ts --ws",
38
+ "transpileGO": "npm run transpileGORest && npm run transpileGOWs",
34
39
  "buildCSTests": "dotnet build cs/tests/tests.csproj",
35
- "buildGO": "go build -C go ./v4",
36
- "transpileGO": "tsx build/goTranspiler.ts",
37
40
  "buildCSRelease": "dotnet build cs --configuration Release",
38
41
  "csharp": "npm run transpileCS && npm run transpileCSWs && npm run buildCS",
39
42
  "go": "npm run transpileGO && npm run buildGO",
@@ -126,6 +129,7 @@
126
129
  "live-tests-rest-csharp": "npm run live-tests -- --csharp",
127
130
  "live-tests-rest-go": "npm run live-tests -- --go",
128
131
  "live-tests-ws-csharp": "npm run live-tests -- --csharp --ws",
132
+ "live-tests-ws-go": "npm run live-tests -- --go --ws",
129
133
  "ti-ts": "tsx ts/src/test/tests.init.ts",
130
134
  "ti-js": "node js/src/test/tests.init.js",
131
135
  "ti-py": "python3 python/ccxt/test/tests_init.py",
@@ -175,15 +179,17 @@
175
179
  "test-base-ws-py": "npm run ti-py -- --baseTests --ws",
176
180
  "test-base-ws-php": "npm run ti-php -- --baseTests --ws",
177
181
  "test-base-ws-cs": "npm run ti-cs -- --baseTests --ws",
182
+ "test-base-ws-go": "npm run ti-go -- --baseTests --ws",
178
183
  "test-base-rest": "npm run test-base-rest-js && npm run test-base-rest-py && npm run test-base-rest-php && npm run test-base-rest-cs",
179
- "test-base-ws": "npm run test-base-ws-js && npm run test-base-ws-py && npm run test-base-ws-php && npm run test-base-ws-cs",
184
+ "test-base-ws": "npm run test-base-ws-js && npm run test-base-ws-py && npm run test-base-ws-php && npm run test-base-ws-cs && npm run test-base-ws-go",
180
185
  "test": "npm run build && npm run commonjs-test && npm run id-tests && npm run request-tests && npm run response-tests && npm run live-tests",
181
186
  "commonjs-test": "node ./utils/test-commonjs.cjs",
182
187
  "package-test": "./utils/package-test.sh",
183
188
  "test-freshness": "tsx ./utils/test-freshness.ts",
184
189
  "benchmark": "tsx examples/ts/benchmark.ts",
185
190
  "cleanup-old-tags": "tsx ./build/cleanup-old-tags.ts",
186
- "test-types-go": "go run -C go ./tests/types/types.go"
191
+ "test-types-go": "go run -C go ./tests/types/types.go",
192
+ "test-go": "npm run test-types-go && npm run response-go && npm run request-go && npm run test-base-rest-go && npm run test-base-ws-go"
187
193
  },
188
194
  "types": "./js/ccxt.d.ts",
189
195
  "devDependencies": {
@@ -197,26 +203,31 @@
197
203
  "as-table": "^1.0.55",
198
204
  "asciichart": "^1.5.25",
199
205
  "assert": "^2.0.0",
200
- "ast-transpiler": "^0.0.70",
206
+ "ast-transpiler": "^0.0.71",
207
+ "blessed": "^0.1.81",
208
+ "clipboardy": "^5.0.0",
209
+ "commander": "^14.0.1",
201
210
  "docsify": "^4.13.1",
202
- "eslint": "8.22.0",
203
211
  "eslint-config-airbnb-base": "15.0.0",
204
212
  "eslint-plugin-import": "2.25.4",
205
213
  "eslint-plugin-jsdoc": "^46.9.0",
214
+ "eslint": "8.22.0",
206
215
  "https-proxy-agent": "^5.0.1",
207
216
  "jsdoc-to-markdown": "^8.0.0",
208
217
  "ololog": "^1.1.175",
218
+ "open": "^10.2.0",
219
+ "ora": "^9.0.0",
209
220
  "piscina": "^3.2.0",
210
221
  "protobufjs": "^7.5.3",
211
222
  "replace-in-file": "^6.3.5",
212
- "rollup": "^2.70.1",
213
223
  "rollup-plugin-execute": "1.1.1",
224
+ "rollup": "^2.70.1",
214
225
  "terser-webpack-plugin": "^5.3.9",
215
226
  "ts-loader": "^9.4.2",
216
227
  "tsx": "^4.7.2",
217
228
  "typescript": "4.7.4",
218
- "webpack": "^5.76.2",
219
- "webpack-cli": "^5.0.1"
229
+ "webpack-cli": "^5.0.1",
230
+ "webpack": "^5.76.2"
220
231
  },
221
232
  "author": {
222
233
  "name": "Igor Kroitor",