@objectstack/service-analytics 9.4.0 → 9.5.1

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/index.js CHANGED
@@ -1375,6 +1375,14 @@ function evaluateAnalyticsQueryOverRows(query, cube, rows) {
1375
1375
  }
1376
1376
 
1377
1377
  // src/analytics-service.ts
1378
+ function isMissingSourceError(err) {
1379
+ const msg = String(err?.message ?? err ?? "").toLowerCase();
1380
+ return msg.includes("no such table") || // sqlite / libsql
1381
+ msg.includes("relation") && msg.includes("does not exist") || // postgres
1382
+ msg.includes("doesn't exist") || // mysql ("table ... doesn't exist")
1383
+ msg.includes("not registered") || // framework: object not in registry
1384
+ msg.includes("unknown object") || msg.includes("is not a registered object");
1385
+ }
1378
1386
  var DEFAULT_CAPABILITIES = {
1379
1387
  nativeSql: false,
1380
1388
  objectqlAggregate: false,
@@ -1555,7 +1563,18 @@ var AnalyticsService = class {
1555
1563
  return previewResult;
1556
1564
  }
1557
1565
  }
1558
- const result = await new DatasetExecutor(this).execute(compiled, selection, context);
1566
+ let result;
1567
+ try {
1568
+ result = await new DatasetExecutor(this).execute(compiled, selection, context);
1569
+ } catch (err) {
1570
+ if (isMissingSourceError(err)) {
1571
+ this.logger.warn(
1572
+ `[Analytics] dataset "${dataset.name}" backing object "${dataset.object}" is unavailable (${String(err?.message ?? err)}); returning an empty result instead of failing the widget`
1573
+ );
1574
+ return { rows: [], fields: [], totals: [] };
1575
+ }
1576
+ throw err;
1577
+ }
1559
1578
  if (this.labelResolver && selection.dimensions?.length) {
1560
1579
  const dims = selection.dimensions.map((name) => dataset.dimensions?.find((d) => d.name === name)).filter((d) => !!d?.field).map((d) => ({ name: d.name, field: d.field, type: d.type, dateGranularity: d.dateGranularity }));
1561
1580
  if (dims.length) {