@claryai/cli 0.1.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/LICENSE +25 -0
- package/README.md +197 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/ajv.d.ts +3 -0
- package/dist/ajv.d.ts.map +1 -0
- package/dist/ajv.js +13 -0
- package/dist/analytics/analytics.d.ts +370 -0
- package/dist/analytics/analytics.d.ts.map +1 -0
- package/dist/analytics/analytics.js +143 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +134 -0
- package/dist/dbt/context.d.ts +14 -0
- package/dist/dbt/context.d.ts.map +1 -0
- package/dist/dbt/context.js +76 -0
- package/dist/dbt/context.test.d.ts +2 -0
- package/dist/dbt/context.test.d.ts.map +1 -0
- package/dist/dbt/context.test.js +152 -0
- package/dist/dbt/manifest.d.ts +7 -0
- package/dist/dbt/manifest.d.ts.map +1 -0
- package/dist/dbt/manifest.js +23 -0
- package/dist/dbt/models.d.ts +43 -0
- package/dist/dbt/models.d.ts.map +1 -0
- package/dist/dbt/models.js +256 -0
- package/dist/dbt/models.test.d.ts +2 -0
- package/dist/dbt/models.test.d.ts.map +1 -0
- package/dist/dbt/models.test.js +19 -0
- package/dist/dbt/profile.d.ts +9 -0
- package/dist/dbt/profile.d.ts.map +1 -0
- package/dist/dbt/profile.js +86 -0
- package/dist/dbt/profiles.test.d.ts +2 -0
- package/dist/dbt/profiles.test.d.ts.map +1 -0
- package/dist/dbt/profiles.test.js +50 -0
- package/dist/dbt/schema.d.ts +31 -0
- package/dist/dbt/schema.d.ts.map +1 -0
- package/dist/dbt/schema.js +49 -0
- package/dist/dbt/targets/Bigquery/index.d.ts +18 -0
- package/dist/dbt/targets/Bigquery/index.d.ts.map +1 -0
- package/dist/dbt/targets/Bigquery/index.js +105 -0
- package/dist/dbt/targets/Bigquery/oauth.d.ts +2 -0
- package/dist/dbt/targets/Bigquery/oauth.d.ts.map +1 -0
- package/dist/dbt/targets/Bigquery/oauth.js +43 -0
- package/dist/dbt/targets/Bigquery/serviceAccount.d.ts +35 -0
- package/dist/dbt/targets/Bigquery/serviceAccount.d.ts.map +1 -0
- package/dist/dbt/targets/Bigquery/serviceAccount.js +149 -0
- package/dist/dbt/targets/Databricks/oauth.d.ts +21 -0
- package/dist/dbt/targets/Databricks/oauth.d.ts.map +1 -0
- package/dist/dbt/targets/Databricks/oauth.js +184 -0
- package/dist/dbt/targets/athena.d.ts +21 -0
- package/dist/dbt/targets/athena.d.ts.map +1 -0
- package/dist/dbt/targets/athena.js +91 -0
- package/dist/dbt/targets/athena.test.d.ts +2 -0
- package/dist/dbt/targets/athena.test.d.ts.map +1 -0
- package/dist/dbt/targets/athena.test.js +60 -0
- package/dist/dbt/targets/clickhouse.d.ts +24 -0
- package/dist/dbt/targets/clickhouse.d.ts.map +1 -0
- package/dist/dbt/targets/clickhouse.js +90 -0
- package/dist/dbt/targets/databricks.d.ts +27 -0
- package/dist/dbt/targets/databricks.d.ts.map +1 -0
- package/dist/dbt/targets/databricks.js +138 -0
- package/dist/dbt/targets/duckdb.d.ts +16 -0
- package/dist/dbt/targets/duckdb.d.ts.map +1 -0
- package/dist/dbt/targets/duckdb.js +63 -0
- package/dist/dbt/targets/duckdb.test.d.ts +2 -0
- package/dist/dbt/targets/duckdb.test.d.ts.map +1 -0
- package/dist/dbt/targets/duckdb.test.js +37 -0
- package/dist/dbt/targets/postgres.d.ts +26 -0
- package/dist/dbt/targets/postgres.d.ts.map +1 -0
- package/dist/dbt/targets/postgres.js +142 -0
- package/dist/dbt/targets/redshift.d.ts +23 -0
- package/dist/dbt/targets/redshift.d.ts.map +1 -0
- package/dist/dbt/targets/redshift.js +96 -0
- package/dist/dbt/targets/snowflake.d.ts +4 -0
- package/dist/dbt/targets/snowflake.d.ts.map +1 -0
- package/dist/dbt/targets/snowflake.js +134 -0
- package/dist/dbt/targets/trino.d.ts +16 -0
- package/dist/dbt/targets/trino.d.ts.map +1 -0
- package/dist/dbt/targets/trino.js +65 -0
- package/dist/dbt/templating.d.ts +15 -0
- package/dist/dbt/templating.d.ts.map +1 -0
- package/dist/dbt/templating.js +50 -0
- package/dist/dbt/templating.test.d.ts +2 -0
- package/dist/dbt/templating.test.d.ts.map +1 -0
- package/dist/dbt/templating.test.js +51 -0
- package/dist/dbt/types.d.ts +17 -0
- package/dist/dbt/types.d.ts.map +1 -0
- package/dist/dbt/types.js +2 -0
- package/dist/dbt/validation.d.ts +9 -0
- package/dist/dbt/validation.d.ts.map +1 -0
- package/dist/dbt/validation.js +54 -0
- package/dist/env.d.ts +12 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +40 -0
- package/dist/error.d.ts +2 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +12 -0
- package/dist/globalState.d.ts +29 -0
- package/dist/globalState.d.ts.map +1 -0
- package/dist/globalState.js +67 -0
- package/dist/handlers/asyncQuery.d.ts +7 -0
- package/dist/handlers/asyncQuery.d.ts.map +1 -0
- package/dist/handlers/asyncQuery.js +50 -0
- package/dist/handlers/compile.d.ts +16 -0
- package/dist/handlers/compile.d.ts.map +1 -0
- package/dist/handlers/compile.js +277 -0
- package/dist/handlers/compile.test.d.ts +2 -0
- package/dist/handlers/compile.test.d.ts.map +1 -0
- package/dist/handlers/compile.test.js +201 -0
- package/dist/handlers/createProject.d.ts +37 -0
- package/dist/handlers/createProject.d.ts.map +1 -0
- package/dist/handlers/createProject.js +272 -0
- package/dist/handlers/dbt/apiClient.d.ts +14 -0
- package/dist/handlers/dbt/apiClient.d.ts.map +1 -0
- package/dist/handlers/dbt/apiClient.js +167 -0
- package/dist/handlers/dbt/compile.d.ts +35 -0
- package/dist/handlers/dbt/compile.d.ts.map +1 -0
- package/dist/handlers/dbt/compile.js +220 -0
- package/dist/handlers/dbt/getDbtProfileTargetName.d.ts +9 -0
- package/dist/handlers/dbt/getDbtProfileTargetName.d.ts.map +1 -0
- package/dist/handlers/dbt/getDbtProfileTargetName.js +44 -0
- package/dist/handlers/dbt/getDbtVersion.d.ts +16 -0
- package/dist/handlers/dbt/getDbtVersion.d.ts.map +1 -0
- package/dist/handlers/dbt/getDbtVersion.js +141 -0
- package/dist/handlers/dbt/getDbtVersion.mocks.d.ts +11 -0
- package/dist/handlers/dbt/getDbtVersion.mocks.d.ts.map +1 -0
- package/dist/handlers/dbt/getDbtVersion.mocks.js +70 -0
- package/dist/handlers/dbt/getDbtVersion.test.d.ts +2 -0
- package/dist/handlers/dbt/getDbtVersion.test.d.ts.map +1 -0
- package/dist/handlers/dbt/getDbtVersion.test.js +97 -0
- package/dist/handlers/dbt/getWarehouseClient.d.ts +24 -0
- package/dist/handlers/dbt/getWarehouseClient.d.ts.map +1 -0
- package/dist/handlers/dbt/getWarehouseClient.js +312 -0
- package/dist/handlers/dbt/refresh.d.ts +11 -0
- package/dist/handlers/dbt/refresh.d.ts.map +1 -0
- package/dist/handlers/dbt/refresh.js +114 -0
- package/dist/handlers/dbt/run.d.ts +14 -0
- package/dist/handlers/dbt/run.d.ts.map +1 -0
- package/dist/handlers/dbt/run.js +67 -0
- package/dist/handlers/deploy.d.ts +26 -0
- package/dist/handlers/deploy.d.ts.map +1 -0
- package/dist/handlers/deploy.js +377 -0
- package/dist/handlers/diagnostics.d.ts +11 -0
- package/dist/handlers/diagnostics.d.ts.map +1 -0
- package/dist/handlers/diagnostics.js +194 -0
- package/dist/handlers/download.d.ts +29 -0
- package/dist/handlers/download.d.ts.map +1 -0
- package/dist/handlers/download.js +955 -0
- package/dist/handlers/exportChartImage.d.ts +7 -0
- package/dist/handlers/exportChartImage.d.ts.map +1 -0
- package/dist/handlers/exportChartImage.js +33 -0
- package/dist/handlers/generate.d.ts +13 -0
- package/dist/handlers/generate.d.ts.map +1 -0
- package/dist/handlers/generate.js +159 -0
- package/dist/handlers/generateExposures.d.ts +8 -0
- package/dist/handlers/generateExposures.d.ts.map +1 -0
- package/dist/handlers/generateExposures.js +100 -0
- package/dist/handlers/getProject.d.ts +6 -0
- package/dist/handlers/getProject.d.ts.map +1 -0
- package/dist/handlers/getProject.js +43 -0
- package/dist/handlers/installSkills.d.ts +12 -0
- package/dist/handlers/installSkills.d.ts.map +1 -0
- package/dist/handlers/installSkills.js +321 -0
- package/dist/handlers/lint/ajvToSarif.d.ts +66 -0
- package/dist/handlers/lint/ajvToSarif.d.ts.map +1 -0
- package/dist/handlers/lint/ajvToSarif.js +222 -0
- package/dist/handlers/lint/sarifFormatter.d.ts +14 -0
- package/dist/handlers/lint/sarifFormatter.d.ts.map +1 -0
- package/dist/handlers/lint/sarifFormatter.js +111 -0
- package/dist/handlers/lint.d.ts +8 -0
- package/dist/handlers/lint.d.ts.map +1 -0
- package/dist/handlers/lint.js +308 -0
- package/dist/handlers/listProjects.d.ts +6 -0
- package/dist/handlers/listProjects.d.ts.map +1 -0
- package/dist/handlers/listProjects.js +53 -0
- package/dist/handlers/login/oauth.d.ts +2 -0
- package/dist/handlers/login/oauth.d.ts.map +1 -0
- package/dist/handlers/login/oauth.js +27 -0
- package/dist/handlers/login/pat.d.ts +2 -0
- package/dist/handlers/login/pat.d.ts.map +1 -0
- package/dist/handlers/login/pat.js +31 -0
- package/dist/handlers/login.d.ts +15 -0
- package/dist/handlers/login.d.ts.map +1 -0
- package/dist/handlers/login.js +239 -0
- package/dist/handlers/metadataFile.d.ts +9 -0
- package/dist/handlers/metadataFile.d.ts.map +1 -0
- package/dist/handlers/metadataFile.js +34 -0
- package/dist/handlers/oauthLogin.d.ts +6 -0
- package/dist/handlers/oauthLogin.d.ts.map +1 -0
- package/dist/handlers/oauthLogin.js +191 -0
- package/dist/handlers/preview.d.ts +29 -0
- package/dist/handlers/preview.d.ts.map +1 -0
- package/dist/handlers/preview.js +415 -0
- package/dist/handlers/renameHandler.d.ts +16 -0
- package/dist/handlers/renameHandler.d.ts.map +1 -0
- package/dist/handlers/renameHandler.js +160 -0
- package/dist/handlers/runChart.d.ts +10 -0
- package/dist/handlers/runChart.d.ts.map +1 -0
- package/dist/handlers/runChart.js +105 -0
- package/dist/handlers/selectProject.d.ts +20 -0
- package/dist/handlers/selectProject.d.ts.map +1 -0
- package/dist/handlers/selectProject.js +91 -0
- package/dist/handlers/setProject.d.ts +14 -0
- package/dist/handlers/setProject.d.ts.map +1 -0
- package/dist/handlers/setProject.js +131 -0
- package/dist/handlers/setWarehouse.d.ts +14 -0
- package/dist/handlers/setWarehouse.d.ts.map +1 -0
- package/dist/handlers/setWarehouse.js +94 -0
- package/dist/handlers/sql.d.ts +9 -0
- package/dist/handlers/sql.d.ts.map +1 -0
- package/dist/handlers/sql.js +89 -0
- package/dist/handlers/utils.d.ts +11 -0
- package/dist/handlers/utils.d.ts.map +1 -0
- package/dist/handlers/utils.js +36 -0
- package/dist/handlers/validate.d.ts +22 -0
- package/dist/handlers/validate.d.ts.map +1 -0
- package/dist/handlers/validate.js +201 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +581 -0
- package/dist/lightdash/loader.d.ts +21 -0
- package/dist/lightdash/loader.d.ts.map +1 -0
- package/dist/lightdash/loader.js +122 -0
- package/dist/lightdash/projectType.d.ts +84 -0
- package/dist/lightdash/projectType.d.ts.map +1 -0
- package/dist/lightdash/projectType.js +75 -0
- package/dist/lightdash-config/index.d.ts +2 -0
- package/dist/lightdash-config/index.d.ts.map +1 -0
- package/dist/lightdash-config/index.js +41 -0
- package/dist/lightdash-config/lightdash-config.test.d.ts +2 -0
- package/dist/lightdash-config/lightdash-config.test.d.ts.map +1 -0
- package/dist/lightdash-config/lightdash-config.test.js +70 -0
- package/dist/styles.d.ts +10 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +14 -0
- package/entitlements.plist +33 -0
- package/package.json +71 -0
- package/track.sh +116 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deployHandler = exports.deploy = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@lightdash/common");
|
|
6
|
+
const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
|
|
7
|
+
const path_1 = tslib_1.__importDefault(require("path"));
|
|
8
|
+
const url_1 = require("url");
|
|
9
|
+
const uuid_1 = require("uuid");
|
|
10
|
+
const analytics_1 = require("../analytics/analytics");
|
|
11
|
+
const config_1 = require("../config");
|
|
12
|
+
const context_1 = require("../dbt/context");
|
|
13
|
+
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
14
|
+
const lightdash_config_1 = require("../lightdash-config");
|
|
15
|
+
const projectType_1 = require("../lightdash/projectType");
|
|
16
|
+
const styles = tslib_1.__importStar(require("../styles"));
|
|
17
|
+
const compile_1 = require("./compile");
|
|
18
|
+
const createProject_1 = require("./createProject");
|
|
19
|
+
const apiClient_1 = require("./dbt/apiClient");
|
|
20
|
+
const getDbtVersion_1 = require("./dbt/getDbtVersion");
|
|
21
|
+
const selectProject_1 = require("./selectProject");
|
|
22
|
+
const replaceProjectYamlTags = async (projectUuid, lightdashProjectConfig) => {
|
|
23
|
+
const yamlTags = Object.entries(lightdashProjectConfig.spotlight?.categories ?? {}).map(([yamlReference, category]) => ({
|
|
24
|
+
yamlReference,
|
|
25
|
+
name: category.label,
|
|
26
|
+
color: category.color ?? 'gray',
|
|
27
|
+
}));
|
|
28
|
+
await (0, apiClient_1.lightdashApi)({
|
|
29
|
+
method: 'PUT',
|
|
30
|
+
url: `/api/v1/projects/${projectUuid}/tags/yaml`,
|
|
31
|
+
body: JSON.stringify(yamlTags),
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const replaceProjectParameters = async (projectUuid, lightdashProjectConfig) => {
|
|
35
|
+
await (0, apiClient_1.lightdashApi)({
|
|
36
|
+
method: 'PUT',
|
|
37
|
+
url: `/api/v2/projects/${projectUuid}/parameters`,
|
|
38
|
+
body: JSON.stringify(lightdashProjectConfig.parameters ?? {}),
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
const replaceProjectDefaults = async (projectUuid, lightdashProjectConfig) => {
|
|
42
|
+
if (lightdashProjectConfig.defaults) {
|
|
43
|
+
await (0, apiClient_1.lightdashApi)({
|
|
44
|
+
method: 'PUT',
|
|
45
|
+
url: `/api/v2/projects/${projectUuid}/defaults`,
|
|
46
|
+
body: JSON.stringify(lightdashProjectConfig.defaults),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const deployBatched = async (explores, options) => {
|
|
51
|
+
const batchSize = parseInt(options.batchSize || '50', 10);
|
|
52
|
+
if (Number.isNaN(batchSize) || batchSize < 1 || batchSize > 1000) {
|
|
53
|
+
throw new Error('batchSize must be a positive integer between 1 and 1000');
|
|
54
|
+
}
|
|
55
|
+
const parallelBatches = parseInt(options.parallelBatches || '1', 10);
|
|
56
|
+
if (Number.isNaN(parallelBatches) ||
|
|
57
|
+
parallelBatches < 1 ||
|
|
58
|
+
parallelBatches > 50) {
|
|
59
|
+
throw new Error('parallelBatches must be a positive integer between 1 and 50');
|
|
60
|
+
}
|
|
61
|
+
globalState_1.default.log(styles.title(`Deploying ${explores.length} explores using batched deploy (batch size: ${batchSize}, parallel: ${parallelBatches})`));
|
|
62
|
+
const deployStartTime = Date.now();
|
|
63
|
+
// Start deploy session
|
|
64
|
+
globalState_1.default.log(`Starting deploy session...`);
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
const startSessionResponse = (await (0, apiClient_1.lightdashApi)({
|
|
67
|
+
method: 'POST',
|
|
68
|
+
url: `/api/v2/projects/${options.projectUuid}/deploy`,
|
|
69
|
+
body: JSON.stringify({}),
|
|
70
|
+
}));
|
|
71
|
+
const sessionUuid = startSessionResponse.deploySessionUuid;
|
|
72
|
+
globalState_1.default.log(styles.success(`Deploy session created: ${sessionUuid}`));
|
|
73
|
+
// Split explores into batches
|
|
74
|
+
const batches = [];
|
|
75
|
+
for (let i = 0; i < explores.length; i += batchSize) {
|
|
76
|
+
batches.push(explores.slice(i, i + batchSize));
|
|
77
|
+
}
|
|
78
|
+
globalState_1.default.log(`Uploading ${batches.length} batches...`);
|
|
79
|
+
// Send batches with parallelism using chunked processing
|
|
80
|
+
const uploadBatch = async (batch, batchIndex) => {
|
|
81
|
+
globalState_1.default.log(` Uploading batch ${batchIndex + 1}/${batches.length} (${batch.length} explores)...`);
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
const response = (await (0, apiClient_1.lightdashApi)({
|
|
84
|
+
method: 'POST',
|
|
85
|
+
url: `/api/v2/projects/${options.projectUuid}/deploy/${sessionUuid}/batch`,
|
|
86
|
+
body: JSON.stringify({
|
|
87
|
+
explores: batch,
|
|
88
|
+
batchNumber: batchIndex,
|
|
89
|
+
}),
|
|
90
|
+
}));
|
|
91
|
+
globalState_1.default.log(styles.success(` ✓ Batch ${batchIndex + 1} uploaded (${response.exploreCount} explores)`));
|
|
92
|
+
return response;
|
|
93
|
+
};
|
|
94
|
+
// Process batches with controlled parallelism using recursive approach
|
|
95
|
+
const processBatchesWithParallelism = async (remainingIndices, results = []) => {
|
|
96
|
+
if (remainingIndices.length === 0) {
|
|
97
|
+
return results;
|
|
98
|
+
}
|
|
99
|
+
const chunk = remainingIndices.slice(0, parallelBatches);
|
|
100
|
+
const remaining = remainingIndices.slice(parallelBatches);
|
|
101
|
+
const chunkPromises = chunk.map((index) => uploadBatch(batches[index], index));
|
|
102
|
+
const chunkResults = await Promise.all(chunkPromises);
|
|
103
|
+
return processBatchesWithParallelism(remaining, [
|
|
104
|
+
...results,
|
|
105
|
+
...chunkResults,
|
|
106
|
+
]);
|
|
107
|
+
};
|
|
108
|
+
const batchIndices = Array.from({ length: batches.length }, (_, i) => i);
|
|
109
|
+
await processBatchesWithParallelism(batchIndices);
|
|
110
|
+
// Finalize deploy
|
|
111
|
+
globalState_1.default.log(`Finalizing deploy...`);
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
113
|
+
const finalizeResponse = (await (0, apiClient_1.lightdashApi)({
|
|
114
|
+
method: 'POST',
|
|
115
|
+
url: `/api/v2/projects/${options.projectUuid}/deploy/${sessionUuid}/finalize`,
|
|
116
|
+
body: JSON.stringify({}),
|
|
117
|
+
}));
|
|
118
|
+
globalState_1.default.log(styles.success(`Deploy completed! ${finalizeResponse.exploreCount} explores deployed.`));
|
|
119
|
+
await analytics_1.LightdashAnalytics.track({
|
|
120
|
+
event: 'deploy.triggered',
|
|
121
|
+
properties: {
|
|
122
|
+
projectId: options.projectUuid,
|
|
123
|
+
durationMs: Date.now() - deployStartTime,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
const deploy = async (explores, options) => {
|
|
128
|
+
if (explores.length === 0) {
|
|
129
|
+
globalState_1.default.log(styles.warning('No explores found'));
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const errors = explores.filter((e) => (0, common_1.isExploreError)(e)).length;
|
|
133
|
+
if (errors > 0) {
|
|
134
|
+
if (options.ignoreErrors) {
|
|
135
|
+
console.error(styles.warning(`\nDeploying project with ${errors} errors\n`));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.error(styles.error(`Can't deploy with errors. If you still want to deploy, add ${styles.bold('--ignore-errors')} flag`));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const lightdashProjectConfig = await (0, lightdash_config_1.readAndLoadLightdashProjectConfig)(path_1.default.resolve(options.projectDir), options.projectUuid);
|
|
143
|
+
// These two methods are not critical to the deployment process, so we can ignore errors and show warnings instead
|
|
144
|
+
try {
|
|
145
|
+
await replaceProjectYamlTags(options.projectUuid, lightdashProjectConfig);
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
console.error(styles.warning(`\nError replacing YAML tags: ${(0, common_1.getErrorMessage)(e)}\n`));
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
await replaceProjectParameters(options.projectUuid, lightdashProjectConfig);
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
console.error(styles.warning(`\nError replacing project parameters: ${(0, common_1.getErrorMessage)(e)}\n`));
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
await replaceProjectDefaults(options.projectUuid, lightdashProjectConfig);
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
console.error(styles.warning(`\nError replacing project defaults: ${(0, common_1.getErrorMessage)(e)}\n`));
|
|
161
|
+
}
|
|
162
|
+
// Use batched deploy if enabled
|
|
163
|
+
if (options.useBatchedDeploy) {
|
|
164
|
+
await deployBatched(explores, options);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const deployStartTime = Date.now();
|
|
168
|
+
const deployPayload = JSON.stringify(explores);
|
|
169
|
+
try {
|
|
170
|
+
await (0, apiClient_1.lightdashApi)({
|
|
171
|
+
method: 'PUT',
|
|
172
|
+
url: `/api/v1/projects/${options.projectUuid}/explores`,
|
|
173
|
+
body: deployPayload,
|
|
174
|
+
});
|
|
175
|
+
await analytics_1.LightdashAnalytics.track({
|
|
176
|
+
event: 'deploy.triggered',
|
|
177
|
+
properties: {
|
|
178
|
+
projectId: options.projectUuid,
|
|
179
|
+
durationMs: Date.now() - deployStartTime,
|
|
180
|
+
payloadSizeBytes: Buffer.byteLength(deployPayload),
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// Check if it's a payload too large error (413) or similar size-related errors
|
|
186
|
+
const errorStatus = error.status;
|
|
187
|
+
const errorMessage = error.message;
|
|
188
|
+
if (errorStatus === 413 ||
|
|
189
|
+
errorMessage?.includes('too large') ||
|
|
190
|
+
errorMessage?.includes('payload') ||
|
|
191
|
+
errorMessage?.includes('Request Entity Too Large') ||
|
|
192
|
+
errorMessage?.includes('413')) {
|
|
193
|
+
console.error(styles.error('\n❌ Deploy failed: Payload too large\n'));
|
|
194
|
+
console.error(styles.warning('Your project is too large to deploy in a single request.\n' +
|
|
195
|
+
'Please use the batched deploy feature:\n\n' +
|
|
196
|
+
` ${styles.bold('clary deploy --use-batched-deploy')}\n\n` +
|
|
197
|
+
'You can also customize batch size and parallelism:\n' +
|
|
198
|
+
` ${styles.bold('--batch-size <number>')} Number of explores per batch (default: 50)\n` +
|
|
199
|
+
` ${styles.bold('--parallel-batches <number>')} Number of parallel batches (default: 1)\n`));
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
// Re-throw other errors to be handled by the caller
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
exports.deploy = deploy;
|
|
208
|
+
const createNewProject = async (executionId, options) => {
|
|
209
|
+
console.error('');
|
|
210
|
+
const absoluteProjectPath = path_1.default.resolve(options.projectDir);
|
|
211
|
+
let defaultProjectName = 'My new Clary Project'; // TODO: improve
|
|
212
|
+
try {
|
|
213
|
+
const context = await (0, context_1.getDbtContext)({
|
|
214
|
+
projectDir: absoluteProjectPath,
|
|
215
|
+
targetPath: options.targetPath,
|
|
216
|
+
});
|
|
217
|
+
defaultProjectName = (0, common_1.friendlyName)(context.projectName);
|
|
218
|
+
}
|
|
219
|
+
catch (e) {
|
|
220
|
+
if (e instanceof common_1.ParseError) {
|
|
221
|
+
// stick with default name
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// If interactive and no name provided, prompt for project name
|
|
225
|
+
let projectName = defaultProjectName;
|
|
226
|
+
if (options.create === true && !globalState_1.default.isNonInteractive()) {
|
|
227
|
+
const answers = await inquirer_1.default.prompt([
|
|
228
|
+
{
|
|
229
|
+
type: 'input',
|
|
230
|
+
name: 'name',
|
|
231
|
+
message: `Add a project name or press enter to use the default: [${defaultProjectName}] `,
|
|
232
|
+
},
|
|
233
|
+
]);
|
|
234
|
+
projectName = answers.name ? answers.name : defaultProjectName;
|
|
235
|
+
}
|
|
236
|
+
// If explicit name provided, use it
|
|
237
|
+
if (typeof options.create === 'string') {
|
|
238
|
+
projectName = options.create;
|
|
239
|
+
}
|
|
240
|
+
projectName = projectName.trim();
|
|
241
|
+
// Create the project
|
|
242
|
+
console.error('');
|
|
243
|
+
const spinner = globalState_1.default.startSpinner(` Creating new project ${styles.bold(projectName)}`);
|
|
244
|
+
const createStartTime = Date.now();
|
|
245
|
+
await analytics_1.LightdashAnalytics.track({
|
|
246
|
+
event: 'create.started',
|
|
247
|
+
properties: {
|
|
248
|
+
executionId,
|
|
249
|
+
projectName,
|
|
250
|
+
isDefaultName: defaultProjectName === projectName,
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
try {
|
|
254
|
+
const results = await (0, createProject_1.createProject)({
|
|
255
|
+
...options,
|
|
256
|
+
name: projectName,
|
|
257
|
+
type: common_1.ProjectType.DEFAULT,
|
|
258
|
+
warehouseCredentials: options.warehouseCredentials,
|
|
259
|
+
assumeYes: options.assumeYes,
|
|
260
|
+
});
|
|
261
|
+
const project = results?.project;
|
|
262
|
+
if (!project) {
|
|
263
|
+
spinner.fail('Cancel preview environment');
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
spinner.succeed(` New project ${styles.bold(projectName)} created\n`);
|
|
267
|
+
await analytics_1.LightdashAnalytics.track({
|
|
268
|
+
event: 'create.completed',
|
|
269
|
+
properties: {
|
|
270
|
+
executionId,
|
|
271
|
+
projectId: project.projectUuid,
|
|
272
|
+
projectName,
|
|
273
|
+
durationMs: Date.now() - createStartTime,
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
return project;
|
|
277
|
+
}
|
|
278
|
+
catch (e) {
|
|
279
|
+
await analytics_1.LightdashAnalytics.track({
|
|
280
|
+
event: 'create.error',
|
|
281
|
+
properties: {
|
|
282
|
+
executionId,
|
|
283
|
+
error: `Error creating developer preview ${e}`,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
spinner.fail();
|
|
287
|
+
throw e;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
const deployHandler = async (originalOptions) => {
|
|
291
|
+
const options = {
|
|
292
|
+
...originalOptions,
|
|
293
|
+
};
|
|
294
|
+
globalState_1.default.setVerbose(options.verbose);
|
|
295
|
+
// Detect project type and configure options accordingly
|
|
296
|
+
const projectTypeConfig = await (0, projectType_1.detectProjectType)({
|
|
297
|
+
projectDir: options.projectDir,
|
|
298
|
+
userOptions: {
|
|
299
|
+
warehouseCredentials: options.warehouseCredentials,
|
|
300
|
+
skipDbtCompile: options.skipDbtCompile,
|
|
301
|
+
skipWarehouseCatalog: options.skipWarehouseCatalog,
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
// Apply project type configuration to options
|
|
305
|
+
options.warehouseCredentials = projectTypeConfig.warehouseCredentials;
|
|
306
|
+
options.skipDbtCompile = projectTypeConfig.skipDbtCompile;
|
|
307
|
+
options.skipWarehouseCatalog = projectTypeConfig.skipWarehouseCatalog;
|
|
308
|
+
// Resolve organization credentials early before doing any heavy work
|
|
309
|
+
if (options.organizationCredentials) {
|
|
310
|
+
try {
|
|
311
|
+
await (0, createProject_1.resolveOrganizationCredentialsName)(options.organizationCredentials);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
console.error(styles.error(error instanceof Error ? error.message : 'Unknown error'));
|
|
315
|
+
process.exit(1);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Only check dbt version for dbt projects (YAML-only projects don't need dbt)
|
|
319
|
+
// For YAML-only projects, we return success: false to indicate dbt wasn't checked,
|
|
320
|
+
// with null error since this is expected behavior, not an error condition.
|
|
321
|
+
// This allows downstream code to distinguish "dbt check skipped" from "dbt check failed".
|
|
322
|
+
const dbtVersionResult = projectTypeConfig.type === projectType_1.CliProjectType.Dbt
|
|
323
|
+
? await (0, getDbtVersion_1.tryGetDbtVersion)()
|
|
324
|
+
: { success: false, error: null };
|
|
325
|
+
if (options.gzip) {
|
|
326
|
+
(0, apiClient_1.setGzipEnabled)(true);
|
|
327
|
+
}
|
|
328
|
+
await (0, apiClient_1.checkLightdashVersion)();
|
|
329
|
+
const executionId = (0, uuid_1.v4)();
|
|
330
|
+
const explores = await (0, compile_1.compile)(options);
|
|
331
|
+
const config = await (0, config_1.getConfig)();
|
|
332
|
+
let projectUuid;
|
|
333
|
+
if (options.create !== undefined) {
|
|
334
|
+
const project = await createNewProject(executionId, options);
|
|
335
|
+
if (!project) {
|
|
336
|
+
console.error("To preview your project, you'll need to manually enter your warehouse connection details.");
|
|
337
|
+
const createProjectUrl = config.context?.serverUrl &&
|
|
338
|
+
new url_1.URL('/createProject', config.context.serverUrl);
|
|
339
|
+
if (createProjectUrl) {
|
|
340
|
+
console.error(`Fill out the project connection form here: ${createProjectUrl}`);
|
|
341
|
+
}
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
projectUuid = project.projectUuid;
|
|
345
|
+
await (0, config_1.setProject)(projectUuid, project.name);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
if (!config.context?.serverUrl) {
|
|
349
|
+
throw new common_1.AuthorizationError(`No active Clary project. Run 'clary login --help'`);
|
|
350
|
+
}
|
|
351
|
+
const projectSelection = await (0, selectProject_1.selectProject)(config);
|
|
352
|
+
if (!projectSelection) {
|
|
353
|
+
throw new common_1.AuthorizationError(`No active Clary project. Run 'clary login --help'`);
|
|
354
|
+
}
|
|
355
|
+
projectUuid = projectSelection.projectUuid;
|
|
356
|
+
// Log current project info
|
|
357
|
+
(0, selectProject_1.logSelectedProject)(projectSelection, config, 'Deploying to');
|
|
358
|
+
}
|
|
359
|
+
await (0, exports.deploy)(explores, { ...options, projectUuid });
|
|
360
|
+
const serverUrl = config.context?.serverUrl?.replace(/\/$/, '');
|
|
361
|
+
let displayUrl = options.create
|
|
362
|
+
? `${serverUrl}/createProject/cli?projectUuid=${projectUuid}`
|
|
363
|
+
: `${serverUrl}/projects/${projectUuid}/home`;
|
|
364
|
+
let successMessage = 'Successfully deployed project:';
|
|
365
|
+
if (dbtVersionResult.success &&
|
|
366
|
+
dbtVersionResult.version.isDbtCloudCLI &&
|
|
367
|
+
options.create) {
|
|
368
|
+
successMessage =
|
|
369
|
+
'Successfully deployed project! Complete the setup by adding warehouse connection details here:';
|
|
370
|
+
displayUrl = `${serverUrl}/generalSettings/projectManagement/${projectUuid}/settings`;
|
|
371
|
+
}
|
|
372
|
+
console.error(`${styles.bold(successMessage)}`);
|
|
373
|
+
console.error('');
|
|
374
|
+
console.error(` ${styles.bold(`⚡️ ${displayUrl}`)}`);
|
|
375
|
+
console.error('');
|
|
376
|
+
};
|
|
377
|
+
exports.deployHandler = deployHandler;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type DiagnosticsOptions = {
|
|
2
|
+
dbt?: boolean;
|
|
3
|
+
projectDir?: string;
|
|
4
|
+
profilesDir?: string;
|
|
5
|
+
defer?: boolean;
|
|
6
|
+
noDefer?: boolean;
|
|
7
|
+
state?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const diagnosticsHandler: (options: DiagnosticsOptions) => Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":"AAgBA,KAAK,kBAAkB,GAAG;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAwGF,eAAO,MAAM,kBAAkB,GAAU,SAAS,kBAAkB,kBAkInE,CAAC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diagnosticsHandler = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@lightdash/common");
|
|
6
|
+
const execa_1 = tslib_1.__importDefault(require("execa"));
|
|
7
|
+
const analytics_1 = require("../analytics/analytics");
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
const env_1 = require("../env");
|
|
10
|
+
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
11
|
+
const styles = tslib_1.__importStar(require("../styles"));
|
|
12
|
+
const apiClient_1 = require("./dbt/apiClient");
|
|
13
|
+
const getDbtVersion_1 = require("./dbt/getDbtVersion");
|
|
14
|
+
const getEnvSourceSuffix = (names, env = process.env) => {
|
|
15
|
+
const activeNames = names.filter((name) => !!env[name]);
|
|
16
|
+
return activeNames.length > 0
|
|
17
|
+
? ` ${styles.secondary(`(Using ${activeNames.join(', ')})`)}`
|
|
18
|
+
: '';
|
|
19
|
+
};
|
|
20
|
+
const formatConfiguredProject = (projectName, projectUuid) => projectUuid === 'Not set' ? projectName : `${projectName} (${projectUuid})`;
|
|
21
|
+
const getAuthStatus = async () => {
|
|
22
|
+
try {
|
|
23
|
+
const config = await (0, config_1.getConfig)();
|
|
24
|
+
const serverUrl = config.context?.serverUrl || 'Not set';
|
|
25
|
+
const organizationUuid = config.user?.organizationUuid || 'Not set';
|
|
26
|
+
const projectName = config.context?.projectName || 'Not set';
|
|
27
|
+
const projectUuid = config.context?.project || 'Not set';
|
|
28
|
+
if (!(config.context?.apiKey && config.context?.serverUrl)) {
|
|
29
|
+
return {
|
|
30
|
+
status: 'missing_credentials',
|
|
31
|
+
serverUrl,
|
|
32
|
+
organizationUuid,
|
|
33
|
+
projectName,
|
|
34
|
+
projectUuid,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const user = await (0, apiClient_1.getUserContext)();
|
|
39
|
+
return {
|
|
40
|
+
status: 'authenticated',
|
|
41
|
+
serverUrl,
|
|
42
|
+
organizationUuid: user.organizationUuid || organizationUuid,
|
|
43
|
+
projectName,
|
|
44
|
+
projectUuid,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
status: 'auth_failed',
|
|
50
|
+
serverUrl,
|
|
51
|
+
organizationUuid,
|
|
52
|
+
projectName,
|
|
53
|
+
projectUuid,
|
|
54
|
+
error: (0, common_1.getErrorMessage)(error),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
status: 'missing_credentials',
|
|
61
|
+
serverUrl: 'Error reading config',
|
|
62
|
+
organizationUuid: 'Error reading config',
|
|
63
|
+
projectName: 'Error reading config',
|
|
64
|
+
projectUuid: 'Error reading config',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const runDbtDebug = async (projectDir, profilesDir, options = {}) => {
|
|
69
|
+
try {
|
|
70
|
+
const args = [
|
|
71
|
+
'debug',
|
|
72
|
+
'--project-dir',
|
|
73
|
+
projectDir,
|
|
74
|
+
'--profiles-dir',
|
|
75
|
+
profilesDir,
|
|
76
|
+
];
|
|
77
|
+
if (options.defer) {
|
|
78
|
+
args.push('--defer');
|
|
79
|
+
}
|
|
80
|
+
if (options.noDefer) {
|
|
81
|
+
args.push('--no-defer');
|
|
82
|
+
}
|
|
83
|
+
if (options.state) {
|
|
84
|
+
args.push('--state', options.state);
|
|
85
|
+
}
|
|
86
|
+
const { all } = await (0, execa_1.default)('dbt', args, {
|
|
87
|
+
all: true,
|
|
88
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
89
|
+
});
|
|
90
|
+
return all || '';
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const msg = (0, common_1.getErrorMessage)(error);
|
|
94
|
+
return `Error running dbt debug: ${msg}`;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const diagnosticsHandler = async (options) => {
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
let success = true;
|
|
100
|
+
globalState_1.default.setVerbose(true); // Always verbose for diagnostics
|
|
101
|
+
try {
|
|
102
|
+
console.log(styles.title('⚡️ Clary CLI Diagnostics'));
|
|
103
|
+
console.log('');
|
|
104
|
+
// CLI Version
|
|
105
|
+
console.log(styles.bold('Clary CLI Version:'));
|
|
106
|
+
console.log(` ${env_1.CLI_VERSION}`);
|
|
107
|
+
await (0, apiClient_1.checkLightdashVersion)();
|
|
108
|
+
console.log('');
|
|
109
|
+
// Node.js Version
|
|
110
|
+
console.log(styles.bold('Node.js Version:'));
|
|
111
|
+
console.log(` ${env_1.NODE_VERSION.major}`);
|
|
112
|
+
if (env_1.NODE_VERSION.major !== env_1.OPTIMIZED_NODE_VERSION) {
|
|
113
|
+
console.log(styles.warning(` ⚠️ You are using Node.js version ${process.version}. Clary CLI is optimized for v${env_1.OPTIMIZED_NODE_VERSION} so you might experience issues.`));
|
|
114
|
+
}
|
|
115
|
+
console.log('');
|
|
116
|
+
// Auth Status
|
|
117
|
+
console.log(styles.bold('Authentication Status:'));
|
|
118
|
+
const authStatus = await getAuthStatus();
|
|
119
|
+
const authSourceSuffix = getEnvSourceSuffix([
|
|
120
|
+
'CLARY_API_KEY',
|
|
121
|
+
'CLARY_PROXY_AUTHORIZATION',
|
|
122
|
+
]);
|
|
123
|
+
const instanceSourceSuffix = getEnvSourceSuffix(['CLARY_URL']);
|
|
124
|
+
const projectSourceSuffix = getEnvSourceSuffix(['CLARY_PROJECT']);
|
|
125
|
+
if (authStatus.status === 'authenticated') {
|
|
126
|
+
console.log(` ✅ Authenticated (verified with server)${authSourceSuffix}`);
|
|
127
|
+
console.log(` Instance: ${authStatus.serverUrl}${instanceSourceSuffix}`);
|
|
128
|
+
console.log(` Organization: ${authStatus.organizationUuid}`);
|
|
129
|
+
console.log(` Configured project: ${formatConfiguredProject(authStatus.projectName, authStatus.projectUuid)}${projectSourceSuffix}`);
|
|
130
|
+
}
|
|
131
|
+
else if (authStatus.status === 'auth_failed') {
|
|
132
|
+
console.log(` ❌ Authentication check failed${authSourceSuffix}`);
|
|
133
|
+
console.log(` Instance: ${authStatus.serverUrl}${instanceSourceSuffix}`);
|
|
134
|
+
if (authStatus.organizationUuid !== 'Not set') {
|
|
135
|
+
console.log(` Stored organization: ${authStatus.organizationUuid}`);
|
|
136
|
+
}
|
|
137
|
+
console.log(` Configured project: ${formatConfiguredProject(authStatus.projectName, authStatus.projectUuid)}${projectSourceSuffix}`);
|
|
138
|
+
console.log(` Error: ${authStatus.error}`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.log(` ❌ Not authenticated${authSourceSuffix}`);
|
|
142
|
+
console.log(` Instance: ${authStatus.serverUrl}${instanceSourceSuffix}`);
|
|
143
|
+
console.log(` Configured project: ${formatConfiguredProject(authStatus.projectName, authStatus.projectUuid)}${projectSourceSuffix}`);
|
|
144
|
+
}
|
|
145
|
+
console.log('');
|
|
146
|
+
// dbt Debug (if --dbt flag is provided)
|
|
147
|
+
if (options.dbt) {
|
|
148
|
+
console.log(styles.bold('dbt Debug:'));
|
|
149
|
+
// First get dbt version
|
|
150
|
+
try {
|
|
151
|
+
const dbtVersion = await (0, getDbtVersion_1.getDbtVersion)();
|
|
152
|
+
console.log(` dbt Version: ${dbtVersion.verboseVersion}`);
|
|
153
|
+
console.log('');
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.log(` Error getting dbt version: ${(0, common_1.getErrorMessage)(error)}`);
|
|
157
|
+
console.log('');
|
|
158
|
+
}
|
|
159
|
+
// Then run dbt debug
|
|
160
|
+
const projectDir = options.projectDir || env_1.DEFAULT_DBT_PROJECT_DIR;
|
|
161
|
+
const profilesDir = options.profilesDir || env_1.DEFAULT_DBT_PROFILES_DIR;
|
|
162
|
+
let debugCommand = `dbt debug --project-dir ${projectDir} --profiles-dir ${profilesDir}`;
|
|
163
|
+
if (options.defer)
|
|
164
|
+
debugCommand += ' --defer';
|
|
165
|
+
if (options.noDefer)
|
|
166
|
+
debugCommand += ' --no-defer';
|
|
167
|
+
if (options.state)
|
|
168
|
+
debugCommand += ` --state ${options.state}`;
|
|
169
|
+
console.log(` Running: ${debugCommand}`);
|
|
170
|
+
console.log('');
|
|
171
|
+
const debugOutput = await runDbtDebug(projectDir, profilesDir, {
|
|
172
|
+
defer: options.defer,
|
|
173
|
+
noDefer: options.noDefer,
|
|
174
|
+
state: options.state,
|
|
175
|
+
});
|
|
176
|
+
console.log(debugOutput);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
success = false;
|
|
181
|
+
throw e;
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
await analytics_1.LightdashAnalytics.track({
|
|
185
|
+
event: 'command.executed',
|
|
186
|
+
properties: {
|
|
187
|
+
command: 'diagnostics',
|
|
188
|
+
durationMs: Date.now() - startTime,
|
|
189
|
+
success,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
exports.diagnosticsHandler = diagnosticsHandler;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type SpaceAsCode } from '@lightdash/common';
|
|
2
|
+
export type DownloadHandlerOptions = {
|
|
3
|
+
verbose: boolean;
|
|
4
|
+
charts: string[];
|
|
5
|
+
dashboards: string[];
|
|
6
|
+
force: boolean;
|
|
7
|
+
path?: string;
|
|
8
|
+
project?: string;
|
|
9
|
+
languageMap: boolean;
|
|
10
|
+
skipSpaceCreate: boolean;
|
|
11
|
+
public: boolean;
|
|
12
|
+
includeCharts: boolean;
|
|
13
|
+
nested: boolean;
|
|
14
|
+
skipSpaces: boolean;
|
|
15
|
+
validate?: boolean;
|
|
16
|
+
concurrency: number;
|
|
17
|
+
gzip?: boolean;
|
|
18
|
+
};
|
|
19
|
+
type MetadataEntry = {
|
|
20
|
+
slug: string;
|
|
21
|
+
type: 'charts' | 'dashboards';
|
|
22
|
+
downloadedAt: string;
|
|
23
|
+
};
|
|
24
|
+
type DownloadContentType = 'charts' | 'dashboards' | 'sqlCharts';
|
|
25
|
+
export declare const downloadContent: (ids: string[], type: DownloadContentType, projectId: string, projectName: string, customPath?: string, languageMap?: boolean, nested?: boolean, skipSpaces?: boolean) => Promise<[number, string[], MetadataEntry[], SpaceAsCode[]]>;
|
|
26
|
+
export declare const downloadHandler: (options: DownloadHandlerOptions) => Promise<void>;
|
|
27
|
+
export declare const uploadHandler: (options: DownloadHandlerOptions) => Promise<void>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAmBH,KAAK,WAAW,EACnB,MAAM,mBAAmB,CAAC;AAuB3B,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,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,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AA2FF,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAwbF,KAAK,mBAAmB,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAkDjE,eAAO,MAAM,eAAe,GACxB,KAAK,MAAM,EAAE,EACb,MAAM,mBAAmB,EACzB,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,aAAa,MAAM,EACnB,cAAa,OAAe,EAC5B,SAAQ,OAAe,EACvB,aAAY,OAAe,KAC5B,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,CA0H5D,CAAC;AAEF,eAAO,MAAM,eAAe,GACxB,SAAS,sBAAsB,KAChC,OAAO,CAAC,IAAI,CAoOd,CAAC;AAubF,eAAO,MAAM,aAAa,GACtB,SAAS,sBAAsB,KAChC,OAAO,CAAC,IAAI,CA2Kd,CAAC"}
|