@lightdash/cli 2.472.0 → 2.473.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/README.md +21 -0
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/handlers/agentAccess.d.ts +8 -0
- package/dist/handlers/agentAccess.d.ts.map +1 -0
- package/dist/handlers/agentAccess.js +23 -0
- package/dist/handlers/agentAccess.mock.d.ts +6 -0
- package/dist/handlers/agentAccess.mock.d.ts.map +1 -0
- package/dist/handlers/agentAccess.mock.js +30 -0
- package/dist/handlers/agentConnect.d.ts +8 -0
- package/dist/handlers/agentConnect.d.ts.map +1 -0
- package/dist/handlers/agentConnect.js +164 -0
- package/dist/handlers/agentStatus.d.ts +3 -0
- package/dist/handlers/agentStatus.d.ts.map +1 -0
- package/dist/handlers/agentStatus.js +28 -0
- package/dist/index.js +37 -7
- package/package.json +3 -3
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AiAccessForUser } from '@lightdash/common';
|
|
2
|
+
export type AgentOptions = {
|
|
3
|
+
project?: string;
|
|
4
|
+
verbose: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const resolveAgentProject: (project?: string) => Promise<string>;
|
|
7
|
+
export declare const getAgentAccess: (projectUuid: string) => Promise<AiAccessForUser>;
|
|
8
|
+
//# sourceMappingURL=agentAccess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentAccess.d.ts","sourceRoot":"","sources":["../../src/handlers/agentAccess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzE,MAAM,MAAM,YAAY,GAAG;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAClB,MAAM,KACjB,OAAO,CAAC,MAAM,CAShB,CAAC;AAEF,eAAO,MAAM,cAAc,gBAAiB,MAAM,KAAG,OAAO,CAAC,eAAe,CAKtE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAgentAccess = exports.resolveAgentProject = void 0;
|
|
4
|
+
const common_1 = require("@lightdash/common");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
const apiClient_1 = require("./dbt/apiClient");
|
|
7
|
+
const resolveProjectFlag_1 = require("./resolveProjectFlag");
|
|
8
|
+
const resolveAgentProject = async (project) => {
|
|
9
|
+
if (project !== undefined)
|
|
10
|
+
return (0, resolveProjectFlag_1.resolveProjectFlag)(project);
|
|
11
|
+
const config = await (0, config_1.getConfig)();
|
|
12
|
+
if (!config.context?.project) {
|
|
13
|
+
throw new common_1.ParameterError('No project selected. Run `lightdash config set-project` or pass --project <uuid or slug>.');
|
|
14
|
+
}
|
|
15
|
+
return config.context.project;
|
|
16
|
+
};
|
|
17
|
+
exports.resolveAgentProject = resolveAgentProject;
|
|
18
|
+
const getAgentAccess = (projectUuid) => (0, apiClient_1.lightdashApi)({
|
|
19
|
+
method: 'GET',
|
|
20
|
+
url: `/api/v2/projects/${projectUuid}/ai-access/me`,
|
|
21
|
+
body: undefined,
|
|
22
|
+
});
|
|
23
|
+
exports.getAgentAccess = getAgentAccess;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AiAccessForUser } from '@lightdash/common';
|
|
2
|
+
export declare const agentProjectUuid = "00000000-0000-0000-0000-000000000001";
|
|
3
|
+
export declare const agentConnectUrl = "https://example.com/agent/connect?project=00000000-0000-0000-0000-000000000001&redirect=/agent-connected";
|
|
4
|
+
export declare const agentAccess: AiAccessForUser;
|
|
5
|
+
export declare const connectedAgentAccess: AiAccessForUser;
|
|
6
|
+
//# sourceMappingURL=agentAccess.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentAccess.mock.d.ts","sourceRoot":"","sources":["../../src/handlers/agentAccess.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,eAAe,EACvB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,gBAAgB,yCAAyC,CAAC;AACvE,eAAO,MAAM,eAAe,6GAA4F,CAAC;AACzH,eAAO,MAAM,WAAW,EAAE,eAkBzB,CAAC;AACF,eAAO,MAAM,oBAAoB,EAAE,eAKlC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.connectedAgentAccess = exports.agentAccess = exports.agentConnectUrl = exports.agentProjectUuid = void 0;
|
|
4
|
+
const common_1 = require("@lightdash/common");
|
|
5
|
+
exports.agentProjectUuid = '00000000-0000-0000-0000-000000000001';
|
|
6
|
+
exports.agentConnectUrl = `https://example.com/agent/connect?project=${exports.agentProjectUuid}&redirect=/agent-connected`;
|
|
7
|
+
exports.agentAccess = {
|
|
8
|
+
projectUuid: exports.agentProjectUuid,
|
|
9
|
+
expiresAt: null,
|
|
10
|
+
requirementSource: 'organization',
|
|
11
|
+
identity: null,
|
|
12
|
+
marker: null,
|
|
13
|
+
warehouseConnectionUuid: null,
|
|
14
|
+
enabled: false,
|
|
15
|
+
principalKind: 'person',
|
|
16
|
+
refusal: {
|
|
17
|
+
code: 'ai_access_refused',
|
|
18
|
+
reason: common_1.AiAccessRefusalReason.NEEDS_SIGN_IN,
|
|
19
|
+
action: common_1.AiAccessRefusalAction.SIGN_IN,
|
|
20
|
+
message: 'Connect your agent to the warehouse once so it can run as you.',
|
|
21
|
+
settingsUrl: null,
|
|
22
|
+
connectUrl: exports.agentConnectUrl,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
exports.connectedAgentAccess = {
|
|
26
|
+
...exports.agentAccess,
|
|
27
|
+
identity: 'connected_person',
|
|
28
|
+
enabled: true,
|
|
29
|
+
refusal: null,
|
|
30
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AgentOptions } from './agentAccess';
|
|
2
|
+
type AgentConnectOptions = AgentOptions & {
|
|
3
|
+
oauthPort?: number;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const agentConnectHandler: (options: AgentConnectOptions) => Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=agentConnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentConnect.d.ts","sourceRoot":"","sources":["../../src/handlers/agentConnect.ts"],"names":[],"mappings":"AAQA,OAAO,EAGH,KAAK,YAAY,EACpB,MAAM,eAAe,CAAC;AAGvB,KAAK,mBAAmB,GAAG,YAAY,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyCF,eAAO,MAAM,mBAAmB,YACnB,mBAAmB,KAC7B,OAAO,CAAC,IAAI,CA4Id,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.agentConnectHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@lightdash/common");
|
|
6
|
+
const http = tslib_1.__importStar(require("http"));
|
|
7
|
+
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
8
|
+
const styles = tslib_1.__importStar(require("../styles"));
|
|
9
|
+
const agentAccess_1 = require("./agentAccess");
|
|
10
|
+
const oauth_1 = require("./login/oauth");
|
|
11
|
+
const getFailureReason = (error) => {
|
|
12
|
+
switch (error) {
|
|
13
|
+
case 'not_agent_session':
|
|
14
|
+
return 'Your Snowflake sign-in is not an agent session. Ask your Snowflake admin to set IS_AGENTIC = TRUE on the security integration used for AI.';
|
|
15
|
+
case 'no_refresh_token':
|
|
16
|
+
return 'Snowflake did not return a refresh token. Try again.';
|
|
17
|
+
case 'license_required':
|
|
18
|
+
return 'An enterprise licence is required.';
|
|
19
|
+
default:
|
|
20
|
+
return 'The sign-in did not complete. Try again.';
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const pollForConnection = async (projectUuid) => {
|
|
24
|
+
const deadline = Date.now() + 120_000;
|
|
25
|
+
const poll = async () => {
|
|
26
|
+
await new Promise((resolve) => {
|
|
27
|
+
setTimeout(resolve, Math.min(3000, deadline - Date.now()));
|
|
28
|
+
});
|
|
29
|
+
const remaining = deadline - Date.now();
|
|
30
|
+
if (remaining <= 0)
|
|
31
|
+
return false;
|
|
32
|
+
let timer;
|
|
33
|
+
try {
|
|
34
|
+
const access = await Promise.race([
|
|
35
|
+
(0, agentAccess_1.getAgentAccess)(projectUuid),
|
|
36
|
+
new Promise((resolve) => {
|
|
37
|
+
timer = setTimeout(() => resolve(undefined), remaining);
|
|
38
|
+
}),
|
|
39
|
+
]);
|
|
40
|
+
if (access === undefined)
|
|
41
|
+
return false;
|
|
42
|
+
if (access.refusal === null)
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
}
|
|
48
|
+
return poll();
|
|
49
|
+
};
|
|
50
|
+
return poll();
|
|
51
|
+
};
|
|
52
|
+
const agentConnectHandler = async (options) => {
|
|
53
|
+
globalState_1.default.setVerbose(options.verbose);
|
|
54
|
+
const projectUuid = await (0, agentAccess_1.resolveAgentProject)(options.project);
|
|
55
|
+
const access = await (0, agentAccess_1.getAgentAccess)(projectUuid);
|
|
56
|
+
if (access.refusal === null && access.identity === 'connected_person') {
|
|
57
|
+
console.error('Agent already connected');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (access.requirementSource === null) {
|
|
61
|
+
console.error('Agent connection is not required for this project');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (access.refusal?.action !== 'sign_in' || !access.refusal.connectUrl) {
|
|
65
|
+
console.error(access.refusal?.message ?? 'Agent not connected');
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const timeout = options.timeout ?? 180;
|
|
70
|
+
if (!Number.isFinite(timeout) ||
|
|
71
|
+
timeout <= 0 ||
|
|
72
|
+
timeout * 1000 > 2_147_483_647) {
|
|
73
|
+
throw new common_1.ParameterError('Timeout must be a positive number of seconds no greater than 2147483.647');
|
|
74
|
+
}
|
|
75
|
+
const port = options.oauthPort ??
|
|
76
|
+
(process.env.LIGHTDASH_OAUTH_PORT
|
|
77
|
+
? Number(process.env.LIGHTDASH_OAUTH_PORT)
|
|
78
|
+
: 0);
|
|
79
|
+
if (!Number.isInteger(port) ||
|
|
80
|
+
port < 0 ||
|
|
81
|
+
port > 65535 ||
|
|
82
|
+
(port === 0 &&
|
|
83
|
+
(options.oauthPort !== undefined ||
|
|
84
|
+
process.env.LIGHTDASH_OAUTH_PORT))) {
|
|
85
|
+
throw new common_1.ParameterError('OAuth port must be a number between 1 and 65535');
|
|
86
|
+
}
|
|
87
|
+
let resolveCallback;
|
|
88
|
+
let rejectCallback;
|
|
89
|
+
const callback = new Promise((resolve, reject) => {
|
|
90
|
+
resolveCallback = resolve;
|
|
91
|
+
rejectCallback = reject;
|
|
92
|
+
}).then(() => ({ status: 'connected' }), (error) => ({ status: 'failed', code: error.message }));
|
|
93
|
+
const server = http.createServer((req, res) => {
|
|
94
|
+
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
95
|
+
if (req.method !== 'GET' || url.pathname !== '/done') {
|
|
96
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
97
|
+
res.end('Not Found');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const error = url.searchParams.get('error');
|
|
101
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
102
|
+
if (error !== null) {
|
|
103
|
+
res.writeHead(400);
|
|
104
|
+
res.end((0, common_1.generateOAuthErrorResponse)('Agent connection failed', [
|
|
105
|
+
getFailureReason(error),
|
|
106
|
+
]));
|
|
107
|
+
rejectCallback(new Error(error));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
res.writeHead(200);
|
|
111
|
+
res.end((0, common_1.generateOAuthSuccessResponse)('Agent connected.', [
|
|
112
|
+
'You can close this tab.',
|
|
113
|
+
]));
|
|
114
|
+
resolveCallback();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
let timer;
|
|
118
|
+
try {
|
|
119
|
+
await new Promise((resolve, reject) => {
|
|
120
|
+
server.once('error', reject);
|
|
121
|
+
server.listen(port, 'localhost', resolve);
|
|
122
|
+
});
|
|
123
|
+
const address = server.address();
|
|
124
|
+
if (!address || typeof address === 'string') {
|
|
125
|
+
throw new common_1.ParameterError('Could not start the agent callback server');
|
|
126
|
+
}
|
|
127
|
+
const redirect = `http://localhost:${address.port}/done`;
|
|
128
|
+
globalState_1.default.debug(`> Agent callback server listening on ${redirect}`);
|
|
129
|
+
const connectUrl = new URL(access.refusal.connectUrl);
|
|
130
|
+
connectUrl.searchParams.set('redirect', redirect);
|
|
131
|
+
const result = Promise.race([
|
|
132
|
+
callback,
|
|
133
|
+
new Promise((resolve) => {
|
|
134
|
+
timer = setTimeout(() => resolve({ status: 'timeout' }), timeout * 1000);
|
|
135
|
+
}),
|
|
136
|
+
]);
|
|
137
|
+
console.error(`\n${styles.title('🔐 Agent connection')}`);
|
|
138
|
+
console.error('Opening browser for authentication...');
|
|
139
|
+
console.error("If the browser doesn't open automatically, please visit:");
|
|
140
|
+
console.error(`${styles.secondary(connectUrl.href)}\n`);
|
|
141
|
+
await (0, oauth_1.openBrowser)(connectUrl.href);
|
|
142
|
+
const outcome = await result;
|
|
143
|
+
if (outcome.status === 'failed') {
|
|
144
|
+
console.error(`Agent connection failed: ${getFailureReason(outcome.code)}`);
|
|
145
|
+
process.exitCode = 1;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (outcome.status === 'connected' ||
|
|
149
|
+
(await pollForConnection(projectUuid))) {
|
|
150
|
+
console.error('Agent connected');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
console.error('Agent connection did not complete. Run `lightdash agent status` after you approve in the browser.');
|
|
154
|
+
process.exitCode = 1;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
clearTimeout(timer);
|
|
158
|
+
await new Promise((resolve) => {
|
|
159
|
+
server.close(() => resolve());
|
|
160
|
+
server.closeAllConnections();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
exports.agentConnectHandler = agentConnectHandler;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentStatus.d.ts","sourceRoot":"","sources":["../../src/handlers/agentStatus.ts"],"names":[],"mappings":"AACA,OAAO,EAGH,KAAK,YAAY,EACpB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,kBAAkB,YAClB,YAAY,KACtB,OAAO,CAAC,IAAI,CAsBd,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.agentStatusHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
6
|
+
const agentAccess_1 = require("./agentAccess");
|
|
7
|
+
const agentStatusHandler = async (options) => {
|
|
8
|
+
globalState_1.default.setVerbose(options.verbose);
|
|
9
|
+
const access = await (0, agentAccess_1.getAgentAccess)(await (0, agentAccess_1.resolveAgentProject)(options.project));
|
|
10
|
+
if (access.refusal === null && access.identity === 'connected_person') {
|
|
11
|
+
console.error(`Agent connected${access.expiresAt ? `, expires ${new Date(access.expiresAt).toISOString()}` : ''}`);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (access.requirementSource === null) {
|
|
15
|
+
console.error('Agent connection not required for this project');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (access.refusal?.action === 'sign_in') {
|
|
19
|
+
console.error(`Agent not connected: ${access.refusal.message}`);
|
|
20
|
+
if (access.refusal.connectUrl)
|
|
21
|
+
console.error(access.refusal.connectUrl);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.error(access.refusal?.message ?? 'Agent not connected');
|
|
25
|
+
}
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
};
|
|
28
|
+
exports.agentStatusHandler = agentStatusHandler;
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,8 @@ const commander_1 = require("commander");
|
|
|
7
7
|
const env_1 = require("./env");
|
|
8
8
|
const error_1 = require("./error");
|
|
9
9
|
const globalState_1 = tslib_1.__importDefault(require("./globalState"));
|
|
10
|
+
const agentConnect_1 = require("./handlers/agentConnect");
|
|
11
|
+
const agentStatus_1 = require("./handlers/agentStatus");
|
|
10
12
|
const build_1 = require("./handlers/apps/build");
|
|
11
13
|
const createApp_1 = require("./handlers/apps/createApp");
|
|
12
14
|
const preview_1 = require("./handlers/apps/preview");
|
|
@@ -52,6 +54,13 @@ function parseIntArgument(value) {
|
|
|
52
54
|
}
|
|
53
55
|
return parsedValue;
|
|
54
56
|
}
|
|
57
|
+
function parseOAuthPortArgument(value) {
|
|
58
|
+
const port = parseInt(value, 10);
|
|
59
|
+
if (Number.isNaN(port) || port < 1 || port > 65535) {
|
|
60
|
+
throw new Error('Port must be a number between 1 and 65535');
|
|
61
|
+
}
|
|
62
|
+
return port;
|
|
63
|
+
}
|
|
55
64
|
function parseStartOfWeekArgument(value) {
|
|
56
65
|
const number = parseIntArgument(value);
|
|
57
66
|
if (number < 0 || number > 6) {
|
|
@@ -142,15 +151,36 @@ ${styles.bold('Examples:')}
|
|
|
142
151
|
.argParser(parseProjectArgument)
|
|
143
152
|
.conflicts('skipProjectSelection'))
|
|
144
153
|
.option('--email <email>', 'Login with email and password', undefined)
|
|
145
|
-
.option('--oauth-port <port>', 'Port for the local OAuth callback server (default: random available port)',
|
|
146
|
-
const port = parseInt(value, 10);
|
|
147
|
-
if (Number.isNaN(port) || port < 1 || port > 65535) {
|
|
148
|
-
throw new Error('Port must be a number between 1 and 65535');
|
|
149
|
-
}
|
|
150
|
-
return port;
|
|
151
|
-
}, undefined)
|
|
154
|
+
.option('--oauth-port <port>', 'Port for the local OAuth callback server (default: random available port)', parseOAuthPortArgument, undefined)
|
|
152
155
|
.option('--verbose', undefined, false)
|
|
153
156
|
.action(login_1.login);
|
|
157
|
+
const agentProgram = commander_1.program
|
|
158
|
+
.command('agent')
|
|
159
|
+
.description('Connect your agent to the warehouse and check its status');
|
|
160
|
+
agentProgram
|
|
161
|
+
.command('connect')
|
|
162
|
+
.description('Connects your agent to the warehouse using browser sign-in')
|
|
163
|
+
.option('--project <project uuid or slug>', 'Specify the project', parseProjectArgument)
|
|
164
|
+
.option('--oauth-port <port>', 'Port for the local callback server (default: LIGHTDASH_OAUTH_PORT or a random available port)', parseOAuthPortArgument)
|
|
165
|
+
.option('--timeout <seconds>', 'Seconds to wait for the browser callback before polling for another 120 seconds', Number, 180)
|
|
166
|
+
.option('--verbose', undefined, false)
|
|
167
|
+
.addHelpText('after', `
|
|
168
|
+
${styles.bold('Examples:')}
|
|
169
|
+
lightdash agent connect
|
|
170
|
+
lightdash agent connect --project my-project --oauth-port 4321 --timeout 180
|
|
171
|
+
`)
|
|
172
|
+
.action(agentConnect_1.agentConnectHandler);
|
|
173
|
+
agentProgram
|
|
174
|
+
.command('status')
|
|
175
|
+
.description('Shows your agent connection status for a project')
|
|
176
|
+
.option('--project <project uuid or slug>', 'Specify the project', parseProjectArgument)
|
|
177
|
+
.option('--verbose', undefined, false)
|
|
178
|
+
.addHelpText('after', `
|
|
179
|
+
${styles.bold('Examples:')}
|
|
180
|
+
lightdash agent status
|
|
181
|
+
lightdash agent status --project my-project
|
|
182
|
+
`)
|
|
183
|
+
.action(agentStatus_1.agentStatusHandler);
|
|
154
184
|
// CONFIG
|
|
155
185
|
const configProgram = commander_1.program
|
|
156
186
|
.command('config')
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightdash/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.473.0",
|
|
4
4
|
"description": "Lightdash CLI tool",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"@actions/core": "1.11.1",
|
|
23
23
|
"@aws-sdk/credential-providers": "3.995.0",
|
|
24
24
|
"@casl/ability": "6.8.0",
|
|
25
|
-
"@lightdash/common": "2.
|
|
26
|
-
"@lightdash/warehouses": "2.
|
|
25
|
+
"@lightdash/common": "2.473.0",
|
|
26
|
+
"@lightdash/warehouses": "2.473.0",
|
|
27
27
|
"@sidvind/better-ajv-errors": "7.0.0",
|
|
28
28
|
"@types/columnify": "1.5.1",
|
|
29
29
|
"ajv": "8.18.0",
|