@lightdash/cli 2.31.0 → 2.32.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.
|
@@ -125,6 +125,7 @@ declare const getDashboardAppSlugs: (dashboardSlugs: string[], customPath?: stri
|
|
|
125
125
|
needsUpdating: boolean;
|
|
126
126
|
})[]) => Promise<string[]>;
|
|
127
127
|
declare const isFilteredWithNoDashboards: (hasFilters: boolean, dashboardSlugs: string[]) => boolean;
|
|
128
|
+
declare const reportOpenDraftsForUpload: (projectUuid: string) => Promise<void>;
|
|
128
129
|
export declare const uploadHandler: (options: DownloadHandlerOptions) => Promise<void>;
|
|
129
130
|
export declare const testHelpers: {
|
|
130
131
|
assertUniqueSpacePaths: typeof assertUniqueSpacePaths;
|
|
@@ -147,6 +148,7 @@ export declare const testHelpers: {
|
|
|
147
148
|
readExternalConnectionFiles: typeof readExternalConnectionFiles;
|
|
148
149
|
readSpaceFiles: typeof readSpaceFiles;
|
|
149
150
|
readSpaceNames: typeof readSpaceNames;
|
|
151
|
+
reportOpenDraftsForUpload: typeof reportOpenDraftsForUpload;
|
|
150
152
|
sanitizeChartForDownload: typeof sanitizeChartForDownload;
|
|
151
153
|
selectVirtualViewCandidates: typeof selectVirtualViewCandidates;
|
|
152
154
|
shouldFallBackToEmbeddedSpaces: typeof shouldFallBackToEmbeddedSpaces;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,WAAW,EA0BX,WAAW,EAIX,eAAe,EAGf,wBAAwB,
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"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"}
|
|
@@ -2001,6 +2001,22 @@ const getDashboardAppSlugs = async (dashboardSlugs, customPath, looseDashboards
|
|
|
2001
2001
|
// Mirrors the Dashboards phase's own guard: a filtered upload with no
|
|
2002
2002
|
// dashboard slugs uploads no dashboards, so there is nothing to derive from.
|
|
2003
2003
|
const isFilteredWithNoDashboards = (hasFilters, dashboardSlugs) => hasFilters && dashboardSlugs.length === 0;
|
|
2004
|
+
const reportOpenDraftsForUpload = async (projectUuid) => {
|
|
2005
|
+
try {
|
|
2006
|
+
const { openDraftCount } = await (0, apiClient_1.lightdashApi)({
|
|
2007
|
+
method: 'GET',
|
|
2008
|
+
url: `/api/v1/projects/${projectUuid}/code/upload-advisory`,
|
|
2009
|
+
body: undefined,
|
|
2010
|
+
});
|
|
2011
|
+
if (openDraftCount > 0) {
|
|
2012
|
+
globalState_1.default.log(styles.warning(`⚠ ${openDraftCount} open content draft${openDraftCount === 1 ? '' : 's'}. Upload will continue; Git content remains authoritative.`));
|
|
2013
|
+
}
|
|
2014
|
+
}
|
|
2015
|
+
catch (error) {
|
|
2016
|
+
globalState_1.default.log(styles.warning('⚠ Could not check for open content drafts. Upload will continue.'));
|
|
2017
|
+
globalState_1.default.debug(`Could not load content-as-code upload advisory: ${(0, common_1.getErrorMessage)(error)}`);
|
|
2018
|
+
}
|
|
2019
|
+
};
|
|
2004
2020
|
const uploadHandler = async (options) => {
|
|
2005
2021
|
globalState_1.default.setVerbose(options.verbose);
|
|
2006
2022
|
if (options.spacesOnly && options.skipSpaces) {
|
|
@@ -2088,6 +2104,7 @@ const uploadHandler = async (options) => {
|
|
|
2088
2104
|
const projectId = projectSelection.projectUuid;
|
|
2089
2105
|
// Log current project info
|
|
2090
2106
|
(0, selectProject_1.logSelectedProject)(projectSelection, config, 'Uploading to');
|
|
2107
|
+
await reportOpenDraftsForUpload(projectId);
|
|
2091
2108
|
// Persist repo-owned sync settings for the review/write-back workflow.
|
|
2092
2109
|
let syncEnabled;
|
|
2093
2110
|
const configExists = await fs_1.promises
|
|
@@ -2820,6 +2837,7 @@ exports.testHelpers = {
|
|
|
2820
2837
|
readExternalConnectionFiles,
|
|
2821
2838
|
readSpaceFiles: spacesAsCode_1.readSpaceFiles,
|
|
2822
2839
|
readSpaceNames: spacesAsCode_1.readSpaceNames,
|
|
2840
|
+
reportOpenDraftsForUpload,
|
|
2823
2841
|
sanitizeChartForDownload,
|
|
2824
2842
|
selectVirtualViewCandidates,
|
|
2825
2843
|
shouldFallBackToEmbeddedSpaces: spacesAsCode_1.shouldFallBackToEmbeddedSpaces,
|
|
@@ -39,7 +39,42 @@ vitest_1.vi.mock('./dbt/apiClient', async (importOriginal) => ({
|
|
|
39
39
|
getContentAsCodeUploadPermissions: vitest_1.vi.fn(),
|
|
40
40
|
lightdashApi: vitest_1.vi.fn(),
|
|
41
41
|
}));
|
|
42
|
-
const { assertUniqueSpacePaths, downloadLinkedVirtualViews, downloadSpaces, extractChartTableNames, extractChartTypeRefsFromCharts, getDashboardAppSlugs, getDashboardChartSlugs, getFlatSpaceFileNames, hasContentFilters, isAiAgentsUnavailableError, isExternalConnectionsUnavailableError, isVirtualViewsUnavailableError, countChangeDelta, downloadAiAgents, isFilteredWithNoDashboards, readAiAgentFiles, readSpaceFiles, readSpaceNames, sanitizeChartForDownload, shouldFallBackToEmbeddedSpaces, shouldDownloadAiAgents, summarizeUploadChanges, upsertAiAgents, upsertExternalConnections, upsertSpaces, upsertVirtualViews, validateSpaceIdentity, writeSpaceFiles, } = download_1.testHelpers;
|
|
42
|
+
const { assertUniqueSpacePaths, downloadLinkedVirtualViews, downloadSpaces, extractChartTableNames, extractChartTypeRefsFromCharts, getDashboardAppSlugs, getDashboardChartSlugs, getFlatSpaceFileNames, hasContentFilters, isAiAgentsUnavailableError, isExternalConnectionsUnavailableError, isVirtualViewsUnavailableError, countChangeDelta, downloadAiAgents, isFilteredWithNoDashboards, readAiAgentFiles, readSpaceFiles, readSpaceNames, reportOpenDraftsForUpload, sanitizeChartForDownload, shouldFallBackToEmbeddedSpaces, shouldDownloadAiAgents, summarizeUploadChanges, upsertAiAgents, upsertExternalConnections, upsertSpaces, upsertVirtualViews, validateSpaceIdentity, writeSpaceFiles, } = download_1.testHelpers;
|
|
43
|
+
describe('reportOpenDraftsForUpload', () => {
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
vitest_1.vi.mocked(apiClient_1.lightdashApi).mockReset();
|
|
46
|
+
vitest_1.vi.spyOn(globalState_1.default, 'log').mockImplementation(() => undefined);
|
|
47
|
+
});
|
|
48
|
+
afterEach(() => {
|
|
49
|
+
vitest_1.vi.restoreAllMocks();
|
|
50
|
+
});
|
|
51
|
+
it('stays quiet when the project has no open drafts', async () => {
|
|
52
|
+
vitest_1.vi.mocked(apiClient_1.lightdashApi).mockResolvedValueOnce({
|
|
53
|
+
openDraftCount: 0,
|
|
54
|
+
});
|
|
55
|
+
await reportOpenDraftsForUpload('project-uuid');
|
|
56
|
+
expect(apiClient_1.lightdashApi).toHaveBeenCalledWith({
|
|
57
|
+
method: 'GET',
|
|
58
|
+
url: '/api/v1/projects/project-uuid/code/upload-advisory',
|
|
59
|
+
body: undefined,
|
|
60
|
+
});
|
|
61
|
+
expect(globalState_1.default.log).not.toHaveBeenCalled();
|
|
62
|
+
});
|
|
63
|
+
it('warns without blocking when the project has multiple open drafts', async () => {
|
|
64
|
+
vitest_1.vi.mocked(apiClient_1.lightdashApi).mockResolvedValueOnce({
|
|
65
|
+
openDraftCount: 3,
|
|
66
|
+
});
|
|
67
|
+
await expect(reportOpenDraftsForUpload('project-uuid')).resolves.toBeUndefined();
|
|
68
|
+
expect(globalState_1.default.log).toHaveBeenCalledWith(expect.stringContaining('3 open content drafts'));
|
|
69
|
+
expect(globalState_1.default.log).toHaveBeenCalledWith(expect.stringContaining('Upload will continue'));
|
|
70
|
+
});
|
|
71
|
+
it('warns without blocking when the draft count cannot be loaded', async () => {
|
|
72
|
+
vitest_1.vi.mocked(apiClient_1.lightdashApi).mockRejectedValueOnce(new Error('draft table unavailable'));
|
|
73
|
+
await expect(reportOpenDraftsForUpload('project-uuid')).resolves.toBeUndefined();
|
|
74
|
+
expect(globalState_1.default.log).toHaveBeenCalledWith(expect.stringContaining('Could not check for open content drafts'));
|
|
75
|
+
expect(globalState_1.default.log).toHaveBeenCalledWith(expect.stringContaining('Upload will continue'));
|
|
76
|
+
});
|
|
77
|
+
});
|
|
43
78
|
const makeDownloadHandlerOptions = (overrides = {}) => ({
|
|
44
79
|
verbose: false,
|
|
45
80
|
charts: [],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightdash/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.32.0",
|
|
4
4
|
"description": "Lightdash CLI tool",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"unique-names-generator": "4.7.1",
|
|
46
46
|
"uuid": "11.1.1",
|
|
47
47
|
"yaml": "2.8.3",
|
|
48
|
-
"@lightdash/common": "2.
|
|
49
|
-
"@lightdash/warehouses": "2.
|
|
48
|
+
"@lightdash/common": "2.32.0",
|
|
49
|
+
"@lightdash/warehouses": "2.32.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/inquirer": "8.2.4",
|