pmxt-core 2.27.10 → 2.28.1

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 (43) hide show
  1. package/dist/BaseExchange.d.ts +41 -1
  2. package/dist/BaseExchange.js +83 -22
  3. package/dist/exchanges/baozi/index.d.ts +2 -16
  4. package/dist/exchanges/baozi/index.js +2 -16
  5. package/dist/exchanges/kalshi/api.d.ts +1 -1
  6. package/dist/exchanges/kalshi/api.js +1 -1
  7. package/dist/exchanges/kalshi/index.d.ts +0 -22
  8. package/dist/exchanges/kalshi/index.js +0 -22
  9. package/dist/exchanges/limitless/api.d.ts +1 -1
  10. package/dist/exchanges/limitless/api.js +1 -1
  11. package/dist/exchanges/limitless/index.d.ts +1 -20
  12. package/dist/exchanges/limitless/index.js +1 -20
  13. package/dist/exchanges/metaculus/index.d.ts +0 -22
  14. package/dist/exchanges/metaculus/index.js +0 -23
  15. package/dist/exchanges/myriad/api.d.ts +1 -1
  16. package/dist/exchanges/myriad/api.js +1 -1
  17. package/dist/exchanges/myriad/index.d.ts +1 -13
  18. package/dist/exchanges/myriad/index.js +1 -13
  19. package/dist/exchanges/opinion/api.d.ts +1 -1
  20. package/dist/exchanges/opinion/api.js +1 -1
  21. package/dist/exchanges/opinion/index.d.ts +0 -22
  22. package/dist/exchanges/opinion/index.js +0 -22
  23. package/dist/exchanges/polymarket/api-clob.d.ts +1 -1
  24. package/dist/exchanges/polymarket/api-clob.js +1 -1
  25. package/dist/exchanges/polymarket/api-data.d.ts +1 -1
  26. package/dist/exchanges/polymarket/api-data.js +1 -1
  27. package/dist/exchanges/polymarket/api-gamma.d.ts +1 -1
  28. package/dist/exchanges/polymarket/api-gamma.js +1 -1
  29. package/dist/exchanges/polymarket/index.d.ts +1 -22
  30. package/dist/exchanges/polymarket/index.js +3 -22
  31. package/dist/exchanges/polymarket/websocket.d.ts +1 -0
  32. package/dist/exchanges/polymarket/websocket.js +15 -0
  33. package/dist/exchanges/polymarket_us/index.d.ts +0 -22
  34. package/dist/exchanges/polymarket_us/index.js +0 -22
  35. package/dist/exchanges/probable/api.d.ts +1 -1
  36. package/dist/exchanges/probable/api.js +1 -1
  37. package/dist/exchanges/probable/index.d.ts +0 -22
  38. package/dist/exchanges/probable/index.js +0 -22
  39. package/dist/exchanges/smarkets/index.d.ts +1 -20
  40. package/dist/exchanges/smarkets/index.js +1 -20
  41. package/dist/server/method-verbs.json +10 -0
  42. package/dist/server/openapi.yaml +31 -0
  43. package/package.json +3 -3
