pmxt-core 2.48.4 → 2.48.6
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.
- package/dist/BaseExchange.js +2 -0
- package/dist/exchanges/baozi/normalizer.js +3 -3
- package/dist/exchanges/kalshi/api.d.ts +1 -1
- package/dist/exchanges/kalshi/api.js +1 -1
- package/dist/exchanges/limitless/api.d.ts +1 -1
- package/dist/exchanges/limitless/api.js +1 -1
- package/dist/exchanges/myriad/api.d.ts +1 -1
- package/dist/exchanges/myriad/api.js +1 -1
- package/dist/exchanges/opinion/api.d.ts +1 -1
- package/dist/exchanges/opinion/api.js +1 -1
- package/dist/exchanges/opinion/fetcher.js +6 -3
- package/dist/exchanges/opinion/normalizer.js +13 -5
- package/dist/exchanges/opinion/utils.d.ts +1 -1
- package/dist/exchanges/opinion/utils.js +3 -1
- package/dist/exchanges/polymarket/api-clob.d.ts +1 -1
- package/dist/exchanges/polymarket/api-clob.js +1 -1
- package/dist/exchanges/polymarket/api-data.d.ts +1 -1
- package/dist/exchanges/polymarket/api-data.js +1 -1
- package/dist/exchanges/polymarket/api-gamma.d.ts +1 -1
- package/dist/exchanges/polymarket/api-gamma.js +1 -1
- package/dist/exchanges/probable/api.d.ts +1 -1
- package/dist/exchanges/probable/api.js +1 -1
- package/dist/server/openapi.yaml +3 -2
- package/dist/types.d.ts +4 -2
- package/package.json +3 -3
package/dist/BaseExchange.js
CHANGED
|
@@ -756,6 +756,8 @@ class PredictionMarketExchange {
|
|
|
756
756
|
// ResolutionDate filter
|
|
757
757
|
if (criteria.resolutionDate) {
|
|
758
758
|
const resDate = market.resolutionDate;
|
|
759
|
+
if (!resDate)
|
|
760
|
+
return false;
|
|
759
761
|
if (criteria.resolutionDate.before && resDate >= criteria.resolutionDate.before) {
|
|
760
762
|
return false;
|
|
761
763
|
}
|
|
@@ -170,10 +170,10 @@ function applyFilters(markets, params) {
|
|
|
170
170
|
if (status !== 'all') {
|
|
171
171
|
const now = Date.now();
|
|
172
172
|
if (status === 'active') {
|
|
173
|
-
result = result.filter(m => m.resolutionDate.getTime() > now);
|
|
173
|
+
result = result.filter(m => !m.resolutionDate || m.resolutionDate.getTime() > now);
|
|
174
174
|
}
|
|
175
175
|
else {
|
|
176
|
-
result = result.filter(m => m.resolutionDate.getTime() <= now);
|
|
176
|
+
result = result.filter(m => m.resolutionDate && m.resolutionDate.getTime() <= now);
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
// Text search
|
|
@@ -198,7 +198,7 @@ function applyFilters(markets, params) {
|
|
|
198
198
|
result.sort((a, b) => b.liquidity - a.liquidity);
|
|
199
199
|
}
|
|
200
200
|
else if (params?.sort === 'newest') {
|
|
201
|
-
result.sort((a, b) => b.resolutionDate
|
|
201
|
+
result.sort((a, b) => (b.resolutionDate?.getTime() ?? 0) - (a.resolutionDate?.getTime() ?? 0));
|
|
202
202
|
}
|
|
203
203
|
else {
|
|
204
204
|
result.sort((a, b) => (b.volume || 0) - (a.volume || 0));
|
|
@@ -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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.252Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.252Z
|
|
7
7
|
* Do not edit manually -- run "npm run fetch:openapi" to regenerate.
|
|
8
8
|
*/
|
|
9
9
|
exports.kalshiApiSpec = {
|
|
@@ -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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.289Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.289Z
|
|
7
7
|
* Do not edit manually -- run "npm run fetch:openapi" to regenerate.
|
|
8
8
|
*/
|
|
9
9
|
exports.limitlessApiSpec = {
|
|
@@ -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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.300Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.300Z
|
|
7
7
|
* Do not edit manually -- run "npm run fetch:openapi" to regenerate.
|
|
8
8
|
*/
|
|
9
9
|
exports.myriadApiSpec = {
|
|
@@ -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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.305Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.305Z
|
|
7
7
|
* Do not edit manually -- run "npm run fetch:openapi" to regenerate.
|
|
8
8
|
*/
|
|
9
9
|
exports.opinionApiSpec = {
|
|
@@ -41,10 +41,13 @@ class OpinionFetcher {
|
|
|
41
41
|
async fetchRawMarkets(params) {
|
|
42
42
|
try {
|
|
43
43
|
if (params?.marketId) {
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
|
|
44
|
+
const idStr = String(params.marketId).trim();
|
|
45
|
+
if (!/^\d+$/.test(idStr)) {
|
|
46
|
+
const err = new Error(`Opinion market IDs must be integers, got: "${params.marketId}"`);
|
|
47
|
+
err.status = 400;
|
|
48
|
+
throw err;
|
|
47
49
|
}
|
|
50
|
+
const id = Number(idStr);
|
|
48
51
|
const market = await this.fetchRawMarketById(id);
|
|
49
52
|
return market ? [market] : [];
|
|
50
53
|
}
|
|
@@ -157,7 +157,7 @@ class OpinionNormalizer {
|
|
|
157
157
|
normalizeTrade(raw, index) {
|
|
158
158
|
return {
|
|
159
159
|
id: raw.txHash || String(index),
|
|
160
|
-
timestamp: (0, utils_1.toMillis)(raw.createdAt),
|
|
160
|
+
timestamp: (0, utils_1.toMillis)(raw.createdAt) ?? 0,
|
|
161
161
|
price: (0, utils_1.parseNumStr)(raw.price),
|
|
162
162
|
amount: (0, utils_1.parseNumStr)(raw.shares),
|
|
163
163
|
side: raw.side === 'BUY' ? 'buy' : raw.side === 'SELL' ? 'sell' : 'unknown',
|
|
@@ -167,7 +167,7 @@ class OpinionNormalizer {
|
|
|
167
167
|
normalizeUserTrade(raw, index) {
|
|
168
168
|
return {
|
|
169
169
|
id: raw.txHash || String(index),
|
|
170
|
-
timestamp: (0, utils_1.toMillis)(raw.createdAt),
|
|
170
|
+
timestamp: (0, utils_1.toMillis)(raw.createdAt) ?? 0,
|
|
171
171
|
price: (0, utils_1.parseNumStr)(raw.price),
|
|
172
172
|
amount: (0, utils_1.parseNumStr)(raw.shares),
|
|
173
173
|
side: raw.side === 'BUY' ? 'buy' : raw.side === 'SELL' ? 'sell' : 'unknown',
|
|
@@ -203,7 +203,7 @@ class OpinionNormalizer {
|
|
|
203
203
|
status: (0, utils_1.mapOrderStatus)(raw.status),
|
|
204
204
|
filled: filledShares,
|
|
205
205
|
remaining: orderShares - filledShares,
|
|
206
|
-
timestamp: (0, utils_1.toMillis)(raw.createdAt),
|
|
206
|
+
timestamp: (0, utils_1.toMillis)(raw.createdAt) ?? 0,
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
209
|
// -- Price enrichment -----------------------------------------------------
|
|
@@ -265,19 +265,23 @@ class OpinionNormalizer {
|
|
|
265
265
|
marketId,
|
|
266
266
|
label: raw.yesLabel || 'Yes',
|
|
267
267
|
price: 0.5,
|
|
268
|
+
metadata: { opinionMarketId: raw.marketId },
|
|
268
269
|
};
|
|
269
270
|
const noOutcome = {
|
|
270
271
|
outcomeId: raw.noTokenId,
|
|
271
272
|
marketId,
|
|
272
273
|
label: raw.noLabel || 'No',
|
|
273
274
|
price: 0.5,
|
|
275
|
+
metadata: { opinionMarketId: raw.marketId },
|
|
274
276
|
};
|
|
275
277
|
const market = {
|
|
276
278
|
marketId,
|
|
277
279
|
title: raw.marketTitle || '',
|
|
278
280
|
description: raw.rules || '',
|
|
279
281
|
outcomes: [yesOutcome, noOutcome],
|
|
280
|
-
resolutionDate:
|
|
282
|
+
resolutionDate: (0, utils_1.toMillis)(raw.cutoffAt) !== null
|
|
283
|
+
? new Date((0, utils_1.toMillis)(raw.cutoffAt))
|
|
284
|
+
: undefined,
|
|
281
285
|
volume24h: (0, utils_1.parseNumStr)(raw.volume24h),
|
|
282
286
|
volume: (0, utils_1.parseNumStr)(raw.volume),
|
|
283
287
|
liquidity: 0,
|
|
@@ -302,12 +306,14 @@ class OpinionNormalizer {
|
|
|
302
306
|
marketId,
|
|
303
307
|
label: child.yesLabel || 'Yes',
|
|
304
308
|
price: 0.5,
|
|
309
|
+
metadata: { opinionMarketId: child.marketId },
|
|
305
310
|
};
|
|
306
311
|
const noOutcome = {
|
|
307
312
|
outcomeId: child.noTokenId,
|
|
308
313
|
marketId,
|
|
309
314
|
label: child.noLabel || 'No',
|
|
310
315
|
price: 0.5,
|
|
316
|
+
metadata: { opinionMarketId: child.marketId },
|
|
311
317
|
};
|
|
312
318
|
const childTitle = child.marketTitle || '';
|
|
313
319
|
const parentTitle = parent.marketTitle || '';
|
|
@@ -320,7 +326,9 @@ class OpinionNormalizer {
|
|
|
320
326
|
title: combinedTitle,
|
|
321
327
|
description: child.rules || '',
|
|
322
328
|
outcomes: [yesOutcome, noOutcome],
|
|
323
|
-
resolutionDate:
|
|
329
|
+
resolutionDate: (0, utils_1.toMillis)(child.cutoffAt || parent.cutoffAt) !== null
|
|
330
|
+
? new Date((0, utils_1.toMillis)(child.cutoffAt || parent.cutoffAt))
|
|
331
|
+
: undefined,
|
|
324
332
|
volume24h,
|
|
325
333
|
volume: (0, utils_1.parseNumStr)(child.volume),
|
|
326
334
|
liquidity: 0,
|
|
@@ -19,5 +19,5 @@ export declare function mapSortToOpinion(sort?: string): number | undefined;
|
|
|
19
19
|
export declare function mapIntervalToOpinion(interval: CandleInterval): string;
|
|
20
20
|
export declare function mapOrderStatus(status: number): 'pending' | 'open' | 'filled' | 'canceled' | 'rejected';
|
|
21
21
|
export declare function parseNumStr(value: string | undefined | null): number;
|
|
22
|
-
export declare function toMillis(ts: number | undefined | null): number;
|
|
22
|
+
export declare function toMillis(ts: number | undefined | null): number | null;
|
|
23
23
|
export declare function intervalToMs(interval: CandleInterval): number;
|
|
@@ -76,9 +76,11 @@ function parseNumStr(value) {
|
|
|
76
76
|
}
|
|
77
77
|
// Convert a raw timestamp to milliseconds.
|
|
78
78
|
// If the value is under 10_000_000_000 it is assumed to be in seconds.
|
|
79
|
+
// Returns null when the input is missing/zero so callers can distinguish
|
|
80
|
+
// "no timestamp" from "epoch" instead of coercing both to 1970-01-01.
|
|
79
81
|
function toMillis(ts) {
|
|
80
82
|
if (!ts)
|
|
81
|
-
return
|
|
83
|
+
return null;
|
|
82
84
|
return ts < 10_000_000_000 ? ts * 1000 : ts;
|
|
83
85
|
}
|
|
84
86
|
// Return the bucket size in milliseconds for a given CandleInterval
|
|
@@ -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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.258Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.258Z
|
|
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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.271Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.271Z
|
|
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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.268Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.268Z
|
|
7
7
|
* Do not edit manually -- run "npm run fetch:openapi" to regenerate.
|
|
8
8
|
*/
|
|
9
9
|
exports.polymarketGammaSpec = {
|
|
@@ -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-06-
|
|
3
|
+
* Generated at: 2026-06-04T11:40:47.295Z
|
|
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-06-
|
|
6
|
+
* Generated at: 2026-06-04T11:40:47.295Z
|
|
7
7
|
* Do not edit manually -- run "npm run fetch:openapi" to regenerate.
|
|
8
8
|
*/
|
|
9
9
|
exports.probableApiSpec = {
|
package/dist/server/openapi.yaml
CHANGED
|
@@ -2655,7 +2655,9 @@ components:
|
|
|
2655
2655
|
resolutionDate:
|
|
2656
2656
|
type: string
|
|
2657
2657
|
format: date-time
|
|
2658
|
-
description:
|
|
2658
|
+
description: >-
|
|
2659
|
+
When the market is scheduled to resolve. Optional because some venues do not publish a cutoff for every
|
|
2660
|
+
market (e.g. Opinion categorical children) — emit `undefined` rather than coercing to epoch.
|
|
2659
2661
|
volume24h:
|
|
2660
2662
|
type: number
|
|
2661
2663
|
description: Trading volume over the past 24 hours (USD).
|
|
@@ -2728,7 +2730,6 @@ components:
|
|
|
2728
2730
|
- title
|
|
2729
2731
|
- description
|
|
2730
2732
|
- outcomes
|
|
2731
|
-
- resolutionDate
|
|
2732
2733
|
- volume24h
|
|
2733
2734
|
- liquidity
|
|
2734
2735
|
- url
|
package/dist/types.d.ts
CHANGED
|
@@ -55,8 +55,10 @@ export interface UnifiedMarket {
|
|
|
55
55
|
slug?: string;
|
|
56
56
|
/** The possible outcomes for this market. */
|
|
57
57
|
outcomes: MarketOutcome[];
|
|
58
|
-
/** When the market is scheduled to resolve.
|
|
59
|
-
|
|
58
|
+
/** When the market is scheduled to resolve. Optional because some venues
|
|
59
|
+
* do not publish a cutoff for every market (e.g. Opinion categorical
|
|
60
|
+
* children) — emit `undefined` rather than coercing to epoch. */
|
|
61
|
+
resolutionDate?: Date;
|
|
60
62
|
/** Trading volume over the past 24 hours (USD). */
|
|
61
63
|
volume24h: number;
|
|
62
64
|
volume?: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmxt-core",
|
|
3
|
-
"version": "2.48.
|
|
3
|
+
"version": "2.48.6",
|
|
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.48.
|
|
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.48.
|
|
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.48.6,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.48.6,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",
|