stock-sdk 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.
- package/.cursor/worktrees.json +5 -0
- package/.yarn/install-state.gz +0 -0
- package/README.md +330 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +293 -0
- package/dist/types.d.ts +177 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/new-doc.md +98 -0
- package/origin.md +480 -0
- package/package.json +32 -0
- package/src/index.test.ts +97 -0
- package/src/index.ts +281 -0
- package/src/types.ts +177 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +9 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import axios, { AxiosInstance } from 'axios';
|
|
2
|
+
import * as iconv from 'iconv-lite';
|
|
3
|
+
import {
|
|
4
|
+
FullQuote,
|
|
5
|
+
SimpleQuote,
|
|
6
|
+
FundFlow,
|
|
7
|
+
PanelLargeOrder,
|
|
8
|
+
HKQuote,
|
|
9
|
+
USQuote,
|
|
10
|
+
FundQuote,
|
|
11
|
+
} from './types';
|
|
12
|
+
|
|
13
|
+
export * from './types';
|
|
14
|
+
|
|
15
|
+
const BASE_URL = 'http://qt.gtimg.cn';
|
|
16
|
+
|
|
17
|
+
function safeNumber(val: string | undefined): number {
|
|
18
|
+
if (!val || val === '') return 0;
|
|
19
|
+
const n = parseFloat(val);
|
|
20
|
+
return Number.isNaN(n) ? 0 : n;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function safeNumberOrNull(val: string | undefined): number | null {
|
|
24
|
+
if (!val || val === '') return null;
|
|
25
|
+
const n = parseFloat(val);
|
|
26
|
+
return Number.isNaN(n) ? null : n;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 解析响应文本,按 `;` 拆行,提取 `v_xxx="..."` 里的内容,返回 { key, fields }[]
|
|
31
|
+
*/
|
|
32
|
+
function parseResponse(text: string): { key: string; fields: string[] }[] {
|
|
33
|
+
const lines = text.split(';').map((l) => l.trim()).filter(Boolean);
|
|
34
|
+
const results: { key: string; fields: string[] }[] = [];
|
|
35
|
+
for (const line of lines) {
|
|
36
|
+
const eqIdx = line.indexOf('=');
|
|
37
|
+
if (eqIdx < 0) continue;
|
|
38
|
+
let key = line.slice(0, eqIdx).trim();
|
|
39
|
+
if (key.startsWith('v_')) key = key.slice(2);
|
|
40
|
+
let raw = line.slice(eqIdx + 1).trim();
|
|
41
|
+
if (raw.startsWith('"') && raw.endsWith('"')) {
|
|
42
|
+
raw = raw.slice(1, -1);
|
|
43
|
+
}
|
|
44
|
+
const fields = raw.split('~');
|
|
45
|
+
results.push({ key, fields });
|
|
46
|
+
}
|
|
47
|
+
return results;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class TencentStockSDK {
|
|
51
|
+
private client: AxiosInstance;
|
|
52
|
+
|
|
53
|
+
constructor() {
|
|
54
|
+
this.client = axios.create({
|
|
55
|
+
baseURL: BASE_URL,
|
|
56
|
+
responseType: 'arraybuffer',
|
|
57
|
+
timeout: 10000,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private async fetch(params: string): Promise<{ key: string; fields: string[] }[]> {
|
|
62
|
+
const resp = await this.client.get('/', { params: { q: params } });
|
|
63
|
+
const text = iconv.decode(Buffer.from(resp.data), 'gbk');
|
|
64
|
+
return parseResponse(text);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ---------- 实时全量行情 ----------
|
|
68
|
+
/**
|
|
69
|
+
* 获取 A 股 / 指数 全量行情
|
|
70
|
+
* @param codes 如 ['sz000858', 'sh600000']
|
|
71
|
+
*/
|
|
72
|
+
async getFullQuotes(codes: string[]): Promise<FullQuote[]> {
|
|
73
|
+
const data = await this.fetch(codes.join(','));
|
|
74
|
+
return data.map((d) => this.parseFullQuote(d.fields));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private parseFullQuote(f: string[]): FullQuote {
|
|
78
|
+
const bid: { price: number; volume: number }[] = [];
|
|
79
|
+
for (let i = 0; i < 5; i++) {
|
|
80
|
+
bid.push({ price: safeNumber(f[9 + i * 2]), volume: safeNumber(f[10 + i * 2]) });
|
|
81
|
+
}
|
|
82
|
+
const ask: { price: number; volume: number }[] = [];
|
|
83
|
+
for (let i = 0; i < 5; i++) {
|
|
84
|
+
ask.push({ price: safeNumber(f[19 + i * 2]), volume: safeNumber(f[20 + i * 2]) });
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
marketId: f[0] ?? '',
|
|
88
|
+
name: f[1] ?? '',
|
|
89
|
+
code: f[2] ?? '',
|
|
90
|
+
price: safeNumber(f[3]),
|
|
91
|
+
prevClose: safeNumber(f[4]),
|
|
92
|
+
open: safeNumber(f[5]),
|
|
93
|
+
volume: safeNumber(f[6]),
|
|
94
|
+
outerVolume: safeNumber(f[7]),
|
|
95
|
+
innerVolume: safeNumber(f[8]),
|
|
96
|
+
bid,
|
|
97
|
+
ask,
|
|
98
|
+
time: f[30] ?? '',
|
|
99
|
+
change: safeNumber(f[31]),
|
|
100
|
+
changePercent: safeNumber(f[32]),
|
|
101
|
+
high: safeNumber(f[33]),
|
|
102
|
+
low: safeNumber(f[34]),
|
|
103
|
+
volume2: safeNumber(f[36]),
|
|
104
|
+
amount: safeNumber(f[37]),
|
|
105
|
+
turnoverRate: safeNumberOrNull(f[38]),
|
|
106
|
+
pe: safeNumberOrNull(f[39]),
|
|
107
|
+
circulatingMarketCap: safeNumberOrNull(f[44]),
|
|
108
|
+
totalMarketCap: safeNumberOrNull(f[45]),
|
|
109
|
+
pb: safeNumberOrNull(f[46]),
|
|
110
|
+
limitUp: safeNumberOrNull(f[47]),
|
|
111
|
+
limitDown: safeNumberOrNull(f[48]),
|
|
112
|
+
raw: f,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ---------- 简要行情 ----------
|
|
117
|
+
/**
|
|
118
|
+
* 获取简要行情
|
|
119
|
+
* @param codes 如 ['s_sz000858', 's_sh000001']
|
|
120
|
+
*/
|
|
121
|
+
async getSimpleQuotes(codes: string[]): Promise<SimpleQuote[]> {
|
|
122
|
+
const data = await this.fetch(codes.join(','));
|
|
123
|
+
return data.map((d) => this.parseSimpleQuote(d.fields));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private parseSimpleQuote(f: string[]): SimpleQuote {
|
|
127
|
+
return {
|
|
128
|
+
marketId: f[0] ?? '',
|
|
129
|
+
name: f[1] ?? '',
|
|
130
|
+
code: f[2] ?? '',
|
|
131
|
+
price: safeNumber(f[3]),
|
|
132
|
+
change: safeNumber(f[4]),
|
|
133
|
+
changePercent: safeNumber(f[5]),
|
|
134
|
+
volume: safeNumber(f[6]),
|
|
135
|
+
amount: safeNumber(f[7]),
|
|
136
|
+
marketCap: safeNumberOrNull(f[9]),
|
|
137
|
+
marketType: f[10] ?? '',
|
|
138
|
+
raw: f,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// ---------- 资金流向 ----------
|
|
143
|
+
/**
|
|
144
|
+
* 获取资金流向
|
|
145
|
+
* @param codes 如 ['ff_sz000858']
|
|
146
|
+
*/
|
|
147
|
+
async getFundFlow(codes: string[]): Promise<FundFlow[]> {
|
|
148
|
+
const data = await this.fetch(codes.join(','));
|
|
149
|
+
return data.map((d) => this.parseFundFlow(d.fields));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private parseFundFlow(f: string[]): FundFlow {
|
|
153
|
+
return {
|
|
154
|
+
code: f[0] ?? '',
|
|
155
|
+
mainInflow: safeNumber(f[1]),
|
|
156
|
+
mainOutflow: safeNumber(f[2]),
|
|
157
|
+
mainNet: safeNumber(f[3]),
|
|
158
|
+
mainNetRatio: safeNumber(f[4]),
|
|
159
|
+
retailInflow: safeNumber(f[5]),
|
|
160
|
+
retailOutflow: safeNumber(f[6]),
|
|
161
|
+
retailNet: safeNumber(f[7]),
|
|
162
|
+
retailNetRatio: safeNumber(f[8]),
|
|
163
|
+
totalFlow: safeNumber(f[9]),
|
|
164
|
+
name: f[12] ?? '',
|
|
165
|
+
date: f[13] ?? '',
|
|
166
|
+
raw: f,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ---------- 盘口大单占比 ----------
|
|
171
|
+
/**
|
|
172
|
+
* 获取盘口大单占比
|
|
173
|
+
* @param codes 如 ['s_pksz000858']
|
|
174
|
+
*/
|
|
175
|
+
async getPanelLargeOrder(codes: string[]): Promise<PanelLargeOrder[]> {
|
|
176
|
+
const data = await this.fetch(codes.join(','));
|
|
177
|
+
return data.map((d) => this.parsePanelLargeOrder(d.fields));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private parsePanelLargeOrder(f: string[]): PanelLargeOrder {
|
|
181
|
+
return {
|
|
182
|
+
buyLargeRatio: safeNumber(f[0]),
|
|
183
|
+
buySmallRatio: safeNumber(f[1]),
|
|
184
|
+
sellLargeRatio: safeNumber(f[2]),
|
|
185
|
+
sellSmallRatio: safeNumber(f[3]),
|
|
186
|
+
raw: f,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ---------- 港股扩展行情 ----------
|
|
191
|
+
/**
|
|
192
|
+
* 获取港股扩展行情
|
|
193
|
+
* @param codes 如 ['r_hk09988']
|
|
194
|
+
*/
|
|
195
|
+
async getHKQuotes(codes: string[]): Promise<HKQuote[]> {
|
|
196
|
+
const data = await this.fetch(codes.join(','));
|
|
197
|
+
return data.map((d) => this.parseHKQuote(d.fields));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private parseHKQuote(f: string[]): HKQuote {
|
|
201
|
+
return {
|
|
202
|
+
marketId: f[0] ?? '',
|
|
203
|
+
name: f[1] ?? '',
|
|
204
|
+
code: f[2] ?? '',
|
|
205
|
+
price: safeNumber(f[3]),
|
|
206
|
+
prevClose: safeNumber(f[4]),
|
|
207
|
+
open: safeNumber(f[5]),
|
|
208
|
+
volume: safeNumber(f[6]),
|
|
209
|
+
time: f[30] ?? '',
|
|
210
|
+
change: safeNumber(f[31]),
|
|
211
|
+
changePercent: safeNumber(f[32]),
|
|
212
|
+
high: safeNumber(f[33]),
|
|
213
|
+
low: safeNumber(f[34]),
|
|
214
|
+
amount: safeNumber(f[36]),
|
|
215
|
+
lotSize: safeNumberOrNull(f[40]),
|
|
216
|
+
circulatingMarketCap: safeNumberOrNull(f[46]),
|
|
217
|
+
totalMarketCap: safeNumberOrNull(f[47]),
|
|
218
|
+
currency: f[f.length - 3] ?? '',
|
|
219
|
+
raw: f,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ---------- 美股简要行情 ----------
|
|
224
|
+
/**
|
|
225
|
+
* 获取美股简要行情
|
|
226
|
+
* @param codes 如 ['s_usBABA']
|
|
227
|
+
*/
|
|
228
|
+
async getUSQuotes(codes: string[]): Promise<USQuote[]> {
|
|
229
|
+
const data = await this.fetch(codes.join(','));
|
|
230
|
+
return data.map((d) => this.parseUSQuote(d.fields));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private parseUSQuote(f: string[]): USQuote {
|
|
234
|
+
return {
|
|
235
|
+
marketId: f[0] ?? '',
|
|
236
|
+
name: f[1] ?? '',
|
|
237
|
+
code: f[2] ?? '',
|
|
238
|
+
price: safeNumber(f[3]),
|
|
239
|
+
change: safeNumber(f[4]),
|
|
240
|
+
changePercent: safeNumber(f[5]),
|
|
241
|
+
volume: safeNumber(f[6]),
|
|
242
|
+
amount: safeNumber(f[7]),
|
|
243
|
+
marketCap: safeNumberOrNull(f[8]),
|
|
244
|
+
raw: f,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ---------- 公募基金行情 ----------
|
|
249
|
+
/**
|
|
250
|
+
* 获取公募基金行情
|
|
251
|
+
* @param codes 如 ['jj000001']
|
|
252
|
+
*/
|
|
253
|
+
async getFundQuotes(codes: string[]): Promise<FundQuote[]> {
|
|
254
|
+
const data = await this.fetch(codes.join(','));
|
|
255
|
+
return data.map((d) => this.parseFundQuote(d.fields));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private parseFundQuote(f: string[]): FundQuote {
|
|
259
|
+
return {
|
|
260
|
+
code: f[0] ?? '',
|
|
261
|
+
name: f[1] ?? '',
|
|
262
|
+
nav: safeNumber(f[5]),
|
|
263
|
+
accNav: safeNumber(f[6]),
|
|
264
|
+
change: safeNumber(f[7]),
|
|
265
|
+
navDate: f[8] ?? '',
|
|
266
|
+
raw: f,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ---------- 批量混合查询 ----------
|
|
271
|
+
/**
|
|
272
|
+
* 批量混合查询,返回原始解析结果(key + fields)
|
|
273
|
+
* @param params 如 'sz000858,s_sh000001,jj000001'
|
|
274
|
+
*/
|
|
275
|
+
async batchRaw(params: string): Promise<{ key: string; fields: string[] }[]> {
|
|
276
|
+
return this.fetch(params);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export default TencentStockSDK;
|
|
281
|
+
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A 股 / 指数 全量行情
|
|
3
|
+
*/
|
|
4
|
+
export interface FullQuote {
|
|
5
|
+
/** 市场标识 */
|
|
6
|
+
marketId: string;
|
|
7
|
+
/** 名称 */
|
|
8
|
+
name: string;
|
|
9
|
+
/** 股票代码 */
|
|
10
|
+
code: string;
|
|
11
|
+
/** 最新价 */
|
|
12
|
+
price: number;
|
|
13
|
+
/** 昨收 */
|
|
14
|
+
prevClose: number;
|
|
15
|
+
/** 今开 */
|
|
16
|
+
open: number;
|
|
17
|
+
/** 成交量(手) */
|
|
18
|
+
volume: number;
|
|
19
|
+
/** 外盘 */
|
|
20
|
+
outerVolume: number;
|
|
21
|
+
/** 内盘 */
|
|
22
|
+
innerVolume: number;
|
|
23
|
+
/** 买一~买五 { price, volume }[] */
|
|
24
|
+
bid: { price: number; volume: number }[];
|
|
25
|
+
/** 卖一~卖五 { price, volume }[] */
|
|
26
|
+
ask: { price: number; volume: number }[];
|
|
27
|
+
/** 时间戳 yyyyMMddHHmmss */
|
|
28
|
+
time: string;
|
|
29
|
+
/** 涨跌额 */
|
|
30
|
+
change: number;
|
|
31
|
+
/** 涨跌幅% */
|
|
32
|
+
changePercent: number;
|
|
33
|
+
/** 最高 */
|
|
34
|
+
high: number;
|
|
35
|
+
/** 最低 */
|
|
36
|
+
low: number;
|
|
37
|
+
/** 成交量(手) (字段36) */
|
|
38
|
+
volume2: number;
|
|
39
|
+
/** 成交额(万) */
|
|
40
|
+
amount: number;
|
|
41
|
+
/** 换手率% */
|
|
42
|
+
turnoverRate: number | null;
|
|
43
|
+
/** 市盈率 */
|
|
44
|
+
pe: number | null;
|
|
45
|
+
/** 流通市值(亿) */
|
|
46
|
+
circulatingMarketCap: number | null;
|
|
47
|
+
/** 总市值(亿) */
|
|
48
|
+
totalMarketCap: number | null;
|
|
49
|
+
/** 市净率 */
|
|
50
|
+
pb: number | null;
|
|
51
|
+
/** 涨停价 */
|
|
52
|
+
limitUp: number | null;
|
|
53
|
+
/** 跌停价 */
|
|
54
|
+
limitDown: number | null;
|
|
55
|
+
/** 原始字段数组(供扩展使用) */
|
|
56
|
+
raw: string[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 简要行情(股票 / 指数)
|
|
61
|
+
*/
|
|
62
|
+
export interface SimpleQuote {
|
|
63
|
+
marketId: string;
|
|
64
|
+
name: string;
|
|
65
|
+
code: string;
|
|
66
|
+
price: number;
|
|
67
|
+
change: number;
|
|
68
|
+
changePercent: number;
|
|
69
|
+
volume: number;
|
|
70
|
+
amount: number;
|
|
71
|
+
/** 总市值(亿) */
|
|
72
|
+
marketCap: number | null;
|
|
73
|
+
/** 市场类型标识 如 GP-A / ZS */
|
|
74
|
+
marketType: string;
|
|
75
|
+
raw: string[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 资金流向
|
|
80
|
+
*/
|
|
81
|
+
export interface FundFlow {
|
|
82
|
+
code: string;
|
|
83
|
+
/** 主力流入 */
|
|
84
|
+
mainInflow: number;
|
|
85
|
+
/** 主力流出 */
|
|
86
|
+
mainOutflow: number;
|
|
87
|
+
/** 主力净流入 */
|
|
88
|
+
mainNet: number;
|
|
89
|
+
/** 主力净流入占比 */
|
|
90
|
+
mainNetRatio: number;
|
|
91
|
+
/** 散户流入 */
|
|
92
|
+
retailInflow: number;
|
|
93
|
+
/** 散户流出 */
|
|
94
|
+
retailOutflow: number;
|
|
95
|
+
/** 散户净流入 */
|
|
96
|
+
retailNet: number;
|
|
97
|
+
/** 散户净流入占比 */
|
|
98
|
+
retailNetRatio: number;
|
|
99
|
+
/** 总资金流 */
|
|
100
|
+
totalFlow: number;
|
|
101
|
+
name: string;
|
|
102
|
+
date: string;
|
|
103
|
+
raw: string[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 盘口大单占比
|
|
108
|
+
*/
|
|
109
|
+
export interface PanelLargeOrder {
|
|
110
|
+
/** 买盘大单占比 */
|
|
111
|
+
buyLargeRatio: number;
|
|
112
|
+
/** 买盘小单占比 */
|
|
113
|
+
buySmallRatio: number;
|
|
114
|
+
/** 卖盘大单占比 */
|
|
115
|
+
sellLargeRatio: number;
|
|
116
|
+
/** 卖盘小单占比 */
|
|
117
|
+
sellSmallRatio: number;
|
|
118
|
+
raw: string[];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 港股扩展行情
|
|
123
|
+
*/
|
|
124
|
+
export interface HKQuote {
|
|
125
|
+
marketId: string;
|
|
126
|
+
name: string;
|
|
127
|
+
code: string;
|
|
128
|
+
price: number;
|
|
129
|
+
prevClose: number;
|
|
130
|
+
open: number;
|
|
131
|
+
volume: number;
|
|
132
|
+
time: string;
|
|
133
|
+
change: number;
|
|
134
|
+
changePercent: number;
|
|
135
|
+
high: number;
|
|
136
|
+
low: number;
|
|
137
|
+
amount: number;
|
|
138
|
+
lotSize: number | null;
|
|
139
|
+
circulatingMarketCap: number | null;
|
|
140
|
+
totalMarketCap: number | null;
|
|
141
|
+
currency: string;
|
|
142
|
+
raw: string[];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 美股简要行情
|
|
147
|
+
*/
|
|
148
|
+
export interface USQuote {
|
|
149
|
+
marketId: string;
|
|
150
|
+
name: string;
|
|
151
|
+
code: string;
|
|
152
|
+
price: number;
|
|
153
|
+
change: number;
|
|
154
|
+
changePercent: number;
|
|
155
|
+
volume: number;
|
|
156
|
+
amount: number;
|
|
157
|
+
marketCap: number | null;
|
|
158
|
+
raw: string[];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 公募基金行情
|
|
163
|
+
*/
|
|
164
|
+
export interface FundQuote {
|
|
165
|
+
code: string;
|
|
166
|
+
name: string;
|
|
167
|
+
/** 最新单位净值 */
|
|
168
|
+
nav: number;
|
|
169
|
+
/** 累计净值 */
|
|
170
|
+
accNav: number;
|
|
171
|
+
/** 当日涨跌额 */
|
|
172
|
+
change: number;
|
|
173
|
+
/** 净值日期 */
|
|
174
|
+
navDate: string;
|
|
175
|
+
raw: string[];
|
|
176
|
+
}
|
|
177
|
+
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "CommonJS",
|
|
5
|
+
"lib": ["ES2020"],
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"declarationMap": true,
|
|
8
|
+
"outDir": "./dist",
|
|
9
|
+
"rootDir": "./src",
|
|
10
|
+
"strict": true,
|
|
11
|
+
"esModuleInterop": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"forceConsistentCasingInFileNames": true,
|
|
14
|
+
"resolveJsonModule": true,
|
|
15
|
+
"moduleResolution": "node"
|
|
16
|
+
},
|
|
17
|
+
"include": ["src"],
|
|
18
|
+
"exclude": ["node_modules", "dist", "**/*.test.ts"]
|
|
19
|
+
}
|
|
20
|
+
|