@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.
@@ -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
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getStrategyManifest
3
- } from "./chunk-MHCXPD2B.mjs";
3
+ } from "./chunk-CK2PW4L5.mjs";
4
4
 
5
5
  // src/ai.ts
6
6
  import { setData, redisKeys } from "@tradejs/infra/redis";