@lightdash/common 0.1468.0 → 0.1469.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.
@@ -1392,6 +1392,9 @@ exports.exploreWithMetricNumber = {
1392
1392
  source: sourceMock,
1393
1393
  isAutoGenerated: false,
1394
1394
  hidden: false,
1395
+ spotlight: {
1396
+ visibility: 'hide',
1397
+ },
1395
1398
  },
1396
1399
  m2: {
1397
1400
  fieldType: field_1.FieldType.METRIC,
@@ -303,7 +303,11 @@ const convertTable = (adapterType, model, dbtMetrics, spotlightConfig, startOfWe
303
303
  ]));
304
304
  const convertedDbtMetrics = Object.fromEntries(dbtMetrics.map((metric) => [
305
305
  metric.name,
306
- convertDbtMetricToLightdashMetric(metric, model.name, tableLabel, spotlightConfig, model.meta.spotlight?.categories),
306
+ convertDbtMetricToLightdashMetric(metric, model.name, tableLabel, {
307
+ ...spotlightConfig,
308
+ default_visibility: model.meta.spotlight?.visibility ??
309
+ spotlightConfig.default_visibility,
310
+ }, model.meta.spotlight?.categories),
307
311
  ]));
308
312
  const allMetrics = Object.values({
309
313
  ...convertedDbtMetrics,
@@ -1,6 +1,7 @@
1
1
  import { type DbtMetric, type DbtModelNode, type V9MetricRef } from '../types/dbt';
2
2
  import { type Table } from '../types/explore';
3
3
  import { DimensionType } from '../types/field';
4
+ import type { LightdashProjectConfig } from '../types/lightdashProjectConfig';
4
5
  type WarehouseCatalog = {
5
6
  [database: string]: {
6
7
  [schema: string]: {
@@ -82,4 +83,11 @@ export declare const MODEL_WITH_ADDITIONAL_DIMENSIONS: DbtModelNode & {
82
83
  relation_name: string;
83
84
  };
84
85
  export declare const LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS: Omit<Table, 'lineageGraph'>;
86
+ export declare const SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE: LightdashProjectConfig;
87
+ export declare const MODEL_WITH_NO_CATEGORIES: DbtModelNode;
88
+ export declare const LIGHTDASH_TABLE_WITH_NO_CATEGORIES: Omit<Table, 'lineageGraph'>;
89
+ export declare const MODEL_WITH_MODEL_LEVEL_CATEGORIES: DbtModelNode;
90
+ export declare const LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES: Omit<Table, 'lineageGraph'>;
91
+ export declare const MODEL_WITH_METRIC_LEVEL_CATEGORIES: DbtModelNode;
92
+ export declare const LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES: Omit<Table, 'lineageGraph'>;
85
93
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS = exports.MODEL_WITH_ADDITIONAL_DIMENSIONS = exports.LIGHTDASH_TABLE_SQL_WHERE = exports.expectedModelWithType = exports.warehouseSchemaWithUpperCaseColumn = exports.warehouseSchemaWithMissingColumn = exports.warehouseSchemaWithMissingTable = exports.warehouseSchema = exports.LIGHTDASH_TABLE_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_BOOLEAN_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY = exports.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_METRICS = exports.MODEL_WITH_WRONG_METRICS = exports.MODEL_WITH_WRONG_METRIC = exports.MODEL_WITH_METRIC = exports.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS = exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = exports.LIGHTDASH_TABLE_WITHOUT_AUTO_METRICS = exports.MODEL_WITH_NO_METRICS = exports.MODEL_WITH_SQL_FILTER = exports.MODEL_WITH_SQL_WHERE = exports.LIGHTDASH_TABLE_WITH_GROUP_BLOCK = exports.LIGHTDASH_TABLE_WITH_GROUP_LABEL = exports.MODEL_WITH_GROUPS_BLOCK = exports.MODEL_WITH_GROUP_LABEL = exports.BASE_LIGHTDASH_TABLE = exports.model = exports.DBT_V9_METRIC = exports.DBT_METRIC_DERIVED = exports.DBT_METRIC_WITH_CUSTOM_SQL = exports.DBT_METRIC_WITH_SQL_FIELD = exports.DBT_METRIC_WITH_FILTER = exports.DBT_METRIC = exports.INVALID_ID_COLUMN_NAMES = exports.VALID_ID_COLUMN_NAMES = void 0;
3
+ exports.LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES = exports.MODEL_WITH_METRIC_LEVEL_CATEGORIES = exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES = exports.MODEL_WITH_MODEL_LEVEL_CATEGORIES = exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES = exports.MODEL_WITH_NO_CATEGORIES = exports.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE = exports.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS = exports.MODEL_WITH_ADDITIONAL_DIMENSIONS = exports.LIGHTDASH_TABLE_SQL_WHERE = exports.expectedModelWithType = exports.warehouseSchemaWithUpperCaseColumn = exports.warehouseSchemaWithMissingColumn = exports.warehouseSchemaWithMissingTable = exports.warehouseSchema = exports.LIGHTDASH_TABLE_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_BOOLEAN_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_OFF_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE = exports.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY = exports.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS = exports.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS = exports.LIGHTDASH_TABLE_WITH_METRICS = exports.MODEL_WITH_WRONG_METRICS = exports.MODEL_WITH_WRONG_METRIC = exports.MODEL_WITH_METRIC = exports.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS = exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = exports.LIGHTDASH_TABLE_WITHOUT_AUTO_METRICS = exports.MODEL_WITH_NO_METRICS = exports.MODEL_WITH_SQL_FILTER = exports.MODEL_WITH_SQL_WHERE = exports.LIGHTDASH_TABLE_WITH_GROUP_BLOCK = exports.LIGHTDASH_TABLE_WITH_GROUP_LABEL = exports.MODEL_WITH_GROUPS_BLOCK = exports.MODEL_WITH_GROUP_LABEL = exports.BASE_LIGHTDASH_TABLE = exports.model = exports.DBT_V9_METRIC = exports.DBT_METRIC_DERIVED = exports.DBT_METRIC_WITH_CUSTOM_SQL = exports.DBT_METRIC_WITH_SQL_FIELD = exports.DBT_METRIC_WITH_FILTER = exports.DBT_METRIC = exports.INVALID_ID_COLUMN_NAMES = exports.VALID_ID_COLUMN_NAMES = void 0;
4
4
  const field_1 = require("../types/field");
5
5
  const table_1 = require("../types/table");
6
6
  const timeFrames_1 = require("../types/timeFrames");
@@ -1377,3 +1377,116 @@ exports.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS = {
1377
1377
  },
1378
1378
  },
1379
1379
  };
1380
+ exports.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE = {
1381
+ spotlight: {
1382
+ default_visibility: 'show',
1383
+ categories: {
1384
+ category_1: { label: 'Category 1' },
1385
+ category_2: { label: 'Category 2', color: 'red' },
1386
+ },
1387
+ },
1388
+ };
1389
+ exports.MODEL_WITH_NO_CATEGORIES = {
1390
+ ...exports.MODEL_WITH_METRIC,
1391
+ meta: {
1392
+ spotlight: {
1393
+ visibility: 'hide',
1394
+ },
1395
+ },
1396
+ };
1397
+ exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES = {
1398
+ ...exports.LIGHTDASH_TABLE_WITH_METRICS,
1399
+ metrics: {
1400
+ ...{
1401
+ dbt_metric_1: {
1402
+ ...exports.LIGHTDASH_TABLE_WITH_DBT_METRICS.metrics.dbt_metric_1,
1403
+ spotlight: {
1404
+ ...exports.LIGHTDASH_TABLE_WITH_DBT_METRICS.metrics.dbt_metric_1
1405
+ .spotlight,
1406
+ visibility: 'hide',
1407
+ },
1408
+ },
1409
+ },
1410
+ ...Object.fromEntries(Object.entries(exports.LIGHTDASH_TABLE_WITH_METRICS.metrics).map(([key, metric]) => [
1411
+ key,
1412
+ {
1413
+ ...metric,
1414
+ spotlight: { ...metric.spotlight, visibility: 'hide' },
1415
+ index: (metric.index ?? 0) + 1,
1416
+ },
1417
+ ])),
1418
+ },
1419
+ dimensions: exports.LIGHTDASH_TABLE_WITH_METRICS.dimensions,
1420
+ };
1421
+ exports.MODEL_WITH_MODEL_LEVEL_CATEGORIES = {
1422
+ ...exports.MODEL_WITH_METRIC,
1423
+ meta: {
1424
+ spotlight: {
1425
+ visibility: 'hide',
1426
+ categories: ['category_1'],
1427
+ },
1428
+ },
1429
+ };
1430
+ exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES = {
1431
+ ...exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES,
1432
+ metrics: Object.fromEntries(Object.entries(exports.LIGHTDASH_TABLE_WITH_NO_CATEGORIES.metrics).map(([key, metric]) => [
1433
+ key,
1434
+ {
1435
+ ...metric,
1436
+ spotlight: {
1437
+ visibility: 'hide',
1438
+ categories: ['category_1'],
1439
+ },
1440
+ },
1441
+ ])),
1442
+ };
1443
+ exports.MODEL_WITH_METRIC_LEVEL_CATEGORIES = {
1444
+ ...exports.MODEL_WITH_MODEL_LEVEL_CATEGORIES,
1445
+ columns: {
1446
+ user_id: {
1447
+ name: 'user_id',
1448
+ data_type: field_1.DimensionType.STRING,
1449
+ meta: {
1450
+ metrics: {
1451
+ user_count: {
1452
+ type: field_1.MetricType.COUNT_DISTINCT,
1453
+ spotlight: {
1454
+ visibility: 'hide',
1455
+ categories: ['category_2'],
1456
+ },
1457
+ },
1458
+ },
1459
+ },
1460
+ },
1461
+ num_participating_athletes: {
1462
+ name: 'num_participating_athletes',
1463
+ data_type: field_1.DimensionType.NUMBER,
1464
+ meta: {
1465
+ dimension: {
1466
+ sql: 'num_participating_men + num_participating_women',
1467
+ },
1468
+ metrics: {
1469
+ total_num_participating_athletes: {
1470
+ type: field_1.MetricType.SUM,
1471
+ },
1472
+ },
1473
+ },
1474
+ },
1475
+ },
1476
+ };
1477
+ exports.LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES = {
1478
+ ...exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES,
1479
+ metrics: Object.fromEntries(Object.entries(exports.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES.metrics).map(([key, metric]) => [
1480
+ key,
1481
+ {
1482
+ ...metric,
1483
+ spotlight: {
1484
+ visibility: 'hide',
1485
+ categories: [
1486
+ 'category_1',
1487
+ ...(key === 'user_count' ? ['category_2'] : []),
1488
+ ],
1489
+ },
1490
+ },
1491
+ ])),
1492
+ };
@@ -87,3 +87,17 @@ describe('convert tables from dbt models', () => {
87
87
  expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_GROUPS_BLOCK, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_GROUP_BLOCK);
88
88
  });
89
89
  });
