bulltrackers-module 1.0.648 → 1.0.650

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.
@@ -80,9 +80,21 @@ async function fetchDependencies(date, calcs, config, deps, manifestLookup = {},
80
80
 
81
81
  calcs.forEach(c => {
82
82
  // [FIX] Support both .getDependencies() method and .dependencies array
83
- const reqs = (typeof c.getDependencies === 'function')
84
- ? c.getDependencies()
85
- : (c.dependencies || []);
83
+ // CRITICAL: Prefer class.getDependencies() over manifest.dependencies
84
+ // because the class method returns original case-sensitive names,
85
+ // while manifest.dependencies contains normalized names
86
+ let reqs = [];
87
+ if (c.class && typeof c.class.getDependencies === 'function') {
88
+ // Use the class method - returns original case-sensitive names
89
+ reqs = c.class.getDependencies();
90
+ } else if (typeof c.getDependencies === 'function') {
91
+ // Fallback: direct method call (if c is the class itself)
92
+ reqs = c.getDependencies();
93
+ } else if (c.dependencies && Array.isArray(c.dependencies)) {
94
+ // Last resort: use manifest's dependencies array (normalized)
95
+ // This is less ideal because names are normalized, but we'll use them as-is
96
+ reqs = c.dependencies;
97
+ }
86
98
 
87
99
  if (Array.isArray(reqs)) {
88
100
  reqs.forEach(r => {
@@ -99,6 +111,10 @@ async function fetchDependencies(date, calcs, config, deps, manifestLookup = {},
99
111
  const calcNames = calcs.map(c => c.name || c.constructor?.name || 'unknown').join(', ');
100
112
  logger.log('INFO', `[DependencyFetcher] Fetching ${needed.size} dependencies for computation(s): ${calcNames} (date: ${dStr})`);
101
113
 
114
+ // DEBUG: Log what dependencies we're looking for
115
+ const depList = Array.from(needed.entries()).map(([norm, orig]) => `${orig} (normalized: ${norm})`).join(', ');
116
+ logger.log('INFO', `[DependencyFetcher] Dependencies requested: ${depList}`);
117
+
102
118
  const results = {};
103
119
  const missingDeps = [];
104
120
  const emptyDeps = [];
@@ -142,6 +158,9 @@ async function fetchDependencies(date, calcs, config, deps, manifestLookup = {},
142
158
  } else {
143
159
  // CHANGED: Store result using the ORIGINAL name so context.computed['CaseSensitive'] works
144
160
  results[originalName] = data;
161
+ // DEBUG: Log successful dependency load
162
+ const dataKeys = Object.keys(data);
163
+ logger.log('INFO', `[DependencyFetcher] ✅ Stored dependency '${originalName}' in results. Keys: ${dataKeys.length} (sample: ${dataKeys.slice(0, 5).join(', ')})`);
145
164
  }
146
165
  } catch (e) {
147
166
  missingDeps.push({ name: originalName, normalizedName: normName, path, error: e.message });
@@ -156,6 +175,10 @@ async function fetchDependencies(date, calcs, config, deps, manifestLookup = {},
156
175
 
157
176
  await Promise.all(promises);
158
177
 
178
+ // DEBUG: Log what we're returning
179
+ const resultKeys = Object.keys(results);
180
+ logger.log('INFO', `[DependencyFetcher] ✅ Returning ${resultKeys.length} dependencies: ${resultKeys.join(', ')}`);
181
+
159
182
  // CRITICAL: Fail if any required dependencies are missing or empty
160
183
  // EXCEPTION: For historical/lookback scenarios, missing dependencies are permissible
161
184
  if ((missingDeps.length > 0 || emptyDeps.length > 0) && !allowMissing) {
@@ -177,6 +177,10 @@ class MetaExecutor {
177
177
  const inst = new c.class();
178
178
  inst.manifest = c;
179
179
 
180
+ // DEBUG: Log what dependencies were fetched
181
+ const fetchedDepKeys = Object.keys(fetchedDeps || {});
182
+ logger.log('INFO', `[MetaExecutor] 📦 Fetched dependencies available: ${fetchedDepKeys.length > 0 ? fetchedDepKeys.join(', ') : 'NONE'}`);
183
+
180
184
  const context = ContextFactory.buildMetaContext({
181
185
  dateStr: dStr,
182
186
  metadata: c,
@@ -196,9 +200,53 @@ class MetaExecutor {
196
200
  seriesData
197
201
  });
198
202
 
203
+ // DEBUG: Log dependency availability
204
+ // CRITICAL: Use class.getDependencies() to get original case-sensitive names
205
+ const depNames = (c.class && typeof c.class.getDependencies === 'function')
206
+ ? c.class.getDependencies()
207
+ : (c.getDependencies ? c.getDependencies() : (c.dependencies || []));
208
+ depNames.forEach(depName => {
209
+ const depData = context.computed[depName];
210
+ if (depData) {
211
+ const keys = Object.keys(depData);
212
+ logger.log('INFO', `[MetaExecutor] ✅ Dependency '${depName}' available for ${c.name}. Keys: ${keys.length} (sample: ${keys.slice(0, 5).join(', ')})`);
213
+ } else {
214
+ logger.log('ERROR', `[MetaExecutor] ❌ Dependency '${depName}' MISSING for ${c.name} in context.computed`);
215
+ }
216
+ });
217
+
199
218
  try {
200
219
  const result = await inst.process(context);
201
- inst.results = { [dStr]: { global: result } };
220
+
221
+ // DEBUG: Log result before saving
222
+ if (result && typeof result === 'object') {
223
+ const resultKeys = Object.keys(result);
224
+ logger.log('INFO', `[MetaExecutor] ✅ ${c.name} computed result. Keys: ${resultKeys.length} (sample: ${resultKeys.slice(0, 10).join(', ')})`);
225
+ if (resultKeys.length === 0) {
226
+ logger.log('WARN', `[MetaExecutor] ⚠️ ${c.name} returned EMPTY result object!`);
227
+ }
228
+ } else {
229
+ logger.log('WARN', `[MetaExecutor] ⚠️ ${c.name} returned non-object result: ${typeof result} - ${result}`);
230
+ }
231
+
232
+ // CRITICAL FIX: Do NOT overwrite this.results - the computation already sets it correctly
233
+ // The computation's process() method sets this.results, and getResult() returns it
234
+ // We only use the return value for logging/debugging
235
+ // inst.results should already be set by the computation's process() method
236
+ if (!inst.results) {
237
+ logger.log('WARN', `[MetaExecutor] ⚠️ ${c.name} did not set this.results - using return value as fallback`);
238
+ inst.results = result;
239
+ }
240
+
241
+ // DEBUG: Verify what getResult() will return
242
+ const finalResult = await inst.getResult();
243
+ if (finalResult && typeof finalResult === 'object') {
244
+ const finalKeys = Object.keys(finalResult);
245
+ logger.log('INFO', `[MetaExecutor] ✅ ${c.name} getResult() will return ${finalKeys.length} keys`);
246
+ } else {
247
+ logger.log('WARN', `[MetaExecutor] ⚠️ ${c.name} getResult() returns: ${typeof finalResult}`);
248
+ }
249
+
202
250
  state[c.name] = inst;
203
251
  } catch (e) {
204
252
  logger.log('ERROR', `Meta calc ${c.name} failed: ${e.message}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bulltrackers-module",
3
- "version": "1.0.648",
3
+ "version": "1.0.650",
4
4
  "description": "Helper Functions for Bulltrackers.",
5
5
  "main": "index.js",
6
6
  "files": [