@lightdash/cli 2.157.1 → 2.158.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/.tsbuildinfo +1 -1
- package/dist/handlers/apps/preview.d.ts.map +1 -1
- package/dist/handlers/apps/preview.js +5 -2
- package/dist/handlers/apps/preview.test.js +1 -1
- package/dist/handlers/download.d.ts +2 -0
- package/dist/handlers/download.d.ts.map +1 -1
- package/dist/handlers/download.js +3 -2
- package/dist/handlers/download.test.js +23 -6
- package/dist/handlers/exportChartImage.d.ts.map +1 -1
- package/dist/handlers/exportChartImage.js +6 -3
- package/dist/handlers/listProjects.d.ts.map +1 -1
- package/dist/handlers/listProjects.js +3 -0
- package/dist/handlers/preAggregateAudit.d.ts.map +1 -1
- package/dist/handlers/preAggregateAudit.js +3 -2
- package/dist/handlers/renameHandler.d.ts.map +1 -1
- package/dist/handlers/renameHandler.js +4 -3
- package/dist/handlers/renameHandler.test.js +2 -2
- package/dist/handlers/resolveProjectFlag.d.ts +6 -0
- package/dist/handlers/resolveProjectFlag.d.ts.map +1 -0
- package/dist/handlers/resolveProjectFlag.js +36 -0
- package/dist/handlers/resolveProjectFlag.test.d.ts +2 -0
- package/dist/handlers/resolveProjectFlag.test.d.ts.map +1 -0
- package/dist/handlers/resolveProjectFlag.test.js +48 -0
- package/dist/handlers/selectProject.d.ts.map +1 -1
- package/dist/handlers/selectProject.js +5 -1
- package/dist/handlers/setProject.d.ts +1 -1
- package/dist/handlers/setProject.d.ts.map +1 -1
- package/dist/handlers/setProject.js +5 -3
- package/dist/handlers/setWarehouse.d.ts.map +1 -1
- package/dist/handlers/setWarehouse.js +3 -2
- package/dist/handlers/validate.d.ts.map +1 -1
- package/dist/handlers/validate.js +5 -2
- package/dist/handlers/validate.test.js +4 -4
- package/dist/index.js +14 -16
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/handlers/apps/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,eAAe,EACvB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/handlers/apps/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,eAAe,EACvB,MAAM,mBAAmB,CAAC;AAe3B;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,SAAU;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACjC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CA8CxB,CAAC;AAEF,eAAO,MAAM,wBAAwB,SAAgB;IACjD,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,KAAG,OAAO,CAAC,MAAM,EAAE,CA6EnB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,WACtC,MAAM,KACf,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAgB;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CA2BlD,CAAC;AAQF,eAAO,MAAM,wBAAwB,WACzB,MAAM,KACf,OAAO,CAAC,IAAI,CAMd,CAAC;AAyBF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAgB;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACtB,KAAG,OAAO,CAAC,IAAI,CAuEf,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,SAAU;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB,KAAG,MACgT,CAAC;AAErT,eAAO,MAAM,uBAAuB,SAAgB;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,KAAG,OAAO,CAAC,OAAO,CAmBlB,CAAC;AAKF,eAAO,MAAM,6BAA6B,WAC9B,MAAM,KACf,OAAO,CAAC,OAAO,CAmBjB,CAAC;AAkBF,KAAK,kBAAkB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,kBAAkB,QACtB,MAAM,GAAG,SAAS,KACxB,MAAM,GAAG,SASX,CAAC;AAEF,eAAO,MAAM,kBAAkB,YAClB,MAAM,GAAG,SAAS,WAClB,kBAAkB,KAC5B,OAAO,CAAC,IAAI,CA6Id,CAAC"}
|
|
@@ -12,6 +12,7 @@ const config_1 = require("../../config");
|
|
|
12
12
|
const globalState_1 = tslib_1.__importDefault(require("../../globalState"));
|
|
13
13
|
const styles = tslib_1.__importStar(require("../../styles"));
|
|
14
14
|
const apiClient_1 = require("../dbt/apiClient");
|
|
15
|
+
const resolveProjectFlag_1 = require("../resolveProjectFlag");
|
|
15
16
|
const utils_1 = require("../utils");
|
|
16
17
|
const appCodeFiles_1 = require("./appCodeFiles");
|
|
17
18
|
const previewProxy_1 = require("./previewProxy");
|
|
@@ -155,7 +156,7 @@ const resolvePreviewTarget = async (args) => {
|
|
|
155
156
|
}
|
|
156
157
|
const projectUuid = args.projectFlag ?? args.currentProjectUuid;
|
|
157
158
|
if (projectUuid === undefined) {
|
|
158
|
-
throw new Error(`No project selected. Pass '--project <uuid>' or run 'lightdash config set-project' first.`);
|
|
159
|
+
throw new Error(`No project selected. Pass '--project <uuid or slug>' or run 'lightdash config set-project' first.`);
|
|
159
160
|
}
|
|
160
161
|
return {
|
|
161
162
|
appDir,
|
|
@@ -352,7 +353,9 @@ const appsPreviewHandler = async (pathArg, options) => {
|
|
|
352
353
|
}
|
|
353
354
|
const target = await (0, exports.resolvePreviewTarget)({
|
|
354
355
|
pathArg,
|
|
355
|
-
projectFlag: options.project
|
|
356
|
+
projectFlag: options.project
|
|
357
|
+
? await (0, resolveProjectFlag_1.resolveProjectFlag)(options.project)
|
|
358
|
+
: undefined,
|
|
356
359
|
currentProjectUuid: config.context?.project,
|
|
357
360
|
cwd: process.cwd(),
|
|
358
361
|
});
|
|
@@ -200,7 +200,7 @@ describe('resolvePreviewTarget', () => {
|
|
|
200
200
|
it('requires --project when the CLI has no current project', async () => {
|
|
201
201
|
const dir = await fs_1.promises.mkdtemp(path.join(os.tmpdir(), 'ld-prev-'));
|
|
202
202
|
await (0, appCodeFiles_1.writeBundleToDir)(dir, previewBundle);
|
|
203
|
-
await expect((0, preview_1.resolvePreviewTarget)({ cwd: dir })).rejects.toThrow(/Pass '--project <uuid>'/);
|
|
203
|
+
await expect((0, preview_1.resolvePreviewTarget)({ cwd: dir })).rejects.toThrow(/Pass '--project <uuid or slug>'/);
|
|
204
204
|
});
|
|
205
205
|
it('errors clearly when the folder has no manifest', async () => {
|
|
206
206
|
const dir = await fs_1.promises.mkdtemp(path.join(os.tmpdir(), 'ld-prev-'));
|
|
@@ -58,6 +58,7 @@ export type DownloadHandlerOptions = {
|
|
|
58
58
|
};
|
|
59
59
|
declare const shouldDownloadAiAgents: ({ includeAll, includeAgents, agents, appsOnly, }: Pick<DownloadHandlerOptions, 'includeAll' | 'includeAgents' | 'agents' | 'appsOnly'>) => boolean;
|
|
60
60
|
declare const hasContentFilters: ({ spacesOnly, charts, dashboards, agents, alerts, googleSheets, scheduledDeliveries, virtualViews, externalConnections, apps, chartTypes, }: Pick<DownloadHandlerOptions, 'spacesOnly' | 'charts' | 'dashboards' | 'agents' | 'alerts' | 'googleSheets' | 'scheduledDeliveries' | 'virtualViews' | 'externalConnections' | 'apps' | 'chartTypes'>) => boolean;
|
|
61
|
+
declare const parseContentFilters: (items: string[]) => string;
|
|
61
62
|
type MetadataEntry = {
|
|
62
63
|
slug: string;
|
|
63
64
|
type: 'charts' | 'dashboards';
|
|
@@ -150,6 +151,7 @@ export declare const testHelpers: {
|
|
|
150
151
|
getDashboardAppSlugs: typeof getDashboardAppSlugs;
|
|
151
152
|
getDashboardChartSlugs: typeof getDashboardChartSlugs;
|
|
152
153
|
hasContentFilters: typeof hasContentFilters;
|
|
154
|
+
parseContentFilters: typeof parseContentFilters;
|
|
153
155
|
isAiAgentsUnavailableError: typeof isAiAgentsUnavailableError;
|
|
154
156
|
isExternalConnectionsUnavailableError: typeof isExternalConnectionsUnavailableError;
|
|
155
157
|
isVirtualViewsUnavailableError: typeof isVirtualViewsUnavailableError;
|
|
@@ -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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"}
|
|
@@ -56,8 +56,8 @@ const parseContentFilters = (items) => {
|
|
|
56
56
|
if (items.length === 0)
|
|
57
57
|
return '';
|
|
58
58
|
const parsedItems = items.map((item) => {
|
|
59
|
-
const
|
|
60
|
-
return
|
|
59
|
+
const urlMatch = item.match(/https?:\/\/.+\/(?:saved|dashboards)\/([^/?#]+)/i);
|
|
60
|
+
return urlMatch ? urlMatch[1] : item;
|
|
61
61
|
});
|
|
62
62
|
return `?${new URLSearchParams(parsedItems.map((item) => ['ids', item])).toString()}`;
|
|
63
63
|
};
|
|
@@ -2848,6 +2848,7 @@ exports.testHelpers = {
|
|
|
2848
2848
|
getDashboardAppSlugs,
|
|
2849
2849
|
getDashboardChartSlugs,
|
|
2850
2850
|
hasContentFilters,
|
|
2851
|
+
parseContentFilters,
|
|
2851
2852
|
isAiAgentsUnavailableError,
|
|
2852
2853
|
isExternalConnectionsUnavailableError,
|
|
2853
2854
|
isVirtualViewsUnavailableError,
|
|
@@ -979,7 +979,6 @@ describe('downloadHandler analytics', () => {
|
|
|
979
979
|
skipVirtualViews: true,
|
|
980
980
|
skipExternalConnections: true,
|
|
981
981
|
path: tmpDir,
|
|
982
|
-
project: 'project-uuid',
|
|
983
982
|
}));
|
|
984
983
|
expect(analytics_1.LightdashAnalytics.track).toHaveBeenCalledWith(expect.objectContaining({
|
|
985
984
|
event: 'download.completed',
|
|
@@ -1051,7 +1050,6 @@ describe('downloadHandler failures', () => {
|
|
|
1051
1050
|
await expect((0, download_1.downloadHandler)(makeDownloadHandlerOptions({
|
|
1052
1051
|
includeAll: true,
|
|
1053
1052
|
path: tmpDir,
|
|
1054
|
-
project: 'project-uuid',
|
|
1055
1053
|
}))).resolves.toBeUndefined();
|
|
1056
1054
|
expect(vitest_1.vi.mocked(apiClient_1.lightdashApi)).toHaveBeenCalledWith(expect.objectContaining({
|
|
1057
1055
|
url: expect.stringContaining('/code/scheduledDeliveries'),
|
|
@@ -1088,7 +1086,6 @@ describe('downloadHandler failures', () => {
|
|
|
1088
1086
|
});
|
|
1089
1087
|
await expect((0, download_1.downloadHandler)(makeDownloadHandlerOptions({
|
|
1090
1088
|
agents: ['sales-agent'],
|
|
1091
|
-
project: 'project-uuid',
|
|
1092
1089
|
}))).rejects.toBe(unavailableError);
|
|
1093
1090
|
});
|
|
1094
1091
|
});
|
|
@@ -1103,9 +1100,7 @@ describe('uploadHandler failures', () => {
|
|
|
1103
1100
|
version: '0.0.0',
|
|
1104
1101
|
});
|
|
1105
1102
|
vitest_1.vi.mocked(apiClient_1.getContentAsCodeUploadPermissions).mockRejectedValueOnce(fatalError);
|
|
1106
|
-
await expect((0, download_1.uploadHandler)(makeDownloadHandlerOptions({
|
|
1107
|
-
project: 'project-uuid',
|
|
1108
|
-
}))).rejects.toBe(fatalError);
|
|
1103
|
+
await expect((0, download_1.uploadHandler)(makeDownloadHandlerOptions({}))).rejects.toBe(fatalError);
|
|
1109
1104
|
});
|
|
1110
1105
|
});
|
|
1111
1106
|
describe('readAiAgentFiles', () => {
|
|
@@ -1716,3 +1711,25 @@ version: 99
|
|
|
1716
1711
|
summarySpy.mockRestore();
|
|
1717
1712
|
});
|
|
1718
1713
|
});
|
|
1714
|
+
describe('parseContentFilters', () => {
|
|
1715
|
+
const { parseContentFilters } = download_1.testHelpers;
|
|
1716
|
+
it('passes slugs and uuids through untouched', () => {
|
|
1717
|
+
expect(parseContentFilters([
|
|
1718
|
+
'sales-overview',
|
|
1719
|
+
'00000000-0000-0000-0000-000000000001',
|
|
1720
|
+
])).toBe('?ids=sales-overview&ids=00000000-0000-0000-0000-000000000001');
|
|
1721
|
+
});
|
|
1722
|
+
it('extracts uuids from legacy app urls', () => {
|
|
1723
|
+
expect(parseContentFilters([
|
|
1724
|
+
'https://app.lightdash.cloud/projects/00000000-0000-0000-0000-0000000000aa/dashboards/00000000-0000-0000-0000-000000000001/view',
|
|
1725
|
+
'https://app.lightdash.cloud/projects/00000000-0000-0000-0000-0000000000aa/saved/00000000-0000-0000-0000-000000000002',
|
|
1726
|
+
])).toBe('?ids=00000000-0000-0000-0000-000000000001&ids=00000000-0000-0000-0000-000000000002');
|
|
1727
|
+
});
|
|
1728
|
+
it('extracts slugs from app urls that use project and content slugs', () => {
|
|
1729
|
+
expect(parseContentFilters([
|
|
1730
|
+
'https://app.lightdash.cloud/projects/jaffle-shop/dashboards/daily-sales/view',
|
|
1731
|
+
'https://app.lightdash.cloud/projects/jaffle-shop/saved/monthly-revenue/view?tab=1',
|
|
1732
|
+
'https://app.lightdash.cloud/projects/jaffle-shop/dashboards/sales-overview/view/tabs/some-tab',
|
|
1733
|
+
])).toBe('?ids=daily-sales&ids=monthly-revenue&ids=sales-overview');
|
|
1734
|
+
});
|
|
1735
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportChartImage.d.ts","sourceRoot":"","sources":["../../src/handlers/exportChartImage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exportChartImage.d.ts","sourceRoot":"","sources":["../../src/handlers/exportChartImage.ts"],"names":[],"mappings":"AASA,KAAK,uBAAuB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,uBAAuB,oBACf,MAAM,WACd,uBAAuB,KACjC,OAAO,CAAC,IAAI,CAiDd,CAAC"}
|
|
@@ -9,14 +9,17 @@ const config_1 = require("../config");
|
|
|
9
9
|
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
10
10
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
11
11
|
const apiClient_1 = require("./dbt/apiClient");
|
|
12
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
12
13
|
const exportChartImageHandler = async (chartUuidOrSlug, options) => {
|
|
13
14
|
globalState_1.default.setVerbose(options.verbose ?? false);
|
|
14
15
|
const spinner = globalState_1.default.startSpinner(`Exporting chart image for '${chartUuidOrSlug}'...`);
|
|
15
16
|
const isChartUuid = (0, uuid_1.validate)(chartUuidOrSlug);
|
|
16
|
-
const
|
|
17
|
-
|
|
17
|
+
const resolveDefaultProject = async () => !isChartUuid ? (await (0, config_1.getConfig)()).context?.project : undefined;
|
|
18
|
+
const projectUuid = options.project
|
|
19
|
+
? await (0, resolveProjectFlag_1.resolveProjectFlag)(options.project)
|
|
20
|
+
: await resolveDefaultProject();
|
|
18
21
|
if (!projectUuid && !isChartUuid) {
|
|
19
|
-
throw new Error('A project is required when exporting by slug. Pass --project <uuid> or select a project first.');
|
|
22
|
+
throw new Error('A project is required when exporting by slug. Pass --project <uuid or slug> or select a project first.');
|
|
20
23
|
}
|
|
21
24
|
const projectQuery = projectUuid
|
|
22
25
|
? `?projectUuid=${encodeURIComponent(projectUuid)}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listProjects.d.ts","sourceRoot":"","sources":["../../src/handlers/listProjects.ts"],"names":[],"mappings":"AAMA,KAAK,mBAAmB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,YAAmB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"listProjects.d.ts","sourceRoot":"","sources":["../../src/handlers/listProjects.ts"],"names":[],"mappings":"AAMA,KAAK,mBAAmB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,YAAmB,mBAAmB,kBAqDrE,CAAC"}
|
|
@@ -28,6 +28,9 @@ const listProjectsHandler = async (options) => {
|
|
|
28
28
|
filteredProjects.forEach((project) => {
|
|
29
29
|
console.error(` ${styles.bold(project.name)}`);
|
|
30
30
|
console.error(` UUID: ${project.projectUuid}`);
|
|
31
|
+
if (project.slug) {
|
|
32
|
+
console.error(` Slug: ${project.slug}`);
|
|
33
|
+
}
|
|
31
34
|
if (project.warehouseType) {
|
|
32
35
|
console.error(` Warehouse: ${project.warehouseType}`);
|
|
33
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preAggregateAudit.d.ts","sourceRoot":"","sources":["../../src/handlers/preAggregateAudit.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EACjC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"preAggregateAudit.d.ts","sourceRoot":"","sources":["../../src/handlers/preAggregateAudit.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EACjC,MAAM,mBAAmB,CAAC;AAO3B,KAAK,YAAY,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;AAEzE,KAAK,YAAY,GAAG;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,YAAY,CAAA;KAAE,EAAE,CAAC;CACvD,CAAC;AAEF,KAAK,aAAa,GAAG;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AA+BF,iBAAS,gBAAgB,CACrB,IAAI,EAAE,qBAAqB,EAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,GAC9B,MAAM,CAYR;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,GAAG,aAAa,CAsC5E;AAED,iBAAS,YAAY,CACjB,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC7C,IAAI,CA8DN;AAED,iBAAS,gBAAgB,CACrB,MAAM,EAAE,0BAA0B,EAAE,EACpC,IAAI,EAAE,OAAO,GACd,IAAI,CAIN;AAgCD,eAAO,MAAM,wBAAwB,YACxB,wBAAwB,KAClC,OAAO,CAAC,IAAI,CA6Bd,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;CAKvB,CAAC"}
|
|
@@ -7,16 +7,17 @@ const config_1 = require("../config");
|
|
|
7
7
|
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
8
8
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
9
9
|
const apiClient_1 = require("./dbt/apiClient");
|
|
10
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
10
11
|
async function resolveProjectUuid(flagValue) {
|
|
11
12
|
if (flagValue)
|
|
12
|
-
return flagValue;
|
|
13
|
+
return (0, resolveProjectFlag_1.resolveProjectFlag)(flagValue);
|
|
13
14
|
if (process.env.LIGHTDASH_PROJECT_UUID) {
|
|
14
15
|
return process.env.LIGHTDASH_PROJECT_UUID;
|
|
15
16
|
}
|
|
16
17
|
const config = await (0, config_1.getConfig)();
|
|
17
18
|
const projectUuid = config.context?.project;
|
|
18
19
|
if (!projectUuid) {
|
|
19
|
-
console.error('No project selected. Pass --project <uuid>, set LIGHTDASH_PROJECT_UUID, or run `lightdash login`.');
|
|
20
|
+
console.error('No project selected. Pass --project <uuid or slug>, set LIGHTDASH_PROJECT_UUID, or run `lightdash login`.');
|
|
20
21
|
process.exit(1);
|
|
21
22
|
}
|
|
22
23
|
return projectUuid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renameHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/renameHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,UAAU,EAEb,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"renameHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/renameHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,UAAU,EAEb,MAAM,mBAAmB,CAAC;AAmB3B,KAAK,oBAAoB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAwCF,eAAO,MAAM,aAAa,YAAmB,oBAAoB,kBAmNhE,CAAC"}
|
|
@@ -13,6 +13,7 @@ const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
|
13
13
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
14
14
|
const apiClient_1 = require("./dbt/apiClient");
|
|
15
15
|
const refresh_1 = require("./dbt/refresh");
|
|
16
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
16
17
|
const validate_1 = require("./validate");
|
|
17
18
|
const REFETCH_JOB_INTERVAL = 2000;
|
|
18
19
|
const waitUntilRenameFinished = (jobUuid) => (0, validate_1.waitUntilFinished)({
|
|
@@ -44,9 +45,9 @@ const renameHandler = async (options) => {
|
|
|
44
45
|
if (!config.context?.apiKey || !config.context.serverUrl) {
|
|
45
46
|
throw new common_1.AuthorizationError(`Not logged in. Run 'lightdash login --help'`);
|
|
46
47
|
}
|
|
47
|
-
const projectUuid = options.project
|
|
48
|
-
|
|
49
|
-
config.context.project;
|
|
48
|
+
const projectUuid = options.project
|
|
49
|
+
? await (0, resolveProjectFlag_1.resolveProjectFlag)(options.project)
|
|
50
|
+
: config.context.previewProject || config.context.project;
|
|
50
51
|
if (!projectUuid) {
|
|
51
52
|
throw new common_1.LightdashError({
|
|
52
53
|
message: 'No project selected. Run lightdash config set-project',
|
|
@@ -13,7 +13,7 @@ vi.mock('./dbt/refresh');
|
|
|
13
13
|
const baseOptions = {
|
|
14
14
|
verbose: false,
|
|
15
15
|
type: common_1.RenameType.FIELD,
|
|
16
|
-
project: '
|
|
16
|
+
project: '11111111-1111-4111-8111-111111111111',
|
|
17
17
|
from: 'old_name',
|
|
18
18
|
to: 'new_name',
|
|
19
19
|
dryRun: false,
|
|
@@ -64,7 +64,7 @@ describe('renameHandler follow-up validation', () => {
|
|
|
64
64
|
context: {
|
|
65
65
|
apiKey: 'test-key',
|
|
66
66
|
serverUrl: 'http://localhost',
|
|
67
|
-
project: '
|
|
67
|
+
project: '11111111-1111-4111-8111-111111111111',
|
|
68
68
|
},
|
|
69
69
|
});
|
|
70
70
|
vi.mocked(refresh_1.getProject).mockResolvedValue({
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the value of a `--project` flag to a project UUID.
|
|
3
|
+
* Accepts a UUID (returned as-is) or a project slug as shown in app URLs.
|
|
4
|
+
*/
|
|
5
|
+
export declare const resolveProjectFlag: (value: string) => Promise<string>;
|
|
6
|
+
//# sourceMappingURL=resolveProjectFlag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveProjectFlag.d.ts","sourceRoot":"","sources":["../../src/handlers/resolveProjectFlag.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,UAAiB,MAAM,KAAG,OAAO,CAAC,MAAM,CAiCtE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveProjectFlag = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@lightdash/common");
|
|
6
|
+
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
7
|
+
const styles = tslib_1.__importStar(require("../styles"));
|
|
8
|
+
const apiClient_1 = require("./dbt/apiClient");
|
|
9
|
+
// Same shape check the backend uses to tell uuids from slugs
|
|
10
|
+
const isUuid = (value) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);
|
|
11
|
+
/**
|
|
12
|
+
* Resolves the value of a `--project` flag to a project UUID.
|
|
13
|
+
* Accepts a UUID (returned as-is) or a project slug as shown in app URLs.
|
|
14
|
+
*/
|
|
15
|
+
const resolveProjectFlag = async (value) => {
|
|
16
|
+
if (isUuid(value)) {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
const projects = await (0, apiClient_1.lightdashApi)({
|
|
20
|
+
method: 'GET',
|
|
21
|
+
url: `/api/v1/org/projects`,
|
|
22
|
+
body: undefined,
|
|
23
|
+
});
|
|
24
|
+
const matches = projects.filter((project) => project.slug === value);
|
|
25
|
+
if (matches.length === 1) {
|
|
26
|
+
globalState_1.default.debug(`> Resolved project slug "${value}" to ${matches[0].projectUuid}`);
|
|
27
|
+
return matches[0].projectUuid;
|
|
28
|
+
}
|
|
29
|
+
if (matches.length > 1) {
|
|
30
|
+
throw new common_1.ParameterError(`Project slug "${value}" matches more than one project. Use the project UUID instead:\n${matches
|
|
31
|
+
.map((project) => ` ${project.name}: ${project.projectUuid}`)
|
|
32
|
+
.join('\n')}`);
|
|
33
|
+
}
|
|
34
|
+
throw new common_1.ParameterError(`No project found with UUID or slug "${value}". Run ${styles.bold('lightdash config list-projects')} to see the projects you have access to.`);
|
|
35
|
+
};
|
|
36
|
+
exports.resolveProjectFlag = resolveProjectFlag;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveProjectFlag.test.d.ts","sourceRoot":"","sources":["../../src/handlers/resolveProjectFlag.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const common_1 = require("@lightdash/common");
|
|
4
|
+
const apiClient_1 = require("./dbt/apiClient");
|
|
5
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
6
|
+
vi.mock('./dbt/apiClient', () => ({
|
|
7
|
+
lightdashApi: vi.fn(),
|
|
8
|
+
}));
|
|
9
|
+
const mockLightdashApi = apiClient_1.lightdashApi;
|
|
10
|
+
const PROJECT_UUID = '00000000-0000-0000-0000-000000000001';
|
|
11
|
+
const OTHER_UUID = '00000000-0000-0000-0000-000000000002';
|
|
12
|
+
const mockOrgProjects = (projects) => {
|
|
13
|
+
mockLightdashApi.mockResolvedValueOnce(projects.map((project) => ({
|
|
14
|
+
...project,
|
|
15
|
+
type: common_1.ProjectType.DEFAULT,
|
|
16
|
+
})));
|
|
17
|
+
};
|
|
18
|
+
describe('resolveProjectFlag', () => {
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
vi.clearAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it('returns a UUID as-is without calling the API', async () => {
|
|
23
|
+
await expect((0, resolveProjectFlag_1.resolveProjectFlag)(PROJECT_UUID)).resolves.toBe(PROJECT_UUID);
|
|
24
|
+
expect(mockLightdashApi).not.toHaveBeenCalled();
|
|
25
|
+
});
|
|
26
|
+
it('resolves a slug to the matching project UUID', async () => {
|
|
27
|
+
mockOrgProjects([
|
|
28
|
+
{ projectUuid: OTHER_UUID, slug: 'other', name: 'Other' },
|
|
29
|
+
{ projectUuid: PROJECT_UUID, slug: 'jaffle-shop', name: 'Jaffle' },
|
|
30
|
+
]);
|
|
31
|
+
await expect((0, resolveProjectFlag_1.resolveProjectFlag)('jaffle-shop')).resolves.toBe(PROJECT_UUID);
|
|
32
|
+
expect(mockLightdashApi).toHaveBeenCalledWith(expect.objectContaining({ url: '/api/v1/org/projects' }));
|
|
33
|
+
});
|
|
34
|
+
it('fails with an actionable error for an unknown slug', async () => {
|
|
35
|
+
mockOrgProjects([
|
|
36
|
+
{ projectUuid: PROJECT_UUID, slug: 'jaffle-shop', name: 'Jaffle' },
|
|
37
|
+
{ projectUuid: OTHER_UUID, name: 'No slug' },
|
|
38
|
+
]);
|
|
39
|
+
await expect((0, resolveProjectFlag_1.resolveProjectFlag)('missing')).rejects.toThrow(common_1.ParameterError);
|
|
40
|
+
});
|
|
41
|
+
it('fails when a slug matches more than one project', async () => {
|
|
42
|
+
mockOrgProjects([
|
|
43
|
+
{ projectUuid: PROJECT_UUID, slug: 'dup', name: 'A' },
|
|
44
|
+
{ projectUuid: OTHER_UUID, slug: 'dup', name: 'B' },
|
|
45
|
+
]);
|
|
46
|
+
await expect((0, resolveProjectFlag_1.resolveProjectFlag)('dup')).rejects.toThrow(/more than one project/);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectProject.d.ts","sourceRoot":"","sources":["../../src/handlers/selectProject.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAuB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"selectProject.d.ts","sourceRoot":"","sources":["../../src/handlers/selectProject.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAuB,MAAM,WAAW,CAAC;AAMxD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAmCF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,WACd,MAAM,oBACI,MAAM,KACzB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAmFtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,cAChB,gBAAgB,UACnB,MAAM,UACN,MAAM,KACf,IAsBF,CAAC"}
|
|
@@ -8,6 +8,7 @@ const config_1 = require("../config");
|
|
|
8
8
|
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
9
9
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
10
10
|
const apiClient_1 = require("./dbt/apiClient");
|
|
11
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
11
12
|
const validatePreviewProject = async (previewProjectUuid) => {
|
|
12
13
|
if (!previewProjectUuid) {
|
|
13
14
|
return undefined;
|
|
@@ -45,7 +46,10 @@ const validatePreviewProject = async (previewProjectUuid) => {
|
|
|
45
46
|
const selectProject = async (config, explicitProject) => {
|
|
46
47
|
// If explicit project provided via --project flag, use it
|
|
47
48
|
if (explicitProject) {
|
|
48
|
-
return {
|
|
49
|
+
return {
|
|
50
|
+
projectUuid: await (0, resolveProjectFlag_1.resolveProjectFlag)(explicitProject),
|
|
51
|
+
isPreview: false,
|
|
52
|
+
};
|
|
49
53
|
}
|
|
50
54
|
const mainProject = config.context?.project;
|
|
51
55
|
const previewProject = await validatePreviewProject(config.context?.previewProject);
|
|
@@ -3,7 +3,7 @@ type SetProjectOptions = {
|
|
|
3
3
|
name: string;
|
|
4
4
|
uuid: string;
|
|
5
5
|
};
|
|
6
|
-
export declare const setProjectCommand: (name?: string,
|
|
6
|
+
export declare const setProjectCommand: (name?: string, uuidOrSlug?: string) => Promise<'selected' | 'skipped' | 'empty'>;
|
|
7
7
|
export declare const setFirstProject: () => Promise<void>;
|
|
8
8
|
export declare const setProjectHandler: (options: SetProjectOptions) => Promise<void>;
|
|
9
9
|
export declare const unsetProjectHandler: (options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setProject.d.ts","sourceRoot":"","sources":["../../src/handlers/setProject.ts"],"names":[],"mappings":"AAQA,KAAK,iBAAiB,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"setProject.d.ts","sourceRoot":"","sources":["../../src/handlers/setProject.ts"],"names":[],"mappings":"AAQA,KAAK,iBAAiB,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,iBAAiB,UACnB,MAAM,eACA,MAAM,KACpB,OAAO,CAAC,UAAU,GAAG,SAAS,GAAG,OAAO,CAoF1C,CAAC;AAEF,eAAO,MAAM,eAAe,qBAmB3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,YAAmB,iBAAiB,kBAsBjE,CAAC;AAOF,eAAO,MAAM,mBAAmB,YAAmB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,kBAmBtE,CAAC"}
|
|
@@ -9,7 +9,7 @@ const analytics_1 = require("../analytics/analytics");
|
|
|
9
9
|
const config_1 = require("../config");
|
|
10
10
|
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
11
11
|
const apiClient_1 = require("./dbt/apiClient");
|
|
12
|
-
const setProjectCommand = async (name,
|
|
12
|
+
const setProjectCommand = async (name, uuidOrSlug) => {
|
|
13
13
|
const projects = await (0, apiClient_1.lightdashApi)({
|
|
14
14
|
method: 'GET',
|
|
15
15
|
url: `/api/v1/org/projects`,
|
|
@@ -25,8 +25,10 @@ const setProjectCommand = async (name, uuid) => {
|
|
|
25
25
|
return 'empty';
|
|
26
26
|
let selectedProject;
|
|
27
27
|
// --uuid or --name options
|
|
28
|
-
if (
|
|
29
|
-
const matchedProject = projects.find((project) => project.name === name ||
|
|
28
|
+
if (uuidOrSlug !== undefined || name !== undefined) {
|
|
29
|
+
const matchedProject = projects.find((project) => project.name === name ||
|
|
30
|
+
project.projectUuid === uuidOrSlug ||
|
|
31
|
+
(uuidOrSlug !== undefined && project.slug === uuidOrSlug));
|
|
30
32
|
if (matchedProject?.type === common_1.ProjectType.PREVIEW) {
|
|
31
33
|
throw new Error(`Project "${matchedProject.name}" is a preview project and cannot be set as the default project. Use \`lightdash start-preview\` to work with preview projects.`);
|
|
32
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setWarehouse.d.ts","sourceRoot":"","sources":["../../src/handlers/setWarehouse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setWarehouse.d.ts","sourceRoot":"","sources":["../../src/handlers/setWarehouse.ts"],"names":[],"mappings":"AAcA,KAAK,0BAA0B,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAeF,eAAO,MAAM,mBAAmB,YACnB,0BAA0B,kBAyFtC,CAAC"}
|
|
@@ -10,13 +10,14 @@ const styles = tslib_1.__importStar(require("../styles"));
|
|
|
10
10
|
const createProject_1 = require("./createProject");
|
|
11
11
|
const apiClient_1 = require("./dbt/apiClient");
|
|
12
12
|
const refresh_1 = require("./dbt/refresh");
|
|
13
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
13
14
|
const resolveProjectUuid = async (projectOption) => {
|
|
14
15
|
if (projectOption) {
|
|
15
|
-
return projectOption;
|
|
16
|
+
return (0, resolveProjectFlag_1.resolveProjectFlag)(projectOption);
|
|
16
17
|
}
|
|
17
18
|
const config = await (0, config_1.getConfig)();
|
|
18
19
|
if (!config.context?.project) {
|
|
19
|
-
throw new common_1.AuthorizationError(`No project selected. Run 'lightdash config set-project' first or pass '--project <uuid>'.`);
|
|
20
|
+
throw new common_1.AuthorizationError(`No project selected. Run 'lightdash config set-project' first or pass '--project <uuid or slug>'.`);
|
|
20
21
|
}
|
|
21
22
|
return config.context.project;
|
|
22
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/handlers/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,OAAO,EACP,YAAY,EASZ,kBAAkB,EAElB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAW,qBAAqB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/handlers/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,OAAO,EACP,YAAY,EASZ,kBAAkB,EAElB,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAW,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAU3D,eAAO,MAAM,iBAAiB,gBACb,MAAM,YACT,CAAC,OAAO,GAAG,YAAY,CAAC,EAAE,qBACjB,gBAAgB,EAAE;;EAMnC,CAAC;AAEP,eAAO,MAAM,WAAW,YAAmB,MAAM;;;EAK3C,CAAC;AAEP,eAAO,MAAM,aAAa,gBAAuB,MAAM,SAAS,MAAM,8DAKhE,CAAC;AAmCP,eAAO,MAAM,qBAAqB,YAAI,OAAO,EAAE,SAAS,CAAU,CAAC;AACnE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,eAAO,MAAM,6CAA6C,2FACkC,CAAC;AAE7F,KAAK,sBAAsB,GAAG,qBAAqB,GAAG;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,wBAAwB,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,uBAAuB,CACnC,OAAO,EAAE,IAAI,CACT,sBAAsB,EACtB,UAAU,GAAG,gCAAgC,CAChD,GACF,kBAAkB,CAKpB;AAED,KAAK,wBAAwB,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,iBAAiB,iDAI3B,wBAAwB,KAAG,OAAO,CAAC,MAAM,CAY3C,CAAC;AAEF,eAAO,MAAM,eAAe,oBACP,sBAAsB,kBAuY1C,CAAC"}
|
|
@@ -12,6 +12,7 @@ const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
|
12
12
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
13
13
|
const compile_1 = require("./compile");
|
|
14
14
|
const apiClient_1 = require("./dbt/apiClient");
|
|
15
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
15
16
|
const timestampConversion_1 = require("./timestampConversion");
|
|
16
17
|
const validateSpaceFilter_1 = require("./validateSpaceFilter");
|
|
17
18
|
const requestValidation = async (projectUuid, explores, validationTargets) => (0, apiClient_1.lightdashApi)({
|
|
@@ -95,9 +96,11 @@ const validateHandler = async (originalOptions) => {
|
|
|
95
96
|
const selectedProject = options.preview
|
|
96
97
|
? config.context?.previewProject
|
|
97
98
|
: config.context?.project;
|
|
98
|
-
const projectUuid = options.project
|
|
99
|
+
const projectUuid = options.project
|
|
100
|
+
? await (0, resolveProjectFlag_1.resolveProjectFlag)(options.project)
|
|
101
|
+
: selectedProject;
|
|
99
102
|
if (projectUuid === undefined) {
|
|
100
|
-
throw new common_1.ParameterError(`No project specified, select a project to validate using ${styles.bold(`--project <
|
|
103
|
+
throw new common_1.ParameterError(`No project specified, select a project to validate using ${styles.bold(`--project <project uuid or slug>`)} or create a preview environment using ${styles.bold(`lightdash start-preview`)} or configure your default project using ${styles.bold(`lightdash config set-project`)}`);
|
|
101
104
|
}
|
|
102
105
|
const isPreview = projectUuid === config.context?.previewProject;
|
|
103
106
|
if (isPreview) {
|
|
@@ -12,7 +12,7 @@ vi.mock('./compile');
|
|
|
12
12
|
vi.mock('./dbt/apiClient');
|
|
13
13
|
vi.mock('./timestampConversion');
|
|
14
14
|
const baseOptions = {
|
|
15
|
-
project: '
|
|
15
|
+
project: '11111111-1111-4111-8111-111111111111',
|
|
16
16
|
preview: false,
|
|
17
17
|
only: Object.values(common_1.ValidationTarget),
|
|
18
18
|
validateWarehouseColumns: false,
|
|
@@ -47,7 +47,7 @@ const chartConfigurationWarning = {
|
|
|
47
47
|
validationUuid: 'warning-uuid',
|
|
48
48
|
validationId: null,
|
|
49
49
|
createdAt: new Date('2026-08-26T12:00:00Z'),
|
|
50
|
-
projectUuid: '
|
|
50
|
+
projectUuid: '11111111-1111-4111-8111-111111111111',
|
|
51
51
|
name: 'Orders over time',
|
|
52
52
|
error: 'dimension is not used in the chart configuration',
|
|
53
53
|
errorType: common_1.ValidationErrorType.ChartConfiguration,
|
|
@@ -62,7 +62,7 @@ const brokenChartError = {
|
|
|
62
62
|
validationUuid: 'error-uuid',
|
|
63
63
|
validationId: null,
|
|
64
64
|
createdAt: new Date('2026-08-26T12:00:00Z'),
|
|
65
|
-
projectUuid: '
|
|
65
|
+
projectUuid: '11111111-1111-4111-8111-111111111111',
|
|
66
66
|
name: 'Broken chart',
|
|
67
67
|
error: 'Dimension does not exist',
|
|
68
68
|
errorType: common_1.ValidationErrorType.Dimension,
|
|
@@ -207,7 +207,7 @@ describe('validateHandler warehouse column validation', () => {
|
|
|
207
207
|
validationUuid: 'validation-uuid',
|
|
208
208
|
validationId: null,
|
|
209
209
|
createdAt: new Date('2026-08-07T09:00:00Z'),
|
|
210
|
-
projectUuid: '
|
|
210
|
+
projectUuid: '11111111-1111-4111-8111-111111111111',
|
|
211
211
|
name: 'Broken data app',
|
|
212
212
|
error: 'Dimension does not exist',
|
|
213
213
|
errorType: common_1.ValidationErrorType.Dimension,
|