90
+ describe('spotlight config', () => {
91
+ it('should convert dbt model with metrics when no categories are defined', () => {
92
+ expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_CATEGORIES, [translator_mock_1.DBT_METRIC], translator_mock_1.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE.spotlight)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_NO_CATEGORIES);
93
+ });
94
+ it('should convert dbt model with metrics when categories are defined', () => {
95
+ expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_MODEL_LEVEL_CATEGORIES, [translator_mock_1.DBT_METRIC], translator_mock_1.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE.spotlight)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_MODEL_LEVEL_CATEGORIES);
96
+ });
97
+ it('should convert dbt model with metrics when categories are defined and there is metric level assignment', () => {
98
+ expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_METRIC_LEVEL_CATEGORIES, [translator_mock_1.DBT_METRIC], translator_mock_1.SPOTLIGHT_CONFIG_WITH_CATEGORIES_AND_HIDE.spotlight)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_METRIC_LEVEL_CATEGORIES);
99
+ });
100
+ it('should error when categories are assigned but not defined in the spotlight config', () => {
101
+ expect(() => (0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_METRIC_LEVEL_CATEGORIES, [translator_mock_1.DBT_METRIC], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toThrowError(`Invalid spotlight categories found in metric 'user_count': category_1, category_2. Categories must be defined in project config.`);
102
+ });
103
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lightdash/common",
3
- "version": "0.1468.0",
3
+ "version": "0.1469.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [