@objectstack/service-analytics 9.4.0 → 9.5.0

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.cjs CHANGED
@@ -1414,6 +1414,14 @@ function evaluateAnalyticsQueryOverRows(query, cube, rows) {
1414
1414
  }
1415
1415
 
1416
1416
  // src/analytics-service.ts
1417
+ function isMissingSourceError(err) {
1418
+ const msg = String(err?.message ?? err ?? "").toLowerCase();
1419
+ return msg.includes("no such table") || // sqlite / libsql
1420
+ msg.includes("relation") && msg.includes("does not exist") || // postgres
1421
+ msg.includes("doesn't exist") || // mysql ("table ... doesn't exist")
1422
+ msg.includes("not registered") || // framework: object not in registry
1423
+ msg.includes("unknown object") || msg.includes("is not a registered object");
1424
+ }
1417
1425
  var DEFAULT_CAPABILITIES = {
1418
1426
  nativeSql: false,
1419
1427
  objectqlAggregate: false,
@@ -1594,7 +1602,18 @@ var AnalyticsService = class {
1594
1602
  return previewResult;
1595
1603
  }
1596
1604
  }
1597
- const result = await new DatasetExecutor(this).execute(compiled, selection, context);
1605
+ let result;
1606
+ try {
1607
+ result = await new DatasetExecutor(this).execute(compiled, selection, context);
1608
+ } catch (err) {
1609
+ if (isMissingSourceError(err)) {
1610
+ this.logger.warn(
1611
+ `[Analytics] dataset "${dataset.name}" backing object "${dataset.object}" is unavailable (${String(err?.message ?? err)}); returning an empty result instead of failing the widget`
1612
+ );
1613
+ return { rows: [], fields: [], totals: [] };
1614
+ }
1615
+ throw err;
1616
+ }
1598
1617
  if (this.labelResolver && selection.dimensions?.length) {
1599
1618
  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 }));
1600
1619
  if (dims.length) {