@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.
Files changed (237) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +197 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/ajv.d.ts +3 -0
  5. package/dist/ajv.d.ts.map +1 -0
  6. package/dist/ajv.js +13 -0
  7. package/dist/analytics/analytics.d.ts +370 -0
  8. package/dist/analytics/analytics.d.ts.map +1 -0
  9. package/dist/analytics/analytics.js +143 -0
  10. package/dist/config.d.ts +34 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +134 -0
  13. package/dist/dbt/context.d.ts +14 -0
  14. package/dist/dbt/context.d.ts.map +1 -0
  15. package/dist/dbt/context.js +76 -0
  16. package/dist/dbt/context.test.d.ts +2 -0
  17. package/dist/dbt/context.test.d.ts.map +1 -0
  18. package/dist/dbt/context.test.js +152 -0
  19. package/dist/dbt/manifest.d.ts +7 -0
  20. package/dist/dbt/manifest.d.ts.map +1 -0
  21. package/dist/dbt/manifest.js +23 -0
  22. package/dist/dbt/models.d.ts +43 -0
  23. package/dist/dbt/models.d.ts.map +1 -0
  24. package/dist/dbt/models.js +256 -0
  25. package/dist/dbt/models.test.d.ts +2 -0
  26. package/dist/dbt/models.test.d.ts.map +1 -0
  27. package/dist/dbt/models.test.js +19 -0
  28. package/dist/dbt/profile.d.ts +9 -0
  29. package/dist/dbt/profile.d.ts.map +1 -0
  30. package/dist/dbt/profile.js +86 -0
  31. package/dist/dbt/profiles.test.d.ts +2 -0
  32. package/dist/dbt/profiles.test.d.ts.map +1 -0
  33. package/dist/dbt/profiles.test.js +50 -0
  34. package/dist/dbt/schema.d.ts +31 -0
  35. package/dist/dbt/schema.d.ts.map +1 -0
  36. package/dist/dbt/schema.js +49 -0
  37. package/dist/dbt/targets/Bigquery/index.d.ts +18 -0
  38. package/dist/dbt/targets/Bigquery/index.d.ts.map +1 -0
  39. package/dist/dbt/targets/Bigquery/index.js +105 -0
  40. package/dist/dbt/targets/Bigquery/oauth.d.ts +2 -0
  41. package/dist/dbt/targets/Bigquery/oauth.d.ts.map +1 -0
  42. package/dist/dbt/targets/Bigquery/oauth.js +43 -0
  43. package/dist/dbt/targets/Bigquery/serviceAccount.d.ts +35 -0
  44. package/dist/dbt/targets/Bigquery/serviceAccount.d.ts.map +1 -0
  45. package/dist/dbt/targets/Bigquery/serviceAccount.js +149 -0
  46. package/dist/dbt/targets/Databricks/oauth.d.ts +21 -0
  47. package/dist/dbt/targets/Databricks/oauth.d.ts.map +1 -0
  48. package/dist/dbt/targets/Databricks/oauth.js +184 -0
  49. package/dist/dbt/targets/athena.d.ts +21 -0
  50. package/dist/dbt/targets/athena.d.ts.map +1 -0
  51. package/dist/dbt/targets/athena.js +91 -0
  52. package/dist/dbt/targets/athena.test.d.ts +2 -0
  53. package/dist/dbt/targets/athena.test.d.ts.map +1 -0
  54. package/dist/dbt/targets/athena.test.js +60 -0
  55. package/dist/dbt/targets/clickhouse.d.ts +24 -0
  56. package/dist/dbt/targets/clickhouse.d.ts.map +1 -0
  57. package/dist/dbt/targets/clickhouse.js +90 -0
  58. package/dist/dbt/targets/databricks.d.ts +27 -0
  59. package/dist/dbt/targets/databricks.d.ts.map +1 -0
  60. package/dist/dbt/targets/databricks.js +138 -0
  61. package/dist/dbt/targets/duckdb.d.ts +16 -0
  62. package/dist/dbt/targets/duckdb.d.ts.map +1 -0
  63. package/dist/dbt/targets/duckdb.js +63 -0
  64. package/dist/dbt/targets/duckdb.test.d.ts +2 -0
  65. package/dist/dbt/targets/duckdb.test.d.ts.map +1 -0
  66. package/dist/dbt/targets/duckdb.test.js +37 -0
  67. package/dist/dbt/targets/postgres.d.ts +26 -0
  68. package/dist/dbt/targets/postgres.d.ts.map +1 -0
  69. package/dist/dbt/targets/postgres.js +142 -0
  70. package/dist/dbt/targets/redshift.d.ts +23 -0
  71. package/dist/dbt/targets/redshift.d.ts.map +1 -0
  72. package/dist/dbt/targets/redshift.js +96 -0
  73. package/dist/dbt/targets/snowflake.d.ts +4 -0
  74. package/dist/dbt/targets/snowflake.d.ts.map +1 -0
  75. package/dist/dbt/targets/snowflake.js +134 -0
  76. package/dist/dbt/targets/trino.d.ts +16 -0
  77. package/dist/dbt/targets/trino.d.ts.map +1 -0
  78. package/dist/dbt/targets/trino.js +65 -0
  79. package/dist/dbt/templating.d.ts +15 -0
  80. package/dist/dbt/templating.d.ts.map +1 -0
  81. package/dist/dbt/templating.js +50 -0
  82. package/dist/dbt/templating.test.d.ts +2 -0
  83. package/dist/dbt/templating.test.d.ts.map +1 -0
  84. package/dist/dbt/templating.test.js +51 -0
  85. package/dist/dbt/types.d.ts +17 -0
  86. package/dist/dbt/types.d.ts.map +1 -0
  87. package/dist/dbt/types.js +2 -0
  88. package/dist/dbt/validation.d.ts +9 -0
  89. package/dist/dbt/validation.d.ts.map +1 -0
  90. package/dist/dbt/validation.js +54 -0
  91. package/dist/env.d.ts +12 -0
  92. package/dist/env.d.ts.map +1 -0
  93. package/dist/env.js +40 -0
  94. package/dist/error.d.ts +2 -0
  95. package/dist/error.d.ts.map +1 -0
  96. package/dist/error.js +12 -0
  97. package/dist/globalState.d.ts +29 -0
  98. package/dist/globalState.d.ts.map +1 -0
  99. package/dist/globalState.js +67 -0
  100. package/dist/handlers/asyncQuery.d.ts +7 -0
  101. package/dist/handlers/asyncQuery.d.ts.map +1 -0
  102. package/dist/handlers/asyncQuery.js +50 -0
  103. package/dist/handlers/compile.d.ts +16 -0
  104. package/dist/handlers/compile.d.ts.map +1 -0
  105. package/dist/handlers/compile.js +277 -0
  106. package/dist/handlers/compile.test.d.ts +2 -0
  107. package/dist/handlers/compile.test.d.ts.map +1 -0
  108. package/dist/handlers/compile.test.js +201 -0
  109. package/dist/handlers/createProject.d.ts +37 -0
  110. package/dist/handlers/createProject.d.ts.map +1 -0
  111. package/dist/handlers/createProject.js +272 -0
  112. package/dist/handlers/dbt/apiClient.d.ts +14 -0
  113. package/dist/handlers/dbt/apiClient.d.ts.map +1 -0
  114. package/dist/handlers/dbt/apiClient.js +167 -0
  115. package/dist/handlers/dbt/compile.d.ts +35 -0
  116. package/dist/handlers/dbt/compile.d.ts.map +1 -0
  117. package/dist/handlers/dbt/compile.js +220 -0
  118. package/dist/handlers/dbt/getDbtProfileTargetName.d.ts +9 -0
  119. package/dist/handlers/dbt/getDbtProfileTargetName.d.ts.map +1 -0
  120. package/dist/handlers/dbt/getDbtProfileTargetName.js +44 -0
  121. package/dist/handlers/dbt/getDbtVersion.d.ts +16 -0
  122. package/dist/handlers/dbt/getDbtVersion.d.ts.map +1 -0
  123. package/dist/handlers/dbt/getDbtVersion.js +141 -0
  124. package/dist/handlers/dbt/getDbtVersion.mocks.d.ts +11 -0
  125. package/dist/handlers/dbt/getDbtVersion.mocks.d.ts.map +1 -0
  126. package/dist/handlers/dbt/getDbtVersion.mocks.js +70 -0
  127. package/dist/handlers/dbt/getDbtVersion.test.d.ts +2 -0
  128. package/dist/handlers/dbt/getDbtVersion.test.d.ts.map +1 -0
  129. package/dist/handlers/dbt/getDbtVersion.test.js +97 -0
  130. package/dist/handlers/dbt/getWarehouseClient.d.ts +24 -0
  131. package/dist/handlers/dbt/getWarehouseClient.d.ts.map +1 -0
  132. package/dist/handlers/dbt/getWarehouseClient.js +312 -0
  133. package/dist/handlers/dbt/refresh.d.ts +11 -0
  134. package/dist/handlers/dbt/refresh.d.ts.map +1 -0
  135. package/dist/handlers/dbt/refresh.js +114 -0
  136. package/dist/handlers/dbt/run.d.ts +14 -0
  137. package/dist/handlers/dbt/run.d.ts.map +1 -0
  138. package/dist/handlers/dbt/run.js +67 -0
  139. package/dist/handlers/deploy.d.ts +26 -0
  140. package/dist/handlers/deploy.d.ts.map +1 -0
  141. package/dist/handlers/deploy.js +377 -0
  142. package/dist/handlers/diagnostics.d.ts +11 -0
  143. package/dist/handlers/diagnostics.d.ts.map +1 -0
  144. package/dist/handlers/diagnostics.js +194 -0
  145. package/dist/handlers/download.d.ts +29 -0
  146. package/dist/handlers/download.d.ts.map +1 -0
  147. package/dist/handlers/download.js +955 -0
  148. package/dist/handlers/exportChartImage.d.ts +7 -0
  149. package/dist/handlers/exportChartImage.d.ts.map +1 -0
  150. package/dist/handlers/exportChartImage.js +33 -0
  151. package/dist/handlers/generate.d.ts +13 -0
  152. package/dist/handlers/generate.d.ts.map +1 -0
  153. package/dist/handlers/generate.js +159 -0
  154. package/dist/handlers/generateExposures.d.ts +8 -0
  155. package/dist/handlers/generateExposures.d.ts.map +1 -0
  156. package/dist/handlers/generateExposures.js +100 -0
  157. package/dist/handlers/getProject.d.ts +6 -0
  158. package/dist/handlers/getProject.d.ts.map +1 -0
  159. package/dist/handlers/getProject.js +43 -0
  160. package/dist/handlers/installSkills.d.ts +12 -0
  161. package/dist/handlers/installSkills.d.ts.map +1 -0
  162. package/dist/handlers/installSkills.js +321 -0
  163. package/dist/handlers/lint/ajvToSarif.d.ts +66 -0
  164. package/dist/handlers/lint/ajvToSarif.d.ts.map +1 -0
  165. package/dist/handlers/lint/ajvToSarif.js +222 -0
  166. package/dist/handlers/lint/sarifFormatter.d.ts +14 -0
  167. package/dist/handlers/lint/sarifFormatter.d.ts.map +1 -0
  168. package/dist/handlers/lint/sarifFormatter.js +111 -0
  169. package/dist/handlers/lint.d.ts +8 -0
  170. package/dist/handlers/lint.d.ts.map +1 -0
  171. package/dist/handlers/lint.js +308 -0
  172. package/dist/handlers/listProjects.d.ts +6 -0
  173. package/dist/handlers/listProjects.d.ts.map +1 -0
  174. package/dist/handlers/listProjects.js +53 -0
  175. package/dist/handlers/login/oauth.d.ts +2 -0
  176. package/dist/handlers/login/oauth.d.ts.map +1 -0
  177. package/dist/handlers/login/oauth.js +27 -0
  178. package/dist/handlers/login/pat.d.ts +2 -0
  179. package/dist/handlers/login/pat.d.ts.map +1 -0
  180. package/dist/handlers/login/pat.js +31 -0
  181. package/dist/handlers/login.d.ts +15 -0
  182. package/dist/handlers/login.d.ts.map +1 -0
  183. package/dist/handlers/login.js +239 -0
  184. package/dist/handlers/metadataFile.d.ts +9 -0
  185. package/dist/handlers/metadataFile.d.ts.map +1 -0
  186. package/dist/handlers/metadataFile.js +34 -0
  187. package/dist/handlers/oauthLogin.d.ts +6 -0
  188. package/dist/handlers/oauthLogin.d.ts.map +1 -0
  189. package/dist/handlers/oauthLogin.js +191 -0
  190. package/dist/handlers/preview.d.ts +29 -0
  191. package/dist/handlers/preview.d.ts.map +1 -0
  192. package/dist/handlers/preview.js +415 -0
  193. package/dist/handlers/renameHandler.d.ts +16 -0
  194. package/dist/handlers/renameHandler.d.ts.map +1 -0
  195. package/dist/handlers/renameHandler.js +160 -0
  196. package/dist/handlers/runChart.d.ts +10 -0
  197. package/dist/handlers/runChart.d.ts.map +1 -0
  198. package/dist/handlers/runChart.js +105 -0
  199. package/dist/handlers/selectProject.d.ts +20 -0
  200. package/dist/handlers/selectProject.d.ts.map +1 -0
  201. package/dist/handlers/selectProject.js +91 -0
  202. package/dist/handlers/setProject.d.ts +14 -0
  203. package/dist/handlers/setProject.d.ts.map +1 -0
  204. package/dist/handlers/setProject.js +131 -0
  205. package/dist/handlers/setWarehouse.d.ts +14 -0
  206. package/dist/handlers/setWarehouse.d.ts.map +1 -0
  207. package/dist/handlers/setWarehouse.js +94 -0
  208. package/dist/handlers/sql.d.ts +9 -0
  209. package/dist/handlers/sql.d.ts.map +1 -0
  210. package/dist/handlers/sql.js +89 -0
  211. package/dist/handlers/utils.d.ts +11 -0
  212. package/dist/handlers/utils.d.ts.map +1 -0
  213. package/dist/handlers/utils.js +36 -0
  214. package/dist/handlers/validate.d.ts +22 -0
  215. package/dist/handlers/validate.d.ts.map +1 -0
  216. package/dist/handlers/validate.js +201 -0
  217. package/dist/index.d.ts +3 -0
  218. package/dist/index.d.ts.map +1 -0
  219. package/dist/index.js +581 -0
  220. package/dist/lightdash/loader.d.ts +21 -0
  221. package/dist/lightdash/loader.d.ts.map +1 -0
  222. package/dist/lightdash/loader.js +122 -0
  223. package/dist/lightdash/projectType.d.ts +84 -0
  224. package/dist/lightdash/projectType.d.ts.map +1 -0
  225. package/dist/lightdash/projectType.js +75 -0
  226. package/dist/lightdash-config/index.d.ts +2 -0
  227. package/dist/lightdash-config/index.d.ts.map +1 -0
  228. package/dist/lightdash-config/index.js +41 -0
  229. package/dist/lightdash-config/lightdash-config.test.d.ts +2 -0
  230. package/dist/lightdash-config/lightdash-config.test.d.ts.map +1 -0
  231. package/dist/lightdash-config/lightdash-config.test.js +70 -0
  232. package/dist/styles.d.ts +10 -0
  233. package/dist/styles.d.ts.map +1 -0
  234. package/dist/styles.js +14 -0
  235. package/entitlements.plist +33 -0
  236. package/package.json +71 -0
  237. package/track.sh +116 -0
