@lightdash/common 0.1462.1 → 0.1463.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/compiler/exploreCompiler.d.ts +5 -2
- package/dist/compiler/exploreCompiler.js +9 -1
- package/dist/compiler/exploreCompiler.mock.js +40 -1
- package/dist/compiler/translator.d.ts +3 -2
- package/dist/compiler/translator.js +26 -6
- package/dist/compiler/translator.mock.js +27 -0
- package/dist/compiler/translator.test.js +19 -20
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -1
- package/dist/schemas/json/lightdash-dbt-2.0.json +59 -0
- package/dist/schemas/json/lightdash-project-config-1.0.json +17 -0
- package/dist/types/dbt.d.ts +11 -2
- package/dist/types/dbt.js +11 -2
- package/dist/types/explore.d.ts +4 -0
- package/dist/types/field.d.ts +4 -1
- package/dist/types/lightdashProjectConfig.d.ts +8 -0
- package/dist/types/lightdashProjectConfig.js +6 -0
- package/dist/utils/item.d.ts +3 -0
- package/dist/utils/loadLightdashProjectConfig.d.ts +2 -0
- package/dist/utils/loadLightdashProjectConfig.js +26 -0
- package/dist/utils/virtualView.js +1 -0
- package/package.json +4 -1
@@ -1,8 +1,9 @@
|
|
1
|
-
import { type SupportedDbtAdapter } from '../types/dbt';
|
1
|
+
import { type DbtRawModelNode, type SupportedDbtAdapter } from '../types/dbt';
|
2
2
|
import { type CompiledExploreJoin, type CompiledTable, type Explore, type ExploreJoin, type Table } from '../types/explore';
|
3
3
|
import { type CompiledCustomDimension, type CompiledCustomSqlDimension, type CompiledDimension, type CompiledMetric, type CustomDimension, type CustomSqlDimension, type Dimension, type Metric } from '../types/field';
|
4
4
|
import { type WarehouseClient } from '../types/warehouse';
|
5
5
|
import { type DateGranularity } from '../types/timeFrames';
|
6
|
+
import { type LightdashProjectConfig } from '../types/lightdashProjectConfig';
|
6
7
|
export declare const lightdashVariablePattern: RegExp;
|
7
8
|
type Reference = {
|
8
9
|
refTable: string;
|
@@ -24,11 +25,13 @@ export type UncompiledExplore = {
|
|
24
25
|
ymlPath?: string;
|
25
26
|
sqlPath?: string;
|
26
27
|
joinAliases?: Record<string, Record<string, string>>;
|
28
|
+
spotlightConfig?: LightdashProjectConfig['spotlight'];
|
29
|
+
meta: DbtRawModelNode['meta'];
|
27
30
|
};
|
28
31
|
export declare class ExploreCompiler {
|
29
32
|
private readonly warehouseClient;
|
30
33
|
constructor(warehouseClient: WarehouseClient);
|
31
|
-
compileExplore({ name, label, tags, baseTable, joinedTables, tables, targetDatabase, groupLabel, warehouse, ymlPath, sqlPath, }: UncompiledExplore): Explore;
|
34
|
+
compileExplore({ name, label, tags, baseTable, joinedTables, tables, targetDatabase, groupLabel, warehouse, ymlPath, sqlPath, spotlightConfig, meta, }: UncompiledExplore): Explore;
|
32
35
|
compileTable(table: Table, tables: Record<string, Table>): CompiledTable;
|
33
36
|
compileMetric(metric: Metric, tables: Record<string, Table>): CompiledMetric;
|
34
37
|
compileMetricSql(metric: Metric, tables: Record<string, Table>): {
|
@@ -33,7 +33,7 @@ class ExploreCompiler {
|
|
33
33
|
constructor(warehouseClient) {
|
34
34
|
this.warehouseClient = warehouseClient;
|
35
35
|
}
|
36
|
-
compileExplore({ name, label, tags, baseTable, joinedTables, tables, targetDatabase, groupLabel, warehouse, ymlPath, sqlPath, }) {
|
36
|
+
compileExplore({ name, label, tags, baseTable, joinedTables, tables, targetDatabase, groupLabel, warehouse, ymlPath, sqlPath, spotlightConfig, meta, }) {
|
37
37
|
// Check that base table and joined tables exist
|
38
38
|
if (!tables[baseTable]) {
|
39
39
|
throw new errors_1.CompileError(`Failed to compile explore "${name}". Tried to find base table but cannot find table with name "${baseTable}"`, {});
|
@@ -118,7 +118,15 @@ class ExploreCompiler {
|
|
118
118
|
[tableName]: this.compileTable(includedTables[tableName], includedTables),
|
119
119
|
}), {});
|
120
120
|
const compiledJoins = joinedTables.map((j) => this.compileJoin(j, includedTables));
|
121
|
+
const spotlightVisibility = meta.spotlight?.visibility ?? spotlightConfig?.default_visibility;
|
121
122
|
return {
|
123
|
+
...(spotlightVisibility !== undefined
|
124
|
+
? {
|
125
|
+
spotlight: {
|
126
|
+
visibility: spotlightVisibility,
|
127
|
+
},
|
128
|
+
}
|
129
|
+
: {}),
|
122
130
|
name,
|
123
131
|
label,
|
124
132
|
tags,
|
@@ -5,6 +5,7 @@ exports.expectedCompiledCustomSqlDimensionWithReferences = void 0;
|
|
5
5
|
const dbt_1 = require("../types/dbt");
|
6
6
|
const field_1 = require("../types/field");
|
7
7
|
const filter_1 = require("../types/filter");
|
8
|
+
const lightdashProjectConfig_1 = require("../types/lightdashProjectConfig");
|
8
9
|
const timeFrames_1 = require("../types/timeFrames");
|
9
10
|
exports.warehouseClientMock = {
|
10
11
|
credentials: {},
|
@@ -78,6 +79,9 @@ exports.exploreBase = {
|
|
78
79
|
name: '',
|
79
80
|
label: '',
|
80
81
|
tags: [],
|
82
|
+
spotlight: {
|
83
|
+
visibility: 'show',
|
84
|
+
},
|
81
85
|
baseTable: 'a',
|
82
86
|
joinedTables: [],
|
83
87
|
tables: {},
|
@@ -88,6 +92,8 @@ exports.exploreBase = {
|
|
88
92
|
};
|
89
93
|
exports.exploreOneEmptyTable = {
|
90
94
|
...exports.exploreBase,
|
95
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
96
|
+
meta: {},
|
91
97
|
tables: {
|
92
98
|
a: {
|
93
99
|
name: 'a',
|
@@ -125,9 +131,13 @@ exports.exploreOneEmptyTableCompiled = {
|
|
125
131
|
};
|
126
132
|
exports.exploreMissingBaseTable = {
|
127
133
|
...exports.exploreBase,
|
134
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
135
|
+
meta: {},
|
128
136
|
};
|
129
137
|
exports.exploreMissingJoinTable = {
|
130
138
|
...exports.exploreBase,
|
139
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
140
|
+
meta: {},
|
131
141
|
joinedTables: [
|
132
142
|
{
|
133
143
|
table: 'b',
|
@@ -152,6 +162,8 @@ exports.exploreMissingJoinTable = {
|
|
152
162
|
};
|
153
163
|
exports.exploreCircularDimensionReference = {
|
154
164
|
...exports.exploreBase,
|
165
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
166
|
+
meta: {},
|
155
167
|
tables: {
|
156
168
|
a: {
|
157
169
|
name: 'a',
|
@@ -197,6 +209,8 @@ exports.exploreCircularDimensionShortReference = {
|
|
197
209
|
};
|
198
210
|
exports.exploreCircularMetricReference = {
|
199
211
|
...exports.exploreBase,
|
212
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
213
|
+
meta: {},
|
200
214
|
tables: {
|
201
215
|
a: {
|
202
216
|
name: 'a',
|
@@ -254,6 +268,8 @@ exports.exploreCircularMetricShortReference = {
|
|
254
268
|
};
|
255
269
|
exports.exploreTableSelfReference = {
|
256
270
|
...exports.exploreBase,
|
271
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
272
|
+
meta: {},
|
257
273
|
tables: {
|
258
274
|
a: {
|
259
275
|
name: 'a',
|
@@ -284,6 +300,8 @@ exports.exploreTableSelfReference = {
|
|
284
300
|
};
|
285
301
|
exports.exploreTableSelfReferenceSqlWhere = {
|
286
302
|
...exports.exploreBase,
|
303
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
304
|
+
meta: {},
|
287
305
|
tables: {
|
288
306
|
a: {
|
289
307
|
name: 'a',
|
@@ -380,6 +398,8 @@ exports.exploreTableSelfReferenceCompiledSqlWhere = {
|
|
380
398
|
};
|
381
399
|
exports.exploreReferenceDimension = {
|
382
400
|
...exports.exploreBase,
|
401
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
402
|
+
meta: {},
|
383
403
|
tables: {
|
384
404
|
a: {
|
385
405
|
name: 'a',
|
@@ -467,6 +487,8 @@ exports.exploreReferenceDimensionCompiled = {
|
|
467
487
|
};
|
468
488
|
exports.exploreComplexReference = {
|
469
489
|
...exports.exploreBase,
|
490
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
491
|
+
meta: {},
|
470
492
|
tables: {
|
471
493
|
a: {
|
472
494
|
name: 'a',
|
@@ -606,6 +628,8 @@ exports.exploreComplexReferenceCompiled = {
|
|
606
628
|
};
|
607
629
|
exports.simpleJoinedExplore = {
|
608
630
|
...exports.exploreBase,
|
631
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
632
|
+
meta: {},
|
609
633
|
joinedTables: [
|
610
634
|
{
|
611
635
|
table: 'b',
|
@@ -1332,6 +1356,8 @@ exports.compiledJoinedExploreWithJoinAliasAndSubsetOfFieldsThatDontIncludeSqlFie
|
|
1332
1356
|
};
|
1333
1357
|
exports.exploreWithMetricNumber = {
|
1334
1358
|
...exports.exploreBase,
|
1359
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
1360
|
+
meta: {},
|
1335
1361
|
tables: {
|
1336
1362
|
a: {
|
1337
1363
|
name: 'a',
|
@@ -1386,7 +1412,18 @@ exports.exploreWithMetricNumber = {
|
|
1386
1412
|
},
|
1387
1413
|
};
|
1388
1414
|
exports.exploreWithMetricNumberCompiled = {
|
1389
|
-
|
1415
|
+
name: exports.exploreWithMetricNumber.name,
|
1416
|
+
label: exports.exploreWithMetricNumber.label,
|
1417
|
+
baseTable: exports.exploreWithMetricNumber.baseTable,
|
1418
|
+
tags: exports.exploreWithMetricNumber.tags,
|
1419
|
+
targetDatabase: exports.exploreWithMetricNumber.targetDatabase,
|
1420
|
+
warehouse: exports.exploreWithMetricNumber.warehouse,
|
1421
|
+
ymlPath: exports.exploreWithMetricNumber.ymlPath,
|
1422
|
+
sqlPath: exports.exploreWithMetricNumber.sqlPath,
|
1423
|
+
groupLabel: exports.exploreWithMetricNumber.groupLabel,
|
1424
|
+
spotlight: {
|
1425
|
+
visibility: 'show',
|
1426
|
+
},
|
1390
1427
|
joinedTables: [],
|
1391
1428
|
tables: {
|
1392
1429
|
a: {
|
@@ -1567,6 +1604,8 @@ exports.tablesWithMetricsWithFilters = {
|
|
1567
1604
|
};
|
1568
1605
|
exports.exploreWithRequiredAttributes = {
|
1569
1606
|
...exports.exploreBase,
|
1607
|
+
spotlightConfig: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
1608
|
+
meta: {},
|
1570
1609
|
joinedTables: [
|
1571
1610
|
{
|
1572
1611
|
table: 'b',
|
@@ -1,10 +1,11 @@
|
|
1
1
|
import { SupportedDbtAdapter, type DbtMetric, type DbtModelNode } from '../types/dbt';
|
2
2
|
import { type Explore, type ExploreError, type Table } from '../types/explore';
|
3
3
|
import { DimensionType } from '../types/field';
|
4
|
+
import { type LightdashProjectConfig } from '../types/lightdashProjectConfig';
|
4
5
|
import { type WarehouseClient } from '../types/warehouse';
|
5
6
|
import { type WeekDay } from '../utils/timeFrames';
|
6
|
-
export declare const convertTable: (adapterType: SupportedDbtAdapter, model: DbtModelNode, dbtMetrics: DbtMetric[], startOfWeek?: WeekDay | null) => Omit<Table, 'lineageGraph'>;
|
7
|
-
export declare const convertExplores: (models: DbtModelNode[], loadSources: boolean, adapterType: SupportedDbtAdapter, metrics: DbtMetric[], warehouseClient: WarehouseClient) => Promise<(Explore | ExploreError)[]>;
|
7
|
+
export declare const convertTable: (adapterType: SupportedDbtAdapter, model: DbtModelNode, dbtMetrics: DbtMetric[], spotlightConfig: LightdashProjectConfig['spotlight'], startOfWeek?: WeekDay | null) => Omit<Table, 'lineageGraph'>;
|
8
|
+
export declare const convertExplores: (models: DbtModelNode[], loadSources: boolean, adapterType: SupportedDbtAdapter, metrics: DbtMetric[], warehouseClient: WarehouseClient, lightdashProjectConfig: LightdashProjectConfig) => Promise<(Explore | ExploreError)[]>;
|
8
9
|
export declare const attachTypesToModels: (models: DbtModelNode[], warehouseCatalog: {
|
9
10
|
[database: string]: {
|
10
11
|
[schema: string]: {
|
@@ -118,7 +118,7 @@ const generateTableLineage = (model, depGraph) => {
|
|
118
118
|
.map((d) => depGraph.getNodeData(d)),
|
119
119
|
}), {});
|
120
120
|
};
|
121
|
-
const convertDbtMetricToLightdashMetric = (metric, tableName, tableLabel) => {
|
121
|
+
const convertDbtMetricToLightdashMetric = (metric, tableName, tableLabel, spotlightConfig) => {
|
122
122
|
let sql;
|
123
123
|
let type;
|
124
124
|
if (metric.calculation_method === 'derived') {
|
@@ -161,6 +161,7 @@ const convertDbtMetricToLightdashMetric = (metric, tableName, tableLabel) => {
|
|
161
161
|
sql = `CASE WHEN ${filterSql} THEN ${sql} ELSE NULL END`;
|
162
162
|
}
|
163
163
|
const groups = (0, dbt_1.convertToGroups)(metric.meta?.groups, metric.meta?.group_label);
|
164
|
+
const spotlightVisibility = spotlightConfig?.default_visibility;
|
164
165
|
return {
|
165
166
|
fieldType: field_1.FieldType.METRIC,
|
166
167
|
type,
|
@@ -188,9 +189,16 @@ const convertDbtMetricToLightdashMetric = (metric, tableName, tableLabel) => {
|
|
188
189
|
: [metric.meta.tags],
|
189
190
|
}
|
190
191
|
: {}),
|
192
|
+
...(spotlightVisibility !== undefined
|
193
|
+
? {
|
194
|
+
spotlight: {
|
195
|
+
visibility: spotlightVisibility,
|
196
|
+
},
|
197
|
+
}
|
198
|
+
: {}),
|
191
199
|
};
|
192
200
|
};
|
193
|
-
const convertTable = (adapterType, model, dbtMetrics, startOfWeek) => {
|
201
|
+
const convertTable = (adapterType, model, dbtMetrics, spotlightConfig, startOfWeek) => {
|
194
202
|
const meta = model.config?.meta || model.meta; // Config block takes priority, then meta block
|
195
203
|
const tableLabel = meta.label || (0, field_1.friendlyName)(model.name);
|
196
204
|
const [dimensions, metrics] = Object.values(model.columns).reduce(([prevDimensions, prevMetrics], column, index) => {
|
@@ -264,7 +272,12 @@ const convertTable = (adapterType, model, dbtMetrics, startOfWeek) => {
|
|
264
272
|
name,
|
265
273
|
metric,
|
266
274
|
tableLabel,
|
267
|
-
requiredAttributes: dimension.requiredAttributes,
|
275
|
+
requiredAttributes: dimension.requiredAttributes,
|
276
|
+
spotlightConfig: {
|
277
|
+
...spotlightConfig,
|
278
|
+
default_visibility: model.meta.spotlight?.visibility ??
|
279
|
+
spotlightConfig.default_visibility,
|
280
|
+
},
|
268
281
|
}),
|
269
282
|
]));
|
270
283
|
return [
|
@@ -283,11 +296,16 @@ const convertTable = (adapterType, model, dbtMetrics, startOfWeek) => {
|
|
283
296
|
name,
|
284
297
|
metric,
|
285
298
|
tableLabel,
|
299
|
+
spotlightConfig: {
|
300
|
+
...spotlightConfig,
|
301
|
+
default_visibility: model.meta.spotlight?.visibility ??
|
302
|
+
spotlightConfig?.default_visibility,
|
303
|
+
},
|
286
304
|
}),
|
287
305
|
]));
|
288
306
|
const convertedDbtMetrics = Object.fromEntries(dbtMetrics.map((metric) => [
|
289
307
|
metric.name,
|
290
|
-
convertDbtMetricToLightdashMetric(metric, model.name, tableLabel),
|
308
|
+
convertDbtMetricToLightdashMetric(metric, model.name, tableLabel, spotlightConfig),
|
291
309
|
]));
|
292
310
|
const allMetrics = Object.values({
|
293
311
|
...convertedDbtMetrics,
|
@@ -374,7 +392,7 @@ const modelCanUseMetric = (metricName, modelName, metrics) => {
|
|
374
392
|
}
|
375
393
|
return false;
|
376
394
|
};
|
377
|
-
const convertExplores = async (models, loadSources, adapterType, metrics, warehouseClient) => {
|
395
|
+
const convertExplores = async (models, loadSources, adapterType, metrics, warehouseClient, lightdashProjectConfig) => {
|
378
396
|
const tableLineage = translateDbtModelsToTableLineage(models);
|
379
397
|
const [tables, exploreErrors] = models.reduce(([accTables, accErrors], model) => {
|
380
398
|
const meta = model.config?.meta || model.meta; // Config block takes priority, then meta block
|
@@ -382,7 +400,7 @@ const convertExplores = async (models, loadSources, adapterType, metrics, wareho
|
|
382
400
|
try {
|
383
401
|
// base dimensions and metrics
|
384
402
|
const tableMetrics = metrics.filter((metric) => modelCanUseMetric(metric.name, model.name, metrics));
|
385
|
-
const table = (0, exports.convertTable)(adapterType, model, tableMetrics, warehouseClient.getStartOfWeek());
|
403
|
+
const table = (0, exports.convertTable)(adapterType, model, tableMetrics, lightdashProjectConfig.spotlight, warehouseClient.getStartOfWeek());
|
386
404
|
// add sources
|
387
405
|
if (loadSources && model.patch_path !== null) {
|
388
406
|
throw new Error('Not Implemented');
|
@@ -441,6 +459,8 @@ const convertExplores = async (models, loadSources, adapterType, metrics, wareho
|
|
441
459
|
warehouse: model.config?.snowflake_warehouse,
|
442
460
|
ymlPath: model.patch_path?.split('://')?.[1],
|
443
461
|
sqlPath: model.path,
|
462
|
+
spotlightConfig: lightdashProjectConfig.spotlight,
|
463
|
+
meta,
|
444
464
|
});
|
445
465
|
}
|
446
466
|
catch (e) {
|
@@ -317,6 +317,9 @@ exports.LIGHTDASH_TABLE_WITH_GROUP_BLOCK = {
|
|
317
317
|
table: 'myTable',
|
318
318
|
tableLabel: 'My table',
|
319
319
|
type: field_1.MetricType.COUNT_DISTINCT,
|
320
|
+
spotlight: {
|
321
|
+
visibility: 'show',
|
322
|
+
},
|
320
323
|
},
|
321
324
|
},
|
322
325
|
groupDetails: {
|
@@ -394,6 +397,9 @@ exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = {
|
|
394
397
|
groups: [],
|
395
398
|
filters: [],
|
396
399
|
index: 0,
|
400
|
+
spotlight: {
|
401
|
+
visibility: 'show',
|
402
|
+
},
|
397
403
|
},
|
398
404
|
dbt_metric_2: {
|
399
405
|
description: 'Description',
|
@@ -415,6 +421,9 @@ exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = {
|
|
415
421
|
groups: [],
|
416
422
|
filters: [],
|
417
423
|
index: 1,
|
424
|
+
spotlight: {
|
425
|
+
visibility: 'show',
|
426
|
+
},
|
418
427
|
},
|
419
428
|
dbt_metric_3: {
|
420
429
|
description: 'Description',
|
@@ -436,6 +445,9 @@ exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = {
|
|
436
445
|
groups: [],
|
437
446
|
filters: [],
|
438
447
|
index: 2,
|
448
|
+
spotlight: {
|
449
|
+
visibility: 'show',
|
450
|
+
},
|
439
451
|
},
|
440
452
|
dbt_metric_4: {
|
441
453
|
description: 'Description',
|
@@ -457,6 +469,9 @@ exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = {
|
|
457
469
|
groups: [],
|
458
470
|
filters: [],
|
459
471
|
index: 3,
|
472
|
+
spotlight: {
|
473
|
+
visibility: 'show',
|
474
|
+
},
|
460
475
|
},
|
461
476
|
dbt_metric_5: {
|
462
477
|
description: 'Description',
|
@@ -478,6 +493,9 @@ exports.LIGHTDASH_TABLE_WITH_DBT_METRICS = {
|
|
478
493
|
groups: [],
|
479
494
|
filters: [],
|
480
495
|
index: 4,
|
496
|
+
spotlight: {
|
497
|
+
visibility: 'show',
|
498
|
+
},
|
481
499
|
},
|
482
500
|
},
|
483
501
|
};
|
@@ -504,6 +522,9 @@ exports.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS = {
|
|
504
522
|
groups: [],
|
505
523
|
filters: [],
|
506
524
|
index: 0,
|
525
|
+
spotlight: {
|
526
|
+
visibility: 'show',
|
527
|
+
},
|
507
528
|
},
|
508
529
|
},
|
509
530
|
};
|
@@ -626,6 +647,9 @@ exports.LIGHTDASH_TABLE_WITH_METRICS = {
|
|
626
647
|
index: 0,
|
627
648
|
dimensionReference: 'myTable_user_id',
|
628
649
|
requiredAttributes: undefined,
|
650
|
+
spotlight: {
|
651
|
+
visibility: 'show',
|
652
|
+
},
|
629
653
|
},
|
630
654
|
total_num_participating_athletes: {
|
631
655
|
fieldType: field_1.FieldType.METRIC,
|
@@ -649,6 +673,9 @@ exports.LIGHTDASH_TABLE_WITH_METRICS = {
|
|
649
673
|
index: 1,
|
650
674
|
dimensionReference: 'myTable_num_participating_athletes',
|
651
675
|
requiredAttributes: undefined,
|
676
|
+
spotlight: {
|
677
|
+
visibility: 'show',
|
678
|
+
},
|
652
679
|
},
|
653
680
|
},
|
654
681
|
};
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const dbt_1 = require("../types/dbt");
|
4
|
+
const lightdashProjectConfig_1 = require("../types/lightdashProjectConfig");
|
4
5
|
const translator_1 = require("./translator");
|
5
6
|
const translator_mock_1 = require("./translator.mock");
|
6
7
|
describe('attachTypesToModels', () => {
|
@@ -26,7 +27,7 @@ describe('attachTypesToModels', () => {
|
|
26
27
|
});
|
27
28
|
describe('convert tables from dbt models', () => {
|
28
29
|
it('should convert dbt model without metrics to Lightdash table without autogenerated metrics', () => {
|
29
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_METRICS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITHOUT_AUTO_METRICS);
|
30
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_METRICS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITHOUT_AUTO_METRICS);
|
30
31
|
});
|
31
32
|
it('should convert dbt model with dbt metrics', () => {
|
32
33
|
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_METRICS, [
|
@@ -35,56 +36,54 @@ describe('convert tables from dbt models', () => {
|
|
35
36
|
translator_mock_1.DBT_METRIC_WITH_CUSTOM_SQL,
|
36
37
|
translator_mock_1.DBT_METRIC_WITH_FILTER,
|
37
38
|
translator_mock_1.DBT_METRIC_DERIVED,
|
38
|
-
])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DBT_METRICS);
|
39
|
+
], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DBT_METRICS);
|
39
40
|
// dbt 1.5 metrics
|
40
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_METRICS, [
|
41
|
-
translator_mock_1.DBT_V9_METRIC,
|
42
|
-
])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS);
|
41
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_METRICS, [translator_mock_1.DBT_V9_METRIC], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DBT_V9_METRICS);
|
43
42
|
});
|
44
43
|
it('should convert dbt model with metrics in meta', () => {
|
45
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_METRIC, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_METRICS);
|
44
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_METRIC, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_METRICS);
|
46
45
|
});
|
47
46
|
it('should convert dbt model with dimension with default time intervals bigquery', () => {
|
48
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY);
|
47
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY);
|
49
48
|
});
|
50
49
|
it('should convert dbt model with dimension with no time intervals bigquery', () => {
|
51
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY);
|
50
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_BIGQUERY);
|
52
51
|
});
|
53
52
|
it('should convert dbt model with dimension with default time intervals snowflake', () => {
|
54
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.SNOWFLAKE, translator_mock_1.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE);
|
53
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.SNOWFLAKE, translator_mock_1.MODEL_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE);
|
55
54
|
});
|
56
55
|
it('should convert dbt model with dimension with no time intervals snowflake', () => {
|
57
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.SNOWFLAKE, translator_mock_1.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE);
|
56
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.SNOWFLAKE, translator_mock_1.MODEL_WITH_NO_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_DEFAULT_TIME_INTERVAL_DIMENSIONS_SNOWFLAKE);
|
58
57
|
});
|
59
58
|
it('should convert dbt model with dimension with off time intervals', () => {
|
60
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_OFF_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS);
|
59
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_OFF_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS);
|
61
60
|
});
|
62
61
|
it('should convert dbt model with dimension with off boolean time intervals', () => {
|
63
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_OFF_BOOLEAN_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS);
|
62
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_OFF_BOOLEAN_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_OFF_TIME_INTERVAL_DIMENSIONS);
|
64
63
|
});
|
65
64
|
it('should convert dbt model with dimension with custom time intervals', () => {
|
66
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS);
|
65
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_CUSTOM_TIME_INTERVAL_DIMENSIONS);
|
67
66
|
});
|
68
67
|
it('should throw an error when metric and dimension have the same name', async () => {
|
69
|
-
expect(() => (0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_WRONG_METRIC, [])).toThrowError('Found a metric and a dimension with the same name: user_id');
|
68
|
+
expect(() => (0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_WRONG_METRIC, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toThrowError('Found a metric and a dimension with the same name: user_id');
|
70
69
|
});
|
71
70
|
it('should throw an error when multiple metrics and dimensions have the same name', async () => {
|
72
|
-
expect(() => (0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_WRONG_METRICS, [])).toThrowError('Found multiple metrics and a dimensions with the same name: user_id,user_id2');
|
71
|
+
expect(() => (0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_WRONG_METRICS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toThrowError('Found multiple metrics and a dimensions with the same name: user_id,user_id2');
|
73
72
|
});
|
74
73
|
it('should convert dbt model with group label', async () => {
|
75
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_GROUP_LABEL, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_GROUP_LABEL);
|
74
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_GROUP_LABEL, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_GROUP_LABEL);
|
76
75
|
});
|
77
76
|
// `sql_where` is an alias of `sql_filter`
|
78
77
|
it('should convert dbt model with sql where', async () => {
|
79
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_SQL_WHERE, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_SQL_WHERE);
|
78
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_SQL_WHERE, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_SQL_WHERE);
|
80
79
|
});
|
81
80
|
it('should convert dbt model with sql filter', async () => {
|
82
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_SQL_FILTER, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_SQL_WHERE);
|
81
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_SQL_FILTER, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_SQL_WHERE);
|
83
82
|
});
|
84
83
|
it('should convert dbt model with dimension and additional dimensions', () => {
|
85
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.POSTGRES, translator_mock_1.MODEL_WITH_ADDITIONAL_DIMENSIONS, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS);
|
84
|
+
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.POSTGRES, translator_mock_1.MODEL_WITH_ADDITIONAL_DIMENSIONS, [], lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG)).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_ADDITIONAL_DIMENSIONS);
|
86
85
|
});
|
87
86
|
it('should convert dbt model with groups meta block', async () => {
|
88
|
-
expect((0, translator_1.convertTable)(dbt_1.SupportedDbtAdapter.BIGQUERY, translator_mock_1.MODEL_WITH_GROUPS_BLOCK, [])).toStrictEqual(translator_mock_1.LIGHTDASH_TABLE_WITH_GROUP_BLOCK);
|
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);
|
89
88
|
});
|
90
89
|
});
|
package/dist/index.d.ts
CHANGED
@@ -54,6 +54,7 @@ export * from './compiler/translator';
|
|
54
54
|
export * from './dbt/validation';
|
55
55
|
export * from './pivotTable/pivotQueryResults';
|
56
56
|
export { default as lightdashDbtYamlSchema } from './schemas/json/lightdash-dbt-2.0.json';
|
57
|
+
export { default as lightdashProjectConfigSchema } from './schemas/json/lightdash-project-config-1.0.json';
|
57
58
|
export * from './templating/template';
|
58
59
|
export * from './types/analytics';
|
59
60
|
export * from './types/api';
|
@@ -88,6 +89,7 @@ export * from './types/gitIntegration';
|
|
88
89
|
export * from './types/groups';
|
89
90
|
export * from './types/job';
|
90
91
|
export * from './types/knex-paginate';
|
92
|
+
export * from './types/lightdashProjectConfig';
|
91
93
|
export * from './types/metricQuery';
|
92
94
|
export * from './types/metricsExplorer';
|
93
95
|
export * from './types/notifications';
|
@@ -152,6 +154,7 @@ export * from './visualizations/TableDataModel';
|
|
152
154
|
export * from './visualizations/types';
|
153
155
|
export * from './visualizations/types/IResultsRunner';
|
154
156
|
export * from './types/spotlightTableConfig';
|
157
|
+
export * from './utils/loadLightdashProjectConfig';
|
155
158
|
export declare const validateEmail: (email: string) => boolean;
|
156
159
|
export declare const getEmailSchema: () => z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
157
160
|
export declare const getPasswordSchema: () => z.ZodString;
|
package/dist/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.getProjectDirectory = exports.deepEqual = exports.removeEmptyProperties = exports.formatRows = exports.itemsInMetricQuery = exports.getTableCalculationsFromItemsMap = exports.getMetricsFromItemsMap = exports.getFilterableDimensionsFromItemsMap = exports.getDimensionsFromItemsMap = exports.getItemMap = exports.getFieldMap = exports.getAxisName = exports.getDateGroupLabel = exports.getResultValueArray = exports.DbtProjectTypeLabels = exports.sensitiveDbtCredentialsFieldNames = exports.DBFieldTypes = exports.LightdashInstallType = exports.isLightdashMode = exports.LightdashMode = exports.isApiError = exports.hasInviteCode = exports.TableSelectionType = exports.hasSpecialCharacters = exports.snakeCaseName = exports.findFieldByIdInExplore = exports.getVisibleFields = exports.SEED_GROUP = exports.SEED_SPACE = exports.SEED_PROJECT = exports.SEED_ORG_2_ADMIN_PASSWORD = exports.SEED_ORG_2_ADMIN_EMAIL = exports.SEED_ORG_2_ADMIN = exports.SEED_ORG_2 = exports.SEED_ORG_1_ADMIN_PASSWORD = exports.SEED_ORG_1_ADMIN_EMAIL = exports.SEED_ORG_1_ADMIN = exports.SEED_ORG_1 = exports.hexToRGB = exports.replaceStringInArray = exports.toggleArrayValue = exports.hasIntersection = exports.validatePassword = exports.getPasswordSchema = exports.getEmailSchema = exports.validateEmail = exports.assertUnreachable = exports.lightdashDbtYamlSchema = void 0;
|
3
|
+
exports.getProjectDirectory = exports.deepEqual = exports.removeEmptyProperties = exports.formatRows = exports.itemsInMetricQuery = exports.getTableCalculationsFromItemsMap = exports.getMetricsFromItemsMap = exports.getFilterableDimensionsFromItemsMap = exports.getDimensionsFromItemsMap = exports.getItemMap = exports.getFieldMap = exports.getAxisName = exports.getDateGroupLabel = exports.getResultValueArray = exports.DbtProjectTypeLabels = exports.sensitiveDbtCredentialsFieldNames = exports.DBFieldTypes = exports.LightdashInstallType = exports.isLightdashMode = exports.LightdashMode = exports.isApiError = exports.hasInviteCode = exports.TableSelectionType = exports.hasSpecialCharacters = exports.snakeCaseName = exports.findFieldByIdInExplore = exports.getVisibleFields = exports.SEED_GROUP = exports.SEED_SPACE = exports.SEED_PROJECT = exports.SEED_ORG_2_ADMIN_PASSWORD = exports.SEED_ORG_2_ADMIN_EMAIL = exports.SEED_ORG_2_ADMIN = exports.SEED_ORG_2 = exports.SEED_ORG_1_ADMIN_PASSWORD = exports.SEED_ORG_1_ADMIN_EMAIL = exports.SEED_ORG_1_ADMIN = exports.SEED_ORG_1 = exports.hexToRGB = exports.replaceStringInArray = exports.toggleArrayValue = exports.hasIntersection = exports.validatePassword = exports.getPasswordSchema = exports.getEmailSchema = exports.validateEmail = exports.assertUnreachable = exports.lightdashProjectConfigSchema = exports.lightdashDbtYamlSchema = void 0;
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
|
6
6
|
const utc_1 = tslib_1.__importDefault(require("dayjs/plugin/utc"));
|
@@ -22,6 +22,8 @@ tslib_1.__exportStar(require("./dbt/validation"), exports);
|
|
22
22
|
tslib_1.__exportStar(require("./pivotTable/pivotQueryResults"), exports);
|
23
23
|
var lightdash_dbt_2_0_json_1 = require("./schemas/json/lightdash-dbt-2.0.json");
|
24
24
|
Object.defineProperty(exports, "lightdashDbtYamlSchema", { enumerable: true, get: function () { return tslib_1.__importDefault(lightdash_dbt_2_0_json_1).default; } });
|
25
|
+
var lightdash_project_config_1_0_json_1 = require("./schemas/json/lightdash-project-config-1.0.json");
|
26
|
+
Object.defineProperty(exports, "lightdashProjectConfigSchema", { enumerable: true, get: function () { return tslib_1.__importDefault(lightdash_project_config_1_0_json_1).default; } });
|
25
27
|
tslib_1.__exportStar(require("./templating/template"), exports);
|
26
28
|
tslib_1.__exportStar(require("./types/analytics"), exports);
|
27
29
|
tslib_1.__exportStar(require("./types/api"), exports);
|
@@ -56,6 +58,7 @@ tslib_1.__exportStar(require("./types/gitIntegration"), exports);
|
|
56
58
|
tslib_1.__exportStar(require("./types/groups"), exports);
|
57
59
|
tslib_1.__exportStar(require("./types/job"), exports);
|
58
60
|
tslib_1.__exportStar(require("./types/knex-paginate"), exports);
|
61
|
+
tslib_1.__exportStar(require("./types/lightdashProjectConfig"), exports);
|
59
62
|
tslib_1.__exportStar(require("./types/metricQuery"), exports);
|
60
63
|
tslib_1.__exportStar(require("./types/metricsExplorer"), exports);
|
61
64
|
tslib_1.__exportStar(require("./types/notifications"), exports);
|
@@ -121,6 +124,7 @@ tslib_1.__exportStar(require("./visualizations/TableDataModel"), exports);
|
|
121
124
|
tslib_1.__exportStar(require("./visualizations/types"), exports);
|
122
125
|
tslib_1.__exportStar(require("./visualizations/types/IResultsRunner"), exports);
|
123
126
|
tslib_1.__exportStar(require("./types/spotlightTableConfig"), exports);
|
127
|
+
tslib_1.__exportStar(require("./utils/loadLightdashProjectConfig"), exports);
|
124
128
|
const validateEmail = (email) => {
|
125
129
|
if (/\s/.test(email)) {
|
126
130
|
return false;
|
@@ -186,6 +186,23 @@
|
|
186
186
|
"field",
|
187
187
|
"interval"
|
188
188
|
]
|
189
|
+
},
|
190
|
+
"spotlight": {
|
191
|
+
"type": "object",
|
192
|
+
"description": "Set the visibility of a metric in Spotlight",
|
193
|
+
"properties": {
|
194
|
+
"visibility": {
|
195
|
+
"type": "string",
|
196
|
+
"enum": ["show", "hide"]
|
197
|
+
}
|
198
|
+
},
|
199
|
+
"anyOf": [
|
200
|
+
{
|
201
|
+
"required": [
|
202
|
+
"visibility"
|
203
|
+
]
|
204
|
+
}
|
205
|
+
]
|
189
206
|
}
|
190
207
|
},
|
191
208
|
"required": ["type", "sql"]
|
@@ -212,6 +229,17 @@
|
|
212
229
|
}
|
213
230
|
},
|
214
231
|
"required": ["field", "interval"]
|
232
|
+
},
|
233
|
+
"spotlight": {
|
234
|
+
"type": "object",
|
235
|
+
"description": "Set the visibility of all metrics in this model in Spotlight",
|
236
|
+
"properties": {
|
237
|
+
"visibility": {
|
238
|
+
"type": "string",
|
239
|
+
"enum": ["show", "hide"]
|
240
|
+
}
|
241
|
+
},
|
242
|
+
"anyOf": [{ "required": ["visibility"] }]
|
215
243
|
}
|
216
244
|
}
|
217
245
|
},
|
@@ -354,6 +382,26 @@
|
|
354
382
|
"field",
|
355
383
|
"interval"
|
356
384
|
]
|
385
|
+
},
|
386
|
+
"spotlight": {
|
387
|
+
"type": "object",
|
388
|
+
"description": "Set the visibility of a metric in Spotlight",
|
389
|
+
"properties": {
|
390
|
+
"visibility": {
|
391
|
+
"type": "string",
|
392
|
+
"enum": [
|
393
|
+
"show",
|
394
|
+
"hide"
|
395
|
+
]
|
396
|
+
}
|
397
|
+
},
|
398
|
+
"anyOf": [
|
399
|
+
{
|
400
|
+
"required": [
|
401
|
+
"visibility"
|
402
|
+
]
|
403
|
+
}
|
404
|
+
]
|
357
405
|
}
|
358
406
|
},
|
359
407
|
"required": ["type"]
|
@@ -626,6 +674,17 @@
|
|
626
674
|
}
|
627
675
|
},
|
628
676
|
"required": ["field", "interval"]
|
677
|
+
},
|
678
|
+
"spotlight": {
|
679
|
+
"type": "object",
|
680
|
+
"description": "Set the visibility of a metric in Spotlight",
|
681
|
+
"properties": {
|
682
|
+
"visibility": {
|
683
|
+
"type": "string",
|
684
|
+
"enum": ["show", "hide"]
|
685
|
+
}
|
686
|
+
},
|
687
|
+
"anyOf": [{ "required": ["visibility"] }]
|
629
688
|
}
|
630
689
|
}
|
631
690
|
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
3
|
+
"$id": "https://schemas.lightdash.com/lightdash/config.json",
|
4
|
+
"type": ["object", "null"],
|
5
|
+
"properties": {
|
6
|
+
"spotlight": {
|
7
|
+
"type": ["object", "null"],
|
8
|
+
"properties": {
|
9
|
+
"default_visibility": {
|
10
|
+
"type": "string",
|
11
|
+
"enum": ["show", "hide"],
|
12
|
+
"default": "show"
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
package/dist/types/dbt.d.ts
CHANGED
@@ -3,6 +3,7 @@ import { type ColumnInfo, type CompiledModelNode, type ParsedMetric } from './db
|
|
3
3
|
import { type CompactOrAlias, type DimensionType, type FieldUrl, type Format, type Metric, type MetricType, type Source } from './field';
|
4
4
|
import { type OrderFieldsByStrategy } from './table';
|
5
5
|
import { type DefaultTimeDimension, type TimeFrames } from './timeFrames';
|
6
|
+
import { type LightdashProjectConfig } from './lightdashProjectConfig';
|
6
7
|
export declare enum SupportedDbtAdapter {
|
7
8
|
BIGQUERY = "bigquery",
|
8
9
|
DATABRICKS = "databricks",
|
@@ -64,6 +65,9 @@ type DbtModelLightdashConfig = {
|
|
64
65
|
field: string;
|
65
66
|
interval: TimeFrames;
|
66
67
|
};
|
68
|
+
spotlight?: {
|
69
|
+
visibility?: NonNullable<LightdashProjectConfig['spotlight']>['default_visibility'];
|
70
|
+
};
|
67
71
|
};
|
68
72
|
export type DbtModelGroup = {
|
69
73
|
label: string;
|
@@ -126,6 +130,9 @@ export type DbtColumnLightdashMetric = {
|
|
126
130
|
}[];
|
127
131
|
percentile?: number;
|
128
132
|
default_time_dimension?: DefaultTimeDimension;
|
133
|
+
spotlight?: {
|
134
|
+
visibility?: NonNullable<LightdashProjectConfig['spotlight']>['default_visibility'];
|
135
|
+
};
|
129
136
|
} & DbtLightdashFieldTags;
|
130
137
|
export type DbtModelLightdashMetric = DbtColumnLightdashMetric & Required<Pick<DbtColumnLightdashMetric, 'sql'>>;
|
131
138
|
export declare const normaliseModelDatabase: (model: DbtRawModelNode, targetWarehouse: SupportedDbtAdapter) => DbtModelNode;
|
@@ -239,15 +246,17 @@ type ConvertModelMetricArgs = {
|
|
239
246
|
tableLabel: string;
|
240
247
|
dimensionReference?: string;
|
241
248
|
requiredAttributes?: Record<string, string | string[]>;
|
249
|
+
spotlightConfig?: LightdashProjectConfig['spotlight'];
|
242
250
|
};
|
243
|
-
export declare const convertModelMetric: ({ modelName, name, metric, source, tableLabel, dimensionReference, requiredAttributes, }: ConvertModelMetricArgs) => Metric;
|
251
|
+
export declare const convertModelMetric: ({ modelName, name, metric, source, tableLabel, dimensionReference, requiredAttributes, spotlightConfig, }: ConvertModelMetricArgs) => Metric;
|
244
252
|
type ConvertColumnMetricArgs = Omit<ConvertModelMetricArgs, 'metric'> & {
|
245
253
|
metric: DbtColumnLightdashMetric;
|
246
254
|
dimensionName?: string;
|
247
255
|
dimensionSql: string;
|
248
256
|
requiredAttributes?: Record<string, string | string[]>;
|
257
|
+
modelCategories?: string[];
|
249
258
|
};
|
250
|
-
export declare const convertColumnMetric: ({ modelName, dimensionName, dimensionSql, name, metric, source, tableLabel, requiredAttributes, }: ConvertColumnMetricArgs) => Metric;
|
259
|
+
export declare const convertColumnMetric: ({ modelName, dimensionName, dimensionSql, name, metric, source, tableLabel, requiredAttributes, spotlightConfig, }: ConvertColumnMetricArgs) => Metric;
|
251
260
|
export declare enum DbtManifestVersion {
|
252
261
|
V7 = "v7",
|
253
262
|
V8 = "v8",
|
package/dist/types/dbt.js
CHANGED
@@ -134,8 +134,9 @@ const isDbtRpcRunSqlResults = (results) => 'results' in results &&
|
|
134
134
|
'rows' in result.table &&
|
135
135
|
Array.isArray(result.table.rows));
|
136
136
|
exports.isDbtRpcRunSqlResults = isDbtRpcRunSqlResults;
|
137
|
-
const convertModelMetric = ({ modelName, name, metric, source, tableLabel, dimensionReference, requiredAttributes, }) => {
|
137
|
+
const convertModelMetric = ({ modelName, name, metric, source, tableLabel, dimensionReference, requiredAttributes, spotlightConfig, }) => {
|
138
138
|
const groups = (0, exports.convertToGroups)(metric.groups, metric.group_label);
|
139
|
+
const spotlightVisibility = metric.spotlight?.visibility ?? spotlightConfig?.default_visibility;
|
139
140
|
return {
|
140
141
|
fieldType: field_1.FieldType.METRIC,
|
141
142
|
name,
|
@@ -173,10 +174,17 @@ const convertModelMetric = ({ modelName, name, metric, source, tableLabel, dimen
|
|
173
174
|
},
|
174
175
|
}
|
175
176
|
: null),
|
177
|
+
...(spotlightVisibility !== undefined
|
178
|
+
? {
|
179
|
+
spotlight: {
|
180
|
+
visibility: spotlightVisibility,
|
181
|
+
},
|
182
|
+
}
|
183
|
+
: {}),
|
176
184
|
};
|
177
185
|
};
|
178
186
|
exports.convertModelMetric = convertModelMetric;
|
179
|
-
const convertColumnMetric = ({ modelName, dimensionName, dimensionSql, name, metric, source, tableLabel, requiredAttributes, }) => (0, exports.convertModelMetric)({
|
187
|
+
const convertColumnMetric = ({ modelName, dimensionName, dimensionSql, name, metric, source, tableLabel, requiredAttributes, spotlightConfig, }) => (0, exports.convertModelMetric)({
|
180
188
|
modelName,
|
181
189
|
name,
|
182
190
|
metric: {
|
@@ -201,6 +209,7 @@ const convertColumnMetric = ({ modelName, dimensionName, dimensionSql, name, met
|
|
201
209
|
},
|
202
210
|
}
|
203
211
|
: null),
|
212
|
+
spotlightConfig,
|
204
213
|
});
|
205
214
|
exports.convertColumnMetric = convertColumnMetric;
|
206
215
|
var DbtManifestVersion;
|
package/dist/types/explore.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import { type DbtModelJoinType, type LineageGraph, type SupportedDbtAdapter } from './dbt';
|
2
2
|
import { type CompiledDimension, type CompiledMetric, type Dimension, type Metric, type Source } from './field';
|
3
|
+
import { type LightdashProjectConfig } from './lightdashProjectConfig';
|
3
4
|
import { type TableBase } from './table';
|
4
5
|
export type ExploreJoin = {
|
5
6
|
table: string;
|
@@ -43,6 +44,9 @@ export type Explore = {
|
|
43
44
|
ymlPath?: string;
|
44
45
|
sqlPath?: string;
|
45
46
|
type?: ExploreType;
|
47
|
+
spotlight?: {
|
48
|
+
visibility: Required<NonNullable<LightdashProjectConfig['spotlight']>>['default_visibility'];
|
49
|
+
};
|
46
50
|
};
|
47
51
|
export declare enum InlineErrorType {
|
48
52
|
METADATA_PARSE_ERROR = "METADATA_PARSE_ERROR",
|
package/dist/types/field.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { AdditionalMetric, currencies, DefaultTimeDimension } from '..';
|
1
|
+
import type { AdditionalMetric, currencies, DefaultTimeDimension, LightdashProjectConfig } from '..';
|
2
2
|
import { type MetricFilterRule } from './filter';
|
3
3
|
import { type TimeFrames } from './timeFrames';
|
4
4
|
export declare enum Compact {
|
@@ -240,6 +240,9 @@ export interface Metric extends Field {
|
|
240
240
|
dimensionReference?: string;
|
241
241
|
requiredAttributes?: Record<string, string | string[]>;
|
242
242
|
defaultTimeDimension?: DefaultTimeDimension;
|
243
|
+
spotlight?: {
|
244
|
+
visibility: Required<NonNullable<LightdashProjectConfig['spotlight']>>['default_visibility'];
|
245
|
+
};
|
243
246
|
}
|
244
247
|
export declare const isFilterableDimension: (dimension: Dimension) => dimension is FilterableDimension;
|
245
248
|
export type FilterableField = TableCalculation | Metric | FilterableDimension | CustomSqlDimension;
|
package/dist/utils/item.d.ts
CHANGED
@@ -51,5 +51,8 @@ export declare const replaceDimensionInExplore: (explore: Explore, dimension: Co
|
|
51
51
|
ymlPath?: string | undefined;
|
52
52
|
sqlPath?: string | undefined;
|
53
53
|
type?: import("../types/explore").ExploreType | undefined;
|
54
|
+
spotlight?: {
|
55
|
+
visibility: "show" | "hide";
|
56
|
+
} | undefined;
|
54
57
|
};
|
55
58
|
export declare const canApplyFormattingToCustomMetric: (item: Dimension, customMetricType: MetricType) => boolean;
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.loadLightdashProjectConfig = void 0;
|
4
|
+
const tslib_1 = require("tslib");
|
5
|
+
const ajv_1 = tslib_1.__importDefault(require("ajv"));
|
6
|
+
const yaml = tslib_1.__importStar(require("js-yaml"));
|
7
|
+
const better_ajv_errors_1 = tslib_1.__importDefault(require("better-ajv-errors"));
|
8
|
+
const lightdashProjectConfig_1 = require("../types/lightdashProjectConfig");
|
9
|
+
const lightdash_project_config_1_0_json_1 = tslib_1.__importDefault(require("../schemas/json/lightdash-project-config-1.0.json"));
|
10
|
+
const errors_1 = require("../types/errors");
|
11
|
+
const loadLightdashProjectConfig = async (yamlFileContents) => {
|
12
|
+
if (yamlFileContents.trim() === '') {
|
13
|
+
return {
|
14
|
+
spotlight: lightdashProjectConfig_1.DEFAULT_SPOTLIGHT_CONFIG,
|
15
|
+
};
|
16
|
+
}
|
17
|
+
const configFile = yaml.load(yamlFileContents);
|
18
|
+
const ajv = new ajv_1.default({ coerceTypes: true });
|
19
|
+
const validate = ajv.compile(lightdash_project_config_1_0_json_1.default);
|
20
|
+
if (!validate(configFile)) {
|
21
|
+
const errors = (0, better_ajv_errors_1.default)(lightdash_project_config_1_0_json_1.default, configFile, validate.errors || [], { indent: 2 });
|
22
|
+
throw new errors_1.ParseError(`Invalid lightdash.config.yml with errors:\n${errors}`);
|
23
|
+
}
|
24
|
+
return configFile;
|
25
|
+
};
|
26
|
+
exports.loadLightdashProjectConfig = loadLightdashProjectConfig;
|
@@ -42,6 +42,7 @@ const createVirtualView = (virtualViewName, sql, columns, warehouseClient, label
|
|
42
42
|
joinedTables: [],
|
43
43
|
tables: { [virtualViewName]: compiledTable },
|
44
44
|
targetDatabase: warehouseClient.getAdapterType(),
|
45
|
+
meta: {},
|
45
46
|
});
|
46
47
|
const virtualView = {
|
47
48
|
...explore,
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@lightdash/common",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.1463.0",
|
4
4
|
"main": "dist/index.js",
|
5
5
|
"types": "dist/index.d.ts",
|
6
6
|
"files": [
|
@@ -8,6 +8,7 @@
|
|
8
8
|
],
|
9
9
|
"license": "MIT",
|
10
10
|
"devDependencies": {
|
11
|
+
"@types/js-yaml": "^4.0.9",
|
11
12
|
"@types/pegjs": "^0.10.3",
|
12
13
|
"@types/sanitize-html": "^2.11.0",
|
13
14
|
"@types/uuid": "^10.0.0",
|
@@ -18,9 +19,11 @@
|
|
18
19
|
"@types/lodash": "^4.14.202",
|
19
20
|
"ajv": "^8.3.0",
|
20
21
|
"ajv-formats": "^2.1.0",
|
22
|
+
"better-ajv-errors": "^1.2.0",
|
21
23
|
"cronstrue": "^2.23.0",
|
22
24
|
"dayjs": "^1.11.9",
|
23
25
|
"dependency-graph": "^0.11.0",
|
26
|
+
"js-yaml": "^4.1.0",
|
24
27
|
"liquidjs": "^10.0.0",
|
25
28
|
"lodash": "^4.17.21",
|
26
29
|
"moment": "^2.29.4",
|