@lightdash/common 0.1462.1 → 0.1463.0
Sign up to get free protection for your applications and to get access to all the features.
- 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",
|