@@ -0,0 +1,7 @@
1
+ type ExportChartImageOptions = {
2
+ output: string;
3
+ verbose?: boolean;
4
+ };
5
+ export declare const exportChartImageHandler: (chartUuidOrSlug: string, options: ExportChartImageOptions) => Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=exportChartImage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportChartImage.d.ts","sourceRoot":"","sources":["../../src/handlers/exportChartImage.ts"],"names":[],"mappings":"AAMA,KAAK,uBAAuB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAChC,iBAAiB,MAAM,EACvB,SAAS,uBAAuB,KACjC,OAAO,CAAC,IAAI,CAkCd,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportChartImageHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
7
+ const globalState_1 = tslib_1.__importDefault(require("../globalState"));
8
+ const styles = tslib_1.__importStar(require("../styles"));
9
+ const apiClient_1 = require("./dbt/apiClient");
10
+ const exportChartImageHandler = async (chartUuidOrSlug, options) => {
11
+ globalState_1.default.setVerbose(options.verbose ?? false);
12
+ const spinner = globalState_1.default.startSpinner(`Exporting chart image for '${chartUuidOrSlug}'...`);
13
+ const imageUrl = await (0, apiClient_1.lightdashApi)({
14
+ method: 'POST',
15
+ url: `/api/v1/saved/${chartUuidOrSlug}/export`,
16
+ body: undefined,
17
+ });
18
+ if (!imageUrl) {
19
+ spinner.warn('No image URL returned');
20
+ return;
21
+ }
22
+ globalState_1.default.debug(`> Image URL: ${imageUrl}`);
23
+ spinner.text = 'Downloading image...';
24
+ const response = await (0, node_fetch_1.default)(imageUrl);
25
+ if (!response.ok) {
26
+ spinner.fail('Failed to download chart image');
27
+ throw new Error(`Failed to download image: ${response.status} ${response.statusText}`);
28
+ }
29
+ const arrayBuffer = await response.arrayBuffer();
30
+ await fs_1.promises.writeFile(options.output, Buffer.from(arrayBuffer));
31
+ spinner.succeed(`${styles.success('Success!')} Saved chart image to ${options.output}`);
32
+ };
33
+ exports.exportChartImageHandler = exportChartImageHandler;
@@ -0,0 +1,13 @@
1
+ import { CompileHandlerOptions } from './compile';
2
+ type GenerateHandlerOptions = CompileHandlerOptions & {
3
+ select: string[] | undefined;
4
+ exclude: string[] | undefined;
5
+ models: string[] | undefined;
6
+ assumeYes: boolean;
7
+ excludeMeta: boolean;
8
+ skipExisting?: boolean;
9
+ preserveColumnCase: boolean;
10
+ };
11
+ export declare const generateHandler: (options: GenerateHandlerOptions) => Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/handlers/generate.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAMlD,KAAK,sBAAsB,GAAG,qBAAqB,GAAG;IAClD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,SAAS,sBAAsB,kBA6KpE,CAAC"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@lightdash/common");
6
+ const fs_1 = require("fs");
7
+ const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
8
+ const path = tslib_1.__importStar(require("path"));
9
+ const uuid_1 = require("uuid");
10
+ const analytics_1 = require("../analytics/analytics");
11
+ const context_1 = require("../dbt/context");
12
+ const manifest_1 = require("../dbt/manifest");
13
+ const models_1 = require("../dbt/models");
14
+ const globalState_1 = tslib_1.__importDefault(require("../globalState"));
15
+ const styles = tslib_1.__importStar(require("../styles"));
16
+ const apiClient_1 = require("./dbt/apiClient");
17
+ const compile_1 = require("./dbt/compile");
18
+ const getDbtVersion_1 = require("./dbt/getDbtVersion");
19
+ const getWarehouseClient_1 = tslib_1.__importDefault(require("./dbt/getWarehouseClient"));
20
+ const generateHandler = async (options) => {
21
+ globalState_1.default.setVerbose(options.verbose);
22
+ await (0, apiClient_1.checkLightdashVersion)();
23
+ const executionId = (0, uuid_1.v4)();
24
+ if (options.select === undefined &&
25
+ options.exclude === undefined &&
26
+ !options.assumeYes) {
27
+ const answers = await inquirer_1.default.prompt([
28
+ {
29
+ type: 'confirm',
30
+ name: 'isConfirm',
31
+ message: 'Are you sure you want to generate .yml for all models in project?',
32
+ },
33
+ ]);
34
+ if (!answers.isConfirm) {
35
+ return;
36
+ }
37
+ }
38
+ const numModelsSelected = (options.select || options.models)?.length;
39
+ const startTime = Date.now();
40
+ await analytics_1.LightdashAnalytics.track({
41
+ event: 'generate.started',
42
+ properties: {
43
+ executionId,
44
+ trigger: 'generate',
45
+ numModelsSelected,
46
+ },
47
+ });
48
+ const absoluteProjectPath = path.resolve(options.projectDir);
49
+ const context = await (0, context_1.getDbtContext)({
50
+ projectDir: absoluteProjectPath,
51
+ targetPath: options.targetPath,
52
+ });
53
+ const profileName = options.profile || context.profileName;
54
+ const dbtVersion = await (0, getDbtVersion_1.getDbtVersion)();
55
+ const { warehouseClient } = await (0, getWarehouseClient_1.default)({
56
+ isDbtCloudCLI: dbtVersion.isDbtCloudCLI,
57
+ profilesDir: options.profilesDir,
58
+ profile: options.profile || context.profileName,
59
+ target: options.target,
60
+ startOfWeek: options.startOfWeek,
61
+ });
62
+ // When --target is explicitly set, run dbt ls to refresh the manifest
63
+ // so model schema/database/catalog reflect the correct target
64
+ if (options.target && !dbtVersion.isDbtCloudCLI) {
65
+ await (0, compile_1.dbtList)(options);
66
+ }
67
+ const manifest = await (0, manifest_1.loadManifest)({ targetDir: context.targetDir });
68
+ const models = (0, common_1.getModelsFromManifest)(manifest);
69
+ const compiledModels = await (0, models_1.getCompiledModels)(models, {
70
+ projectDir: dbtVersion.isDbtCloudCLI ? undefined : absoluteProjectPath,
71
+ profilesDir: dbtVersion.isDbtCloudCLI
72
+ ? undefined
73
+ : path.resolve(options.profilesDir),
74
+ profile: dbtVersion.isDbtCloudCLI ? undefined : profileName,
75
+ target: options.target,
76
+ select: options.select || options.models,
77
+ exclude: options.exclude,
78
+ vars: options.vars || undefined,
79
+ });
80
+ globalState_1.default.debug(`> Compiled models: ${compiledModels.length}`);
81
+ console.info(styles.info(`Generated .yml files:`));
82
+ for await (const compiledModel of compiledModels) {
83
+ const spinner = globalState_1.default.startSpinner(` Generating .yml for model ${styles.bold(compiledModel.name)}`);
84
+ try {
85
+ const table = await (0, models_1.getWarehouseTableForModel)({
86
+ model: compiledModel,
87
+ warehouseClient,
88
+ preserveColumnCase: options.preserveColumnCase,
89
+ });
90
+ // Resolve dbt version for metadata structure
91
+ const resolvedDbtVersion = dbtVersion.versionOption === common_1.DbtVersionOptionLatest.LATEST
92
+ ? (0, common_1.getLatestSupportDbtVersion)()
93
+ : dbtVersion.versionOption;
94
+ globalState_1.default.debug(`Using detected dbt version ${resolvedDbtVersion} for metadata structure`);
95
+ const { updatedYml, outputFilePath } = await (0, models_1.findAndUpdateModelYaml)({
96
+ model: compiledModel,
97
+ table,
98
+ docs: manifest.docs,
99
+ includeMeta: !options.excludeMeta,
100
+ projectDir: absoluteProjectPath,
101
+ projectName: context.projectName,
102
+ assumeYes: options.assumeYes,
103
+ dbtVersion: resolvedDbtVersion,
104
+ });
105
+ try {
106
+ if (options.skipExisting) {
107
+ try {
108
+ await fs_1.promises.access(outputFilePath);
109
+ spinner.warn(` already exists ${styles.bold(compiledModel.name)}${styles.info(` ➡️ ${path.relative(process.cwd(), outputFilePath)} `)}`);
110
+ // eslint-disable-next-line no-continue
111
+ continue; // Skip this file if it already exists
112
+ }
113
+ catch {
114
+ // File does not exist, we continue
115
+ }
116
+ }
117
+ const outputDirPath = path.dirname(outputFilePath);
118
+ // Create a directory if it doesn't exist
119
+ try {
120
+ await fs_1.promises.access(outputDirPath);
121
+ }
122
+ catch (error) {
123
+ await fs_1.promises.mkdir(outputDirPath, { recursive: true });
124
+ }
125
+ await fs_1.promises.writeFile(outputFilePath, updatedYml.toString({
126
+ quoteChar: '"',
127
+ }));
128
+ }
129
+ catch (e) {
130
+ const msg = (0, common_1.getErrorMessage)(e);
131
+ throw new common_1.ParseError(`Failed to write file ${outputFilePath}\n ${msg}`);
132
+ }
133
+ spinner.succeed(` ${styles.bold(compiledModel.name)}${styles.info(` ➡️ ${path.relative(process.cwd(), outputFilePath)}`)}`);
134
+ }
135
+ catch (e) {
136
+ const msg = (0, common_1.getErrorMessage)(e);
137
+ await analytics_1.LightdashAnalytics.track({
138
+ event: 'generate.error',
139
+ properties: {
140
+ executionId,
141
+ trigger: 'generate',
142
+ error: `${msg}`,
143
+ },
144
+ });
145
+ spinner.fail(` Failed to generate ${compiledModel.name}.yml`);
146
+ throw e;
147
+ }
148
+ }
149
+ await analytics_1.LightdashAnalytics.track({
150
+ event: 'generate.completed',
151
+ properties: {
152
+ executionId,
153
+ trigger: 'generate',
154
+ numModelsSelected,
155
+ durationMs: Date.now() - startTime,
156
+ },
157
+ });
158
+ };
159
+ exports.generateHandler = generateHandler;
@@ -0,0 +1,8 @@
1
+ type GenerateExposuresHandlerOptions = {
2
+ projectDir: string;
3
+ verbose: boolean;
4
+ output?: string;
5
+ };
6
+ export declare const generateExposuresHandler: (options: GenerateExposuresHandlerOptions) => Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=generateExposures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateExposures.d.ts","sourceRoot":"","sources":["../../src/handlers/generateExposures.ts"],"names":[],"mappings":"AAkBA,KAAK,+BAA+B,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACjC,SAAS,+BAA+B,kBA6G3C,CAAC"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateExposuresHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@lightdash/common");
6
+ const fs_1 = require("fs");
7
+ const yaml = tslib_1.__importStar(require("js-yaml"));
8
+ const path = tslib_1.__importStar(require("path"));
9
+ const uuid_1 = require("uuid");
10
+ const analytics_1 = require("../analytics/analytics");
11
+ const config_1 = require("../config");
12
+ const globalState_1 = tslib_1.__importDefault(require("../globalState"));
13
+ const styles = tslib_1.__importStar(require("../styles"));
14
+ const apiClient_1 = require("./dbt/apiClient");
15
+ const getDbtVersion_1 = require("./dbt/getDbtVersion");
16
+ const generateExposuresHandler = async (options) => {
17
+ globalState_1.default.setVerbose(options.verbose);
18
+ await (0, apiClient_1.checkLightdashVersion)();
19
+ const executionId = (0, uuid_1.v4)();
20
+ const config = await (0, config_1.getConfig)();
21
+ if (!(config.context?.project && config.context.serverUrl)) {
22
+ throw new common_1.AuthorizationError(`No active Clary project. Run 'clary login --help'`);
23
+ }
24
+ const startTime = Date.now();
25
+ await analytics_1.LightdashAnalytics.track({
26
+ event: 'generate_exposures.started',
27
+ properties: {
28
+ executionId,
29
+ },
30
+ });
31
+ console.info(styles.warning(`This is an experimental feature and may change in future versions`));
32
+ // Log current project info
33
+ globalState_1.default.logProjectInfo(config);
34
+ const spinner = globalState_1.default.startSpinner(` Generating Clary exposures .yml for project ${styles.bold(config.context.projectName || config.context.project)}`);
35
+ try {
36
+ const absoluteProjectPath = path.resolve(options.projectDir);
37
+ // Detect dbt version to determine format
38
+ const dbtVersionInfo = await (0, getDbtVersion_1.getDbtVersion)();
39
+ const isDbt110Plus = dbtVersionInfo.versionOption === common_1.DbtVersionOptionLatest.LATEST
40
+ ? true
41
+ : (0, common_1.isDbtVersion110OrHigher)(dbtVersionInfo.versionOption);
42
+ const exposures = await (0, apiClient_1.lightdashApi)({
43
+ method: 'GET',
44
+ url: `/api/v1/projects/${config.context.project}/dbt-exposures`,
45
+ body: undefined,
46
+ });
47
+ console.info(styles.info(`Found ${Object.keys(exposures).length} exposures`));
48
+ const outputFilePath = options.output ||
49
+ path.join(absoluteProjectPath, 'models', 'lightdash_exposures.yml');
50
+ // Transform exposures based on dbt version
51
+ const transformedExposures = Object.values(exposures).map(({ dependsOn, tags, ...rest }) => {
52
+ if (isDbt110Plus && tags) {
53
+ // For dbt 1.10+, move tags under config
54
+ return {
55
+ ...rest,
56
+ depends_on: dependsOn,
57
+ config: {
58
+ tags,
59
+ },
60
+ };
61
+ }
62
+ // For older versions, keep tags at top level
63
+ return {
64
+ ...rest,
65
+ depends_on: dependsOn,
66
+ ...(tags ? { tags } : {}),
67
+ };
68
+ });
69
+ const updatedYml = {
70
+ version: 2,
71
+ exposures: transformedExposures,
72
+ };
73
+ const ymlString = yaml.dump(updatedYml, {
74
+ quotingType: '"',
75
+ });
76
+ await fs_1.promises.writeFile(outputFilePath, ymlString);
77
+ spinner.succeed(` Generated exposures file in '${outputFilePath}'`);
78
+ await analytics_1.LightdashAnalytics.track({
79
+ event: 'generate_exposures.completed',
80
+ properties: {
81
+ executionId,
82
+ countExposures: Object.keys(exposures).length,
83
+ durationMs: Date.now() - startTime,
84
+ },
85
+ });
86
+ }
87
+ catch (e) {
88
+ await analytics_1.LightdashAnalytics.track({
89
+ event: 'generate_exposures.error',
90
+ properties: {
91
+ executionId,
92
+ trigger: 'generate',
93
+ error: `${(0, common_1.getErrorMessage)(e)}`,
94
+ },
95
+ });
96
+ spinner.fail(` Failed to generate exposures file'`);
97
+ throw e;
98
+ }
99
+ };
100
+ exports.generateExposuresHandler = generateExposuresHandler;
@@ -0,0 +1,6 @@
1
+ type GetProjectOptions = {
2
+ verbose: boolean;
3
+ };
4
+ export declare const getProjectHandler: (options: GetProjectOptions) => Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=getProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProject.d.ts","sourceRoot":"","sources":["../../src/handlers/getProject.ts"],"names":[],"mappings":"AAKA,KAAK,iBAAiB,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS,iBAAiB,kBAsCjE,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProjectHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const analytics_1 = require("../analytics/analytics");
6
+ const config_1 = require("../config");
7
+ const globalState_1 = tslib_1.__importDefault(require("../globalState"));
8
+ const styles = tslib_1.__importStar(require("../styles"));
9
+ const getProjectHandler = async (options) => {
10
+ const startTime = Date.now();
11
+ let success = true;
12
+ globalState_1.default.setVerbose(options.verbose);
13
+ try {
14
+ const config = await (0, config_1.getConfig)();
15
+ globalState_1.default.debug(`> Config: ${JSON.stringify(config)}`);
16
+ const projectUuid = config.context?.project;
17
+ const projectName = config.context?.projectName;
18
+ if (!projectUuid) {
19
+ console.error(styles.warning('No project set. Use `clary config set-project` to select a project.'));
20
+ }
21
+ else {
22
+ console.error(styles.bold('\nCurrent project:\n'));
23
+ console.error(` Name: ${projectName || '(unknown)'}`);
24
+ console.error(` UUID: ${projectUuid}`);
25
+ console.error('');
26
+ }
27
+ }
28
+ catch (e) {
29
+ success = false;
30
+ throw e;
31
+ }
32
+ finally {
33
+ await analytics_1.LightdashAnalytics.track({
34
+ event: 'command.executed',
35
+ properties: {
36
+ command: 'get-project',
37
+ durationMs: Date.now() - startTime,
38
+ success,
39
+ },
40
+ });
41
+ }
42
+ };
43
+ exports.getProjectHandler = getProjectHandler;
@@ -0,0 +1,12 @@
1
+ type AgentType = 'claude' | 'cursor' | 'codex';
2
+ type InstallSkillsOptions = {
3
+ verbose: boolean;
4
+ agent: AgentType;
5
+ global: boolean;
6
+ path?: string;
7
+ source?: string;
8
+ };
9
+ export declare function getVersionWithSkills(): string;
10
+ export declare const installSkillsHandler: (options: InstallSkillsOptions) => Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=installSkills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installSkills.d.ts","sourceRoot":"","sources":["../../src/handlers/installSkills.ts"],"names":[],"mappings":"AAqBA,KAAK,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,KAAK,oBAAoB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAoTF,wBAAgB,oBAAoB,IAAI,MAAM,CA8B7C;AAED,eAAO,MAAM,oBAAoB,GAC7B,SAAS,oBAAoB,KAC9B,OAAO,CAAC,IAAI,CAsFd,CAAC"}