@forzalabs/remora 1.1.9 → 1.1.10

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/index.js CHANGED
@@ -13259,6 +13259,13 @@ ${stack}` : base;
13259
13259
  stack: extra
13260
13260
  });
13261
13261
  };
13262
+ this.flush = () => {
13263
+ if (!this._enabled || !this._logger) return Promise.resolve();
13264
+ return new Promise((resolve) => {
13265
+ this._logger.on("finish", resolve);
13266
+ this._logger.end();
13267
+ });
13268
+ };
13262
13269
  }
13263
13270
  };
13264
13271
  var FileLogService = new FileLogServiceClass();
@@ -13309,7 +13316,6 @@ var Logger = class {
13309
13316
  this._fileLoggingFolder = folder;
13310
13317
  this._fileLoggingFile = file;
13311
13318
  FileLogService_default.enable(folder, file);
13312
- console.log(`Enabled file logger.`);
13313
13319
  };
13314
13320
  this.getConfig = () => ({
13315
13321
  level: this._level,
@@ -13332,6 +13338,7 @@ var Logger = class {
13332
13338
  console.info(message);
13333
13339
  FileLogService_default.write("INFO", String(message));
13334
13340
  };
13341
+ this.flush = () => FileLogService_default.flush();
13335
13342
  this.error = (error) => {
13336
13343
  let message;
13337
13344
  let stack;
@@ -13473,7 +13480,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
13473
13480
 
13474
13481
  // ../../packages/constants/src/Constants.ts
13475
13482
  var CONSTANTS = {
13476
- cliVersion: "1.1.9",
13483
+ cliVersion: "1.1.10",
13477
13484
  backendVersion: 1,
13478
13485
  backendPort: 5088,
13479
13486
  workerVersion: 2,
@@ -13842,9 +13849,10 @@ var ValidatorClass = class {
13842
13849
  const validAggregations = ["sum", "count", "avg", "min", "max"];
13843
13850
  if (pivot.aggregation && !validAggregations.includes(pivot.aggregation))
13844
13851
  errors.push(`Invalid pivot aggregation "${pivot.aggregation}" in consumer "${consumer.name}". Valid values: ${validAggregations.join(", ")}`);
13852
+ const hasWildcardField = consumer.fields.some((x) => x.key === "*");
13845
13853
  const allFieldKeys = consumer.fields.map((x) => x.alias ?? x.key);
13846
13854
  const pivotFields = [...pivot.rowKeys ?? [], pivot.pivotColumn, pivot.valueColumn].filter(Boolean);
13847
- const missingFields = pivotFields.filter((f) => !allFieldKeys.includes(f));
13855
+ const missingFields = hasWildcardField ? [] : pivotFields.filter((f) => !allFieldKeys.includes(f));
13848
13856
  if (missingFields.length > 0)
13849
13857
  errors.push(`Pivot references field(s) "${missingFields.join(", ")}" that are not present in the consumer "${consumer.name}".`);
13850
13858
  }
@@ -20859,6 +20867,7 @@ var ExecutorOrchestratorClass = class {
20859
20867
  finalResult.outputCount = postOperation.totalOutputCount;
20860
20868
  UsageManager_default.endUsage(usageId, finalResult.outputCount, finalResult);
20861
20869
  Logger_default.log(`[${usageId}] Consumer "${consumer.name}" completed: ${finalResult.outputCount} rows, ${finalResult.workerCount} worker(s), ${Math.round(finalResult.elapsedMS)}ms`);
20870
+ await Logger_default.flush();
20862
20871
  return finalResult;
20863
20872
  } catch (error) {
20864
20873
  Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
@@ -20867,6 +20876,7 @@ var ExecutorOrchestratorClass = class {
20867
20876
  Logger_default.log(`[${usageId}] Running cleanup after failure`);
20868
20877
  await this.performCleanupOperations(scope, tracker);
20869
20878
  UsageManager_default.failUsage(usageId, Helper_default.asError(error).message);
20879
+ await Logger_default.flush();
20870
20880
  throw error;
20871
20881
  }
20872
20882
  };
@@ -20960,13 +20970,12 @@ var ExecutorOrchestratorClass = class {
20960
20970
  if (executorResults.length > 1) {
20961
20971
  Logger_default.log(`[${scope.id}] Merging ${executorResults.length} worker output files into ${mainPath}`);
20962
20972
  const perf = performance.now();
20963
- const output = import_fs14.default.createWriteStream(mainPath);
20964
- output.setMaxListeners(executorResults.length + 1);
20965
20973
  for (const workerResult of executorResults) {
20966
- await (0, import_promises10.pipeline)(import_fs14.default.createReadStream(workerResult.resultUri), output, { end: false });
20974
+ await (0, import_promises10.pipeline)(
20975
+ import_fs14.default.createReadStream(workerResult.resultUri),
20976
+ import_fs14.default.createWriteStream(mainPath, { flags: "a" })
20977
+ );
20967
20978
  }
20968
- output.end();
20969
- output.close();
20970
20979
  tracker.measure("merge-workers", performance.now() - perf);
20971
20980
  Logger_default.log(`[${scope.id}] Merge complete in ${Math.round(performance.now() - perf)}ms`);
20972
20981
  } else if (executorResults.length === 1) {
@@ -21123,15 +21132,18 @@ var run = async (consumerName, options) => {
21123
21132
  return sum + (result.response?.elapsedMS || 0);
21124
21133
  }, 0);
21125
21134
  const totalsInfo = import_chalk6.default.gray(` (${totalRows} rows, ${Helper_default.formatDuration(totalDuration)})`);
21126
- if (results.some((x) => !x.success))
21135
+ const hasFailures = results.some((x) => !x.success);
21136
+ if (hasFailures)
21127
21137
  console.log(import_chalk6.default.blueBright("\n\u2139\uFE0F Run completed with errors") + totalsInfo);
21128
21138
  else
21129
21139
  console.log(import_chalk6.default.green("\n\u2705 Run complete!") + totalsInfo);
21130
- process.exit(1);
21140
+ await Logger_default.flush();
21141
+ process.exit(hasFailures ? 1 : 0);
21131
21142
  } catch (err) {
21132
21143
  const myErr = Helper_default.asError(err);
21133
21144
  console.error(import_chalk6.default.red.bold("\n\u274C Unexpected error during run:"), myErr.message);
21134
21145
  Logger_default.error(myErr);
21146
+ await Logger_default.flush();
21135
21147
  process.exit(1);
21136
21148
  }
21137
21149
  };
@@ -21452,8 +21464,10 @@ var mock = async (producerName, records) => {
21452
21464
 
21453
21465
  // src/index.ts
21454
21466
  import_dotenv.default.configDotenv();
21455
- if (process.env.NODE_ENV !== "development" && process.env.REMORA_DEBUG_MODE === "true")
21467
+ if (process.env.NODE_ENV !== "development" && process.env.REMORA_DEBUG_MODE === "true") {
21456
21468
  Logger_default.enableFileLogging("./remora/logs");
21469
+ console.log(`Enabled file logger.`);
21470
+ }
21457
21471
  if (!process.env.REMORA_WORKERS_PATH)
21458
21472
  process.env.REMORA_WORKERS_PATH = "./workers";
21459
21473
  var program = new import_commander.Command();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forzalabs/remora",
3
- "version": "1.1.9",
3
+ "version": "1.1.10",
4
4
  "description": "A powerful CLI tool for seamless data translation.",
5
5
  "main": "index.js",
6
6
  "private": false,
@@ -13253,6 +13253,13 @@ ${stack}` : base;
13253
13253
  stack: extra
