@363045841yyt/klinechart-core 0.8.1 → 0.8.3
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/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +31 -0
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +16 -0
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts +9 -2
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +78 -9
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.js +3 -0
- package/dist/data-fetchers/dataBuffer.js.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts +13 -0
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -0
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +36 -0
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -0
- package/dist/data-fetchers/gotdx.d.ts +10 -0
- package/dist/data-fetchers/gotdx.d.ts.map +1 -0
- package/dist/data-fetchers/gotdx.js +168 -0
- package/dist/data-fetchers/gotdx.js.map +1 -0
- package/dist/data-fetchers/hundred-mock.d.ts +9 -2
- package/dist/data-fetchers/hundred-mock.d.ts.map +1 -1
- package/dist/data-fetchers/hundred-mock.js +92 -7
- package/dist/data-fetchers/hundred-mock.js.map +1 -1
- package/dist/data-fetchers/index.d.ts +7 -4
- package/dist/data-fetchers/index.d.ts.map +1 -1
- package/dist/data-fetchers/index.js +6 -4
- package/dist/data-fetchers/index.js.map +1 -1
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +14 -15
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/thousand-mock.d.ts +9 -2
- package/dist/data-fetchers/thousand-mock.d.ts.map +1 -1
- package/dist/data-fetchers/thousand-mock.js +88 -16
- package/dist/data-fetchers/thousand-mock.js.map +1 -1
- package/dist/data-fetchers/tradingview.d.ts +9 -2
- package/dist/data-fetchers/tradingview.d.ts.map +1 -1
- package/dist/data-fetchers/tradingview.js +75 -4
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/data-fetchers/types.d.ts +21 -0
- package/dist/data-fetchers/types.d.ts.map +1 -0
- package/dist/data-fetchers/types.js +2 -0
- package/dist/data-fetchers/types.js.map +1 -0
- package/dist/engine/data/chartDataManager.d.ts +1 -0
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +3 -0
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/render/chartRenderer.d.ts.map +1 -1
- package/dist/engine/render/chartRenderer.js +2 -0
- package/dist/engine/render/chartRenderer.js.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/ichimoku.js +8 -5
- package/dist/engine/renderers/Indicator/ichimoku.js.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
- package/dist/engine/renderers/Indicator/sar.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/sar.js +3 -3
- package/dist/engine/renderers/Indicator/sar.js.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/supertrend.js +3 -3
- package/dist/engine/renderers/Indicator/supertrend.js.map +1 -1
- package/dist/engine/renderers/timeAxis.d.ts.map +1 -1
- package/dist/engine/renderers/timeAxis.js +1 -0
- package/dist/engine/renderers/timeAxis.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/chartBridge.d.ts +47 -0
- package/dist/mcp/chartBridge.d.ts.map +1 -0
- package/dist/mcp/chartBridge.js +167 -0
- package/dist/mcp/chartBridge.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/types.d.ts +17 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/plugin/types.d.ts +2 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js.map +1 -1
- package/dist/semantic/index.d.ts +1 -1
- package/dist/semantic/index.d.ts.map +1 -1
- package/dist/semantic/index.js.map +1 -1
- package/dist/semantic/schema.json +1 -1
- package/dist/semantic/types.d.ts +2 -1
- package/dist/semantic/types.d.ts.map +1 -1
- package/dist/utils/dateFormat.d.ts +25 -0
- package/dist/utils/dateFormat.d.ts.map +1 -1
- package/dist/utils/dateFormat.js +78 -0
- package/dist/utils/dateFormat.js.map +1 -1
- package/dist/utils/kLineDraw/axis.d.ts +2 -0
- package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
- package/dist/utils/kLineDraw/axis.js +11 -6
- package/dist/utils/kLineDraw/axis.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/controllers/createChartController.ts +34 -0
- package/src/controllers/types.ts +9 -0
- package/src/data-fetchers/__tests__/dataBuffer.test.ts +5 -2
- package/src/data-fetchers/__tests__/fetcherRegistry.test.ts +192 -0
- package/src/data-fetchers/baostock.ts +54 -22
- package/src/data-fetchers/dataBuffer.ts +6 -0
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +50 -0
- package/src/data-fetchers/gotdx.ts +160 -0
- package/src/data-fetchers/hundred-mock.ts +54 -7
- package/src/data-fetchers/index.ts +19 -4
- package/src/data-fetchers/router.ts +27 -15
- package/src/data-fetchers/thousand-mock.ts +49 -16
- package/src/data-fetchers/tradingview.ts +32 -6
- package/src/data-fetchers/types.ts +27 -0
- package/src/engine/data/chartDataManager.ts +4 -0
- package/src/engine/render/chartRenderer.ts +2 -0
- package/src/engine/renderers/Indicator/ichimoku.ts +10 -4
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +1 -1
- package/src/engine/renderers/Indicator/sar.ts +3 -3
- package/src/engine/renderers/Indicator/supertrend.ts +3 -4
- package/src/engine/renderers/__tests__/boll.renderer.test.ts +1 -0
- package/src/engine/renderers/__tests__/ene.renderer.test.ts +1 -0
- package/src/engine/renderers/__tests__/expma.renderer.test.ts +1 -0
- package/src/engine/renderers/__tests__/ma.renderer.test.ts +1 -0
- package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +1 -0
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +1 -0
- package/src/engine/renderers/timeAxis.ts +1 -0
- package/src/index.ts +2 -0
- package/src/mcp/chartBridge.ts +220 -0
- package/src/mcp/index.ts +2 -0
- package/src/mcp/types.ts +19 -0
- package/src/plugin/types.ts +2 -0
- package/src/semantic/index.ts +1 -0
- package/src/semantic/schema.json +1 -1
- package/src/semantic/types.ts +3 -1
- package/src/utils/dateFormat.ts +85 -0
- package/src/utils/kLineDraw/axis.ts +13 -6
- package/src/version.ts +1 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import { DataFetcher } from './fetcherDefinitionRegistry';
|
|
36
|
+
const PERIOD_TO_CATEGORY = {
|
|
37
|
+
'1min': 8,
|
|
38
|
+
'5min': 0,
|
|
39
|
+
'15min': 1,
|
|
40
|
+
'30min': 2,
|
|
41
|
+
'60min': 3,
|
|
42
|
+
daily: 4,
|
|
43
|
+
weekly: 5,
|
|
44
|
+
monthly: 6,
|
|
45
|
+
quarterly: 10,
|
|
46
|
+
yearly: 11,
|
|
47
|
+
};
|
|
48
|
+
const ADJUST_MAP = {
|
|
49
|
+
none: 0,
|
|
50
|
+
qfq: 1,
|
|
51
|
+
hfq: 2,
|
|
52
|
+
splits: 0,
|
|
53
|
+
};
|
|
54
|
+
const EXCHANGE_EX_CATEGORY = {
|
|
55
|
+
US: 74,
|
|
56
|
+
HK: 71,
|
|
57
|
+
SG: 78,
|
|
58
|
+
DE: 73,
|
|
59
|
+
};
|
|
60
|
+
const BASE_URL = 'http://127.0.0.1:8080';
|
|
61
|
+
function mapBar(item, code) {
|
|
62
|
+
const ts = new Date(item.DateTime).getTime();
|
|
63
|
+
return {
|
|
64
|
+
timestamp: ts,
|
|
65
|
+
date: item.DateTime.split('T')[0],
|
|
66
|
+
open: item.Open,
|
|
67
|
+
high: item.High,
|
|
68
|
+
low: item.Low,
|
|
69
|
+
close: item.Close,
|
|
70
|
+
volume: item.Vol,
|
|
71
|
+
turnover: item.Amount,
|
|
72
|
+
turnoverRate: item.Turnover,
|
|
73
|
+
changeAmount: item.RisePrice,
|
|
74
|
+
changePercent: item.RiseRate,
|
|
75
|
+
stockCode: code,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function mapExItem(item, code) {
|
|
79
|
+
const ts = new Date(item.DateTime).getTime();
|
|
80
|
+
return {
|
|
81
|
+
timestamp: ts,
|
|
82
|
+
date: item.DateTime.split('T')[0],
|
|
83
|
+
open: item.Open,
|
|
84
|
+
high: item.High,
|
|
85
|
+
low: item.Low,
|
|
86
|
+
close: item.Close,
|
|
87
|
+
volume: item.Vol,
|
|
88
|
+
turnover: item.Amount,
|
|
89
|
+
stockCode: code,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function fetchGotdx(_source, config) {
|
|
93
|
+
if (config.exchange && config.exchange in EXCHANGE_EX_CATEGORY) {
|
|
94
|
+
const category = EXCHANGE_EX_CATEGORY[config.exchange];
|
|
95
|
+
const period = PERIOD_TO_CATEGORY[config.period] ?? 4;
|
|
96
|
+
const body = {
|
|
97
|
+
category,
|
|
98
|
+
code: config.symbol,
|
|
99
|
+
period,
|
|
100
|
+
start_date: config.startDate,
|
|
101
|
+
end_date: config.endDate,
|
|
102
|
+
times: 1,
|
|
103
|
+
};
|
|
104
|
+
const res = await fetch(`${BASE_URL}/api/ex/kline-by-date`, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
headers: { 'Content-Type': 'application/json' },
|
|
107
|
+
body: JSON.stringify(body),
|
|
108
|
+
});
|
|
109
|
+
if (!res.ok)
|
|
110
|
+
throw new Error(`[gotdx] ex/kline-by-date failed: ${res.status} ${res.statusText}`);
|
|
111
|
+
const list = await res.json();
|
|
112
|
+
return list.map((item) => mapExItem(item, config.symbol));
|
|
113
|
+
}
|
|
114
|
+
const market = config.symbol.startsWith('6') || config.symbol.startsWith('9') ? 1 : 0;
|
|
115
|
+
const category = PERIOD_TO_CATEGORY[config.period] ?? 4;
|
|
116
|
+
const adjust = ADJUST_MAP[config.adjust] ?? 0;
|
|
117
|
+
const body = {
|
|
118
|
+
market,
|
|
119
|
+
code: config.symbol,
|
|
120
|
+
category,
|
|
121
|
+
start_date: config.startDate,
|
|
122
|
+
end_date: config.endDate,
|
|
123
|
+
times: 1,
|
|
124
|
+
adjust,
|
|
125
|
+
};
|
|
126
|
+
const res = await fetch(`${BASE_URL}/api/stock/kline-by-date`, {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: { 'Content-Type': 'application/json' },
|
|
129
|
+
body: JSON.stringify(body),
|
|
130
|
+
});
|
|
131
|
+
if (!res.ok)
|
|
132
|
+
throw new Error(`[gotdx] stock/kline-by-date failed: ${res.status} ${res.statusText}`);
|
|
133
|
+
const list = await res.json();
|
|
134
|
+
return list.map((item) => mapBar(item, config.symbol));
|
|
135
|
+
}
|
|
136
|
+
let GotdxFetcher = (() => {
|
|
137
|
+
let _classDecorators = [DataFetcher({
|
|
138
|
+
name: 'gotdx',
|
|
139
|
+
displayName: 'GOTDX',
|
|
140
|
+
description: 'TDX data source via local proxy',
|
|
141
|
+
version: '1.0.0',
|
|
142
|
+
capabilities: [
|
|
143
|
+
'1min', '5min', '15min', '30min', '60min',
|
|
144
|
+
'daily', 'weekly', 'monthly', 'quarterly', 'yearly',
|
|
145
|
+
],
|
|
146
|
+
})];
|
|
147
|
+
let _classDescriptor;
|
|
148
|
+
let _classExtraInitializers = [];
|
|
149
|
+
let _classThis;
|
|
150
|
+
var GotdxFetcher = class {
|
|
151
|
+
static { _classThis = this; }
|
|
152
|
+
static {
|
|
153
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
154
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
155
|
+
GotdxFetcher = _classThis = _classDescriptor.value;
|
|
156
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
157
|
+
}
|
|
158
|
+
static fetcher = fetchGotdx;
|
|
159
|
+
static {
|
|
160
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
return GotdxFetcher = _classThis;
|
|
164
|
+
})();
|
|
165
|
+
export { GotdxFetcher };
|
|
166
|
+
/** @deprecated Use `GotdxFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
167
|
+
export const gotdxDataFetcher = fetchGotdx;
|
|
168
|
+
//# sourceMappingURL=gotdx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gotdx.js","sourceRoot":"","sources":["../../src/data-fetchers/gotdx.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { KLineData } from '../controllers/types';
|
|
2
|
+
import type { FetchConfig } from './types';
|
|
3
|
+
declare function fetchHundredMock(_source: string, config: FetchConfig): Promise<ReadonlyArray<KLineData>>;
|
|
4
|
+
export declare class HundredMockFetcher {
|
|
5
|
+
static fetcher: typeof fetchHundredMock;
|
|
6
|
+
}
|
|
7
|
+
/** @deprecated Use `HundredMockFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
8
|
+
export declare const hundredMockDataFetcher: typeof fetchHundredMock;
|
|
9
|
+
export {};
|
|
3
10
|
//# sourceMappingURL=hundred-mock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hundred-mock.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/hundred-mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"hundred-mock.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/hundred-mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,iBAAe,gBAAgB,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAwDnC;AAED,qBAOa,kBAAkB;IAC7B,MAAM,CAAC,OAAO,0BAAmB;CAClC;AAED,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB,yBAAmB,CAAA"}
|
|
@@ -1,16 +1,73 @@
|
|
|
1
|
-
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import { DataFetcher } from './fetcherDefinitionRegistry';
|
|
36
|
+
async function fetchHundredMock(_source, config) {
|
|
2
37
|
console.log(`[hundred-mock] generating ${config.symbol} ${config.period}`);
|
|
3
38
|
const start = new Date(config.startDate).getTime();
|
|
4
39
|
const end = new Date(config.endDate).getTime();
|
|
5
40
|
const dayMs = 86400000;
|
|
6
41
|
const totalDays = Math.floor((end - start) / dayMs) + 1;
|
|
42
|
+
if (totalDays <= 0)
|
|
43
|
+
return [];
|
|
44
|
+
const basePrice = 12.5;
|
|
7
45
|
const data = [];
|
|
8
|
-
|
|
46
|
+
if (totalDays === 1) {
|
|
47
|
+
data.push({
|
|
48
|
+
timestamp: start,
|
|
49
|
+
open: basePrice,
|
|
50
|
+
high: basePrice,
|
|
51
|
+
low: basePrice,
|
|
52
|
+
close: basePrice,
|
|
53
|
+
volume: Math.round(Math.random() * 10000000 + 1000000),
|
|
54
|
+
});
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
const meanReversionStrength = 0.005;
|
|
58
|
+
const rawWalk = [basePrice];
|
|
59
|
+
for (let i = 1; i < totalDays; i++) {
|
|
60
|
+
const prev = rawWalk[i - 1];
|
|
61
|
+
const reversion = meanReversionStrength * (basePrice - prev);
|
|
62
|
+
const change = (Math.random() - 0.48) * prev * 0.06 + reversion;
|
|
63
|
+
rawWalk.push(prev + change);
|
|
64
|
+
}
|
|
65
|
+
const finalOffset = rawWalk[totalDays - 1] - basePrice;
|
|
9
66
|
for (let i = 0; i < totalDays; i++) {
|
|
67
|
+
const bridge = finalOffset * (i / (totalDays - 1));
|
|
68
|
+
const close = Math.round((rawWalk[i] - bridge) * 100) / 100;
|
|
10
69
|
const ts = start + i * dayMs;
|
|
11
|
-
const
|
|
12
|
-
const open = price;
|
|
13
|
-
const close = Math.round((open + change) * 100) / 100;
|
|
70
|
+
const open = i === 0 ? basePrice : data[i - 1].close;
|
|
14
71
|
const high = Math.round(Math.max(open, close) * (1 + Math.random() * 0.03) * 100) / 100;
|
|
15
72
|
const low = Math.round(Math.min(open, close) * (1 - Math.random() * 0.03) * 100) / 100;
|
|
16
73
|
const volume = Math.round(Math.random() * 10000000 + 1000000);
|
|
@@ -23,8 +80,36 @@ export const hundredMockDataFetcher = async (_source, config) => {
|
|
|
23
80
|
volume,
|
|
24
81
|
turnover: Math.round((volume * (open + close)) / 2),
|
|
25
82
|
});
|
|
26
|
-
price = close;
|
|
27
83
|
}
|
|
28
84
|
return data;
|
|
29
|
-
}
|
|
85
|
+
}
|
|
86
|
+
let HundredMockFetcher = (() => {
|
|
87
|
+
let _classDecorators = [DataFetcher({
|
|
88
|
+
name: 'mock-100',
|
|
89
|
+
displayName: 'Mock 100',
|
|
90
|
+
description: 'Generates ~100 random K-line bars with Brownian bridge',
|
|
91
|
+
version: '1.0.0',
|
|
92
|
+
capabilities: ['*'],
|
|
93
|
+
})];
|
|
94
|
+
let _classDescriptor;
|
|
95
|
+
let _classExtraInitializers = [];
|
|
96
|
+
let _classThis;
|
|
97
|
+
var HundredMockFetcher = class {
|
|
98
|
+
static { _classThis = this; }
|
|
99
|
+
static {
|
|
100
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
101
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
102
|
+
HundredMockFetcher = _classThis = _classDescriptor.value;
|
|
103
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
104
|
+
}
|
|
105
|
+
static fetcher = fetchHundredMock;
|
|
106
|
+
static {
|
|
107
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
return HundredMockFetcher = _classThis;
|
|
111
|
+
})();
|
|
112
|
+
export { HundredMockFetcher };
|
|
113
|
+
/** @deprecated Use `HundredMockFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
114
|
+
export const hundredMockDataFetcher = fetchHundredMock;
|
|
30
115
|
//# sourceMappingURL=hundred-mock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hundred-mock.js","sourceRoot":"","sources":["../../src/data-fetchers/hundred-mock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hundred-mock.js","sourceRoot":"","sources":["../../src/data-fetchers/hundred-mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export { baostockDataFetcher } from './baostock';
|
|
4
|
-
export { tradingviewDataFetcher } from './tradingview';
|
|
1
|
+
export { HundredMockFetcher, hundredMockDataFetcher } from './hundred-mock';
|
|
2
|
+
export { ThousandMockFetcher, thousandMockDataFetcher } from './thousand-mock';
|
|
3
|
+
export { BaoStockFetcher, baostockDataFetcher } from './baostock';
|
|
4
|
+
export { TradingviewFetcher, tradingviewDataFetcher } from './tradingview';
|
|
5
|
+
export { GotdxFetcher, gotdxDataFetcher } from './gotdx';
|
|
5
6
|
export { routerDataFetcher } from './router';
|
|
6
7
|
export { DataBuffer } from './dataBuffer';
|
|
7
8
|
export type { DataWindow } from './dataBuffer';
|
|
9
|
+
export { DataFetcher, getRegisteredFetcher, getRegisteredFetchers, fetcherHasCapability, fetcherSupportsPeriod, clearRegisteredFetchersForTest, } from './fetcherDefinitionRegistry';
|
|
10
|
+
export type { FetchConfig, DataFetcherDefinitionConfig, DataFetcherDefinition, DataFetcherFn, } from './types';
|
|
8
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,WAAW,EACX,2BAA2B,EAC3B,qBAAqB,EACrB,aAAa,GACd,MAAM,SAAS,CAAA"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export { baostockDataFetcher } from './baostock';
|
|
4
|
-
export { tradingviewDataFetcher } from './tradingview';
|
|
1
|
+
export { HundredMockFetcher, hundredMockDataFetcher } from './hundred-mock';
|
|
2
|
+
export { ThousandMockFetcher, thousandMockDataFetcher } from './thousand-mock';
|
|
3
|
+
export { BaoStockFetcher, baostockDataFetcher } from './baostock';
|
|
4
|
+
export { TradingviewFetcher, tradingviewDataFetcher } from './tradingview';
|
|
5
|
+
export { GotdxFetcher, gotdxDataFetcher } from './gotdx';
|
|
5
6
|
export { routerDataFetcher } from './router';
|
|
6
7
|
export { DataBuffer } from './dataBuffer';
|
|
8
|
+
export { DataFetcher, getRegisteredFetcher, getRegisteredFetchers, fetcherHasCapability, fetcherSupportsPeriod, clearRegisteredFetchersForTest, } from './fetcherDefinitionRegistry';
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data-fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data-fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAKvD,eAAO,MAAM,iBAAiB,EAAE,WA0B/B,CAAA"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { thousandMockDataFetcher } from './thousand-mock';
|
|
4
|
-
import { tradingviewDataFetcher } from './tradingview';
|
|
1
|
+
import { getRegisteredFetcher, fetcherSupportsPeriod } from './fetcherDefinitionRegistry';
|
|
2
|
+
const FALLBACK_SOURCE = 'baostock';
|
|
5
3
|
export const routerDataFetcher = (source, config) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return thousandMockDataFetcher(source, config);
|
|
15
|
-
default:
|
|
16
|
-
return hundredMockDataFetcher(source, config);
|
|
4
|
+
const def = getRegisteredFetcher(source);
|
|
5
|
+
if (!def) {
|
|
6
|
+
console.warn(`[DataFetcher] unknown source "${source}", falling back to "${FALLBACK_SOURCE}"`);
|
|
7
|
+
const fallback = getRegisteredFetcher(FALLBACK_SOURCE);
|
|
8
|
+
if (!fallback) {
|
|
9
|
+
return Promise.reject(new Error(`[DataFetcher] no fetcher registered for "${source}" and no fallback available`));
|
|
10
|
+
}
|
|
11
|
+
return fallback.fetcher(source, config);
|
|
17
12
|
}
|
|
13
|
+
if (!fetcherSupportsPeriod(source, config.period)) {
|
|
14
|
+
return Promise.reject(new Error(`[DataFetcher] "${source}" does not support period "${config.period}". Supported: ${def.capabilities?.join(', ') ?? 'none'}`));
|
|
15
|
+
}
|
|
16
|
+
return def.fetcher(source, config);
|
|
18
17
|
};
|
|
19
18
|
//# sourceMappingURL=router.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/data-fetchers/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/data-fetchers/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAEzF,MAAM,eAAe,GAAG,UAAU,CAAA;AAElC,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;IAC/D,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CACV,iCAAiC,MAAM,uBAAuB,eAAe,GAAG,CACjF,CAAA;QACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAA;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CACP,4CAA4C,MAAM,6BAA6B,CAChF,CACF,CAAA;QACH,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CACP,kBAAkB,MAAM,8BAA8B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAC7H,CACF,CAAA;IACH,CAAC;IAED,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACpC,CAAC,CAAA"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { KLineData } from '../controllers/types';
|
|
2
|
+
import type { FetchConfig } from './types';
|
|
3
|
+
declare function fetchThousandMock(_source: string, _config: FetchConfig): Promise<ReadonlyArray<KLineData>>;
|
|
4
|
+
export declare class ThousandMockFetcher {
|
|
5
|
+
static fetcher: typeof fetchThousandMock;
|
|
6
|
+
}
|
|
7
|
+
/** @deprecated Use `ThousandMockFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
8
|
+
export declare const thousandMockDataFetcher: typeof fetchThousandMock;
|
|
9
|
+
export {};
|
|
3
10
|
//# sourceMappingURL=thousand-mock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thousand-mock.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/thousand-mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"thousand-mock.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/thousand-mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,iBAAe,iBAAiB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAyCnC;AAED,qBAOa,mBAAmB;IAC9B,MAAM,CAAC,OAAO,2BAAoB;CACnC;AAED,2FAA2F;AAC3F,eAAO,MAAM,uBAAuB,0BAAoB,CAAA"}
|
|
@@ -1,29 +1,101 @@
|
|
|
1
|
-
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import { DataFetcher } from './fetcherDefinitionRegistry';
|
|
36
|
+
async function fetchThousandMock(_source, _config) {
|
|
2
37
|
console.log('[thousand-mock] generating 10k K-lines');
|
|
3
38
|
const data = [];
|
|
4
39
|
const startTime = new Date('2020-01-01').getTime();
|
|
5
40
|
const dayMs = 24 * 60 * 60 * 1000;
|
|
6
|
-
|
|
7
|
-
|
|
41
|
+
const totalDays = 10000;
|
|
42
|
+
const basePrice = 3000;
|
|
43
|
+
const meanReversionStrength = 0.0005;
|
|
44
|
+
const volatility = 0.02;
|
|
45
|
+
const rawWalk = [basePrice];
|
|
46
|
+
for (let i = 1; i < totalDays; i++) {
|
|
47
|
+
const prev = rawWalk[i - 1];
|
|
48
|
+
const reversion = meanReversionStrength * (basePrice - prev);
|
|
49
|
+
const change = (Math.random() - 0.5) * 2 * volatility * prev + reversion;
|
|
50
|
+
rawWalk.push(prev + change);
|
|
51
|
+
}
|
|
52
|
+
const finalOffset = rawWalk[totalDays - 1] - basePrice;
|
|
53
|
+
for (let i = 0; i < totalDays; i++) {
|
|
54
|
+
const bridge = finalOffset * (i / (totalDays - 1));
|
|
55
|
+
const close = Math.round((rawWalk[i] - bridge) * 100) / 100;
|
|
8
56
|
const timestamp = startTime + i * dayMs;
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const open = lastClose;
|
|
13
|
-
const close = open * (1 + change);
|
|
14
|
-
const high = Math.max(open, close) * (1 + Math.random() * 0.01);
|
|
15
|
-
const low = Math.min(open, close) * (1 - Math.random() * 0.01);
|
|
57
|
+
const open = i === 0 ? basePrice : data[i - 1].close;
|
|
58
|
+
const high = Math.round(Math.max(open, close) * (1 + Math.random() * 0.01) * 100) / 100;
|
|
59
|
+
const low = Math.round(Math.min(open, close) * (1 - Math.random() * 0.01) * 100) / 100;
|
|
16
60
|
const volume = Math.floor(1000000 + Math.random() * 5000000);
|
|
17
61
|
data.push({
|
|
18
62
|
timestamp,
|
|
19
|
-
open
|
|
20
|
-
high
|
|
21
|
-
low
|
|
22
|
-
close
|
|
63
|
+
open,
|
|
64
|
+
high,
|
|
65
|
+
low,
|
|
66
|
+
close,
|
|
23
67
|
volume,
|
|
24
68
|
});
|
|
25
|
-
lastClose = close;
|
|
26
69
|
}
|
|
27
70
|
return data;
|
|
28
|
-
}
|
|
71
|
+
}
|
|
72
|
+
let ThousandMockFetcher = (() => {
|
|
73
|
+
let _classDecorators = [DataFetcher({
|
|
74
|
+
name: 'mock-10000',
|
|
75
|
+
displayName: 'Mock 10000',
|
|
76
|
+
description: 'Generates ~10,000 random K-line bars with Brownian bridge',
|
|
77
|
+
version: '1.0.0',
|
|
78
|
+
capabilities: ['*'],
|
|
79
|
+
})];
|
|
80
|
+
let _classDescriptor;
|
|
81
|
+
let _classExtraInitializers = [];
|
|
82
|
+
let _classThis;
|
|
83
|
+
var ThousandMockFetcher = class {
|
|
84
|
+
static { _classThis = this; }
|
|
85
|
+
static {
|
|
86
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
87
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
88
|
+
ThousandMockFetcher = _classThis = _classDescriptor.value;
|
|
89
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
90
|
+
}
|
|
91
|
+
static fetcher = fetchThousandMock;
|
|
92
|
+
static {
|
|
93
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
return ThousandMockFetcher = _classThis;
|
|
97
|
+
})();
|
|
98
|
+
export { ThousandMockFetcher };
|
|
99
|
+
/** @deprecated Use `ThousandMockFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
100
|
+
export const thousandMockDataFetcher = fetchThousandMock;
|
|
29
101
|
//# sourceMappingURL=thousand-mock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thousand-mock.js","sourceRoot":"","sources":["../../src/data-fetchers/thousand-mock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thousand-mock.js","sourceRoot":"","sources":["../../src/data-fetchers/thousand-mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { KLineData } from '../controllers/types';
|
|
2
|
+
import type { FetchConfig } from './types';
|
|
3
|
+
declare function fetchTradingview(_source: string, config: FetchConfig): Promise<ReadonlyArray<KLineData>>;
|
|
4
|
+
export declare class TradingviewFetcher {
|
|
5
|
+
static fetcher: typeof fetchTradingview;
|
|
6
|
+
}
|
|
7
|
+
/** @deprecated Use `TradingviewFetcher.fetcher` directly or rely on routerDataFetcher. */
|
|
8
|
+
export declare const tradingviewDataFetcher: typeof fetchTradingview;
|
|
9
|
+
export {};
|
|
3
10
|
//# sourceMappingURL=tradingview.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tradingview.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/tradingview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"tradingview.d.ts","sourceRoot":"","sources":["../../src/data-fetchers/tradingview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAoB1C,iBAAe,gBAAgB,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAkCnC;AAED,qBAOa,kBAAkB;IAC7B,MAAM,CAAC,OAAO,0BAAmB;CAClC;AAED,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB,yBAAmB,CAAA"}
|