@lightdash/cli 2.157.1 → 2.159.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.
Files changed (36) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/handlers/apps/preview.d.ts.map +1 -1
  3. package/dist/handlers/apps/preview.js +5 -2
  4. package/dist/handlers/apps/preview.test.js +1 -1
  5. package/dist/handlers/download.d.ts +2 -0
  6. package/dist/handlers/download.d.ts.map +1 -1
  7. package/dist/handlers/download.js +3 -2
  8. package/dist/handlers/download.test.js +23 -6
  9. package/dist/handlers/exportChartImage.d.ts.map +1 -1
  10. package/dist/handlers/exportChartImage.js +6 -3
  11. package/dist/handlers/listProjects.d.ts.map +1 -1
  12. package/dist/handlers/listProjects.js +3 -0
  13. package/dist/handlers/preAggregateAudit.d.ts.map +1 -1
  14. package/dist/handlers/preAggregateAudit.js +3 -2
  15. package/dist/handlers/renameHandler.d.ts.map +1 -1
  16. package/dist/handlers/renameHandler.js +4 -3
  17. package/dist/handlers/renameHandler.test.js +2 -2
  18. package/dist/handlers/resolveProjectFlag.d.ts +6 -0
  19. package/dist/handlers/resolveProjectFlag.d.ts.map +1 -0
  20. package/dist/handlers/resolveProjectFlag.js +36 -0
  21. package/dist/handlers/resolveProjectFlag.test.d.ts +2 -0
  22. package/dist/handlers/resolveProjectFlag.test.d.ts.map +1 -0
  23. package/dist/handlers/resolveProjectFlag.test.js +48 -0
  24. package/dist/handlers/selectProject.d.ts.map +1 -1
  25. package/dist/handlers/selectProject.js +5 -1
  26. package/dist/handlers/selectProject.test.js +26 -0
  27. package/dist/handlers/setProject.d.ts +1 -1
  28. package/dist/handlers/setProject.d.ts.map +1 -1
  29. package/dist/handlers/setProject.js +5 -3
  30. package/dist/handlers/setWarehouse.d.ts.map +1 -1
  31. package/dist/handlers/setWarehouse.js +3 -2
  32. package/dist/handlers/validate.d.ts.map +1 -1
  33. package/dist/handlers/validate.js +5 -2
  34. package/dist/handlers/validate.test.js +4 -4
  35. package/dist/index.js +14 -16
  36. 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;AAc3B;;;;;;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,CA2Id,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":"AAEA,OAAO,EACH,WAAW,EA0BX,WAAW,EAIX,eAAe,EAGf,wBAAwB,EAoBxB,KAAK,WAAW,EACnB,MAAM,mBAAmB,CAAC;AAiB3B,OAAO,EAIH,KAAK,0BAA0B,EAClC,MAAM,iCAAiC,CAAC;AAoEzC,OAAO,EACH,sBAAsB,EAGtB,cAAc,EACd,qBAAqB,EAKrB,cAAc,EACd,cAAc,EACd,8BAA8B,EAC9B,yBAAyB,EACzB,YAAY,EACZ,qBAAqB,EACrB,eAAe,EAElB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAIF,QAAA,MAAM,sBAAsB,qDAKzB,IAAI,CACH,sBAAsB,EACtB,YAAY,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,CACzD,KAAG,OAEoE,CAAC;AAEzE,QAAA,MAAM,iBAAiB,gJAYpB,IAAI,CACH,sBAAsB,EACpB,YAAY,GACZ,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,qBAAqB,GACrB,cAAc,GACd,qBAAqB,GACrB,MAAM,GACN,YAAY,CACjB,KAAG,OAauC,CAAC;AAgF5C,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,wBAAwB,UACnB,WAAW,oBACA,OAAO,KAC1B,WAUY,CAAC;AA6YhB,KAAK,mBAAmB,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAkDjE,QAAA,MAAM,6BAA6B,eACnB,eAAe,EAAE,KAC9B,MAAM,EAWR,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,8BAA8B,WAAY,WAAW,EAAE,KAAG,MAAM,EAUrE,CAAC;AAIF,QAAA,MAAM,sBAAsB,WAAY,WAAW,EAAE,KAAG,MAAM,EAM7D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAGnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,eAAe,QACnB,MAAM,EAAE,QACP,mBAAmB,aACd,MAAM,eACJ,MAAM,eACN,MAAM,gBACN,OAAO,WACZ,OAAO,eACH,OAAO,qBACD,OAAO,eACb,OAAO,eACN,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KACtC,OAAO,CAAC,qBAAqB,CA6J/B,CAAC;AAsDF,QAAA,MAAM,8BAA8B,UAAW,OAAO,KAAG,OACmB,CAAC;AAE7E;;;;;GAKG;AACH,QAAA,MAAM,0BAA0B,cACjB,MAAM,cACL,MAAM,EAAE,eACP,MAAM,KACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAoCvB,CAAC;AAaF,QAAA,MAAM,kBAAkB,cACT,MAAM,SACV,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,aACH,OAAO,eACL,MAAM,mBACH,MAAM,EAAE,KACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmEhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,SAAU,MAAM,KAAG,MAGzC,CAAC;AASzB;;;;;;GAMG;AACH,QAAA,MAAM,qCAAqC,UAAW,OAAO,KAAG,OAElB,CAAC;AAE/C,QAAA,MAAM,0BAA0B,UAAW,OAAO,KAAG,OAEP,CAAC;AA8E/C,QAAA,MAAM,2BAA2B,gBAChB,MAAM,KACpB,OAAO,CAAC,wBAAwB,EAAE,CAOpC,CAAC;AAEF,QAAA,MAAM,yBAAyB,cAChB,MAAM,SACV,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,aACH,OAAO,eACL,MAAM,KACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8EhC,CAAC;AAgDF,QAAA,MAAM,gBAAgB,cACP,MAAM,OACZ,MAAM,EAAE,YACH,OAAO,eACJ,MAAM,KACpB,OAAO,CAAC,MAAM,CAqDhB,CAAC;AAEF,QAAA,MAAM,gBAAgB,gBACL,MAAM,KACpB,OAAO,CAAC,WAAW,EAAE,CAOvB,CAAC;AAcF,QAAA,MAAM,cAAc,cACL,MAAM,SACV,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,eACD,MAAM,aACT,OAAO,KAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDhC,CAAC;AAgLF,eAAO,MAAM,eAAe,YACf,sBAAsB,KAChC,OAAO,CAAC,IAAI,CAglCd,CAAC;AA8BF,QAAA,MAAM,gBAAgB,WACV,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,MAIM,CAAC;AAEV,QAAA,MAAM,sBAAsB,WAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,0BAA0B,CAAA;CAoBxD,CAAC;AAwMF;;;GAGG;AACH,QAAA,MAAM,eAAe,GAAU,CAAC,SAAS,WAAW,GAAG,eAAe,QAC5D,QAAQ,GAAG,YAAY,aAClB,MAAM,WACR,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,SACP,MAAM,EAAE,aACJ,OAAO,eACL,MAAM,oBACD,OAAO,sBACL,OAAO,aAChB,OAAO,gBACL,MAAM,eACP,CAAC,CAAC,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,eACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cACvB,WAAW,CAAC,MAAM,CAAC,KAChC,OAAO,CAAC;IACP,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB,CA+LA,CAAC;AA8DF,QAAA,MAAM,2BAA2B,gEAK9B;IACC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC5B,KAAG,MAAM,EAWT,CAAC;AAEF,QAAA,MAAM,sBAAsB,mBACR,MAAM,EAAE,eACX,MAAM,oBACF,CAAC,eAAe,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,KAClE,OAAO,CAAC,MAAM,EAAE,CAId,CAAC;AAEN,QAAA,MAAM,oBAAoB,mBACN,MAAM,EAAE,eACX,MAAM,oBACF,CAAC,eAAe,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,KAClE,OAAO,CAAC,MAAM,EAAE,CAId,CAAC;AAIN,QAAA,MAAM,0BAA0B,eAChB,OAAO,kBACH,MAAM,EAAE,KACzB,OAAoD,CAAC;AAExD,QAAA,MAAM,yBAAyB,gBACd,MAAM,KACpB,OAAO,CAAC,IAAI,CA6Bd,CAAC;AAoCF,eAAO,MAAM,aAAa,YACb,sBAAsB,KAChC,OAAO,CAAC,IAAI,CA+pCd,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCvB,CAAC"}
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 uuidMatch = item.match(/https?:\/\/.+\/(?:saved|dashboards)\/([a-f0-9-]+)/i);
60
- return uuidMatch ? uuidMatch[1] : item;
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":"AAQA,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,CA+Cd,CAAC"}
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 projectUuid = options.project ??
17
- (!isChartUuid ? (await (0, config_1.getConfig)()).context?.project : undefined);
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,kBAkDrE,CAAC"}
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;AAM3B,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"}
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;AAkB3B,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,kBAoNhE,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
- config.context.previewProject ||
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: 'test-project-uuid',
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: 'test-project-uuid',
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolveProjectFlag.test.d.ts.map
@@ -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;AAKxD,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,CAgFtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,cAChB,gBAAgB,UACnB,MAAM,UACN,MAAM,KACf,IAsBF,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 { projectUuid: explicitProject, isPreview: false };
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);
@@ -45,6 +45,32 @@ describe('selectProject', () => {
45
45
  isPreview: true,
46
46
  });