@@ -201,6 +201,8 @@ export interface ExchangeHas {
201
201
  unwatchAddress: ExchangeCapability;
202
202
  /** Whether this exchange supports streaming order book updates. */
203
203
  watchOrderBook: ExchangeCapability;
204
+ /** Whether this exchange supports unsubscribing from an order book stream. */
205
+ unwatchOrderBook: ExchangeCapability;
204
206
  /** Whether this exchange supports streaming trade updates. */
205
207
  watchTrades: ExchangeCapability;
206
208
  /** Whether this exchange supports fetching the authenticated user's trade history. */
@@ -254,7 +256,21 @@ export declare abstract class PredictionMarketExchange {
254
256
  markets: Record<string, UnifiedMarket>;
255
257
  marketsBySlug: Record<string, UnifiedMarket>;
256
258
  loadedMarkets: boolean;
257
- readonly has: ExchangeHas;
259
+ /**
260
+ * Capability map derived automatically from method overrides at runtime.
261
+ * Exchanges do NOT need to declare this manually -- if a subclass overrides
262
+ * a method (and the override does not throw "not supported"), it is `true`.
263
+ * To mark a capability as `'emulated'`, add its key to `emulatedCapabilities`.
264
+ */
265
+ get has(): ExchangeHas;
266
+ private _has?;
267
+ /**
268
+ * Override in subclasses to force specific capability values.
269
+ * Use `'emulated'` for methods backed by a non-native mechanism,
270
+ * or `false` for methods that override the base only to throw a
271
+ * better error message (e.g. "pari-mutuel bets cannot be cancelled").
272
+ */
273
+ protected readonly capabilityOverrides: Partial<Record<keyof ExchangeHas, ExchangeCapability>>;
258
274
  protected credentials?: ExchangeCredentials;
259
275
  protected apiDescriptor?: ApiDescriptor;
260
276
  private _throttler;
@@ -492,6 +508,12 @@ export declare abstract class PredictionMarketExchange {
492
508
  * @returns Promise that resolves with the current orderbook state
493
509
  */
494
510
  watchOrderBook(id: string, limit?: number): Promise<OrderBook>;
511
+ /**
512
+ * Unsubscribe from a previously watched order book stream.
513
+ *
514
+ * @param id - The Outcome ID to stop watching
515
+ */
516
+ unwatchOrderBook(id: string): Promise<void>;
495
517
  /**
496
518
  * Watch trade executions in real-time via WebSocket.
497
519
  * Returns a promise that resolves with the next trade(s). Call repeatedly in a loop to stream updates (CCXT Pro pattern).
@@ -560,4 +582,22 @@ export declare abstract class PredictionMarketExchange {
560
582
  * Creates an async function for an implicit API endpoint.
561
583
  */
562
584
  private createImplicitMethod;
585
+ /** All keys that appear in ExchangeHas -- kept in sync via the exhaustive check below. */
586
+ private static readonly _capabilityKeys;
587
+ private static readonly _exhaustiveCheck;
588
+ /**
589
+ * Map from capability keys to the actual method(s) whose override status
590
+ * determines support. Most map 1:1, but `fetchMarkets` and `fetchEvents`
591
+ * are implemented in the base class and delegate to `*Impl` methods that
592
+ * exchanges override instead.
593
+ */
594
+ private static readonly _capabilityDelegates;
595
+ /**
596
+ * Derive the capability map by comparing this instance's prototype chain
597
+ * against the base class stubs. A method that is overridden (i.e. not the
598
+ * same function reference as the base stub) is considered supported.
599
+ *
600
+ * Explicit `capabilityOverrides` take precedence over introspection.
601
+ */
602
+ private _deriveCapabilities;
563
603
  }
@@ -19,28 +19,26 @@ class PredictionMarketExchange {
19
19
  markets = {};
20
20
  marketsBySlug = {};
21
21
  loadedMarkets = false;
22
- has = {
23
- fetchMarkets: false,
24
- fetchEvents: false,
25
- fetchOHLCV: false,
26
- fetchOrderBook: false,
27
- fetchTrades: false,
28
- createOrder: false,
29
- cancelOrder: false,
30
- fetchOrder: false,
31
- fetchOpenOrders: false,
32
- fetchPositions: false,
33
- fetchBalance: false,
34
- watchAddress: false,
35
- unwatchAddress: false,
36
- watchOrderBook: false,
37
- watchTrades: false,
38
- fetchMyTrades: false,
39
- fetchClosedOrders: false,
40
- fetchAllOrders: false,
41
- buildOrder: false,
42
- submitOrder: false,
43
- };
22
+ /**
23
+ * Capability map derived automatically from method overrides at runtime.
24
+ * Exchanges do NOT need to declare this manually -- if a subclass overrides
25
+ * a method (and the override does not throw "not supported"), it is `true`.
26
+ * To mark a capability as `'emulated'`, add its key to `emulatedCapabilities`.
27
+ */
28
+ get has() {
29
+ if (!this._has) {
30
+ this._has = this._deriveCapabilities();
31
+ }
32
+ return this._has;
33
+ }
34
+ _has;
35
+ /**
36
+ * Override in subclasses to force specific capability values.
37
+ * Use `'emulated'` for methods backed by a non-native mechanism,
38
+ * or `false` for methods that override the base only to throw a
39
+ * better error message (e.g. "pari-mutuel bets cannot be cancelled").
40
+ */
41
+ capabilityOverrides = {};
44
42
  credentials;
45
43
  // Implicit API (merged across multiple defineImplicitApi calls)
46
44
  apiDescriptor;
@@ -668,6 +666,14 @@ class PredictionMarketExchange {
668
666
  async watchOrderBook(id, limit) {
669
667
  throw new Error(`watchOrderBook() is not supported by ${this.name}`);
670
668
  }
669
+ /**
670
+ * Unsubscribe from a previously watched order book stream.
671
+ *
672
+ * @param id - The Outcome ID to stop watching
673
+ */
674
+ async unwatchOrderBook(id) {
675
+ throw new Error(`unwatchOrderBook() is not supported by ${this.name}`);
676
+ }
671
677
  // ----------------------------------------------------------------------------
672
678
  // WebSocket Streaming Methods
673
679
  // ----------------------------------------------------------------------------
@@ -827,5 +833,60 @@ class PredictionMarketExchange {
827
833
  }
828
834
  };
829
835
  }
836
+ // ----------------------------------------------------------------------------
837
+ // Capability Derivation
838
+ // ----------------------------------------------------------------------------
839
+ /** All keys that appear in ExchangeHas -- kept in sync via the exhaustive check below. */
840
+ static _capabilityKeys = [
841
+ 'fetchMarkets', 'fetchEvents', 'fetchOHLCV', 'fetchOrderBook',
842
+ 'fetchTrades', 'createOrder', 'cancelOrder', 'fetchOrder',
843
+ 'fetchOpenOrders', 'fetchPositions', 'fetchBalance',
844
+ 'watchAddress', 'unwatchAddress', 'watchOrderBook',
845
+ 'unwatchOrderBook', 'watchTrades', 'fetchMyTrades',
846
+ 'fetchClosedOrders', 'fetchAllOrders', 'buildOrder', 'submitOrder',
847
+ ];
848
+ // Compile-time exhaustiveness check: fails tsc if a key exists in
849
+ // ExchangeHas but is missing from _capabilityKeys above.
850
+ static _exhaustiveCheck = {
851
+ fetchMarkets: true, fetchEvents: true, fetchOHLCV: true,
852
+ fetchOrderBook: true, fetchTrades: true, createOrder: true,
853
+ cancelOrder: true, fetchOrder: true, fetchOpenOrders: true,
854
+ fetchPositions: true, fetchBalance: true, watchAddress: true,
855
+ unwatchAddress: true, watchOrderBook: true, unwatchOrderBook: true,
856
+ watchTrades: true, fetchMyTrades: true, fetchClosedOrders: true,
857
+ fetchAllOrders: true, buildOrder: true, submitOrder: true,
858
+ };
859
+ /**
860
+ * Map from capability keys to the actual method(s) whose override status
861
+ * determines support. Most map 1:1, but `fetchMarkets` and `fetchEvents`
862
+ * are implemented in the base class and delegate to `*Impl` methods that
863
+ * exchanges override instead.
864
+ */
865
+ static _capabilityDelegates = {
866
+ fetchMarkets: 'fetchMarketsImpl',
867
+ fetchEvents: 'fetchEventsImpl',
868
+ };
869
+ /**
870
+ * Derive the capability map by comparing this instance's prototype chain
871
+ * against the base class stubs. A method that is overridden (i.e. not the
872
+ * same function reference as the base stub) is considered supported.
873
+ *
874
+ * Explicit `capabilityOverrides` take precedence over introspection.
875
+ */
876
+ _deriveCapabilities() {
877
+ const base = PredictionMarketExchange.prototype;
878
+ const result = {};
879
+ for (const key of PredictionMarketExchange._capabilityKeys) {
880
+ // Explicit override wins unconditionally
881
+ if (key in this.capabilityOverrides) {
882
+ result[key] = this.capabilityOverrides[key];
883
+ continue;
884
+ }
885
+ // Check the delegate method (usually same name, but fetchMarkets -> fetchMarketsImpl)
886
+ const methodName = PredictionMarketExchange._capabilityDelegates[key] ?? key;
887
+ result[key] = this[methodName] !== base[methodName];
888
+ }
889
+ return result;
890
+ }
830
891
  }
831
892
  exports.PredictionMarketExchange = PredictionMarketExchange;
@@ -5,27 +5,13 @@ export interface BaoziExchangeOptions {
5
5
  rpcUrl?: string;
6
6
  }
7
7
  export declare class BaoziExchange extends PredictionMarketExchange {
8
- readonly has: {
9
- fetchMarkets: true;
10
- fetchEvents: true;
8
+ protected readonly capabilityOverrides: {
11
9
  fetchOHLCV: "emulated";
12
10
  fetchOrderBook: "emulated";
13
11
  fetchTrades: "emulated";
14
- createOrder: true;
15
- cancelOrder: false;
16
- fetchOrder: true;
17
12
  fetchOpenOrders: "emulated";
18
- fetchPositions: true;
19
- fetchBalance: true;
20
- watchAddress: false;
21
- unwatchAddress: false;
22
- watchOrderBook: true;
13
+ cancelOrder: false;
23
14
  watchTrades: false;
24
- fetchMyTrades: false;
25
- fetchClosedOrders: false;
26
- fetchAllOrders: false;
27
- buildOrder: false;
28
- submitOrder: false;
29
15
  };
30
16
  private auth?;
31
17
  private connection;
@@ -11,27 +11,13 @@ const fetcher_1 = require("./fetcher");
11
11
  const normalizer_1 = require("./normalizer");
12
12
  const utils_1 = require("./utils");
13
13
  class BaoziExchange extends BaseExchange_1.PredictionMarketExchange {
14
- has = {
15
- fetchMarkets: true,
16
- fetchEvents: true,
14
+ capabilityOverrides = {
17
15
  fetchOHLCV: 'emulated',
18
16
  fetchOrderBook: 'emulated',
19
17
  fetchTrades: 'emulated',
20
- createOrder: true,
21
- cancelOrder: false,
22
- fetchOrder: true,
23
18
  fetchOpenOrders: 'emulated',
24
- fetchPositions: true,
25
- fetchBalance: true,
26
- watchAddress: false,
27
- unwatchAddress: false,
28
- watchOrderBook: true,
19
+ cancelOrder: false,
29
20
  watchTrades: false,
30
- fetchMyTrades: false,
31
- fetchClosedOrders: false,
32
- fetchAllOrders: false,
33
- buildOrder: false,
34
- submitOrder: false,
35
21
  };
36
22
  auth;
37
23
  connection;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/kalshi/Kalshi.yaml
3
- * Generated at: 2026-04-11T09:39:36.747Z
3
+ * Generated at: 2026-04-11T11:19:05.280Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const kalshiApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.kalshiApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/kalshi/Kalshi.yaml
6
- * Generated at: 2026-04-11T09:39:36.747Z
6
+ * Generated at: 2026-04-11T11:19:05.280Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.kalshiApiSpec = {
@@ -11,28 +11,6 @@ export interface KalshiInternalOptions extends KalshiExchangeOptions {
11
11
  demoMode?: boolean;
12
12
  }
13
13
  export declare class KalshiExchange extends PredictionMarketExchange {
14
- readonly has: {
15
- fetchMarkets: true;
16
- fetchEvents: true;
17
- fetchOHLCV: true;
18
- fetchOrderBook: true;
19
- fetchTrades: true;
20
- createOrder: true;
21
- cancelOrder: true;
22
- fetchOrder: true;
23
- fetchOpenOrders: true;
24
- fetchPositions: true;
25
- fetchBalance: true;
26
- watchAddress: false;
27
- unwatchAddress: false;
28
- watchOrderBook: true;
29
- watchTrades: true;
30
- fetchMyTrades: true;
31
- fetchClosedOrders: true;
32
- fetchAllOrders: true;
33
- buildOrder: true;
34
- submitOrder: true;
35
- };
36
14
  private auth?;
37
15
  private wsConfig?;
38
16
  private config;
@@ -13,28 +13,6 @@ const config_1 = require("./config");
13
13
  const fetcher_1 = require("./fetcher");
14
14
  const normalizer_1 = require("./normalizer");
15
15
  class KalshiExchange extends BaseExchange_1.PredictionMarketExchange {
16
- has = {
17
- fetchMarkets: true,
18
- fetchEvents: true,
19
- fetchOHLCV: true,
20
- fetchOrderBook: true,
21
- fetchTrades: true,
22
- createOrder: true,
23
- cancelOrder: true,
24
- fetchOrder: true,
25
- fetchOpenOrders: true,
26
- fetchPositions: true,
27
- fetchBalance: true,
28
- watchAddress: false,
29
- unwatchAddress: false,
30
- watchOrderBook: true,
31
- watchTrades: true,
32
- fetchMyTrades: true,
33
- fetchClosedOrders: true,
34
- fetchAllOrders: true,
35
- buildOrder: true,
36
- submitOrder: true,
37
- };
38
16
  auth;
39
17
  wsConfig;
40
18
  config;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/limitless/Limitless.yaml
3
- * Generated at: 2026-04-11T09:39:36.781Z
3
+ * Generated at: 2026-04-11T11:19:05.327Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const limitlessApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.limitlessApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/limitless/Limitless.yaml
6
- * Generated at: 2026-04-11T09:39:36.781Z
6
+ * Generated at: 2026-04-11T11:19:05.327Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.limitlessApiSpec = {
@@ -11,27 +11,8 @@ export interface LimitlessExchangeOptions {
11
11
  websocket?: LimitlessWebSocketConfig;
12
12
  }
13
13
  export declare class LimitlessExchange extends PredictionMarketExchange {
14
- readonly has: {
15
- fetchMarkets: true;
16
- fetchEvents: true;
17
- fetchOHLCV: true;
18
- fetchOrderBook: true;
19
- fetchTrades: true;
20
- createOrder: true;
21
- cancelOrder: true;
14
+ protected readonly capabilityOverrides: {
22
15
  fetchOrder: false;
23
- fetchOpenOrders: true;
24
- fetchPositions: true;
25
- fetchBalance: true;
26
- watchAddress: true;
27
- unwatchAddress: true;
28
- watchOrderBook: true;
29
- watchTrades: true;
30
- fetchMyTrades: true;
31
- fetchClosedOrders: true;
32
- fetchAllOrders: true;
33
- buildOrder: false;
34
- submitOrder: false;
35
16
  };
36
17
  private auth?;
37
18
  private client?;
@@ -17,27 +17,8 @@ const fetcher_1 = require("./fetcher");
17
17
  const normalizer_1 = require("./normalizer");
18
18
  const websocket_1 = require("./websocket");
19
19
  class LimitlessExchange extends BaseExchange_1.PredictionMarketExchange {
20
- has = {
21
- fetchMarkets: true,
22
- fetchEvents: true,
23
- fetchOHLCV: true,
24
- fetchOrderBook: true,
25
- fetchTrades: true,
26
- createOrder: true,
27
- cancelOrder: true,
20
+ capabilityOverrides = {
28
21
  fetchOrder: false,
29
- fetchOpenOrders: true,
30
- fetchPositions: true,
31
- fetchBalance: true,
32
- watchAddress: true,
33
- unwatchAddress: true,
34
- watchOrderBook: true,
35
- watchTrades: true,
36
- fetchMyTrades: true,
37
- fetchClosedOrders: true,
38
- fetchAllOrders: true,
39
- buildOrder: false,
40
- submitOrder: false,
41
22
  };
42
23
  auth;
43
24
  client;
@@ -37,28 +37,6 @@ import { UnifiedMarket, UnifiedEvent, CreateOrderParams, Order } from "../../typ
37
37
  * | Continuous/numeric/date | Yes (read-only HIGHER/LOWER) | No (requires 201-point CDF) |
38
38
  */
39
39
  export declare class MetaculusExchange extends PredictionMarketExchange {
40
- readonly has: {
41
- fetchMarkets: true;
42
- fetchEvents: true;
43
- createOrder: true;
44
- cancelOrder: true;
45
- fetchOHLCV: false;
46
- fetchOrderBook: false;
47
- fetchTrades: false;
48
- fetchOrder: false;
49
- fetchOpenOrders: false;
50
- fetchPositions: false;
51
- fetchBalance: false;
52
- watchAddress: false;
53
- unwatchAddress: false;
54
- watchOrderBook: false;
55
- watchTrades: false;
56
- fetchMyTrades: false;
57
- fetchClosedOrders: false;
58
- fetchAllOrders: false;
59
- buildOrder: false;
60
- submitOrder: false;
61
- };
62
40
  private readonly apiToken?;
63
41
  constructor(credentials?: ExchangeCredentials);
64
42
  get name(): string;
@@ -48,29 +48,6 @@ const cancelOrder_1 = require("./cancelOrder");
48
48
  * | Continuous/numeric/date | Yes (read-only HIGHER/LOWER) | No (requires 201-point CDF) |
49
49
  */
50
50
  class MetaculusExchange extends BaseExchange_1.PredictionMarketExchange {
51
- has = {
52
- fetchMarkets: true,
53
- fetchEvents: true,
54
- createOrder: true,
55
- cancelOrder: true,
56
- // Metaculus is a forecasting platform -- no order book, no trading history
57
- fetchOHLCV: false,
58
- fetchOrderBook: false,
59
- fetchTrades: false,
60
- fetchOrder: false,
61
- fetchOpenOrders: false,
62
- fetchPositions: false,
63
- fetchBalance: false,
64
- watchAddress: false,
65
- unwatchAddress: false,
66
- watchOrderBook: false,
67
- watchTrades: false,
68
- fetchMyTrades: false,
69
- fetchClosedOrders: false,
70
- fetchAllOrders: false,
71
- buildOrder: false,
72
- submitOrder: false,
73
- };
74
51
  apiToken;
75
52
  constructor(credentials) {
76
53
  super(credentials);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/myriad/myriad.yaml
3
- * Generated at: 2026-04-11T09:39:36.791Z
3
+ * Generated at: 2026-04-11T11:19:05.341Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const myriadApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.myriadApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/myriad/myriad.yaml
6
- * Generated at: 2026-04-11T09:39:36.791Z
6
+ * Generated at: 2026-04-11T11:19:05.341Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.myriadApiSpec = {
@@ -1,27 +1,15 @@
1
1
  import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams, OHLCVParams, TradesParams, ExchangeCredentials, EventFetchParams, MyTradesParams } from '../../BaseExchange';
2
2
  import { UnifiedMarket, UnifiedEvent, PriceCandle, OrderBook, Trade, UserTrade, Balance, Order, Position, CreateOrderParams } from '../../types';
3
3
  export declare class MyriadExchange extends PredictionMarketExchange {
4
- readonly has: {
5
- fetchMarkets: true;
6
- fetchEvents: true;
7
- fetchOHLCV: true;
4
+ protected readonly capabilityOverrides: {
8
5
  fetchOrderBook: "emulated";
9
- fetchTrades: true;
10
6
  createOrder: "emulated";
11
7
  cancelOrder: false;
12
8
  fetchOrder: false;
13
9
  fetchOpenOrders: "emulated";
14
- fetchPositions: true;
15
10
  fetchBalance: "emulated";
16
- watchAddress: false;
17
- unwatchAddress: false;
18
11
  watchOrderBook: "emulated";
19
12
  watchTrades: "emulated";
20
- fetchMyTrades: true;
21
- fetchClosedOrders: false;
22
- fetchAllOrders: false;
23
- buildOrder: false;
24
- submitOrder: false;
25
13
  };
26
14
  private auth?;
27
15
  private ws?;
@@ -12,27 +12,15 @@ const api_1 = require("./api");
12
12
  const fetcher_1 = require("./fetcher");
13
13
  const normalizer_1 = require("./normalizer");
14
14
  class MyriadExchange extends BaseExchange_1.PredictionMarketExchange {
15
- has = {
16
- fetchMarkets: true,
17
- fetchEvents: true,
18
- fetchOHLCV: true,
15
+ capabilityOverrides = {
19
16
  fetchOrderBook: 'emulated',
20
- fetchTrades: true,
21
17
  createOrder: 'emulated',
22
18
  cancelOrder: false,
23
19
  fetchOrder: false,
24
20
  fetchOpenOrders: 'emulated',
25
- fetchPositions: true,
26
21
  fetchBalance: 'emulated',
27
- watchAddress: false,
28
- unwatchAddress: false,
29
22
  watchOrderBook: 'emulated',
30
23
  watchTrades: 'emulated',
31
- fetchMyTrades: true,
32
- fetchClosedOrders: false,
33
- fetchAllOrders: false,
34
- buildOrder: false,
35
- submitOrder: false,
36
24
  };
37
25
  auth;
38
26
  ws;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/opinion/opinion-openapi.yaml
3
- * Generated at: 2026-04-11T09:39:36.796Z
3
+ * Generated at: 2026-04-11T11:19:05.346Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const opinionApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.opinionApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/opinion/opinion-openapi.yaml
6
- * Generated at: 2026-04-11T09:39:36.796Z
6
+ * Generated at: 2026-04-11T11:19:05.346Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.opinionApiSpec = {
@@ -8,28 +8,6 @@ export interface OpinionExchangeOptions {
8
8
  websocket?: OpinionWebSocketConfig;
9
9
  }
10
10
  export declare class OpinionExchange extends PredictionMarketExchange {
11
- readonly has: {
12
- fetchMarkets: true;
13
- fetchEvents: true;
14
- fetchOHLCV: true;
15
- fetchOrderBook: true;
16
- fetchTrades: false;
17
- createOrder: true;
18
- cancelOrder: true;
19
- fetchOrder: true;
20
- fetchOpenOrders: true;
21
- fetchPositions: true;
22
- fetchBalance: false;
23
- watchAddress: false;
24
- unwatchAddress: false;
25
- watchOrderBook: true;
26
- watchTrades: true;
27
- fetchMyTrades: true;
28
- fetchClosedOrders: true;
29
- fetchAllOrders: true;
30
- buildOrder: true;
31
- submitOrder: true;
32
- };
33
11
  private auth?;
34
12
  private readonly walletAddress?;
35
13
  private wsConfig?;
@@ -52,28 +52,6 @@ const config_1 = require("./config");
52
52
  const fetcher_1 = require("./fetcher");
53
53
  const normalizer_1 = require("./normalizer");
54
54
  class OpinionExchange extends BaseExchange_1.PredictionMarketExchange {
55
- has = {
56
- fetchMarkets: true,
57
- fetchEvents: true,
58
- fetchOHLCV: true,
59
- fetchOrderBook: true,
60
- fetchTrades: false,
61
- createOrder: true,
62
- cancelOrder: true,
63
- fetchOrder: true,
64
- fetchOpenOrders: true,
65
- fetchPositions: true,
66
- fetchBalance: false,
67
- watchAddress: false,
68
- unwatchAddress: false,
69
- watchOrderBook: true,
70
- watchTrades: true,
71
- fetchMyTrades: true,
72
- fetchClosedOrders: true,
73
- fetchAllOrders: true,
74
- buildOrder: true,
75
- submitOrder: true,
76
- };
77
55
  auth;
78
56
  walletAddress;
79
57
  wsConfig;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketClobAPI.yaml
3
- * Generated at: 2026-04-11T09:39:36.751Z
3
+ * Generated at: 2026-04-11T11:19:05.287Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const polymarketClobSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.polymarketClobSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketClobAPI.yaml
6
- * Generated at: 2026-04-11T09:39:36.751Z
6
+ * Generated at: 2026-04-11T11:19:05.287Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.polymarketClobSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/Polymarket_Data_API.yaml
3
- * Generated at: 2026-04-11T09:39:36.765Z
3
+ * Generated at: 2026-04-11T11:19:05.306Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const polymarketDataSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.polymarketDataSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/Polymarket_Data_API.yaml
6
- * Generated at: 2026-04-11T09:39:36.765Z
6
+ * Generated at: 2026-04-11T11:19:05.306Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.polymarketDataSpec = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketGammaAPI.yaml
3
- * Generated at: 2026-04-11T09:39:36.762Z
3
+ * Generated at: 2026-04-11T11:19:05.303Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const polymarketGammaSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.polymarketGammaSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/polymarket/PolymarketGammaAPI.yaml
6
- * Generated at: 2026-04-11T09:39:36.762Z
6
+ * Generated at: 2026-04-11T11:19:05.303Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.polymarketGammaSpec = {
@@ -11,28 +11,6 @@ export interface PolymarketExchangeOptions {
11
11
  websocket?: PolymarketWebSocketConfig;
12
12
  }
13
13
  export declare class PolymarketExchange extends PredictionMarketExchange {
14
- readonly has: {
15
- fetchMarkets: true;
16
- fetchEvents: true;
17
- fetchOHLCV: true;
18
- fetchOrderBook: true;
19
- fetchTrades: true;
20
- createOrder: true;
21
- cancelOrder: true;
22
- fetchOrder: true;
23
- fetchOpenOrders: true;
24
- fetchPositions: true;
25
- fetchBalance: true;
26
- watchAddress: true;
27
- unwatchAddress: true;
28
- watchOrderBook: true;
29
- watchTrades: true;
30
- fetchMyTrades: true;
31
- fetchClosedOrders: false;
32
- fetchAllOrders: false;
33
- buildOrder: true;
34
- submitOrder: true;
35
- };
36
14
  private auth?;
37
15
  private wsConfig?;
38
16
  private cachedApiCreds?;
@@ -72,6 +50,7 @@ export declare class PolymarketExchange extends PredictionMarketExchange {
72
50
  fetchPositions(address?: string): Promise<Position[]>;
73
51
  fetchBalance(address?: string): Promise<Balance[]>;
74
52
  watchOrderBook(id: string, limit?: number): Promise<OrderBook>;
53
+ unwatchOrderBook(id: string): Promise<void>;
75
54
  watchTrades(id: string, address?: string, since?: number, limit?: number): Promise<Trade[]>;
76
55
  watchAddress(address: string, types?: SubscriptionOption[]): Promise<SubscribedAddressSnapshot>;
77
56
  unwatchAddress(address: string): Promise<void>;
@@ -19,28 +19,6 @@ const fetcher_1 = require("./fetcher");
19
19
  const normalizer_1 = require("./normalizer");
20
20
  const websocket_1 = require("./websocket");
21
21
  class PolymarketExchange extends BaseExchange_1.PredictionMarketExchange {
22
- has = {
23
- fetchMarkets: true,
24
- fetchEvents: true,
25
- fetchOHLCV: true,
26
- fetchOrderBook: true,
27
- fetchTrades: true,
28
- createOrder: true,
29
- cancelOrder: true,
30
- fetchOrder: true,
31
- fetchOpenOrders: true,
32
- fetchPositions: true,
33
- fetchBalance: true,
34
- watchAddress: true,
35
- unwatchAddress: true,
36
- watchOrderBook: true,
37
- watchTrades: true,
38
- fetchMyTrades: true,
39
- fetchClosedOrders: false,
40
- fetchAllOrders: false,
41
- buildOrder: true,
42
- submitOrder: true,
43
- };
44
22
  auth;
45
23
  wsConfig;
46
24
  cachedApiCreds;
@@ -438,6 +416,9 @@ class PolymarketExchange extends BaseExchange_1.PredictionMarketExchange {
438
416
  async watchOrderBook(id, limit) {
439
417
  return this.ensureWs().watchOrderBook(id);
440
418
  }
419
+ async unwatchOrderBook(id) {
420
+ return this.ensureWs().unwatchOrderBook(id);
421
+ }
441
422
  async watchTrades(id, address, since, limit) {
442
423
  return this.ensureWs().watchTrades(id, address);
443
424
  }
@@ -30,6 +30,7 @@ export declare class PolymarketWebSocket {
30
30
  private initializationPromise?;
31
31
  constructor(callApi: (operationId: string, params?: Record<string, any>) => Promise<any>, config?: PolymarketWebSocketConfig);
32
32
  watchOrderBook(id: string): Promise<OrderBook>;
33
+ unwatchOrderBook(id: string): Promise<void>;
33
34
  watchTrades(id: string, address?: string): Promise<Trade[]>;
34
35
  watchAddress(address: string, types: SubscriptionOption[]): Promise<SubscribedAddressSnapshot>;
35
36
  unwatchAddress(address: string): Promise<void>;
@@ -82,6 +82,21 @@ class PolymarketWebSocket {
82
82
  this.orderBookResolvers.get(id).push({ resolve, reject });
83
83
  });
84
84
  }
85
+ async unwatchOrderBook(id) {
86
+ if (!this.manager) {
87
+ return;
88
+ }
89
+ await this.manager.removeSubscriptions([id]);
90
+ // Clear any pending resolvers for this asset
91
+ const resolvers = this.orderBookResolvers.get(id);
92
+ if (resolvers) {
93
+ this.orderBookResolvers = new Map([...this.orderBookResolvers].filter(([key]) => key !== id));
94
+ }
95
+ // Remove the cached orderbook for this asset
96
+ if (this.orderBooks.has(id)) {
97
+ this.orderBooks = new Map([...this.orderBooks].filter(([key]) => key !== id));
98
+ }
99
+ }
85
100
  async watchTrades(id, address) {
86
101
  if (address) {
87
102
  return this.watcher.watch(address, ['trades'], id);
@@ -20,28 +20,6 @@ export * from './price';
20
20
  export * from './errors';
21
21
  export { PolymarketUSNormalizer } from './normalizer';
22
22
  export declare class PolymarketUSExchange extends PredictionMarketExchange {
23
- readonly has: {
24
- fetchMarkets: true;
25
- fetchEvents: true;
26
- fetchOHLCV: false;
27
- fetchOrderBook: true;
28
- fetchTrades: false;
29
- createOrder: true;
30
- cancelOrder: true;
31
- fetchOrder: true;
32
- fetchOpenOrders: true;
33
- fetchPositions: true;
34
- fetchBalance: true;
35
- watchAddress: false;
36
- unwatchAddress: false;
37
- watchOrderBook: true;
38
- watchTrades: true;
39
- fetchMyTrades: true;
40
- fetchClosedOrders: false;
41
- fetchAllOrders: false;
42
- buildOrder: true;
43
- submitOrder: true;
44
- };
45
23
  private readonly client;
46
24
  private readonly normalizer;
47
25
  private readonly config;
@@ -44,28 +44,6 @@ __exportStar(require("./errors"), exports);
44
44
  var normalizer_2 = require("./normalizer");
45
45
  Object.defineProperty(exports, "PolymarketUSNormalizer", { enumerable: true, get: function () { return normalizer_2.PolymarketUSNormalizer; } });
46
46
  class PolymarketUSExchange extends BaseExchange_1.PredictionMarketExchange {
47
- has = {
48
- fetchMarkets: true,
49
- fetchEvents: true,
50
- fetchOHLCV: false,
51
- fetchOrderBook: true,
52
- fetchTrades: false,
53
- createOrder: true,
54
- cancelOrder: true,
55
- fetchOrder: true,
56
- fetchOpenOrders: true,
57
- fetchPositions: true,
58
- fetchBalance: true,
59
- watchAddress: false,
60
- unwatchAddress: false,
61
- watchOrderBook: true,
62
- watchTrades: true,
63
- fetchMyTrades: true,
64
- fetchClosedOrders: false,
65
- fetchAllOrders: false,
66
- buildOrder: true,
67
- submitOrder: true,
68
- };
69
47
  client;
70
48
  normalizer;
71
49
  config;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/probable/probable.yaml
3
- * Generated at: 2026-04-11T09:39:36.786Z
3
+ * Generated at: 2026-04-11T11:19:05.333Z
4
4
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
5
5
  */
6
6
  export declare const probableApiSpec: {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.probableApiSpec = void 0;
4
4
  /**
5
5
  * Auto-generated from /home/runner/work/pmxt/pmxt/core/specs/probable/probable.yaml
6
- * Generated at: 2026-04-11T09:39:36.786Z
6
+ * Generated at: 2026-04-11T11:19:05.333Z
7
7
  * Do not edit manually -- run "npm run fetch:openapi" to regenerate.
8
8
  */
9
9
  exports.probableApiSpec = {
@@ -2,28 +2,6 @@ import { PredictionMarketExchange, MarketFetchParams, EventFetchParams, Exchange
2
2
  import { UnifiedMarket, UnifiedEvent, OrderBook, PriceCandle, Trade, UserTrade, Order, Position, Balance, CreateOrderParams } from '../../types';
3
3
  import { ProbableWebSocketConfig } from './websocket';
4
4
  export declare class ProbableExchange extends PredictionMarketExchange {
5
- readonly has: {
6
- fetchMarkets: true;
7
- fetchEvents: true;
8
- fetchOHLCV: true;
9
- fetchOrderBook: true;
10
- fetchTrades: true;
11
- createOrder: true;
12
- cancelOrder: true;
13
- fetchOrder: true;
14
- fetchOpenOrders: true;
15
- fetchPositions: true;
16
- fetchBalance: true;
17
- watchAddress: false;
18
- unwatchAddress: false;
19
- watchOrderBook: true;
20
- watchTrades: false;
21
- fetchMyTrades: true;
22
- fetchClosedOrders: false;
23
- fetchAllOrders: false;
24
- buildOrder: false;
25
- submitOrder: false;
26
- };
27
5
  private auth?;
28
6
  private ws?;
29
7
  private wsConfig?;
@@ -14,28 +14,6 @@ const fetcher_1 = require("./fetcher");
14
14
  const normalizer_1 = require("./normalizer");
15
15
  const BSC_USDT_ADDRESS = '0x55d398326f99059fF775485246999027B3197955';
16
16
  class ProbableExchange extends BaseExchange_1.PredictionMarketExchange {
17
- has = {
18
- fetchMarkets: true,
19
- fetchEvents: true,
20
- fetchOHLCV: true,
21
- fetchOrderBook: true,
22
- fetchTrades: true,
23
- createOrder: true,
24
- cancelOrder: true,
25
- fetchOrder: true,
26
- fetchOpenOrders: true,
27
- fetchPositions: true,
28
- fetchBalance: true,
29
- watchAddress: false,
30
- unwatchAddress: false,
31
- watchOrderBook: true,
32
- watchTrades: false,
33
- fetchMyTrades: true,
34
- fetchClosedOrders: false,
35
- fetchAllOrders: false,
36
- buildOrder: false,
37
- submitOrder: false,
38
- };
39
17
  auth;
40
18
  ws;
41
19
  wsConfig;
@@ -1,27 +1,8 @@
1
1
  import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams, TradesParams, ExchangeCredentials, EventFetchParams, MyTradesParams, OrderHistoryParams } from '../../BaseExchange';
2
2
  import { UnifiedMarket, UnifiedEvent, OrderBook, Trade, UserTrade, Balance, Order, Position, CreateOrderParams, BuiltOrder } from '../../types';
3
3
  export declare class SmarketsExchange extends PredictionMarketExchange {
4
- readonly has: {
5
- fetchMarkets: true;
6
- fetchEvents: true;
7
- fetchOHLCV: false;
8
- fetchOrderBook: true;
9
- fetchTrades: true;
10
- createOrder: true;
11
- cancelOrder: true;
12
- fetchOrder: true;
13
- fetchOpenOrders: true;
4
+ protected readonly capabilityOverrides: {
14
5
  fetchPositions: "emulated";
15
- fetchBalance: true;
16
- watchAddress: false;
17
- unwatchAddress: false;
18
- watchOrderBook: false;
19
- watchTrades: false;
20
- fetchMyTrades: true;
21
- fetchClosedOrders: true;
22
- fetchAllOrders: true;
23
- buildOrder: true;
24
- submitOrder: true;
25
6
  };
26
7
  private auth?;
27
8
  private loginPromise;
@@ -12,27 +12,8 @@ const fetcher_1 = require("./fetcher");
12
12
  const normalizer_1 = require("./normalizer");
13
13
  const price_1 = require("./price");
14
14
  class SmarketsExchange extends BaseExchange_1.PredictionMarketExchange {
15
- has = {
16
- fetchMarkets: true,
17
- fetchEvents: true,
18
- fetchOHLCV: false,
19
- fetchOrderBook: true,
20
- fetchTrades: true,
21
- createOrder: true,
22
- cancelOrder: true,
23
- fetchOrder: true,
24
- fetchOpenOrders: true,
15
+ capabilityOverrides = {
25
16
  fetchPositions: 'emulated',
26
- fetchBalance: true,
27
- watchAddress: false,
28
- unwatchAddress: false,
29
- watchOrderBook: false,
30
- watchTrades: false,
31
- fetchMyTrades: true,
32
- fetchClosedOrders: true,
33
- fetchAllOrders: true,
34
- buildOrder: true,
35
- submitOrder: true,
36
17
  };
37
18
  auth;
38
19
  loginPromise = null;
@@ -294,6 +294,16 @@
294
294
  }
295
295
  ]
296
296
  },
297
+ "unwatchOrderBook": {
298
+ "verb": "post",
299
+ "args": [
300
+ {
301
+ "name": "id",
302
+ "kind": "string",
303
+ "optional": false
304
+ }
305
+ ]
306
+ },
297
307
  "watchTrades": {
298
308
  "verb": "post",
299
309
  "args": [
@@ -1360,6 +1360,37 @@ paths:
1360
1360
  description: >-
1361
1361
  Watch order book updates in real-time via WebSocket. Returns a promise that resolves with the next order book
1362
1362
  update. Call repeatedly in a loop to stream updates (CCXT Pro pattern).
1363
+ '/api/{exchange}/unwatchOrderBook':
1364
+ post:
1365
+ summary: Unwatch Order Book
1366
+ operationId: unwatchOrderBook
1367
+ parameters:
1368
+ - $ref: '#/components/parameters/ExchangeParam'
1369
+ requestBody:
1370
+ content:
1371
+ application/json:
1372
+ schema:
1373
+ title: UnwatchOrderBookRequest
1374
+ type: object
1375
+ properties:
1376
+ args:
1377
+ type: array
1378
+ maxItems: 1
1379
+ items:
1380
+ type: string
1381
+ minItems: 1
1382
+ credentials:
1383
+ $ref: '#/components/schemas/ExchangeCredentials'
1384
+ required:
1385
+ - args
1386
+ responses:
1387
+ '200':
1388
+ description: Unwatch Order Book response
1389
+ content:
1390
+ application/json:
1391
+ schema:
1392
+ $ref: '#/components/schemas/BaseResponse'
1393
+ description: Unsubscribe from a previously watched order book stream.
1363
1394
  '/api/{exchange}/watchTrades':
1364
1395
  post:
1365
1396
  summary: Watch Trades
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmxt-core",
3
- "version": "2.27.10",
3
+ "version": "2.28.1",
4
4
  "description": "pmxt is a unified prediction market data API. The ccxt for prediction markets.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,8 +29,8 @@
29
29
  "test": "jest -c jest.config.js",
30
30
  "server": "tsx watch src/server/index.ts",
31
31
  "server:prod": "node dist/server/index.js",
32
- "generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=2.27.10,library=urllib3",
33
- "generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=2.27.10,supportsES6=true,typescriptThreePlus=true && node ../sdks/typescript/scripts/fix-generated.js",
32
+ "generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=2.28.1,library=urllib3",
33
+ "generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=2.28.1,supportsES6=true,typescriptThreePlus=true && node ../sdks/typescript/scripts/fix-generated.js",
34
34
  "fetch:openapi": "node scripts/fetch-openapi-specs.js",
35
35
  "extract:jsdoc": "node ../scripts/extract-jsdoc.js",
36
36
  "generate:docs": "npm run extract:jsdoc && node ../scripts/generate-api-docs.js",