@lightdash/cli 1.69.1 → 1.71.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.
|
@@ -78,7 +78,7 @@ declare const isVirtualViewsUnavailableError: (error: unknown) => boolean;
|
|
|
78
78
|
* unavailable on the server.
|
|
79
79
|
*/
|
|
80
80
|
declare const downloadLinkedVirtualViews: (projectId: string, tableNames: string[], customPath?: string) => Promise<number | null>;
|
|
81
|
-
declare const upsertVirtualViews: (projectId: string, slugs: string[], changes: Record<string, number>, force: boolean, canUpload: boolean, customPath?: string) => Promise<Record<string, number>>;
|
|
81
|
+
declare const upsertVirtualViews: (projectId: string, slugs: string[], changes: Record<string, number>, force: boolean, canUpload: boolean, customPath?: string, candidateSlugs?: string[]) => Promise<Record<string, number>>;
|
|
82
82
|
export declare const getExternalConnectionSecretEnvVar: (slug: string) => string;
|
|
83
83
|
/**
|
|
84
84
|
* External connections are enterprise-only and admin-gated; when the download
|
|
@@ -99,6 +99,12 @@ declare const summarizeUploadChanges: (before: Record<string, number>, after: Re
|
|
|
99
99
|
detail: string;
|
|
100
100
|
variant?: ContentAsCodeOutputVariant;
|
|
101
101
|
};
|
|
102
|
+
declare const selectVirtualViewCandidates: ({ chartItems, chartSlugs, dashboardItems, dashboardSlugs, }: {
|
|
103
|
+
chartItems: ChartAsCode[];
|
|
104
|
+
chartSlugs: string[];
|
|
105
|
+
dashboardItems: DashboardAsCode[];
|
|
106
|
+
dashboardSlugs: string[];
|
|
107
|
+
}) => string[];
|
|
102
108
|
declare const getDashboardChartSlugs: (dashboardSlugs: string[], customPath?: string, looseDashboards?: (DashboardAsCode & {
|
|
103
109
|
needsUpdating: boolean;
|
|
104
110
|
})[]) => Promise<string[]>;
|
|
@@ -127,6 +133,7 @@ export declare const testHelpers: {
|
|
|
127
133
|
readSpaceFiles: typeof readSpaceFiles;
|
|
128
134
|
readSpaceNames: typeof readSpaceNames;
|
|
129
135
|
sanitizeChartForDownload: typeof sanitizeChartForDownload;
|
|
136
|
+
selectVirtualViewCandidates: typeof selectVirtualViewCandidates;
|
|
130
137
|
shouldFallBackToEmbeddedSpaces: typeof shouldFallBackToEmbeddedSpaces;
|
|
131
138
|
shouldDownloadAiAgents: typeof shouldDownloadAiAgents;
|
|
132
139
|
sortSpaceFilesParentFirst: typeof sortSpaceFilesParentFirst;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"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"}
|
|
@@ -535,10 +535,13 @@ const readVirtualViewFiles = async (customPath) => {
|
|
|
535
535
|
(0, resource_1.assertCodeResourceFilesValid)(result);
|
|
536
536
|
return result.files.map(({ document }) => document);
|
|
537
537
|
};
|
|
538
|
-
const upsertVirtualViews = async (projectId, slugs, changes, force, canUpload, customPath) => {
|
|
538
|
+
const upsertVirtualViews = async (projectId, slugs, changes, force, canUpload, customPath, candidateSlugs = []) => {
|
|
539
539
|
const virtualViews = await readVirtualViewFiles(customPath);
|
|
540
|
-
|
|
541
|
-
|
|
540
|
+
// Candidates are chart table names, and most are regular dbt explores
|
|
541
|
+
// with no local file — unmatched candidates never warn; explicit slugs do.
|
|
542
|
+
const candidateSet = new Set(candidateSlugs);
|
|
543
|
+
const selected = slugs.length > 0 || candidateSet.size > 0
|
|
544
|
+
? virtualViews.filter(({ slug }) => slugs.includes(slug) || candidateSet.has(slug))
|
|
542
545
|
: virtualViews;
|
|
543
546
|
const selectedSlugs = new Set(selected.map(({ slug }) => slug));
|
|
544
547
|
slugs
|
|
@@ -1646,6 +1649,21 @@ const selectDashboardChartSlugs = (dashboardItems, dashboardSlugs) => selectDash
|
|
|
1646
1649
|
const selectDashboardAppSlugs = (dashboardItems, dashboardSlugs) => [
|
|
1647
1650
|
...new Set(extractAppSlugsFromDashboards(selectDashboards(dashboardItems, dashboardSlugs))),
|
|
1648
1651
|
];
|
|
1652
|
+
// Virtual views a filtered upload should carry: the table names of the local
|
|
1653
|
+
// charts selected explicitly (-c) or referenced by the selected dashboards'
|
|
1654
|
+
// tiles. Dashboards contribute only when some are selected — a filtered
|
|
1655
|
+
// upload without -d uploads no dashboards, so there is nothing to derive.
|
|
1656
|
+
const selectVirtualViewCandidates = ({ chartItems, chartSlugs, dashboardItems, dashboardSlugs, }) => {
|
|
1657
|
+
const selectedChartSlugs = new Set([
|
|
1658
|
+
...chartSlugs,
|
|
1659
|
+
...(dashboardSlugs.length > 0
|
|
1660
|
+
? selectDashboardChartSlugs(dashboardItems, dashboardSlugs)
|
|
1661
|
+
: []),
|
|
1662
|
+
]);
|
|
1663
|
+
if (selectedChartSlugs.size === 0)
|
|
1664
|
+
return [];
|
|
1665
|
+
return extractChartTableNames(chartItems.filter((chart) => selectedChartSlugs.has(chart.slug)));
|
|
1666
|
+
};
|
|
1649
1667
|
const getDashboardChartSlugs = async (dashboardSlugs, customPath, looseDashboards = []) => selectDashboardChartSlugs(await readDashboardItems(customPath, looseDashboards), dashboardSlugs);
|
|
1650
1668
|
const getDashboardAppSlugs = async (dashboardSlugs, customPath, looseDashboards = []) => selectDashboardAppSlugs(await readDashboardItems(customPath, looseDashboards), dashboardSlugs);
|
|
1651
1669
|
// Mirrors the Dashboards phase's own guard: a filtered upload with no
|
|
@@ -1770,16 +1788,49 @@ const uploadHandler = async (options) => {
|
|
|
1770
1788
|
if (parseInt(String(options.concurrency), 10) > 1000) {
|
|
1771
1789
|
globalState_1.default.log(styles.warning(`Concurrency limit exceeded. Using maximum of 1000 instead of ${options.concurrency}`));
|
|
1772
1790
|
}
|
|
1791
|
+
// The Virtual views, Data apps and Charts phases all derive slugs
|
|
1792
|
+
// from the same dashboard YAML; read the download folder once and
|
|
1793
|
+
// share it.
|
|
1794
|
+
let dashboardItemsPromise;
|
|
1795
|
+
const loadDashboardItems = () => {
|
|
1796
|
+
dashboardItemsPromise =
|
|
1797
|
+
dashboardItemsPromise ??
|
|
1798
|
+
readDashboardItems(options.path, looseFiles.dashboards);
|
|
1799
|
+
return dashboardItemsPromise;
|
|
1800
|
+
};
|
|
1773
1801
|
if (!options.skipVirtualViews) {
|
|
1774
|
-
|
|
1775
|
-
|
|
1802
|
+
// --include-virtual-views on a filtered upload also pushes the
|
|
1803
|
+
// virtual views backing the selected charts and dashboards. An
|
|
1804
|
+
// unfiltered upload already pushes every local virtual view.
|
|
1805
|
+
let virtualViewCandidates = [];
|
|
1806
|
+
if (options.includeVirtualViews === true &&
|
|
1807
|
+
hasFilters &&
|
|
1808
|
+
(options.charts.length > 0 || options.dashboards.length > 0)) {
|
|
1809
|
+
virtualViewCandidates = selectVirtualViewCandidates({
|
|
1810
|
+
chartItems: [
|
|
1811
|
+
...(await readCodeFiles('charts', options.path)),
|
|
1812
|
+
...looseFiles.charts,
|
|
1813
|
+
],
|
|
1814
|
+
chartSlugs: options.charts,
|
|
1815
|
+
dashboardItems: options.dashboards.length > 0
|
|
1816
|
+
? await loadDashboardItems()
|
|
1817
|
+
: [],
|
|
1818
|
+
dashboardSlugs: options.dashboards,
|
|
1819
|
+
});
|
|
1820
|
+
}
|
|
1821
|
+
if (hasFilters &&
|
|
1822
|
+
options.virtualViews.length === 0 &&
|
|
1823
|
+
virtualViewCandidates.length === 0) {
|
|
1824
|
+
globalState_1.default.log(styles.warning(options.includeVirtualViews === true
|
|
1825
|
+
? `No virtual views referenced by the selected content, skipping`
|
|
1826
|
+
: `No virtual view filters provided, skipping`));
|
|
1776
1827
|
}
|
|
1777
1828
|
else {
|
|
1778
1829
|
changes = await runUploadChangesPhase({
|
|
1779
1830
|
output,
|
|
1780
1831
|
label: 'Virtual views',
|
|
1781
1832
|
changes,
|
|
1782
|
-
action: () => upsertVirtualViews(projectId, options.virtualViews, changes, options.force, uploadPermissions.virtualViews, options.path),
|
|
1833
|
+
action: () => upsertVirtualViews(projectId, options.virtualViews, changes, options.force, uploadPermissions.virtualViews, options.path, virtualViewCandidates),
|
|
1783
1834
|
});
|
|
1784
1835
|
}
|
|
1785
1836
|
}
|
|
@@ -1798,15 +1849,6 @@ const uploadHandler = async (options) => {
|
|
|
1798
1849
|
});
|
|
1799
1850
|
}
|
|
1800
1851
|
}
|
|
1801
|
-
// Both the Data apps and Charts phases derive slugs from the same
|
|
1802
|
-
// dashboard YAML; read the download folder once and share it.
|
|
1803
|
-
let dashboardItemsPromise;
|
|
1804
|
-
const loadDashboardItems = () => {
|
|
1805
|
-
dashboardItemsPromise =
|
|
1806
|
-
dashboardItemsPromise ??
|
|
1807
|
-
readDashboardItems(options.path, looseFiles.dashboards);
|
|
1808
|
-
return dashboardItemsPromise;
|
|
1809
|
-
};
|
|
1810
1852
|
// Upload data apps (enterprise; explicit --apps/--include-apps, or
|
|
1811
1853
|
// auto-pushed for a dashboard's apps). Must land before dashboards.
|
|
1812
1854
|
const explicitAppReferences = Array.isArray(options.apps)
|
|
@@ -2239,6 +2281,7 @@ exports.testHelpers = {
|
|
|
2239
2281
|
readSpaceFiles: spacesAsCode_1.readSpaceFiles,
|
|
2240
2282
|
readSpaceNames: spacesAsCode_1.readSpaceNames,
|
|
2241
2283
|
sanitizeChartForDownload,
|
|
2284
|
+
selectVirtualViewCandidates,
|
|
2242
2285
|
shouldFallBackToEmbeddedSpaces: spacesAsCode_1.shouldFallBackToEmbeddedSpaces,
|
|
2243
2286
|
shouldDownloadAiAgents,
|
|
2244
2287
|
sortSpaceFilesParentFirst: spacesAsCode_1.sortSpaceFilesParentFirst,
|
|
@@ -343,6 +343,59 @@ describe('extractChartTableNames', () => {
|
|
|
343
343
|
expect(extractChartTableNames([chart(undefined), chart(''), chart('one')])).toEqual(['one']);
|
|
344
344
|
});
|
|
345
345
|
});
|
|
346
|
+
describe('selectVirtualViewCandidates', () => {
|
|
347
|
+
const chart = (slug, tableName) => ({
|
|
348
|
+
slug,
|
|
349
|
+
tableName,
|
|
350
|
+
});
|
|
351
|
+
it('collects table names of explicitly selected charts', () => {
|
|
352
|
+
expect(download_1.testHelpers.selectVirtualViewCandidates({
|
|
353
|
+
chartItems: [
|
|
354
|
+
chart('wanted', 'my_virtual_view'),
|
|
355
|
+
chart('other', 'other_view'),
|
|
356
|
+
],
|
|
357
|
+
chartSlugs: ['wanted'],
|
|
358
|
+
dashboardItems: [],
|
|
359
|
+
dashboardSlugs: [],
|
|
360
|
+
})).toEqual(['my_virtual_view']);
|
|
361
|
+
});
|
|
362
|
+
it('collects table names of the selected dashboards charts only', () => {
|
|
363
|
+
expect(download_1.testHelpers.selectVirtualViewCandidates({
|
|
364
|
+
chartItems: [
|
|
365
|
+
chart('dash-chart', 'my_virtual_view'),
|
|
366
|
+
chart('other-dash-chart', 'other_view'),
|
|
367
|
+
],
|
|
368
|
+
chartSlugs: [],
|
|
369
|
+
dashboardItems: [
|
|
370
|
+
makeLooseDashboard('wanted-dash', ['dash-chart']),
|
|
371
|
+
makeLooseDashboard('other-dash', ['other-dash-chart']),
|
|
372
|
+
],
|
|
373
|
+
dashboardSlugs: ['wanted-dash'],
|
|
374
|
+
})).toEqual(['my_virtual_view']);
|
|
375
|
+
});
|
|
376
|
+
it('ignores dashboards entirely when none are selected', () => {
|
|
377
|
+
expect(download_1.testHelpers.selectVirtualViewCandidates({
|
|
378
|
+
chartItems: [chart('dash-chart', 'my_virtual_view')],
|
|
379
|
+
chartSlugs: [],
|
|
380
|
+
dashboardItems: [
|
|
381
|
+
makeLooseDashboard('some-dash', ['dash-chart']),
|
|
382
|
+
],
|
|
383
|
+
dashboardSlugs: [],
|
|
384
|
+
})).toEqual([]);
|
|
385
|
+
});
|
|
386
|
+
it('dedupes across sources and drops charts without a table name', () => {
|
|
387
|
+
expect(download_1.testHelpers.selectVirtualViewCandidates({
|
|
388
|
+
chartItems: [
|
|
389
|
+
chart('a-chart', 'shared_view'),
|
|
390
|
+
chart('b-chart', 'shared_view'),
|
|
391
|
+
chart('sql-chart', undefined),
|
|
392
|
+
],
|
|
393
|
+
chartSlugs: ['a-chart', 'sql-chart'],
|
|
394
|
+
dashboardItems: [makeLooseDashboard('dash', ['b-chart'])],
|
|
395
|
+
dashboardSlugs: ['dash'],
|
|
396
|
+
})).toEqual(['shared_view']);
|
|
397
|
+
});
|
|
398
|
+
});
|
|
346
399
|
describe('getDashboardAppSlugs', () => {
|
|
347
400
|
let tmpDir;
|
|
348
401
|
beforeEach(async () => {
|
|
@@ -573,6 +626,34 @@ version: 1
|
|
|
573
626
|
expect(apiClient_1.lightdashApi).not.toHaveBeenCalled();
|
|
574
627
|
expect(logSpy).toHaveBeenCalledExactlyOnceWith(expect.stringContaining('Error uploading virtual views'));
|
|
575
628
|
});
|
|
629
|
+
it('uploads candidate matches only, silent on unmatched candidates', async () => {
|
|
630
|
+
const logSpy = vitest_1.vi
|
|
631
|
+
.spyOn(globalState_1.default, 'log')
|
|
632
|
+
.mockImplementation(() => undefined);
|
|
633
|
+
await fs_1.promises.writeFile(path.join(tmpDir, 'virtual-views', 'my_view.yml'), virtualView('my_view'));
|
|
634
|
+
await fs_1.promises.writeFile(path.join(tmpDir, 'virtual-views', 'unrelated_view.yml'), virtualView('unrelated_view'));
|
|
635
|
+
vitest_1.vi.mocked(apiClient_1.lightdashApi).mockResolvedValueOnce({
|
|
636
|
+
action: 'create',
|
|
637
|
+
});
|
|
638
|
+
const changes = await upsertVirtualViews('project-uuid', [], {}, false, true, tmpDir, ['my_view', 'orders', 'customers']);
|
|
639
|
+
expect(changes).toEqual({ 'virtual views created': 1 });
|
|
640
|
+
expect(apiClient_1.lightdashApi).toHaveBeenCalledExactlyOnceWith(expect.objectContaining({
|
|
641
|
+
url: expect.stringContaining('/code/virtualViews/my_view'),
|
|
642
|
+
}));
|
|
643
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
644
|
+
});
|
|
645
|
+
it('still warns about explicit slugs missing locally when candidates are present', async () => {
|
|
646
|
+
const logSpy = vitest_1.vi
|
|
647
|
+
.spyOn(globalState_1.default, 'log')
|
|
648
|
+
.mockImplementation(() => undefined);
|
|
649
|
+
await fs_1.promises.writeFile(path.join(tmpDir, 'virtual-views', 'my_view.yml'), virtualView('my_view'));
|
|
650
|
+
vitest_1.vi.mocked(apiClient_1.lightdashApi).mockResolvedValueOnce({
|
|
651
|
+
action: 'update',
|
|
652
|
+
});
|
|
653
|
+
const changes = await upsertVirtualViews('project-uuid', ['missing_view'], {}, false, true, tmpDir, ['my_view']);
|
|
654
|
+
expect(changes).toEqual({ 'virtual views updated': 1 });
|
|
655
|
+
expect(logSpy).toHaveBeenCalledExactlyOnceWith(expect.stringContaining('Virtual view "missing_view" was not found locally'));
|
|
656
|
+
});
|
|
576
657
|
});
|
|
577
658
|
describe('upsertExternalConnections', () => {
|
|
578
659
|
let tmpDir;
|
package/dist/index.js
CHANGED
|
@@ -410,6 +410,7 @@ const uploadCommand = commander_1.program
|
|
|
410
410
|
.option('--skip-external-connections', 'skip uploading external connections', false)
|
|
411
411
|
.option('--concurrency <number>', 'Number of parallel uploads (default: 1)', '1')
|
|
412
412
|
.option('--include-charts', 'Include charts updates when uploading dashboards', false)
|
|
413
|
+
.option('--include-virtual-views', 'Include the virtual views used by the charts and dashboards being uploaded', false)
|
|
413
414
|
.option('--validate', 'Validate charts and dashboards after upload', false)
|
|
414
415
|
.option('--gzip', 'Enable gzip compression for request bodies', false)
|
|
415
416
|
.option('--apps <appReferences...>', 'Upload only the specified data apps, by UUID, slug, or app URL (enterprise).')
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightdash/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.71.0",
|
|
4
4
|
"description": "Lightdash CLI tool",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"unique-names-generator": "4.7.1",
|
|
42
42
|
"uuid": "11.1.1",
|
|
43
43
|
"yaml": "2.8.3",
|
|
44
|
-
"@lightdash/common": "1.
|
|
45
|
-
"@lightdash/warehouses": "1.
|
|
44
|
+
"@lightdash/common": "1.71.0",
|
|
45
|
+
"@lightdash/warehouses": "1.71.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/inquirer": "8.2.4",
|