@forzalabs/remora 1.1.13 → 1.1.15

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
@@ -13500,7 +13500,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
13500
13500
 
13501
13501
  // ../../packages/constants/src/Constants.ts
13502
13502
  var CONSTANTS = {
13503
- cliVersion: "1.1.13",
13503
+ cliVersion: "1.1.15",
13504
13504
  backendVersion: 1,
13505
13505
  backendPort: 5088,
13506
13506
  workerVersion: 2,
@@ -13791,6 +13791,10 @@ var ValidatorClass = class {
13791
13791
  try {
13792
13792
  const recursionErrors = this.detectConsumerRecursion(consumer);
13793
13793
  errors.push(...recursionErrors);
13794
+ for (const [i, field] of consumer.fields.entries()) {
13795
+ if (!field.key)
13796
+ errors.push(`Field at index ${i} in consumer "${consumer.name}" is missing the required "key" property`);
13797
+ }
13794
13798
  const allFieldsWithNoFrom = consumer.fields.filter((x) => x.key === "*" && !x.from);
13795
13799
  if (allFieldsWithNoFrom.length > 0 && consumer.producers.length > 1)
13796
13800
  errors.push(`Field with key "*" was used without specifying the "from" producer and multiple producers were found.`);
@@ -18911,18 +18915,31 @@ var ConsumerExecutorClass = class {
18911
18915
  for (const field of fields) {
18912
18916
  const { cField } = field;
18913
18917
  const fieldKey = cField.alias ?? cField.key;
18914
- const dimension = dimensions.find((x) => x.name === cField.key);
18915
- if (!dimension) {
18916
- if (cField.fixed && Algo_default.hasVal(cField.default))
18917
- record[fieldKey] = cField.default;
18918
- else if (cField.copyFrom)
18919
- record[fieldKey] = record[cField.copyFrom];
18920
- else
18921
- throw new Error(`The requested field "${cField.key}" from the consumer is not present in the underlying producer "${producer.name}" (${dimensions.map((x) => x.name).join(", ")})`);
18918
+ let dimension;
18919
+ try {
18920
+ dimension = dimensions.find((x) => x.name === cField.key);
18921
+ if (!dimension) {
18922
+ if (cField.fixed && Algo_default.hasVal(cField.default))
18923
+ record[fieldKey] = cField.default;
18924
+ else if (cField.copyFrom)
18925
+ record[fieldKey] = record[cField.copyFrom];
18926
+ else
18927
+ throw new Error(`The requested field "${cField.key}" from the consumer is not present in the underlying producer "${producer.name}" (${dimensions.map((x) => x.name).join(", ")})`);
18928
+ }
18929
+ } catch (error) {
18930
+ const err = new Error(`Resolving dimension for field "${fieldKey}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
18931
+ Logger_default.error(err);
18932
+ throw err;
18922
18933
  }
18923
- if (cField.alias && cField.alias !== dimension.name) {
18924
- record[cField.alias] = record[dimension.name];
18925
- delete record[dimension.name];
18934
+ try {
18935
+ if (cField.alias && dimension && cField.alias !== dimension.name) {
18936
+ record[cField.alias] = record[dimension.name];
18937
+ delete record[dimension.name];
18938
+ }
18939
+ } catch (error) {
18940
+ const err = new Error(`Aliasing field "${cField.key}" to "${cField.alias}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
18941
+ Logger_default.error(err);
18942
+ throw err;
18926
18943
  }
18927
18944
  }
18928
18945
  for (const field of fields) {
@@ -18941,28 +18958,51 @@ var ConsumerExecutorClass = class {
18941
18958
  case "skip":
18942
18959
  continue;
18943
18960
  case "fail":
18944
- default:
18945
- throw new Error(errorMessage, { cause: error });
18961
+ default: {
18962
+ const err = new Error(errorMessage, { cause: error });
18963
+ Logger_default.error(err);
18964
+ throw err;
18965
+ }
18946
18966
  }
18947
18967
  } else {
18948
- throw new Error(errorMessage, { cause: error });
18968
+ const err = new Error(errorMessage, { cause: error });
18969
+ Logger_default.error(err);
18970
+ throw err;
18949
18971
  }
18950
18972
  }
18951
18973
  }
18952
- for (const dimension of dimensions) {
18953
- const field = fields.find((x) => x.cField.key === dimension.name);
18954
- if (!field)
18955
- delete record[dimension.name];
18974
+ try {
18975
+ for (const dimension of dimensions) {
18976
+ const field = fields.find((x) => x.cField.key === dimension.name);
18977
+ if (!field)
18978
+ delete record[dimension.name];
18979
+ }
18980
+ } catch (error) {
18981
+ const err = new Error(`Removing unmapped dimensions failed for producer "${producer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
18982
+ Logger_default.error(err);
18983
+ throw err;
18956
18984
  }
18957
- if (consumer.filters && consumer.filters.length > 0) {
18958
- const isKept = consumer.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x.rule));
18959
- if (!isKept)
18960
- return null;
18985
+ try {
18986
+ if (consumer.filters && consumer.filters.length > 0) {
18987
+ const isKept = consumer.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x.rule));
18988
+ if (!isKept)
18989
+ return null;
18990
+ }
18991
+ } catch (error) {
18992
+ const err = new Error(`Consumer filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
18993
+ Logger_default.error(err);
18994
+ throw err;
18961
18995
  }
18962
- if (requestOptions && requestOptions.filters) {
18963
- const isKept = requestOptions.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x));
18964
- if (!isKept)
18965
- return null;
18996
+ try {
18997
+ if (requestOptions && requestOptions.filters) {
18998
+ const isKept = requestOptions.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x));
18999
+ if (!isKept)
19000
+ return null;
19001
+ }
19002
+ } catch (error) {
19003
+ const err = new Error(`Request filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
19004
+ Logger_default.error(err);
19005
+ throw err;
18966
19006
  }
18967
19007
  return record;
18968
19008
  };
@@ -19479,6 +19519,9 @@ var ExecutorOrchestratorClass = class {
19479
19519
  Logger_default.log(`[${usageId}] Spawning worker ${workerId} for producer "${prod.name}" \u2014 chunk ${chunk.start}-${chunk.end} (${Math.round((chunk.end - chunk.start) / 1024)}KB)`);
19480
19520
  workerThreads.push(pool.exec("executor", [workerData], {
19481
19521
  on: (payload) => this.onWorkAdvanced(payload, currentWorkerIndex, _progress)
19522
+ }).catch((error) => {
19523
+ Logger_default.error(error);
19524
+ return null;
19482
19525
  }));
19483
19526
  }
19484
19527
  Logger_default.log(`[${usageId}] Waiting for ${workerThreads.length} worker(s) to complete`);
@@ -19544,7 +19587,7 @@ var ExecutorOrchestratorClass = class {
19544
19587
  return finalResult;
19545
19588
  } catch (error) {
19546
19589
  Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
19547
- Logger_default.error(Helper_default.asError(error));
19590
+ Logger_default.error(error);
19548
19591
  await pool.terminate();
19549
19592
  await ConsumerOnFinishManager_default.onConsumerError(consumer, usageId);
19550
19593
  Logger_default.log(`[${usageId}] Running cleanup after failure`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forzalabs/remora",
3
- "version": "1.1.13",
3
+ "version": "1.1.15",
4
4
  "description": "A powerful CLI tool for seamless data translation.",
5
5
  "main": "index.js",
6
6
  "private": false,
@@ -13494,7 +13494,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
13494
13494
 
13495
13495
  // ../../packages/constants/src/Constants.ts
13496
13496
  var CONSTANTS = {
13497
- cliVersion: "1.1.13",
13497
+ cliVersion: "1.1.15",
13498
13498
  backendVersion: 1,
13499
13499
  backendPort: 5088,
13500
13500
  workerVersion: 2,
@@ -13785,6 +13785,10 @@ var ValidatorClass = class {
13785
13785
  try {
13786
13786
  const recursionErrors = this.detectConsumerRecursion(consumer);
13787
13787
  errors.push(...recursionErrors);
13788
+ for (const [i, field] of consumer.fields.entries()) {
13789
+ if (!field.key)
13790
+ errors.push(`Field at index ${i} in consumer "${consumer.name}" is missing the required "key" property`);
13791
+ }
13788
13792
  const allFieldsWithNoFrom = consumer.fields.filter((x) => x.key === "*" && !x.from);
13789
13793
  if (allFieldsWithNoFrom.length > 0 && consumer.producers.length > 1)
13790
13794
  errors.push(`Field with key "*" was used without specifying the "from" producer and multiple producers were found.`);
@@ -18510,18 +18514,31 @@ var ConsumerExecutorClass = class {
18510
18514
  for (const field of fields) {
18511
18515
  const { cField } = field;
18512
18516
  const fieldKey = cField.alias ?? cField.key;
18513
- const dimension = dimensions.find((x) => x.name === cField.key);
18514
- if (!dimension) {
18515
- if (cField.fixed && Algo_default.hasVal(cField.default))
18516
- record[fieldKey] = cField.default;
18517
- else if (cField.copyFrom)
18518
- record[fieldKey] = record[cField.copyFrom];
18519
- else
18520
- throw new Error(`The requested field "${cField.key}" from the consumer is not present in the underlying producer "${producer.name}" (${dimensions.map((x) => x.name).join(", ")})`);
18517
+ let dimension;
18518
+ try {
18519
+ dimension = dimensions.find((x) => x.name === cField.key);
18520
+ if (!dimension) {
18521
+ if (cField.fixed && Algo_default.hasVal(cField.default))
18522
+ record[fieldKey] = cField.default;
18523
+ else if (cField.copyFrom)
18524
+ record[fieldKey] = record[cField.copyFrom];
18525
+ else
18526
+ throw new Error(`The requested field "${cField.key}" from the consumer is not present in the underlying producer "${producer.name}" (${dimensions.map((x) => x.name).join(", ")})`);
18527
+ }
18528
+ } catch (error) {
18529
+ const err = new Error(`Resolving dimension for field "${fieldKey}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
18530
+ Logger_default.error(err);
18531
+ throw err;
18521
18532
  }
18522
- if (cField.alias && cField.alias !== dimension.name) {
18523
- record[cField.alias] = record[dimension.name];
18524
- delete record[dimension.name];
18533
+ try {
18534
+ if (cField.alias && dimension && cField.alias !== dimension.name) {
18535
+ record[cField.alias] = record[dimension.name];
18536
+ delete record[dimension.name];
18537
+ }
18538
+ } catch (error) {
18539
+ const err = new Error(`Aliasing field "${cField.key}" to "${cField.alias}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
18540
+ Logger_default.error(err);
18541
+ throw err;
18525
18542
  }
18526
18543
  }
18527
18544
  for (const field of fields) {
@@ -18540,28 +18557,51 @@ var ConsumerExecutorClass = class {
18540
18557
  case "skip":
18541
18558
  continue;
18542
18559
  case "fail":
18543
- default:
18544
- throw new Error(errorMessage, { cause: error });
18560
+ default: {
18561
+ const err = new Error(errorMessage, { cause: error });
18562
+ Logger_default.error(err);
18563
+ throw err;
18564
+ }
18545
18565
  }
18546
18566
  } else {
18547
- throw new Error(errorMessage, { cause: error });
18567
+ const err = new Error(errorMessage, { cause: error });
18568
+ Logger_default.error(err);
18569
+ throw err;
18548
18570
  }
18549
18571
  }
18550
18572
  }
18551
- for (const dimension of dimensions) {
18552
- const field = fields.find((x) => x.cField.key === dimension.name);
18553
- if (!field)
18554
- delete record[dimension.name];
18573
+ try {
18574
+ for (const dimension of dimensions) {
18575
+ const field = fields.find((x) => x.cField.key === dimension.name);
18576
+ if (!field)
18577
+ delete record[dimension.name];
18578
+ }
18579
+ } catch (error) {
18580
+ const err = new Error(`Removing unmapped dimensions failed for producer "${producer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
18581
+ Logger_default.error(err);
18582
+ throw err;
18555
18583
  }
18556
- if (consumer.filters && consumer.filters.length > 0) {
18557
- const isKept = consumer.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x.rule));
18558
- if (!isKept)
18559
- return null;
18584
+ try {
18585
+ if (consumer.filters && consumer.filters.length > 0) {
18586
+ const isKept = consumer.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x.rule));
18587
+ if (!isKept)
18588
+ return null;
18589
+ }
18590
+ } catch (error) {
18591
+ const err = new Error(`Consumer filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
18592
+ Logger_default.error(err);
18593
+ throw err;
18560
18594
  }
18561
- if (requestOptions && requestOptions.filters) {
18562
- const isKept = requestOptions.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x));
18563
- if (!isKept)
18564
- return null;
18595
+ try {
18596
+ if (requestOptions && requestOptions.filters) {
18597
+ const isKept = requestOptions.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x));
18598
+ if (!isKept)
18599
+ return null;
18600
+ }
18601
+ } catch (error) {
18602
+ const err = new Error(`Request filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
18603
+ Logger_default.error(err);
18604
+ throw err;
18565
18605
  }
18566
18606
  return record;
18567
18607
  };
@@ -19238,6 +19278,9 @@ var ExecutorOrchestratorClass = class {
19238
19278
  Logger_default.log(`[${usageId}] Spawning worker ${workerId} for producer "${prod.name}" \u2014 chunk ${chunk.start}-${chunk.end} (${Math.round((chunk.end - chunk.start) / 1024)}KB)`);
19239
19279
  workerThreads.push(pool.exec("executor", [workerData], {
19240
19280
  on: (payload) => this.onWorkAdvanced(payload, currentWorkerIndex, _progress)
19281
+ }).catch((error) => {
19282
+ Logger_default.error(error);
19283
+ return null;
19241
19284
  }));
19242
19285
  }
19243
19286
  Logger_default.log(`[${usageId}] Waiting for ${workerThreads.length} worker(s) to complete`);
@@ -19303,7 +19346,7 @@ var ExecutorOrchestratorClass = class {
19303
19346
  return finalResult;
19304
19347
  } catch (error) {
19305
19348
  Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
19306
- Logger_default.error(Helper_default.asError(error));
19349
+ Logger_default.error(error);
19307
19350
  await pool.terminate();
19308
19351
  await ConsumerOnFinishManager_default.onConsumerError(consumer, usageId);
19309
19352
  Logger_default.log(`[${usageId}] Running cleanup after failure`);