@tradejs/node 1.0.0 → 1.0.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/{ai-NNJ3RLLL.mjs → ai-MDMDKAEE.mjs} +3 -3
- package/dist/backtest.d.mts +1 -1
- package/dist/backtest.d.ts +1 -1
- package/dist/backtest.js +214 -131
- package/dist/backtest.mjs +52 -25
- package/dist/{chunk-DE7ADBIR.mjs → chunk-3C76HVLA.mjs} +1 -0
- package/dist/{chunk-CVTV6S2V.mjs → chunk-7ICOZAKA.mjs} +26 -1
- package/dist/chunk-CK2PW4L5.mjs +243 -0
- package/dist/{chunk-PXJJPAQT.mjs → chunk-H4HXW3EZ.mjs} +1 -1
- package/dist/chunk-MGFEID6K.mjs +268 -0
- package/dist/{chunk-ZIMX3JX2.mjs → chunk-QDYCJ2OK.mjs} +1 -1
- package/dist/cli.js +131 -99
- package/dist/cli.mjs +17 -15
- package/dist/connectors.d.mts +9 -9
- package/dist/connectors.d.ts +9 -9
- package/dist/connectors.js +110 -70
- package/dist/connectors.mjs +2 -2
- package/dist/pine.d.mts +27 -3
- package/dist/pine.d.ts +27 -3
- package/dist/pine.js +31 -4
- package/dist/pine.mjs +9 -1
- package/dist/registry.d.mts +10 -10
- package/dist/registry.d.ts +10 -10
- package/dist/registry.js +122 -81
- package/dist/registry.mjs +2 -2
- package/dist/strategies.js +132 -151
- package/dist/strategies.mjs +15 -10
- package/package.json +13 -4
- package/dist/chunk-E2QNOA5M.mjs +0 -227
- package/dist/chunk-MHCXPD2B.mjs +0 -201
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getTradejsProjectCwd,
|
|
3
|
+
importTradejsModule,
|
|
4
|
+
loadTradejsConfig,
|
|
5
|
+
resolvePluginModuleSpecifier
|
|
6
|
+
} from "./chunk-3C76HVLA.mjs";
|
|
7
|
+
|
|
8
|
+
// src/connectorsRegistry.ts
|
|
9
|
+
import { logger } from "@tradejs/infra/logger";
|
|
10
|
+
var createConnectorRegistryState = () => ({
|
|
11
|
+
connectorCreators: /* @__PURE__ */ new Map(),
|
|
12
|
+
providerToConnectorName: /* @__PURE__ */ new Map(),
|
|
13
|
+
pluginsLoadPromise: null
|
|
14
|
+
});
|
|
15
|
+
var registryStateByProjectRoot = /* @__PURE__ */ new Map();
|
|
16
|
+
var getConnectorRegistryState = (cwd = getTradejsProjectCwd()) => {
|
|
17
|
+
const projectRoot = getTradejsProjectCwd(cwd);
|
|
18
|
+
let state = registryStateByProjectRoot.get(projectRoot);
|
|
19
|
+
if (!state) {
|
|
20
|
+
state = createConnectorRegistryState();
|
|
21
|
+
registryStateByProjectRoot.set(projectRoot, state);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
projectRoot,
|
|
25
|
+
state
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
var BUILTIN_CONNECTOR_NAMES = {
|
|
29
|
+
ByBit: "ByBit",
|
|
30
|
+
Binance: "Binance",
|
|
31
|
+
Coinbase: "Coinbase",
|
|
32
|
+
Test: "Test"
|
|
33
|
+
};
|
|
34
|
+
var normalizeProvider = (value) => String(value ?? "").trim().toLowerCase();
|
|
35
|
+
var toUniqueModules = (modules = []) => [
|
|
36
|
+
...new Set(modules.map((moduleName) => moduleName.trim()).filter(Boolean))
|
|
37
|
+
];
|
|
38
|
+
var findConnectorNameInsensitive = (name, connectorCreators) => {
|
|
39
|
+
const normalized = name.trim().toLowerCase();
|
|
40
|
+
if (!normalized) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
for (const existingName of connectorCreators.keys()) {
|
|
44
|
+
if (existingName.toLowerCase() === normalized) {
|
|
45
|
+
return existingName;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
};
|
|
50
|
+
var normalizeProviders = (providers, connectorName) => {
|
|
51
|
+
const list = Array.isArray(providers) ? providers.map((item) => normalizeProvider(item)).filter(Boolean) : [];
|
|
52
|
+
const deduped = [...new Set(list)];
|
|
53
|
+
if (deduped.length) {
|
|
54
|
+
return deduped;
|
|
55
|
+
}
|
|
56
|
+
return [normalizeProvider(connectorName)];
|
|
57
|
+
};
|
|
58
|
+
var registerProvider = (provider, connectorName, source, providerToConnectorName) => {
|
|
59
|
+
const existing = providerToConnectorName.get(provider);
|
|
60
|
+
if (existing && existing !== connectorName) {
|
|
61
|
+
logger.warn(
|
|
62
|
+
'Skip duplicate connector provider "%s" from %s: already mapped to %s',
|
|
63
|
+
provider,
|
|
64
|
+
source,
|
|
65
|
+
existing
|
|
66
|
+
);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
providerToConnectorName.set(provider, connectorName);
|
|
70
|
+
};
|
|
71
|
+
var registerEntry = (entry, source, state) => {
|
|
72
|
+
const connectorName = String(entry?.name ?? "").trim();
|
|
73
|
+
if (!connectorName) {
|
|
74
|
+
logger.warn("Skip connector entry without name from %s", source);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (typeof entry.creator !== "function") {
|
|
78
|
+
logger.warn(
|
|
79
|
+
'Skip connector entry "%s" from %s: creator must be a function',
|
|
80
|
+
connectorName,
|
|
81
|
+
source
|
|
82
|
+
);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const existingByName = findConnectorNameInsensitive(
|
|
86
|
+
connectorName,
|
|
87
|
+
state.connectorCreators
|
|
88
|
+
);
|
|
89
|
+
if (existingByName) {
|
|
90
|
+
logger.warn(
|
|
91
|
+
'Skip duplicate connector "%s" from %s: already registered as %s',
|
|
92
|
+
connectorName,
|
|
93
|
+
source,
|
|
94
|
+
existingByName
|
|
95
|
+
);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
state.connectorCreators.set(connectorName, entry.creator);
|
|
99
|
+
const providers = normalizeProviders(entry.providers, connectorName);
|
|
100
|
+
for (const provider of providers) {
|
|
101
|
+
registerProvider(
|
|
102
|
+
provider,
|
|
103
|
+
connectorName,
|
|
104
|
+
source,
|
|
105
|
+
state.providerToConnectorName
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
var registerEntries = (entries, source, state) => {
|
|
110
|
+
for (const entry of entries) {
|
|
111
|
+
registerEntry(entry, source, state);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var extractConnectorPluginDefinition = (moduleExport) => {
|
|
115
|
+
if (!moduleExport || typeof moduleExport !== "object") {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const candidate = moduleExport;
|
|
119
|
+
if (Array.isArray(candidate.connectorEntries)) {
|
|
120
|
+
return {
|
|
121
|
+
connectorEntries: candidate.connectorEntries
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const defaultExport = candidate.default;
|
|
125
|
+
if (defaultExport && Array.isArray(defaultExport.connectorEntries)) {
|
|
126
|
+
return {
|
|
127
|
+
connectorEntries: defaultExport.connectorEntries
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
};
|
|
132
|
+
var importConnectorPluginModule = async (moduleName) => {
|
|
133
|
+
if (typeof importTradejsModule === "function") {
|
|
134
|
+
return importTradejsModule(moduleName);
|
|
135
|
+
}
|
|
136
|
+
return import(
|
|
137
|
+
/* webpackIgnore: true */
|
|
138
|
+
moduleName
|
|
139
|
+
);
|
|
140
|
+
};
|
|
141
|
+
var ensureConnectorPluginsLoaded = async (cwd = getTradejsProjectCwd()) => {
|
|
142
|
+
const { projectRoot, state } = getConnectorRegistryState(cwd);
|
|
143
|
+
if (!state.pluginsLoadPromise) {
|
|
144
|
+
state.pluginsLoadPromise = (async () => {
|
|
145
|
+
const config = await loadTradejsConfig(projectRoot);
|
|
146
|
+
const connectorModules = toUniqueModules(config.connectors);
|
|
147
|
+
if (!connectorModules.length) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
for (const moduleName of connectorModules) {
|
|
151
|
+
try {
|
|
152
|
+
const resolvedModuleName = resolvePluginModuleSpecifier(
|
|
153
|
+
moduleName,
|
|
154
|
+
projectRoot
|
|
155
|
+
);
|
|
156
|
+
const moduleExport = await importConnectorPluginModule(resolvedModuleName);
|
|
157
|
+
const pluginDefinition = extractConnectorPluginDefinition(moduleExport);
|
|
158
|
+
if (!pluginDefinition) {
|
|
159
|
+
logger.warn(
|
|
160
|
+
'Skip connector plugin "%s": export { connectorEntries } is missing',
|
|
161
|
+
moduleName
|
|
162
|
+
);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
registerEntries(pluginDefinition.connectorEntries, moduleName, state);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
logger.warn(
|
|
168
|
+
'Failed to load connector plugin "%s": %s',
|
|
169
|
+
moduleName,
|
|
170
|
+
String(error)
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
})();
|
|
175
|
+
}
|
|
176
|
+
await state.pluginsLoadPromise;
|
|
177
|
+
};
|
|
178
|
+
var getConnectorCreatorByName = async (connectorName, cwd = getTradejsProjectCwd()) => {
|
|
179
|
+
await ensureConnectorPluginsLoaded(cwd);
|
|
180
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
181
|
+
const raw = String(connectorName ?? "").trim();
|
|
182
|
+
if (!raw) {
|
|
183
|
+
return void 0;
|
|
184
|
+
}
|
|
185
|
+
const direct = state.connectorCreators.get(raw);
|
|
186
|
+
if (direct) {
|
|
187
|
+
return direct;
|
|
188
|
+
}
|
|
189
|
+
const existing = findConnectorNameInsensitive(raw, state.connectorCreators);
|
|
190
|
+
if (!existing) {
|
|
191
|
+
return void 0;
|
|
192
|
+
}
|
|
193
|
+
return state.connectorCreators.get(existing);
|
|
194
|
+
};
|
|
195
|
+
var getConnectorNameByProvider = async (provider, cwd = getTradejsProjectCwd()) => {
|
|
196
|
+
await ensureConnectorPluginsLoaded(cwd);
|
|
197
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
198
|
+
const normalized = normalizeProvider(provider);
|
|
199
|
+
if (!normalized) {
|
|
200
|
+
return void 0;
|
|
201
|
+
}
|
|
202
|
+
return state.providerToConnectorName.get(normalized);
|
|
203
|
+
};
|
|
204
|
+
var getConnectorCreatorByProvider = async (provider, cwd = getTradejsProjectCwd()) => {
|
|
205
|
+
await ensureConnectorPluginsLoaded(cwd);
|
|
206
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
207
|
+
const normalized = normalizeProvider(provider);
|
|
208
|
+
if (!normalized) {
|
|
209
|
+
return void 0;
|
|
210
|
+
}
|
|
211
|
+
const connectorName = state.providerToConnectorName.get(normalized);
|
|
212
|
+
if (!connectorName) {
|
|
213
|
+
return void 0;
|
|
214
|
+
}
|
|
215
|
+
return state.connectorCreators.get(connectorName);
|
|
216
|
+
};
|
|
217
|
+
var resolveConnectorName = async (providerOrName, cwd = getTradejsProjectCwd()) => {
|
|
218
|
+
await ensureConnectorPluginsLoaded(cwd);
|
|
219
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
220
|
+
const raw = String(providerOrName ?? "").trim();
|
|
221
|
+
if (!raw) {
|
|
222
|
+
return void 0;
|
|
223
|
+
}
|
|
224
|
+
const byProvider = state.providerToConnectorName.get(normalizeProvider(raw));
|
|
225
|
+
if (byProvider) {
|
|
226
|
+
return byProvider;
|
|
227
|
+
}
|
|
228
|
+
return state.connectorCreators.get(raw) && raw ? raw : findConnectorNameInsensitive(raw, state.connectorCreators) ?? void 0;
|
|
229
|
+
};
|
|
230
|
+
var getAvailableConnectorNames = async (cwd = getTradejsProjectCwd()) => {
|
|
231
|
+
await ensureConnectorPluginsLoaded(cwd);
|
|
232
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
233
|
+
return [...state.connectorCreators.keys()].sort((a, b) => a.localeCompare(b));
|
|
234
|
+
};
|
|
235
|
+
var getAvailableConnectorProviders = async (cwd = getTradejsProjectCwd()) => {
|
|
236
|
+
await ensureConnectorPluginsLoaded(cwd);
|
|
237
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
238
|
+
return [...state.providerToConnectorName.keys()].sort(
|
|
239
|
+
(a, b) => a.localeCompare(b)
|
|
240
|
+
);
|
|
241
|
+
};
|
|
242
|
+
var registerConnectorEntries = (entries, cwd = getTradejsProjectCwd()) => {
|
|
243
|
+
const { state } = getConnectorRegistryState(cwd);
|
|
244
|
+
registerEntries(entries, "runtime", state);
|
|
245
|
+
};
|
|
246
|
+
var resetConnectorRegistryCache = (cwd) => {
|
|
247
|
+
const normalizedCwd = String(cwd ?? "").trim();
|
|
248
|
+
if (!normalizedCwd) {
|
|
249
|
+
registryStateByProjectRoot.clear();
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
registryStateByProjectRoot.delete(getTradejsProjectCwd(normalizedCwd));
|
|
253
|
+
};
|
|
254
|
+
var DEFAULT_CONNECTOR_NAME = BUILTIN_CONNECTOR_NAMES.ByBit;
|
|
255
|
+
|
|
256
|
+
export {
|
|
257
|
+
BUILTIN_CONNECTOR_NAMES,
|
|
258
|
+
ensureConnectorPluginsLoaded,
|
|
259
|
+
getConnectorCreatorByName,
|
|
260
|
+
getConnectorNameByProvider,
|
|
261
|
+
getConnectorCreatorByProvider,
|
|
262
|
+
resolveConnectorName,
|
|
263
|
+
getAvailableConnectorNames,
|
|
264
|
+
getAvailableConnectorProviders,
|
|
265
|
+
registerConnectorEntries,
|
|
266
|
+
resetConnectorRegistryCache,
|
|
267
|
+
DEFAULT_CONNECTOR_NAME
|
|
268
|
+
};
|