13254
13254
  });
13255
13255
  };
13256
+ this.flush = () => {
13257
+ if (!this._enabled || !this._logger) return Promise.resolve();
13258
+ return new Promise((resolve) => {
13259
+ this._logger.on("finish", resolve);
13260
+ this._logger.end();
13261
+ });
13262
+ };
13256
13263
  }
13257
13264
  };
13258
13265
  var FileLogService = new FileLogServiceClass();
@@ -13303,7 +13310,6 @@ var Logger = class {
13303
13310
  this._fileLoggingFolder = folder;
13304
13311
  this._fileLoggingFile = file;
13305
13312
  FileLogService_default.enable(folder, file);
13306
- console.log(`Enabled file logger.`);
13307
13313
  };
13308
13314
  this.getConfig = () => ({
13309
13315
  level: this._level,
@@ -13326,6 +13332,7 @@ var Logger = class {
13326
13332
  console.info(message);
13327
13333
  FileLogService_default.write("INFO", String(message));
13328
13334
  };
13335
+ this.flush = () => FileLogService_default.flush();
13329
13336
  this.error = (error) => {
13330
13337
  let message;
13331
13338
  let stack;
@@ -13467,7 +13474,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
13467
13474
 
13468
13475
  // ../../packages/constants/src/Constants.ts
13469
13476
  var CONSTANTS = {
13470
- cliVersion: "1.1.9",
13477
+ cliVersion: "1.1.10",
13471
13478
  backendVersion: 1,
13472
13479
  backendPort: 5088,
13473
13480
  workerVersion: 2,
@@ -13836,9 +13843,10 @@ var ValidatorClass = class {
13836
13843
  const validAggregations = ["sum", "count", "avg", "min", "max"];
13837
13844
  if (pivot.aggregation && !validAggregations.includes(pivot.aggregation))
13838
13845
  errors.push(`Invalid pivot aggregation "${pivot.aggregation}" in consumer "${consumer.name}". Valid values: ${validAggregations.join(", ")}`);
13846
+ const hasWildcardField = consumer.fields.some((x) => x.key === "*");
13839
13847
  const allFieldKeys = consumer.fields.map((x) => x.alias ?? x.key);
13840
13848
  const pivotFields = [...pivot.rowKeys ?? [], pivot.pivotColumn, pivot.valueColumn].filter(Boolean);
13841
- const missingFields = pivotFields.filter((f) => !allFieldKeys.includes(f));
13849
+ const missingFields = hasWildcardField ? [] : pivotFields.filter((f) => !allFieldKeys.includes(f));
13842
13850
  if (missingFields.length > 0)
13843
13851
  errors.push(`Pivot references field(s) "${missingFields.join(", ")}" that are not present in the consumer "${consumer.name}".`);
13844
13852
  }
@@ -20618,6 +20626,7 @@ var ExecutorOrchestratorClass = class {
20618
20626
  finalResult.outputCount = postOperation.totalOutputCount;
20619
20627
  UsageManager_default.endUsage(usageId, finalResult.outputCount, finalResult);
20620
20628
  Logger_default.log(`[${usageId}] Consumer "${consumer.name}" completed: ${finalResult.outputCount} rows, ${finalResult.workerCount} worker(s), ${Math.round(finalResult.elapsedMS)}ms`);
20629
+ await Logger_default.flush();
20621
20630
  return finalResult;
20622
20631
  } catch (error) {
20623
20632
  Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
@@ -20626,6 +20635,7 @@ var ExecutorOrchestratorClass = class {
20626
20635
  Logger_default.log(`[${usageId}] Running cleanup after failure`);
20627
20636
  await this.performCleanupOperations(scope, tracker);
20628
20637
  UsageManager_default.failUsage(usageId, Helper_default.asError(error).message);
20638
+ await Logger_default.flush();
20629
20639
  throw error;
20630
20640
  }
20631
20641
  };
@@ -20719,13 +20729,12 @@ var ExecutorOrchestratorClass = class {
20719
20729
  if (executorResults.length > 1) {
20720
20730
  Logger_default.log(`[${scope.id}] Merging ${executorResults.length} worker output files into ${mainPath}`);
20721
20731
  const perf = performance.now();
20722
- const output = import_fs13.default.createWriteStream(mainPath);
20723
- output.setMaxListeners(executorResults.length + 1);
20724
20732
  for (const workerResult of executorResults) {
20725
- await (0, import_promises10.pipeline)(import_fs13.default.createReadStream(workerResult.resultUri), output, { end: false });
20733
+ await (0, import_promises10.pipeline)(
20734
+ import_fs13.default.createReadStream(workerResult.resultUri),
20735
+ import_fs13.default.createWriteStream(mainPath, { flags: "a" })
20736
+ );
20726
20737
  }
20727
- output.end();
20728
- output.close();
20729
20738
  tracker.measure("merge-workers", performance.now() - perf);
20730
20739
  Logger_default.log(`[${scope.id}] Merge complete in ${Math.round(performance.now() - perf)}ms`);
20731
20740
  } else if (executorResults.length === 1) {