@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
- const selected = slugs.length
541
- ? virtualViews.filter(({ slug }) => slugs.includes(slug))
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
- if (hasFilters && options.virtualViews.length === 0) {
1775
- globalState_1.default.log(styles.warning(`No virtual view filters provided, skipping`));
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.69.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.69.1",
45
- "@lightdash/warehouses": "1.69.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",