47
47
  });
48
+ it('uses an explicit --project UUID as-is, without any API call, even when a preview is active', async () => {
49
+ const config = {
50
+ context: {
51
+ project: MAIN_UUID,
52
+ previewProject: PREVIEW_UUID,
53
+ },
54
+ };
55
+ const explicitUuid = '00000000-0000-0000-0000-000000000003';
56
+ const selection = await (0, selectProject_1.selectProject)(config, explicitUuid);
57
+ expect(selection).toEqual({
58
+ projectUuid: explicitUuid,
59
+ isPreview: false,
60
+ });
61
+ expect(mockLightdashApi).not.toHaveBeenCalled();
62
+ });
63
+ it('resolves an explicit --project slug through the org projects list', async () => {
64
+ const config = {
65
+ context: { project: MAIN_UUID },
66
+ };
67
+ mockLightdashApi.mockResolvedValueOnce([
68
+ { projectUuid: PREVIEW_UUID, slug: 'other', name: 'Other' },
69
+ { projectUuid: MAIN_UUID, slug: 'jaffle-shop', name: 'Jaffle' },
70
+ ]);
71
+ const selection = await (0, selectProject_1.selectProject)(config, 'jaffle-shop');
72
+ expect(selection).toEqual({ projectUuid: MAIN_UUID, isPreview: false });
73
+ });
48
74
  it('returns the main project when only the main project is configured', async () => {
49
75
  const config = {
50
76
  context: {
@@ -3,7 +3,7 @@ type SetProjectOptions = {
3
3
  name: string;
4
4
  uuid: string;
5
5
  };
6
- export declare const setProjectCommand: (name?: string, uuid?: string) => Promise<'selected' | 'skipped' | 'empty'>;
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,SACN,MAAM,KACd,OAAO,CAAC,UAAU,GAAG,SAAS,GAAG,OAAO,CAiF1C,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"}
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, uuid) => {
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 (uuid !== undefined || name !== undefined) {
29
- const matchedProject = projects.find((project) => project.name === name || project.projectUuid === uuid);
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":"AAaA,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"}
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;AAS3D,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,kBAqY1C,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 || selectedProject;
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 <projectUuid>`)} or create a preview environment using ${styles.bold(`lightdash start-preview`)} or configure your default project using ${styles.bold(`lightdash config set-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: 'test-project-uuid',
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: 'test-project-uuid',
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: 'test-project-uuid',
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: 'test-project-uuid',
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,