yamchart 0.8.5 → 0.8.7

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 (49) hide show
  1. package/dist/{advisor-CSVLJFOG.js → advisor-54JBE2EV.js} +3 -3
  2. package/dist/{chunk-RYTMXP2R.js → chunk-C7A7TKSY.js} +2 -2
  3. package/dist/chunk-C7A7TKSY.js.map +1 -0
  4. package/dist/{chunk-QLBCPJDL.js → chunk-GLCEDWGH.js} +2 -2
  5. package/dist/{chunk-VXDZEBAN.js → chunk-NCPWAWIM.js} +4 -4
  6. package/dist/chunk-NCPWAWIM.js.map +1 -0
  7. package/dist/{chunk-VTLZAE3C.js → chunk-YMQ4PWVJ.js} +2 -2
  8. package/dist/{connection-utils-2SZAG2QM.js → connection-utils-MXEF6X7K.js} +3 -3
  9. package/dist/{describe-ELE7CAVA.js → describe-XKLBZEWG.js} +4 -4
  10. package/dist/{dev-AWJ7TF6G.js → dev-Z2R2DBWO.js} +6 -6
  11. package/dist/dev-Z2R2DBWO.js.map +1 -0
  12. package/dist/{dist-2OQOI2PU.js → dist-LJR7TAW4.js} +2 -2
  13. package/dist/index.js +21 -21
  14. package/dist/index.js.map +1 -1
  15. package/dist/public/assets/{EventManagement-BoRjqKRW.js → EventManagement-DtPDwZ-w.js} +1 -1
  16. package/dist/public/assets/{LoginPage-6Mq23h5G.js → LoginPage-DBq1qDOK.js} +1 -1
  17. package/dist/public/assets/PublicViewer-Da8Cu1C1.js +1 -0
  18. package/dist/public/assets/{SetupWizard-OaUCCW42.js → SetupWizard-hgd12cdr.js} +1 -1
  19. package/dist/public/assets/{ShareManagement-DxGEtGcz.js → ShareManagement-D82oEJJg.js} +1 -1
  20. package/dist/public/assets/{UserManagement-CY0xL5Sd.js → UserManagement-CZsxY9aP.js} +1 -1
  21. package/dist/public/assets/{index-BG7tFC30.js → index-DVSm0iiw.js} +46 -46
  22. package/dist/public/assets/{index.es-CeWJMj7-.js → index.es-BmKO-vE1.js} +1 -1
  23. package/dist/public/assets/{jspdf.es.min-mo4OQEJV.js → jspdf.es.min-DMVrmE3G.js} +3 -3
  24. package/dist/public/index.html +1 -1
  25. package/dist/{query-P4TSQES4.js → query-MXMFI5TB.js} +3 -3
  26. package/dist/{sample-3VDU6ZAV.js → sample-HDPYNAKS.js} +3 -3
  27. package/dist/{search-L5QA64T7.js → search-6CPEPJTI.js} +4 -4
  28. package/dist/{source-resolver-TTHGNPBK.js → source-resolver-PCASPRSD.js} +4 -4
  29. package/dist/{sync-warehouse-KGT6XSXI.js → sync-warehouse-XC7YYZKC.js} +3 -3
  30. package/dist/{tables-IG4RYPCG.js → tables-26PNVZIC.js} +4 -4
  31. package/dist/{test-SN75DCIN.js → test-APA44AIF.js} +3 -3
  32. package/package.json +2 -2
  33. package/dist/chunk-RYTMXP2R.js.map +0 -1
  34. package/dist/chunk-VXDZEBAN.js.map +0 -1
  35. package/dist/dev-AWJ7TF6G.js.map +0 -1
  36. package/dist/public/assets/PublicViewer-D1_damvE.js +0 -1
  37. /package/dist/{advisor-CSVLJFOG.js.map → advisor-54JBE2EV.js.map} +0 -0
  38. /package/dist/{chunk-QLBCPJDL.js.map → chunk-GLCEDWGH.js.map} +0 -0
  39. /package/dist/{chunk-VTLZAE3C.js.map → chunk-YMQ4PWVJ.js.map} +0 -0
  40. /package/dist/{connection-utils-2SZAG2QM.js.map → connection-utils-MXEF6X7K.js.map} +0 -0
  41. /package/dist/{describe-ELE7CAVA.js.map → describe-XKLBZEWG.js.map} +0 -0
  42. /package/dist/{dist-2OQOI2PU.js.map → dist-LJR7TAW4.js.map} +0 -0
  43. /package/dist/{query-P4TSQES4.js.map → query-MXMFI5TB.js.map} +0 -0
  44. /package/dist/{sample-3VDU6ZAV.js.map → sample-HDPYNAKS.js.map} +0 -0
  45. /package/dist/{search-L5QA64T7.js.map → search-6CPEPJTI.js.map} +0 -0
  46. /package/dist/{source-resolver-TTHGNPBK.js.map → source-resolver-PCASPRSD.js.map} +0 -0
  47. /package/dist/{sync-warehouse-KGT6XSXI.js.map → sync-warehouse-XC7YYZKC.js.map} +0 -0
  48. /package/dist/{tables-IG4RYPCG.js.map → tables-26PNVZIC.js.map} +0 -0
  49. /package/dist/{test-SN75DCIN.js.map → test-APA44AIF.js.map} +0 -0
@@ -23,7 +23,7 @@ import {
23
23
  VERSION,
24
24
  deepMerge,
25
25
  resolveProjectConfig
26
- } from "./chunk-RYTMXP2R.js";
26
+ } from "./chunk-C7A7TKSY.js";
27
27
  import "./chunk-DGUM43GV.js";
28
28
  export {
29
29
  ChartSchema,
@@ -51,4 +51,4 @@ export {
51
51
  deepMerge,
52
52
  resolveProjectConfig
53
53
  };
54
- //# sourceMappingURL=dist-2OQOI2PU.js.map
54
+ //# sourceMappingURL=dist-LJR7TAW4.js.map
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findProjectRoot,
7
7
  loadEnvFile,
8
8
  validateProject
9
- } from "./chunk-QLBCPJDL.js";
9
+ } from "./chunk-GLCEDWGH.js";
10
10
  import {
11
11
  detail,
12
12
  error,
@@ -17,7 +17,7 @@ import {
17
17
  success,
18
18
  warning
19
19
  } from "./chunk-HJVVHYVN.js";
20
- import "./chunk-RYTMXP2R.js";
20
+ import "./chunk-C7A7TKSY.js";
21
21
  import "./chunk-5N3FYFBV.js";
22
22
  import "./chunk-UND73EOB.js";
23
23
  import "./chunk-DGUM43GV.js";
@@ -32,7 +32,7 @@ var __dirname = dirname(fileURLToPath(import.meta.url));
32
32
  var pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
33
33
  var program = new Command();
34
34
  program.name("yamchart").description("Git-native business intelligence dashboards").version(pkg.version);
35
- program.option("--env <name>", "Environment to use (default: local, or YAMCHART_ENV)");
35
+ program.option("--env <name>", "Environment to use (from environments block, or YAMCHART_ENV)");
36
36
  program.hook("preAction", () => {
37
37
  const opts = program.opts();
38
38
  if (opts.env) {
@@ -105,7 +105,7 @@ program.command("dev").description("Start development server with hot reload").a
105
105
  process.exit(2);
106
106
  }
107
107
  const globalOpts = program.opts();
108
- const { runDevServer } = await import("./dev-AWJ7TF6G.js");
108
+ const { runDevServer } = await import("./dev-Z2R2DBWO.js");
109
109
  await runDevServer(projectDir, {
110
110
  port: parseInt(options.port, 10),
111
111
  apiOnly: options.apiOnly ?? false,
@@ -179,7 +179,7 @@ program.command("sync-dbt").description("Sync dbt project metadata into AI-reada
179
179
  if (!options.targetDatabase) {
180
180
  try {
181
181
  const { readFile } = await import("fs/promises");
182
- const { resolveConnection } = await import("./connection-utils-2SZAG2QM.js");
182
+ const { resolveConnection } = await import("./connection-utils-MXEF6X7K.js");
183
183
  const { detectDatabaseMismatch } = await import("./rewrite-database-FDJIXKZ2.js");
184
184
  const catalogJsonStr = await readFile(join(projectDir, ".yamchart", "catalog.json"), "utf-8");
185
185
  const catalogData = JSON.parse(catalogJsonStr);
@@ -233,7 +233,7 @@ program.command("test").description("Run model tests (@returns schema checks and
233
233
  }
234
234
  loadEnvFile(projectDir);
235
235
  try {
236
- const { testProject, formatTestOutput } = await import("./test-SN75DCIN.js");
236
+ const { testProject, formatTestOutput } = await import("./test-APA44AIF.js");
237
237
  const result = await testProject(projectDir, model, {
238
238
  connection: options.connection,
239
239
  json: options.json
@@ -282,7 +282,7 @@ program.command("tables").description("List tables and views in the connected da
282
282
  loadEnvFile(projectDir);
283
283
  try {
284
284
  if (options.compare) {
285
- const { resolveTablesSource } = await import("./source-resolver-TTHGNPBK.js");
285
+ const { resolveTablesSource } = await import("./source-resolver-PCASPRSD.js");
286
286
  const { compareTables, formatCompareTables } = await import("./compare-ZN6RUOOQ.js");
287
287
  let localResult;
288
288
  try {
@@ -313,7 +313,7 @@ program.command("tables").description("List tables and views in the connected da
313
313
  }
314
314
  return;
315
315
  }
316
- const { listTables } = await import("./tables-IG4RYPCG.js");
316
+ const { listTables } = await import("./tables-26PNVZIC.js");
317
317
  const result = await listTables(projectDir, {
318
318
  ...options,
319
319
  source: options.source || "auto"
@@ -351,7 +351,7 @@ program.command("describe").description("Show columns and types for a table").ar
351
351
  loadEnvFile(projectDir);
352
352
  try {
353
353
  if (options.compare) {
354
- const { resolveDescribeSource } = await import("./source-resolver-TTHGNPBK.js");
354
+ const { resolveDescribeSource } = await import("./source-resolver-PCASPRSD.js");
355
355
  const { compareColumns, formatCompareColumns } = await import("./compare-ZN6RUOOQ.js");
356
356
  let localResult;
357
357
  try {
@@ -373,7 +373,7 @@ program.command("describe").description("Show columns and types for a table").ar
373
373
  }
374
374
  return;
375
375
  }
376
- const { describeTable } = await import("./describe-ELE7CAVA.js");
376
+ const { describeTable } = await import("./describe-XKLBZEWG.js");
377
377
  const result = await describeTable(projectDir, table, {
378
378
  ...options,
379
379
  source: options.source || "auto"
@@ -412,8 +412,8 @@ program.command("query").description("Execute SQL against a connection").argumen
412
412
  }
413
413
  loadEnvFile(projectDir);
414
414
  try {
415
- const { executeQuery } = await import("./query-P4TSQES4.js");
416
- const { formatTable, formatJSON } = await import("./connection-utils-2SZAG2QM.js");
415
+ const { executeQuery } = await import("./query-MXMFI5TB.js");
416
+ const { formatTable, formatJSON } = await import("./connection-utils-MXEF6X7K.js");
417
417
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
418
418
  const result = await executeQuery(projectDir, sql, {
419
419
  connection: options.connection,
@@ -440,8 +440,8 @@ program.command("sample").description("Show sample rows from a table or dbt mode
440
440
  }
441
441
  loadEnvFile(projectDir);
442
442
  try {
443
- const { sampleTable } = await import("./sample-3VDU6ZAV.js");
444
- const { formatTable, formatJSON } = await import("./connection-utils-2SZAG2QM.js");
443
+ const { sampleTable } = await import("./sample-HDPYNAKS.js");
444
+ const { formatTable, formatJSON } = await import("./connection-utils-MXEF6X7K.js");
445
445
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
446
446
  const result = await sampleTable(projectDir, table, {
447
447
  connection: options.connection,
@@ -471,7 +471,7 @@ program.command("search").description("Search for tables and columns by keyword"
471
471
  }
472
472
  loadEnvFile(projectDir);
473
473
  try {
474
- const { searchDatabase } = await import("./search-L5QA64T7.js");
474
+ const { searchDatabase } = await import("./search-6CPEPJTI.js");
475
475
  const result = await searchDatabase(projectDir, keyword, {
476
476
  ...options,
477
477
  source: options.source || "auto"
@@ -525,7 +525,7 @@ catalogCmd.command("tables").description("List tables from cached catalog").opti
525
525
  process.exit(2);
526
526
  }
527
527
  try {
528
- const { listTables } = await import("./tables-IG4RYPCG.js");
528
+ const { listTables } = await import("./tables-26PNVZIC.js");
529
529
  const result = await listTables(projectDir, {
530
530
  source: "catalog",
531
531
  schema: options.schema
@@ -567,7 +567,7 @@ catalogCmd.command("describe").description("Show cached columns and types for a
567
567
  process.exit(2);
568
568
  }
569
569
  try {
570
- const { describeTable } = await import("./describe-ELE7CAVA.js");
570
+ const { describeTable } = await import("./describe-XKLBZEWG.js");
571
571
  const result = await describeTable(projectDir, table, { source: "catalog" });
572
572
  if (options.json) {
573
573
  console.log(JSON.stringify(result.columns, null, 2));
@@ -609,7 +609,7 @@ catalogCmd.command("search").description("Search cached metadata for tables and
609
609
  process.exit(2);
610
610
  }
611
611
  try {
612
- const { searchDatabase } = await import("./search-L5QA64T7.js");
612
+ const { searchDatabase } = await import("./search-6CPEPJTI.js");
613
613
  const result = await searchDatabase(projectDir, keyword, { source: "catalog" });
614
614
  if (options.json) {
615
615
  console.log(JSON.stringify(result.results, null, 2));
@@ -734,7 +734,7 @@ program.command("sync-warehouse").description("Sync warehouse table metadata int
734
734
  }
735
735
  loadEnvFile(projectDir);
736
736
  try {
737
- const { runSyncWarehouse } = await import("./sync-warehouse-KGT6XSXI.js");
737
+ const { runSyncWarehouse } = await import("./sync-warehouse-XC7YYZKC.js");
738
738
  await runSyncWarehouse(projectDir, options);
739
739
  } catch (err) {
740
740
  error(err instanceof Error ? err.message : String(err));
@@ -785,7 +785,7 @@ program.command("advisor").description("AI-powered dbt model advisor \u2014 sugg
785
785
  process.exit(2);
786
786
  }
787
787
  loadEnvFile(projectDir);
788
- const { runAdvisor } = await import("./advisor-CSVLJFOG.js");
788
+ const { runAdvisor } = await import("./advisor-54JBE2EV.js");
789
789
  await runAdvisor(projectDir, question, {
790
790
  top: options.top ? parseInt(options.top, 10) : 5,
791
791
  json: options.json,
@@ -875,7 +875,7 @@ semanticCmd.command("query").description("Run a structured query against the sem
875
875
  console.log(result.sql);
876
876
  return;
877
877
  }
878
- const { resolveConnection, createConnector, formatTable, formatJSON } = await import("./connection-utils-2SZAG2QM.js");
878
+ const { resolveConnection, createConnector, formatTable, formatJSON } = await import("./connection-utils-MXEF6X7K.js");
879
879
  const connection = await resolveConnection(projectDir, options.connection, program.opts().env);
880
880
  const connector = createConnector(connection, projectDir);
881
881
  const start = performance.now();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { resolve, basename, dirname, join } from 'path';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { validateProject } from './commands/validate.js';\nimport { findProjectRoot, loadEnvFile } from './utils/config.js';\nimport pc from 'picocolors';\nimport * as output from './utils/output.js';\nimport { checkForUpdate } from './utils/update-check.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram\n .name('yamchart')\n .description('Git-native business intelligence dashboards')\n .version(pkg.version);\n\nprogram.option('--env <name>', 'Environment to use (default: local, or YAMCHART_ENV)');\n\n// Propagate --env to process.env so all downstream callers pick it up\nprogram.hook('preAction', () => {\n const opts = program.opts();\n if (opts.env) {\n process.env.YAMCHART_ENV = opts.env;\n }\n});\n\nprogram\n .command('validate')\n .description('Validate configuration files')\n .argument('[path]', 'Path to yamchart project', '.')\n .option('--dry-run', 'Connect to database and test queries with EXPLAIN')\n .option('-c, --connection <name>', 'Connection to use for dry-run')\n .option('--json', 'Output as JSON')\n .action(async (path: string, options: { dryRun?: boolean; connection?: string; json?: boolean }) => {\n const startPath = resolve(path);\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: 'yamchart.yaml not found' }));\n } else {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n }\n process.exit(2);\n }\n\n // Load .env file\n loadEnvFile(projectDir);\n\n if (!options.json) {\n output.header('Validating yamchart project...');\n }\n\n const result = await validateProject(projectDir, {\n dryRun: options.dryRun ?? false,\n connection: options.connection,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n // Print results\n for (const error of result.errors) {\n output.error(error.file);\n output.detail(error.message);\n if (error.suggestion) {\n output.detail(error.suggestion);\n }\n }\n\n for (const warning of result.warnings) {\n output.warning(warning.file);\n output.detail(warning.message);\n }\n\n output.newline();\n\n if (result.success) {\n output.success(`Schema: ${result.stats.passed} passed`);\n } else {\n output.error(`Schema: ${result.stats.passed} passed, ${result.stats.failed} failed`);\n }\n\n if (result.dryRunStats) {\n output.newline();\n if (result.dryRunStats.failed === 0) {\n output.success(`Queries: ${result.dryRunStats.passed} passed (EXPLAIN OK)`);\n } else {\n output.error(`Queries: ${result.dryRunStats.passed} passed, ${result.dryRunStats.failed} failed`);\n }\n }\n\n output.newline();\n\n if (result.success) {\n output.success('Validation passed');\n } else {\n output.error(`Validation failed with ${result.errors.length} error(s)`);\n }\n }\n\n process.exit(result.success ? 0 : 1);\n });\n\nprogram\n .command('dev')\n .description('Start development server with hot reload')\n .argument('[path]', 'Path to yamchart project', '.')\n .option('-p, --port <number>', 'Port to listen on', '3001')\n .option('--api-only', 'Only serve API, no web UI')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (path: string, options: { port: string; apiOnly?: boolean; open: boolean }) => {\n const startPath = resolve(path);\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n const globalOpts = program.opts();\n const { runDevServer } = await import('./commands/dev.js');\n\n await runDevServer(projectDir, {\n port: parseInt(options.port, 10),\n apiOnly: options.apiOnly ?? false,\n open: options.open,\n version: pkg.version,\n env: globalOpts.env,\n });\n });\n\nprogram\n .command('init')\n .description('Create a new yamchart project')\n .argument('[directory]', 'Target directory', '.')\n .option('--example', 'Create full example project with sample database')\n .option('--empty', 'Create only yamchart.yaml (no connections, models, or charts)')\n .option('--force', 'Overwrite existing files')\n .action(async (directory: string, options: { example?: boolean; empty?: boolean; force?: boolean }) => {\n const { initProject } = await import('./commands/init.js');\n const targetDir = resolve(directory);\n\n const result = await initProject(targetDir, options);\n\n if (!result.success) {\n output.error(result.error || 'Failed to create project');\n process.exit(1);\n }\n\n output.newline();\n output.success(`Created ${directory === '.' ? basename(targetDir) : directory}/`);\n for (const file of result.files.slice(0, 10)) {\n output.detail(file);\n }\n if (result.files.length > 10) {\n output.detail(`... and ${result.files.length - 10} more files`);\n }\n output.newline();\n output.info(`Run \\`cd ${directory === '.' ? basename(targetDir) : directory} && yamchart dev\\` to start.`);\n });\n\nprogram\n .command('sync-dbt')\n .description('Sync dbt project metadata into AI-readable catalog')\n .option('-s, --source <type>', 'Source type: local, github, dbt-cloud', 'local')\n .option('-p, --path <dir>', 'Path to dbt project (for local source)')\n .option('--repo <repo>', 'GitHub repository (for github source)')\n .option('--branch <branch>', 'Git branch (for github source)', 'main')\n .option('-i, --include <patterns...>', 'Include glob patterns')\n .option('-e, --exclude <patterns...>', 'Exclude glob patterns')\n .option('-t, --tag <tags...>', 'Filter by dbt tags')\n .option('--refresh', 'Re-sync using saved configuration')\n .option('--target-database <database>', 'Override database in ref() paths (e.g. switch from dev to prod)')\n .action(async (options: {\n source: 'local' | 'github' | 'dbt-cloud';\n path?: string;\n repo?: string;\n branch?: string;\n include?: string[];\n exclude?: string[];\n tag?: string[];\n refresh?: boolean;\n targetDatabase?: string;\n }) => {\n const { syncDbt, loadSyncConfig } = await import('./commands/sync-dbt.js');\n\n // Find project root\n const projectDir = await findProjectRoot(process.cwd());\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n // Handle refresh mode\n if (options.refresh) {\n const savedConfig = await loadSyncConfig(projectDir);\n if (!savedConfig) {\n output.error('No saved sync config found');\n output.detail('Run sync-dbt without --refresh first');\n process.exit(1);\n }\n output.info(`Re-syncing from ${savedConfig.source}:${savedConfig.path || savedConfig.repo}`);\n }\n\n const spin = output.spinner('Syncing dbt metadata...');\n\n const result = await syncDbt(projectDir, {\n source: options.source,\n path: options.path,\n repo: options.repo,\n branch: options.branch,\n include: options.include || [],\n exclude: options.exclude || [],\n tags: options.tag || [],\n refresh: options.refresh,\n targetDatabase: options.targetDatabase,\n });\n\n spin.stop();\n\n if (!result.success) {\n output.error(result.error || 'Sync failed');\n process.exit(1);\n }\n\n output.success(`Synced ${result.modelsIncluded} models to .yamchart/catalog.md`);\n if (result.modelsExcluded > 0) {\n output.detail(`${result.modelsExcluded} models filtered out`);\n }\n\n // Show lineage warnings\n if (result.warnings) {\n for (const w of result.warnings) {\n output.warning(w);\n }\n }\n\n // Check for database mismatch (skip if --target-database was used)\n if (!options.targetDatabase) {\n try {\n const { readFile } = await import('fs/promises');\n const { resolveConnection } = await import('./commands/connection-utils.js');\n const { detectDatabaseMismatch } = await import('./dbt/rewrite-database.js');\n const catalogJsonStr = await readFile(join(projectDir, '.yamchart', 'catalog.json'), 'utf-8');\n const catalogData = JSON.parse(catalogJsonStr);\n const connection = await resolveConnection(projectDir, undefined, program.opts().env);\n // Extract database from connection config (varies by type)\n const connDb = (connection as Record<string, any>).config?.database as string | undefined;\n const mismatch = detectDatabaseMismatch(catalogData.models, connDb);\n if (mismatch.mismatch) {\n output.warning(\n `Catalog tables reference database \"${mismatch.catalogDatabase}\" but your default ` +\n `connection uses \"${mismatch.connectionDatabase}\". Models using ref() may query the wrong database.`\n );\n output.detail(\n `To fix: yamchart sync-dbt --refresh --target-database ${mismatch.connectionDatabase}`\n );\n }\n } catch {\n // Connection not configured or unreadable — skip silently\n }\n }\n });\n\nprogram\n .command('generate')\n .description('Generate SQL model stubs from dbt catalog')\n .argument('[model]', 'Specific model to generate (optional)')\n .option('--yolo', 'Skip all prompts, use defaults for everything')\n .action(async (model: string | undefined, options: { yolo?: boolean }) => {\n const { generate } = await import('./commands/generate.js');\n\n const projectDir = await findProjectRoot(process.cwd());\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n const result = await generate(projectDir, {\n model,\n yolo: options.yolo,\n });\n\n if (!result.success) {\n output.error(result.error || 'Generate failed');\n process.exit(1);\n }\n\n output.success(`Generated ${result.filesCreated} model stubs`);\n if (result.filesSkipped > 0) {\n output.detail(`${result.filesSkipped} files skipped`);\n }\n });\n\nprogram\n .command('test')\n .description('Run model tests (@returns schema checks and @tests data assertions)')\n .argument('[model]', 'Specific model to test (optional, tests all if omitted)')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .action(async (model: string | undefined, options: { connection?: string; json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: 'yamchart.yaml not found' }));\n } else {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n }\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { testProject, formatTestOutput } = await import('./commands/test.js');\n const result = await testProject(projectDir, model, {\n connection: options.connection,\n json: options.json,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n formatTestOutput(result, result.connectionName);\n }\n\n process.exit(result.success ? 0 : 1);\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }),\n );\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(2);\n }\n });\n\nprogram\n .command('update')\n .description('Check for yamchart updates')\n .action(async () => {\n const { runUpdate } = await import('./commands/update.js');\n await runUpdate(pkg.version);\n });\n\nprogram\n .command('reset-password')\n .description('Reset a user password (requires auth to be enabled)')\n .requiredOption('-e, --email <email>', 'Email address of the user')\n .action(async (options: { email: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n const { resetPassword } = await import('./commands/reset-password.js');\n await resetPassword(projectDir, options.email);\n });\n\nprogram\n .command('tables')\n .description('List tables and views in the connected database')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('-s, --schema <name>', 'Filter to schema')\n .option('-d, --database <name>', 'Filter to database (Snowflake/Databricks)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .option('--compare', 'Compare local metadata against live database')\n .action(async (options: { connection?: string; schema?: string; database?: string; json?: boolean; source?: string; compare?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n if (options.compare) {\n const { resolveTablesSource } = await import('./commands/source-resolver.js');\n const { compareTables, formatCompareTables } = await import('./commands/compare.js');\n\n let localResult;\n try {\n localResult = await resolveTablesSource(projectDir, 'catalog', options.connection, {\n schema: options.schema,\n database: options.database,\n });\n } catch {\n try {\n localResult = await resolveTablesSource(projectDir, 'model', options.connection, {\n schema: options.schema,\n database: options.database,\n });\n } catch {\n output.error('Cannot compare — no local metadata found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n process.exit(1);\n }\n }\n\n const dbResult = await resolveTablesSource(projectDir, 'db', options.connection, {\n schema: options.schema,\n database: options.database,\n });\n const diffs = compareTables(localResult.tables, dbResult.tables);\n\n if (options.json) {\n console.log(JSON.stringify(diffs, null, 2));\n } else {\n console.log(formatCompareTables(localResult.source, diffs));\n }\n return;\n }\n\n const { listTables } = await import('./commands/tables.js');\n const result = await listTables(projectDir, {\n ...options,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.tables, null, 2));\n } else {\n const sourceLabel = result.source === 'db'\n ? `${result.connectionName} (${result.connectionType})`\n : `Source: ${result.source}`;\n output.header(`Tables in ${sourceLabel}`);\n if (result.tables.length === 0) {\n output.info('No tables found');\n } else {\n for (const table of result.tables) {\n const schema = table.schema ? `${table.schema}.` : '';\n const typeLabel = table.type === 'VIEW' ? pc.dim(' (view)') : '';\n console.log(` ${schema}${table.name}${typeLabel}`);\n }\n output.newline();\n output.info(`${result.tables.length} table(s) found${result.durationMs > 0 ? ` (${result.durationMs.toFixed(0)}ms)` : ''}`);\n }\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('describe')\n .description('Show columns and types for a table')\n .argument('<table>', 'Table name (can be fully qualified, e.g. schema.table)')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .option('--compare', 'Compare local metadata against live database')\n .action(async (table: string, options: { connection?: string; json?: boolean; source?: string; compare?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n if (options.compare) {\n const { resolveDescribeSource } = await import('./commands/source-resolver.js');\n const { compareColumns, formatCompareColumns } = await import('./commands/compare.js');\n\n let localResult;\n try {\n localResult = await resolveDescribeSource(projectDir, table, 'catalog', options.connection);\n } catch {\n try {\n localResult = await resolveDescribeSource(projectDir, table, 'model', options.connection);\n } catch {\n output.error('Cannot compare — no local metadata found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n process.exit(1);\n }\n }\n\n const dbResult = await resolveDescribeSource(projectDir, table, 'db', options.connection);\n const diffs = compareColumns(localResult.columns, dbResult.columns);\n\n if (options.json) {\n console.log(JSON.stringify(diffs, null, 2));\n } else {\n console.log(formatCompareColumns(localResult.table, localResult.source, diffs));\n }\n return;\n }\n\n const { describeTable } = await import('./commands/describe.js');\n const result = await describeTable(projectDir, table, {\n ...options,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.columns, null, 2));\n } else {\n if (result.resolvedFrom) {\n output.detail(`Resolved \"${result.resolvedFrom}\" → ${result.table}`);\n }\n const sourceLabel = result.source === 'db'\n ? `${result.connectionName} (${result.connectionType})`\n : `Source: ${result.source}`;\n output.header(`${result.table} (${sourceLabel})`);\n\n const nameWidth = Math.max(4, ...result.columns.map((c) => c.name.length));\n const typeWidth = Math.max(4, ...result.columns.map((c) => c.type.length));\n\n console.log(` ${'name'.padEnd(nameWidth)} ${'type'.padEnd(typeWidth)} nullable`);\n console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(typeWidth)} ${'─'.repeat(8)}`);\n\n for (const col of result.columns) {\n const nullable = col.nullable === 'YES' ? pc.dim('yes') : 'no';\n console.log(` ${col.name.padEnd(nameWidth)} ${pc.dim(col.type.padEnd(typeWidth))} ${nullable}`);\n }\n\n output.newline();\n output.info(`${result.columns.length} column(s)${result.durationMs > 0 ? ` (${result.durationMs.toFixed(0)}ms)` : ''}`);\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('query')\n .description('Execute SQL against a connection')\n .argument('<sql>', 'SQL query to execute')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .option('-l, --limit <number>', 'Max rows to return (default: 100)')\n .action(async (sql: string, options: { connection?: string; json?: boolean; limit?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { executeQuery } = await import('./commands/query.js');\n const { formatTable, formatJSON } = await import('./commands/connection-utils.js');\n\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const result = await executeQuery(projectDir, sql, {\n connection: options.connection,\n json: options.json,\n limit,\n });\n\n if (options.json) {\n console.log(formatJSON(result));\n } else {\n console.log(formatTable(result));\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('sample')\n .description('Show sample rows from a table or dbt model')\n .argument('<table>', 'Table name or dbt model name')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('-l, --limit <number>', 'Rows to show (default: 5)')\n .option('--json', 'Output as JSON')\n .action(async (table: string, options: { connection?: string; json?: boolean; limit?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { sampleTable } = await import('./commands/sample.js');\n const { formatTable, formatJSON } = await import('./commands/connection-utils.js');\n\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const result = await sampleTable(projectDir, table, {\n connection: options.connection,\n json: options.json,\n limit,\n });\n\n if (options.json) {\n console.log(formatJSON(result));\n } else {\n if (result.resolvedFrom) {\n output.detail(`Resolved \"${result.resolvedFrom}\" → ${result.table}`);\n }\n console.log(formatTable(result));\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('search')\n .description('Search for tables and columns by keyword')\n .argument('<keyword>', 'Keyword to search for')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .action(async (keyword: string, options: { connection?: string; json?: boolean; source?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { searchDatabase } = await import('./commands/search.js');\n const result = await searchDatabase(projectDir, keyword, {\n ...options,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.results, null, 2));\n } else {\n const sourceLabel = result.source === 'db'\n ? `${result.connectionName} (${result.connectionType})`\n : `Source: ${result.source}`;\n output.header(`Search results for \"${result.keyword}\" in ${sourceLabel}`);\n\n const tables = result.results.filter((r) => r.type === 'table');\n const columns = result.results.filter((r) => r.type === 'column');\n\n if (tables.length > 0) {\n output.newline();\n console.log(' Tables:');\n for (const t of tables) {\n const qualified = t.schema ? `${t.schema}.${t.table}` : t.table;\n console.log(` ${qualified}`);\n }\n }\n\n if (columns.length > 0) {\n output.newline();\n console.log(' Columns:');\n const nameWidth = Math.max(...columns.map((c) => {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n return qualified.length;\n }));\n for (const c of columns) {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n const colType = c.columnType ? pc.dim(c.columnType) : '';\n console.log(` ${qualified.padEnd(nameWidth + 2)}${colType}`);\n }\n }\n\n if (result.results.length === 0) {\n output.detail('No matches found');\n }\n\n output.newline();\n output.info(`${result.results.length} result(s)${result.durationMs > 0 ? ` (${result.durationMs.toFixed(0)}ms)` : ''}`);\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst catalogCmd = program\n .command('catalog')\n .description('Explore cached local metadata (no database connection needed)');\n\ncatalogCmd\n .command('tables')\n .description('List tables from cached catalog')\n .option('-s, --schema <name>', 'Filter to schema')\n .option('--json', 'Output as JSON')\n .action(async (options: { schema?: string; json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { listTables } = await import('./commands/tables.js');\n const result = await listTables(projectDir, {\n source: 'catalog',\n schema: options.schema,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.tables, null, 2));\n } else {\n output.header('Tables (from catalog)');\n if (result.tables.length === 0) {\n output.info('No tables found in catalog');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else {\n const filtered = options.schema\n ? result.tables.filter((t) => t.schema.toLowerCase().includes(options.schema!.toLowerCase()))\n : result.tables;\n for (const table of filtered) {\n const schema = table.schema ? `${table.schema}.` : '';\n const typeLabel = table.type === 'VIEW' ? pc.dim(' (view)') : table.type === 'SOURCE' ? pc.dim(' (source)') : '';\n console.log(` ${schema}${table.name}${typeLabel}`);\n }\n output.newline();\n output.info(`${filtered.length} table(s) from catalog`);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('No catalog found')) {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\ncatalogCmd\n .command('describe')\n .description('Show cached columns and types for a table')\n .argument('<table>', 'Table name or model name')\n .option('--json', 'Output as JSON')\n .action(async (table: string, options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { describeTable } = await import('./commands/describe.js');\n const result = await describeTable(projectDir, table, { source: 'catalog' });\n\n if (options.json) {\n console.log(JSON.stringify(result.columns, null, 2));\n } else {\n if (result.resolvedFrom) {\n output.detail(`Resolved \"${result.resolvedFrom}\" → ${result.table}`);\n }\n output.header(`${result.table} (from catalog)`);\n\n const nameWidth = Math.max(4, ...result.columns.map((c) => c.name.length));\n const typeWidth = Math.max(4, ...result.columns.map((c) => c.type.length));\n\n console.log(` ${'name'.padEnd(nameWidth)} ${'type'.padEnd(typeWidth)} nullable`);\n console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(typeWidth)} ${'─'.repeat(8)}`);\n\n for (const col of result.columns) {\n const nullable = col.nullable === 'YES' ? pc.dim('yes') : 'no';\n console.log(` ${col.name.padEnd(nameWidth)} ${pc.dim(col.type.padEnd(typeWidth))} ${nullable}`);\n }\n\n output.newline();\n output.info(`${result.columns.length} column(s)`);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('No catalog found')) {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else if (err instanceof Error && err.message.includes('not found in catalog')) {\n output.error(err.message);\n output.detail('Try `yamchart catalog search` to find available tables');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\ncatalogCmd\n .command('search')\n .description('Search cached metadata for tables and columns')\n .argument('<keyword>', 'Keyword to search for')\n .option('--json', 'Output as JSON')\n .action(async (keyword: string, options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { searchDatabase } = await import('./commands/search.js');\n const result = await searchDatabase(projectDir, keyword, { source: 'catalog' });\n\n if (options.json) {\n console.log(JSON.stringify(result.results, null, 2));\n } else {\n output.header(`Search results for \"${keyword}\" (from catalog)`);\n\n const tables = result.results.filter((r) => r.type === 'table');\n const columns = result.results.filter((r) => r.type === 'column');\n\n if (tables.length > 0) {\n output.newline();\n console.log(' Tables:');\n for (const t of tables) {\n const qualified = t.schema ? `${t.schema}.${t.table}` : t.table;\n console.log(` ${qualified}`);\n }\n }\n\n if (columns.length > 0) {\n output.newline();\n console.log(' Columns:');\n const nameWidth = Math.max(...columns.map((c) => {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n return qualified.length;\n }));\n for (const c of columns) {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n const colType = c.columnType ? pc.dim(c.columnType) : '';\n console.log(` ${qualified.padEnd(nameWidth + 2)}${colType}`);\n }\n }\n\n if (result.results.length === 0) {\n output.detail('No matches found in catalog');\n output.detail('Try `yamchart search <keyword>` to search the live database');\n }\n\n output.newline();\n output.info(`${result.results.length} result(s) from catalog`);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('No catalog found')) {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\ncatalogCmd\n .command('status')\n .description('Show catalog sync status')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { readFile } = await import('fs/promises');\n const catalogPath = join(projectDir, '.yamchart', 'catalog.json');\n\n let catalogData: { syncedAt?: string; source?: { type: string }; models?: Array<{ source?: string; columns?: unknown[] }> };\n try {\n catalogData = JSON.parse(await readFile(catalogPath, 'utf-8'));\n } catch {\n if (options.json) {\n console.log(JSON.stringify({ exists: false }));\n } else {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n }\n process.exit(1);\n return;\n }\n\n const models = catalogData.models || [];\n const dbtModels = models.filter((m) => m.source === 'dbt');\n const warehouseModels = models.filter((m) => m.source === 'warehouse');\n const sourceModels = models.filter((m) => m.source === 'dbt-source');\n const totalColumns = models.reduce((sum, m) => sum + (m.columns?.length || 0), 0);\n\n // Try to load warehouse sync state\n let syncState: { syncedAt?: string; connection?: string; schemas?: string[] } | null = null;\n try {\n const syncPath = join(projectDir, '.yamchart', 'warehouse-sync.json');\n syncState = JSON.parse(await readFile(syncPath, 'utf-8'));\n } catch {\n // No sync state\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n exists: true,\n syncedAt: catalogData.syncedAt,\n source: catalogData.source,\n models: models.length,\n dbtModels: dbtModels.length,\n warehouseModels: warehouseModels.length,\n sourceModels: sourceModels.length,\n totalColumns,\n warehouseSync: syncState ? {\n syncedAt: syncState.syncedAt,\n connection: syncState.connection,\n schemas: syncState.schemas,\n } : null,\n }, null, 2));\n } else {\n output.header('Catalog Status');\n console.log(` Last synced: ${catalogData.syncedAt || 'unknown'}`);\n console.log(` Models: ${models.length} total (${dbtModels.length} dbt, ${warehouseModels.length} warehouse, ${sourceModels.length} sources)`);\n console.log(` Columns: ${totalColumns}`);\n\n if (syncState) {\n output.newline();\n console.log(` Warehouse sync:`);\n console.log(` Connection: ${syncState.connection || 'default'}`);\n console.log(` Schemas: ${syncState.schemas?.join(', ') || 'all'}`);\n console.log(` Last sync: ${syncState.syncedAt || 'unknown'}`);\n }\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('sync-warehouse')\n .description('Sync warehouse table metadata into the catalog')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('-s, --schema <schemas>', 'Comma-separated schemas to sync')\n .option('-d, --database <name>', 'Database to sync (Snowflake/Databricks)')\n .option('--skip-samples', 'Skip sample row collection')\n .option('--refresh', 'Re-run with saved connection/schema config')\n .option('--full', 'Force full re-sync (ignore incremental state)')\n .option('--json', 'Output sync summary as JSON')\n .action(async (options) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { runSyncWarehouse } = await import('./commands/sync-warehouse.js');\n await runSyncWarehouse(projectDir, options);\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('lineage')\n .description('Show upstream dependencies for a model')\n .argument('<model>', 'Model name to trace lineage for')\n .option('--depth <n>', 'Maximum depth to trace (default: unlimited)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .action(async (model: string, options: { depth?: string; json?: boolean; source?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { getLineage } = await import('./commands/lineage.js');\n const depth = options.depth ? parseInt(options.depth, 10) : undefined;\n const result = await getLineage(projectDir, model, {\n depth,\n json: options.json,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.tree, null, 2));\n } else {\n console.log(result.rendered);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('ENOENT')) {\n output.error('No catalog found. Run `yamchart sync-dbt` first.');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('advisor')\n .description('AI-powered dbt model advisor — suggests improvements informed by your BI layer')\n .argument('[question]', 'Question to ask, or \"audit\" for comprehensive analysis')\n .option('--top <n>', 'Limit audit suggestions (default: 5)')\n .option('--json', 'Output as JSON')\n .option('--dbt-path <path>', 'Override the synced dbt project path')\n .option('-c, --connection <name>', 'Connection to use for warehouse introspection')\n .action(async (question: string | undefined, options: { top?: string; json?: boolean; dbtPath?: string; connection?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: 'yamchart.yaml not found' }));\n } else {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n }\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n const { runAdvisor } = await import('./commands/advisor.js');\n await runAdvisor(projectDir, question, {\n top: options.top ? parseInt(options.top, 10) : 5,\n json: options.json,\n dbtPath: options.dbtPath,\n connection: options.connection,\n });\n });\n\nconst semanticCmd = program\n .command('semantic')\n .description('Explore the semantic layer — auto-generated measures and dimensions from your catalog')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { readFile } = await import('fs/promises');\n const catalogPath = join(projectDir, '.yamchart', 'catalog.json');\n const catalogJson = JSON.parse(await readFile(catalogPath, 'utf-8'));\n\n const { listSemanticEntities } = await import('./commands/semantic.js');\n const result = listSemanticEntities(catalogJson);\n\n if (options.json) {\n console.log(JSON.stringify(result.entities, null, 2));\n return;\n }\n\n if (result.entities.length === 0) {\n output.info('No semantic entities found.');\n output.detail('Run `yamchart sync-dbt` or `yamchart sync-warehouse` to populate the catalog.');\n return;\n }\n\n output.header(`Semantic Layer — ${result.entities.length} entities`);\n\n for (const entity of result.entities) {\n console.log(` ${pc.bold(entity.name)}`);\n console.log(` ${pc.dim(entity.source_table)}`);\n if (entity.description) {\n console.log(` ${entity.description}`);\n }\n if (entity.measures.length > 0) {\n console.log(` Measures: ${entity.measures.map((m) => `${m.name} (${pc.dim(m.type)})`).join(', ')}`);\n }\n if (entity.dimensions.length > 0) {\n console.log(` Dimensions: ${entity.dimensions.map((d) => `${d.name} (${pc.dim(d.type)})`).join(', ')}`);\n }\n console.log();\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('ENOENT')) {\n output.error('No catalog found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\nsemanticCmd\n .command('query')\n .description('Run a structured query against the semantic layer')\n .requiredOption('-e, --entity <name>', 'Entity name (e.g. fct_revenue)')\n .requiredOption('-m, --measures <measures>', 'Comma-separated measure names')\n .option('-d, --dimensions <dimensions>', 'Comma-separated dimension names')\n .option('-f, --filter <filter...>', 'Filters in format dimension=value')\n .option('--order <field>', 'Order by field')\n .option('--desc', 'Order descending (default: ascending)')\n .option('-l, --limit <n>', 'Row limit (default: 100)')\n .option('-c, --connection <name>', 'Connection to use')\n .option('--json', 'Output as JSON')\n .option('--sql', 'Print compiled SQL only (do not execute)')\n .action(async (options: {\n entity: string;\n measures: string;\n dimensions?: string;\n filter?: string[];\n order?: string;\n desc?: boolean;\n limit?: string;\n connection?: string;\n json?: boolean;\n sql?: boolean;\n }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { readFile } = await import('fs/promises');\n const catalogPath = join(projectDir, '.yamchart', 'catalog.json');\n const catalogJson = JSON.parse(await readFile(catalogPath, 'utf-8'));\n\n const { querySemanticEntity } = await import('./commands/semantic.js');\n\n // Parse filters: \"region=US\" → { dimension: 'region', operator: 'equals', value: 'US' }\n const filters = (options.filter || []).map((f) => {\n const eqIdx = f.indexOf('=');\n if (eqIdx === -1) throw new Error(`Invalid filter format: \"${f}\". Use dimension=value`);\n return {\n dimension: f.slice(0, eqIdx),\n operator: 'equals' as const,\n value: f.slice(eqIdx + 1),\n };\n });\n\n const result = querySemanticEntity(catalogJson, {\n entity: options.entity,\n measures: options.measures.split(',').map((s) => s.trim()),\n dimensions: options.dimensions ? options.dimensions.split(',').map((s) => s.trim()) : [],\n filters,\n order_by: options.order ? { field: options.order, direction: options.desc ? 'desc' : 'asc' } : undefined,\n limit: options.limit ? parseInt(options.limit, 10) : 100,\n });\n\n // --sql: just print the SQL\n if (options.sql) {\n console.log(result.sql);\n return;\n }\n\n // Execute the query\n const { resolveConnection, createConnector, formatTable, formatJSON } = await import('./commands/connection-utils.js');\n const connection = await resolveConnection(projectDir, options.connection, program.opts().env);\n const connector = createConnector(connection, projectDir);\n\n const start = performance.now();\n await connector.connect();\n const queryResult = await connector.execute(result.sql);\n await connector.disconnect();\n const durationMs = Math.round((performance.now() - start) * 100) / 100;\n\n if (options.json) {\n console.log(formatJSON({\n columns: queryResult.columns,\n rows: queryResult.rows,\n rowCount: queryResult.rows.length,\n durationMs,\n }));\n } else {\n output.detail(`Entity: ${result.entityName}`);\n output.detail(`SQL: ${result.sql.replace(/\\n/g, ' ').slice(0, 120)}...`);\n output.newline();\n console.log(formatTable({\n columns: queryResult.columns,\n rows: queryResult.rows,\n rowCount: queryResult.rows.length,\n durationMs,\n }));\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('ENOENT')) {\n output.error('No catalog found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\nprogram.parse();\n\n// Passive update check — runs in background, prints on exit if outdated\nlet updateNotification: string | null = null;\n\ncheckForUpdate(pkg.version).then((update) => {\n if (update) {\n updateNotification = `\\n Update available: ${update.current} → ${update.latest}\\n Run: yamchart update to see what's new\\n`;\n }\n});\n\nprocess.on('exit', () => {\n if (updateNotification) {\n // Use dim styling so it doesn't compete with command output\n console.error(`\\n${pc.dim(updateNotification)}`);\n }\n});\n"],"mappings":"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","names":["error","warning"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { resolve, basename, dirname, join } from 'path';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { validateProject } from './commands/validate.js';\nimport { findProjectRoot, loadEnvFile } from './utils/config.js';\nimport pc from 'picocolors';\nimport * as output from './utils/output.js';\nimport { checkForUpdate } from './utils/update-check.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'));\n\nconst program = new Command();\n\nprogram\n .name('yamchart')\n .description('Git-native business intelligence dashboards')\n .version(pkg.version);\n\nprogram.option('--env <name>', 'Environment to use (from environments block, or YAMCHART_ENV)');\n\n// Propagate --env to process.env so all downstream callers pick it up\nprogram.hook('preAction', () => {\n const opts = program.opts();\n if (opts.env) {\n process.env.YAMCHART_ENV = opts.env;\n }\n});\n\nprogram\n .command('validate')\n .description('Validate configuration files')\n .argument('[path]', 'Path to yamchart project', '.')\n .option('--dry-run', 'Connect to database and test queries with EXPLAIN')\n .option('-c, --connection <name>', 'Connection to use for dry-run')\n .option('--json', 'Output as JSON')\n .action(async (path: string, options: { dryRun?: boolean; connection?: string; json?: boolean }) => {\n const startPath = resolve(path);\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: 'yamchart.yaml not found' }));\n } else {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n }\n process.exit(2);\n }\n\n // Load .env file\n loadEnvFile(projectDir);\n\n if (!options.json) {\n output.header('Validating yamchart project...');\n }\n\n const result = await validateProject(projectDir, {\n dryRun: options.dryRun ?? false,\n connection: options.connection,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n // Print results\n for (const error of result.errors) {\n output.error(error.file);\n output.detail(error.message);\n if (error.suggestion) {\n output.detail(error.suggestion);\n }\n }\n\n for (const warning of result.warnings) {\n output.warning(warning.file);\n output.detail(warning.message);\n }\n\n output.newline();\n\n if (result.success) {\n output.success(`Schema: ${result.stats.passed} passed`);\n } else {\n output.error(`Schema: ${result.stats.passed} passed, ${result.stats.failed} failed`);\n }\n\n if (result.dryRunStats) {\n output.newline();\n if (result.dryRunStats.failed === 0) {\n output.success(`Queries: ${result.dryRunStats.passed} passed (EXPLAIN OK)`);\n } else {\n output.error(`Queries: ${result.dryRunStats.passed} passed, ${result.dryRunStats.failed} failed`);\n }\n }\n\n output.newline();\n\n if (result.success) {\n output.success('Validation passed');\n } else {\n output.error(`Validation failed with ${result.errors.length} error(s)`);\n }\n }\n\n process.exit(result.success ? 0 : 1);\n });\n\nprogram\n .command('dev')\n .description('Start development server with hot reload')\n .argument('[path]', 'Path to yamchart project', '.')\n .option('-p, --port <number>', 'Port to listen on', '3001')\n .option('--api-only', 'Only serve API, no web UI')\n .option('--no-open', 'Do not open browser automatically')\n .action(async (path: string, options: { port: string; apiOnly?: boolean; open: boolean }) => {\n const startPath = resolve(path);\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n const globalOpts = program.opts();\n const { runDevServer } = await import('./commands/dev.js');\n\n await runDevServer(projectDir, {\n port: parseInt(options.port, 10),\n apiOnly: options.apiOnly ?? false,\n open: options.open,\n version: pkg.version,\n env: globalOpts.env,\n });\n });\n\nprogram\n .command('init')\n .description('Create a new yamchart project')\n .argument('[directory]', 'Target directory', '.')\n .option('--example', 'Create full example project with sample database')\n .option('--empty', 'Create only yamchart.yaml (no connections, models, or charts)')\n .option('--force', 'Overwrite existing files')\n .action(async (directory: string, options: { example?: boolean; empty?: boolean; force?: boolean }) => {\n const { initProject } = await import('./commands/init.js');\n const targetDir = resolve(directory);\n\n const result = await initProject(targetDir, options);\n\n if (!result.success) {\n output.error(result.error || 'Failed to create project');\n process.exit(1);\n }\n\n output.newline();\n output.success(`Created ${directory === '.' ? basename(targetDir) : directory}/`);\n for (const file of result.files.slice(0, 10)) {\n output.detail(file);\n }\n if (result.files.length > 10) {\n output.detail(`... and ${result.files.length - 10} more files`);\n }\n output.newline();\n output.info(`Run \\`cd ${directory === '.' ? basename(targetDir) : directory} && yamchart dev\\` to start.`);\n });\n\nprogram\n .command('sync-dbt')\n .description('Sync dbt project metadata into AI-readable catalog')\n .option('-s, --source <type>', 'Source type: local, github, dbt-cloud', 'local')\n .option('-p, --path <dir>', 'Path to dbt project (for local source)')\n .option('--repo <repo>', 'GitHub repository (for github source)')\n .option('--branch <branch>', 'Git branch (for github source)', 'main')\n .option('-i, --include <patterns...>', 'Include glob patterns')\n .option('-e, --exclude <patterns...>', 'Exclude glob patterns')\n .option('-t, --tag <tags...>', 'Filter by dbt tags')\n .option('--refresh', 'Re-sync using saved configuration')\n .option('--target-database <database>', 'Override database in ref() paths (e.g. switch from dev to prod)')\n .action(async (options: {\n source: 'local' | 'github' | 'dbt-cloud';\n path?: string;\n repo?: string;\n branch?: string;\n include?: string[];\n exclude?: string[];\n tag?: string[];\n refresh?: boolean;\n targetDatabase?: string;\n }) => {\n const { syncDbt, loadSyncConfig } = await import('./commands/sync-dbt.js');\n\n // Find project root\n const projectDir = await findProjectRoot(process.cwd());\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n // Handle refresh mode\n if (options.refresh) {\n const savedConfig = await loadSyncConfig(projectDir);\n if (!savedConfig) {\n output.error('No saved sync config found');\n output.detail('Run sync-dbt without --refresh first');\n process.exit(1);\n }\n output.info(`Re-syncing from ${savedConfig.source}:${savedConfig.path || savedConfig.repo}`);\n }\n\n const spin = output.spinner('Syncing dbt metadata...');\n\n const result = await syncDbt(projectDir, {\n source: options.source,\n path: options.path,\n repo: options.repo,\n branch: options.branch,\n include: options.include || [],\n exclude: options.exclude || [],\n tags: options.tag || [],\n refresh: options.refresh,\n targetDatabase: options.targetDatabase,\n });\n\n spin.stop();\n\n if (!result.success) {\n output.error(result.error || 'Sync failed');\n process.exit(1);\n }\n\n output.success(`Synced ${result.modelsIncluded} models to .yamchart/catalog.md`);\n if (result.modelsExcluded > 0) {\n output.detail(`${result.modelsExcluded} models filtered out`);\n }\n\n // Show lineage warnings\n if (result.warnings) {\n for (const w of result.warnings) {\n output.warning(w);\n }\n }\n\n // Check for database mismatch (skip if --target-database was used)\n if (!options.targetDatabase) {\n try {\n const { readFile } = await import('fs/promises');\n const { resolveConnection } = await import('./commands/connection-utils.js');\n const { detectDatabaseMismatch } = await import('./dbt/rewrite-database.js');\n const catalogJsonStr = await readFile(join(projectDir, '.yamchart', 'catalog.json'), 'utf-8');\n const catalogData = JSON.parse(catalogJsonStr);\n const connection = await resolveConnection(projectDir, undefined, program.opts().env);\n // Extract database from connection config (varies by type)\n const connDb = (connection as Record<string, any>).config?.database as string | undefined;\n const mismatch = detectDatabaseMismatch(catalogData.models, connDb);\n if (mismatch.mismatch) {\n output.warning(\n `Catalog tables reference database \"${mismatch.catalogDatabase}\" but your default ` +\n `connection uses \"${mismatch.connectionDatabase}\". Models using ref() may query the wrong database.`\n );\n output.detail(\n `To fix: yamchart sync-dbt --refresh --target-database ${mismatch.connectionDatabase}`\n );\n }\n } catch {\n // Connection not configured or unreadable — skip silently\n }\n }\n });\n\nprogram\n .command('generate')\n .description('Generate SQL model stubs from dbt catalog')\n .argument('[model]', 'Specific model to generate (optional)')\n .option('--yolo', 'Skip all prompts, use defaults for everything')\n .action(async (model: string | undefined, options: { yolo?: boolean }) => {\n const { generate } = await import('./commands/generate.js');\n\n const projectDir = await findProjectRoot(process.cwd());\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n const result = await generate(projectDir, {\n model,\n yolo: options.yolo,\n });\n\n if (!result.success) {\n output.error(result.error || 'Generate failed');\n process.exit(1);\n }\n\n output.success(`Generated ${result.filesCreated} model stubs`);\n if (result.filesSkipped > 0) {\n output.detail(`${result.filesSkipped} files skipped`);\n }\n });\n\nprogram\n .command('test')\n .description('Run model tests (@returns schema checks and @tests data assertions)')\n .argument('[model]', 'Specific model to test (optional, tests all if omitted)')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .action(async (model: string | undefined, options: { connection?: string; json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: 'yamchart.yaml not found' }));\n } else {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n }\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { testProject, formatTestOutput } = await import('./commands/test.js');\n const result = await testProject(projectDir, model, {\n connection: options.connection,\n json: options.json,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n formatTestOutput(result, result.connectionName);\n }\n\n process.exit(result.success ? 0 : 1);\n } catch (err) {\n if (options.json) {\n console.log(\n JSON.stringify({ success: false, error: err instanceof Error ? err.message : String(err) }),\n );\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(2);\n }\n });\n\nprogram\n .command('update')\n .description('Check for yamchart updates')\n .action(async () => {\n const { runUpdate } = await import('./commands/update.js');\n await runUpdate(pkg.version);\n });\n\nprogram\n .command('reset-password')\n .description('Reset a user password (requires auth to be enabled)')\n .requiredOption('-e, --email <email>', 'Email address of the user')\n .action(async (options: { email: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n const { resetPassword } = await import('./commands/reset-password.js');\n await resetPassword(projectDir, options.email);\n });\n\nprogram\n .command('tables')\n .description('List tables and views in the connected database')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('-s, --schema <name>', 'Filter to schema')\n .option('-d, --database <name>', 'Filter to database (Snowflake/Databricks)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .option('--compare', 'Compare local metadata against live database')\n .action(async (options: { connection?: string; schema?: string; database?: string; json?: boolean; source?: string; compare?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n if (options.compare) {\n const { resolveTablesSource } = await import('./commands/source-resolver.js');\n const { compareTables, formatCompareTables } = await import('./commands/compare.js');\n\n let localResult;\n try {\n localResult = await resolveTablesSource(projectDir, 'catalog', options.connection, {\n schema: options.schema,\n database: options.database,\n });\n } catch {\n try {\n localResult = await resolveTablesSource(projectDir, 'model', options.connection, {\n schema: options.schema,\n database: options.database,\n });\n } catch {\n output.error('Cannot compare — no local metadata found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n process.exit(1);\n }\n }\n\n const dbResult = await resolveTablesSource(projectDir, 'db', options.connection, {\n schema: options.schema,\n database: options.database,\n });\n const diffs = compareTables(localResult.tables, dbResult.tables);\n\n if (options.json) {\n console.log(JSON.stringify(diffs, null, 2));\n } else {\n console.log(formatCompareTables(localResult.source, diffs));\n }\n return;\n }\n\n const { listTables } = await import('./commands/tables.js');\n const result = await listTables(projectDir, {\n ...options,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.tables, null, 2));\n } else {\n const sourceLabel = result.source === 'db'\n ? `${result.connectionName} (${result.connectionType})`\n : `Source: ${result.source}`;\n output.header(`Tables in ${sourceLabel}`);\n if (result.tables.length === 0) {\n output.info('No tables found');\n } else {\n for (const table of result.tables) {\n const schema = table.schema ? `${table.schema}.` : '';\n const typeLabel = table.type === 'VIEW' ? pc.dim(' (view)') : '';\n console.log(` ${schema}${table.name}${typeLabel}`);\n }\n output.newline();\n output.info(`${result.tables.length} table(s) found${result.durationMs > 0 ? ` (${result.durationMs.toFixed(0)}ms)` : ''}`);\n }\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('describe')\n .description('Show columns and types for a table')\n .argument('<table>', 'Table name (can be fully qualified, e.g. schema.table)')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .option('--compare', 'Compare local metadata against live database')\n .action(async (table: string, options: { connection?: string; json?: boolean; source?: string; compare?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n if (options.compare) {\n const { resolveDescribeSource } = await import('./commands/source-resolver.js');\n const { compareColumns, formatCompareColumns } = await import('./commands/compare.js');\n\n let localResult;\n try {\n localResult = await resolveDescribeSource(projectDir, table, 'catalog', options.connection);\n } catch {\n try {\n localResult = await resolveDescribeSource(projectDir, table, 'model', options.connection);\n } catch {\n output.error('Cannot compare — no local metadata found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n process.exit(1);\n }\n }\n\n const dbResult = await resolveDescribeSource(projectDir, table, 'db', options.connection);\n const diffs = compareColumns(localResult.columns, dbResult.columns);\n\n if (options.json) {\n console.log(JSON.stringify(diffs, null, 2));\n } else {\n console.log(formatCompareColumns(localResult.table, localResult.source, diffs));\n }\n return;\n }\n\n const { describeTable } = await import('./commands/describe.js');\n const result = await describeTable(projectDir, table, {\n ...options,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.columns, null, 2));\n } else {\n if (result.resolvedFrom) {\n output.detail(`Resolved \"${result.resolvedFrom}\" → ${result.table}`);\n }\n const sourceLabel = result.source === 'db'\n ? `${result.connectionName} (${result.connectionType})`\n : `Source: ${result.source}`;\n output.header(`${result.table} (${sourceLabel})`);\n\n const nameWidth = Math.max(4, ...result.columns.map((c) => c.name.length));\n const typeWidth = Math.max(4, ...result.columns.map((c) => c.type.length));\n\n console.log(` ${'name'.padEnd(nameWidth)} ${'type'.padEnd(typeWidth)} nullable`);\n console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(typeWidth)} ${'─'.repeat(8)}`);\n\n for (const col of result.columns) {\n const nullable = col.nullable === 'YES' ? pc.dim('yes') : 'no';\n console.log(` ${col.name.padEnd(nameWidth)} ${pc.dim(col.type.padEnd(typeWidth))} ${nullable}`);\n }\n\n output.newline();\n output.info(`${result.columns.length} column(s)${result.durationMs > 0 ? ` (${result.durationMs.toFixed(0)}ms)` : ''}`);\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('query')\n .description('Execute SQL against a connection')\n .argument('<sql>', 'SQL query to execute')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .option('-l, --limit <number>', 'Max rows to return (default: 100)')\n .action(async (sql: string, options: { connection?: string; json?: boolean; limit?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { executeQuery } = await import('./commands/query.js');\n const { formatTable, formatJSON } = await import('./commands/connection-utils.js');\n\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const result = await executeQuery(projectDir, sql, {\n connection: options.connection,\n json: options.json,\n limit,\n });\n\n if (options.json) {\n console.log(formatJSON(result));\n } else {\n console.log(formatTable(result));\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('sample')\n .description('Show sample rows from a table or dbt model')\n .argument('<table>', 'Table name or dbt model name')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('-l, --limit <number>', 'Rows to show (default: 5)')\n .option('--json', 'Output as JSON')\n .action(async (table: string, options: { connection?: string; json?: boolean; limit?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { sampleTable } = await import('./commands/sample.js');\n const { formatTable, formatJSON } = await import('./commands/connection-utils.js');\n\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const result = await sampleTable(projectDir, table, {\n connection: options.connection,\n json: options.json,\n limit,\n });\n\n if (options.json) {\n console.log(formatJSON(result));\n } else {\n if (result.resolvedFrom) {\n output.detail(`Resolved \"${result.resolvedFrom}\" → ${result.table}`);\n }\n console.log(formatTable(result));\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('search')\n .description('Search for tables and columns by keyword')\n .argument('<keyword>', 'Keyword to search for')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .action(async (keyword: string, options: { connection?: string; json?: boolean; source?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { searchDatabase } = await import('./commands/search.js');\n const result = await searchDatabase(projectDir, keyword, {\n ...options,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.results, null, 2));\n } else {\n const sourceLabel = result.source === 'db'\n ? `${result.connectionName} (${result.connectionType})`\n : `Source: ${result.source}`;\n output.header(`Search results for \"${result.keyword}\" in ${sourceLabel}`);\n\n const tables = result.results.filter((r) => r.type === 'table');\n const columns = result.results.filter((r) => r.type === 'column');\n\n if (tables.length > 0) {\n output.newline();\n console.log(' Tables:');\n for (const t of tables) {\n const qualified = t.schema ? `${t.schema}.${t.table}` : t.table;\n console.log(` ${qualified}`);\n }\n }\n\n if (columns.length > 0) {\n output.newline();\n console.log(' Columns:');\n const nameWidth = Math.max(...columns.map((c) => {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n return qualified.length;\n }));\n for (const c of columns) {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n const colType = c.columnType ? pc.dim(c.columnType) : '';\n console.log(` ${qualified.padEnd(nameWidth + 2)}${colType}`);\n }\n }\n\n if (result.results.length === 0) {\n output.detail('No matches found');\n }\n\n output.newline();\n output.info(`${result.results.length} result(s)${result.durationMs > 0 ? ` (${result.durationMs.toFixed(0)}ms)` : ''}`);\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst catalogCmd = program\n .command('catalog')\n .description('Explore cached local metadata (no database connection needed)');\n\ncatalogCmd\n .command('tables')\n .description('List tables from cached catalog')\n .option('-s, --schema <name>', 'Filter to schema')\n .option('--json', 'Output as JSON')\n .action(async (options: { schema?: string; json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { listTables } = await import('./commands/tables.js');\n const result = await listTables(projectDir, {\n source: 'catalog',\n schema: options.schema,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.tables, null, 2));\n } else {\n output.header('Tables (from catalog)');\n if (result.tables.length === 0) {\n output.info('No tables found in catalog');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else {\n const filtered = options.schema\n ? result.tables.filter((t) => t.schema.toLowerCase().includes(options.schema!.toLowerCase()))\n : result.tables;\n for (const table of filtered) {\n const schema = table.schema ? `${table.schema}.` : '';\n const typeLabel = table.type === 'VIEW' ? pc.dim(' (view)') : table.type === 'SOURCE' ? pc.dim(' (source)') : '';\n console.log(` ${schema}${table.name}${typeLabel}`);\n }\n output.newline();\n output.info(`${filtered.length} table(s) from catalog`);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('No catalog found')) {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\ncatalogCmd\n .command('describe')\n .description('Show cached columns and types for a table')\n .argument('<table>', 'Table name or model name')\n .option('--json', 'Output as JSON')\n .action(async (table: string, options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { describeTable } = await import('./commands/describe.js');\n const result = await describeTable(projectDir, table, { source: 'catalog' });\n\n if (options.json) {\n console.log(JSON.stringify(result.columns, null, 2));\n } else {\n if (result.resolvedFrom) {\n output.detail(`Resolved \"${result.resolvedFrom}\" → ${result.table}`);\n }\n output.header(`${result.table} (from catalog)`);\n\n const nameWidth = Math.max(4, ...result.columns.map((c) => c.name.length));\n const typeWidth = Math.max(4, ...result.columns.map((c) => c.type.length));\n\n console.log(` ${'name'.padEnd(nameWidth)} ${'type'.padEnd(typeWidth)} nullable`);\n console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(typeWidth)} ${'─'.repeat(8)}`);\n\n for (const col of result.columns) {\n const nullable = col.nullable === 'YES' ? pc.dim('yes') : 'no';\n console.log(` ${col.name.padEnd(nameWidth)} ${pc.dim(col.type.padEnd(typeWidth))} ${nullable}`);\n }\n\n output.newline();\n output.info(`${result.columns.length} column(s)`);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('No catalog found')) {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else if (err instanceof Error && err.message.includes('not found in catalog')) {\n output.error(err.message);\n output.detail('Try `yamchart catalog search` to find available tables');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\ncatalogCmd\n .command('search')\n .description('Search cached metadata for tables and columns')\n .argument('<keyword>', 'Keyword to search for')\n .option('--json', 'Output as JSON')\n .action(async (keyword: string, options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { searchDatabase } = await import('./commands/search.js');\n const result = await searchDatabase(projectDir, keyword, { source: 'catalog' });\n\n if (options.json) {\n console.log(JSON.stringify(result.results, null, 2));\n } else {\n output.header(`Search results for \"${keyword}\" (from catalog)`);\n\n const tables = result.results.filter((r) => r.type === 'table');\n const columns = result.results.filter((r) => r.type === 'column');\n\n if (tables.length > 0) {\n output.newline();\n console.log(' Tables:');\n for (const t of tables) {\n const qualified = t.schema ? `${t.schema}.${t.table}` : t.table;\n console.log(` ${qualified}`);\n }\n }\n\n if (columns.length > 0) {\n output.newline();\n console.log(' Columns:');\n const nameWidth = Math.max(...columns.map((c) => {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n return qualified.length;\n }));\n for (const c of columns) {\n const qualified = c.schema ? `${c.schema}.${c.table}.${c.column}` : `${c.table}.${c.column}`;\n const colType = c.columnType ? pc.dim(c.columnType) : '';\n console.log(` ${qualified.padEnd(nameWidth + 2)}${colType}`);\n }\n }\n\n if (result.results.length === 0) {\n output.detail('No matches found in catalog');\n output.detail('Try `yamchart search <keyword>` to search the live database');\n }\n\n output.newline();\n output.info(`${result.results.length} result(s) from catalog`);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('No catalog found')) {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\ncatalogCmd\n .command('status')\n .description('Show catalog sync status')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n try {\n const { readFile } = await import('fs/promises');\n const catalogPath = join(projectDir, '.yamchart', 'catalog.json');\n\n let catalogData: { syncedAt?: string; source?: { type: string }; models?: Array<{ source?: string; columns?: unknown[] }> };\n try {\n catalogData = JSON.parse(await readFile(catalogPath, 'utf-8'));\n } catch {\n if (options.json) {\n console.log(JSON.stringify({ exists: false }));\n } else {\n output.error('No catalog found');\n output.detail('Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate');\n }\n process.exit(1);\n return;\n }\n\n const models = catalogData.models || [];\n const dbtModels = models.filter((m) => m.source === 'dbt');\n const warehouseModels = models.filter((m) => m.source === 'warehouse');\n const sourceModels = models.filter((m) => m.source === 'dbt-source');\n const totalColumns = models.reduce((sum, m) => sum + (m.columns?.length || 0), 0);\n\n // Try to load warehouse sync state\n let syncState: { syncedAt?: string; connection?: string; schemas?: string[] } | null = null;\n try {\n const syncPath = join(projectDir, '.yamchart', 'warehouse-sync.json');\n syncState = JSON.parse(await readFile(syncPath, 'utf-8'));\n } catch {\n // No sync state\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n exists: true,\n syncedAt: catalogData.syncedAt,\n source: catalogData.source,\n models: models.length,\n dbtModels: dbtModels.length,\n warehouseModels: warehouseModels.length,\n sourceModels: sourceModels.length,\n totalColumns,\n warehouseSync: syncState ? {\n syncedAt: syncState.syncedAt,\n connection: syncState.connection,\n schemas: syncState.schemas,\n } : null,\n }, null, 2));\n } else {\n output.header('Catalog Status');\n console.log(` Last synced: ${catalogData.syncedAt || 'unknown'}`);\n console.log(` Models: ${models.length} total (${dbtModels.length} dbt, ${warehouseModels.length} warehouse, ${sourceModels.length} sources)`);\n console.log(` Columns: ${totalColumns}`);\n\n if (syncState) {\n output.newline();\n console.log(` Warehouse sync:`);\n console.log(` Connection: ${syncState.connection || 'default'}`);\n console.log(` Schemas: ${syncState.schemas?.join(', ') || 'all'}`);\n console.log(` Last sync: ${syncState.syncedAt || 'unknown'}`);\n }\n }\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('sync-warehouse')\n .description('Sync warehouse table metadata into the catalog')\n .option('-c, --connection <name>', 'Connection to use (overrides default)')\n .option('-s, --schema <schemas>', 'Comma-separated schemas to sync')\n .option('-d, --database <name>', 'Database to sync (Snowflake/Databricks)')\n .option('--skip-samples', 'Skip sample row collection')\n .option('--refresh', 'Re-run with saved connection/schema config')\n .option('--full', 'Force full re-sync (ignore incremental state)')\n .option('--json', 'Output sync summary as JSON')\n .action(async (options) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { runSyncWarehouse } = await import('./commands/sync-warehouse.js');\n await runSyncWarehouse(projectDir, options);\n } catch (err) {\n output.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command('lineage')\n .description('Show upstream dependencies for a model')\n .argument('<model>', 'Model name to trace lineage for')\n .option('--depth <n>', 'Maximum depth to trace (default: unlimited)')\n .option('--json', 'Output as JSON')\n .option('--source <type>', 'Data source: auto, catalog, model, or db (default: auto)')\n .action(async (model: string, options: { depth?: string; json?: boolean; source?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { getLineage } = await import('./commands/lineage.js');\n const depth = options.depth ? parseInt(options.depth, 10) : undefined;\n const result = await getLineage(projectDir, model, {\n depth,\n json: options.json,\n source: (options.source as any) || 'auto',\n });\n\n if (options.json) {\n console.log(JSON.stringify(result.tree, null, 2));\n } else {\n console.log(result.rendered);\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('ENOENT')) {\n output.error('No catalog found. Run `yamchart sync-dbt` first.');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\nprogram\n .command('advisor')\n .description('AI-powered dbt model advisor — suggests improvements informed by your BI layer')\n .argument('[question]', 'Question to ask, or \"audit\" for comprehensive analysis')\n .option('--top <n>', 'Limit audit suggestions (default: 5)')\n .option('--json', 'Output as JSON')\n .option('--dbt-path <path>', 'Override the synced dbt project path')\n .option('-c, --connection <name>', 'Connection to use for warehouse introspection')\n .action(async (question: string | undefined, options: { top?: string; json?: boolean; dbtPath?: string; connection?: string }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n if (options.json) {\n console.log(JSON.stringify({ success: false, error: 'yamchart.yaml not found' }));\n } else {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n }\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n const { runAdvisor } = await import('./commands/advisor.js');\n await runAdvisor(projectDir, question, {\n top: options.top ? parseInt(options.top, 10) : 5,\n json: options.json,\n dbtPath: options.dbtPath,\n connection: options.connection,\n });\n });\n\nconst semanticCmd = program\n .command('semantic')\n .description('Explore the semantic layer — auto-generated measures and dimensions from your catalog')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n output.detail('Run this command from a yamchart project directory');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { readFile } = await import('fs/promises');\n const catalogPath = join(projectDir, '.yamchart', 'catalog.json');\n const catalogJson = JSON.parse(await readFile(catalogPath, 'utf-8'));\n\n const { listSemanticEntities } = await import('./commands/semantic.js');\n const result = listSemanticEntities(catalogJson);\n\n if (options.json) {\n console.log(JSON.stringify(result.entities, null, 2));\n return;\n }\n\n if (result.entities.length === 0) {\n output.info('No semantic entities found.');\n output.detail('Run `yamchart sync-dbt` or `yamchart sync-warehouse` to populate the catalog.');\n return;\n }\n\n output.header(`Semantic Layer — ${result.entities.length} entities`);\n\n for (const entity of result.entities) {\n console.log(` ${pc.bold(entity.name)}`);\n console.log(` ${pc.dim(entity.source_table)}`);\n if (entity.description) {\n console.log(` ${entity.description}`);\n }\n if (entity.measures.length > 0) {\n console.log(` Measures: ${entity.measures.map((m) => `${m.name} (${pc.dim(m.type)})`).join(', ')}`);\n }\n if (entity.dimensions.length > 0) {\n console.log(` Dimensions: ${entity.dimensions.map((d) => `${d.name} (${pc.dim(d.type)})`).join(', ')}`);\n }\n console.log();\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('ENOENT')) {\n output.error('No catalog found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\nsemanticCmd\n .command('query')\n .description('Run a structured query against the semantic layer')\n .requiredOption('-e, --entity <name>', 'Entity name (e.g. fct_revenue)')\n .requiredOption('-m, --measures <measures>', 'Comma-separated measure names')\n .option('-d, --dimensions <dimensions>', 'Comma-separated dimension names')\n .option('-f, --filter <filter...>', 'Filters in format dimension=value')\n .option('--order <field>', 'Order by field')\n .option('--desc', 'Order descending (default: ascending)')\n .option('-l, --limit <n>', 'Row limit (default: 100)')\n .option('-c, --connection <name>', 'Connection to use')\n .option('--json', 'Output as JSON')\n .option('--sql', 'Print compiled SQL only (do not execute)')\n .action(async (options: {\n entity: string;\n measures: string;\n dimensions?: string;\n filter?: string[];\n order?: string;\n desc?: boolean;\n limit?: string;\n connection?: string;\n json?: boolean;\n sql?: boolean;\n }) => {\n const startPath = resolve('.');\n const projectDir = await findProjectRoot(startPath);\n\n if (!projectDir) {\n output.error('yamchart.yaml not found');\n process.exit(2);\n }\n\n loadEnvFile(projectDir);\n\n try {\n const { readFile } = await import('fs/promises');\n const catalogPath = join(projectDir, '.yamchart', 'catalog.json');\n const catalogJson = JSON.parse(await readFile(catalogPath, 'utf-8'));\n\n const { querySemanticEntity } = await import('./commands/semantic.js');\n\n // Parse filters: \"region=US\" → { dimension: 'region', operator: 'equals', value: 'US' }\n const filters = (options.filter || []).map((f) => {\n const eqIdx = f.indexOf('=');\n if (eqIdx === -1) throw new Error(`Invalid filter format: \"${f}\". Use dimension=value`);\n return {\n dimension: f.slice(0, eqIdx),\n operator: 'equals' as const,\n value: f.slice(eqIdx + 1),\n };\n });\n\n const result = querySemanticEntity(catalogJson, {\n entity: options.entity,\n measures: options.measures.split(',').map((s) => s.trim()),\n dimensions: options.dimensions ? options.dimensions.split(',').map((s) => s.trim()) : [],\n filters,\n order_by: options.order ? { field: options.order, direction: options.desc ? 'desc' : 'asc' } : undefined,\n limit: options.limit ? parseInt(options.limit, 10) : 100,\n });\n\n // --sql: just print the SQL\n if (options.sql) {\n console.log(result.sql);\n return;\n }\n\n // Execute the query\n const { resolveConnection, createConnector, formatTable, formatJSON } = await import('./commands/connection-utils.js');\n const connection = await resolveConnection(projectDir, options.connection, program.opts().env);\n const connector = createConnector(connection, projectDir);\n\n const start = performance.now();\n await connector.connect();\n const queryResult = await connector.execute(result.sql);\n await connector.disconnect();\n const durationMs = Math.round((performance.now() - start) * 100) / 100;\n\n if (options.json) {\n console.log(formatJSON({\n columns: queryResult.columns,\n rows: queryResult.rows,\n rowCount: queryResult.rows.length,\n durationMs,\n }));\n } else {\n output.detail(`Entity: ${result.entityName}`);\n output.detail(`SQL: ${result.sql.replace(/\\n/g, ' ').slice(0, 120)}...`);\n output.newline();\n console.log(formatTable({\n columns: queryResult.columns,\n rows: queryResult.rows,\n rowCount: queryResult.rows.length,\n durationMs,\n }));\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('ENOENT')) {\n output.error('No catalog found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.');\n } else {\n output.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n }\n });\n\nprogram.parse();\n\n// Passive update check — runs in background, prints on exit if outdated\nlet updateNotification: string | null = null;\n\ncheckForUpdate(pkg.version).then((update) => {\n if (update) {\n updateNotification = `\\n Update available: ${update.current} → ${update.latest}\\n Run: yamchart update to see what's new\\n`;\n }\n});\n\nprocess.on('exit', () => {\n if (updateNotification) {\n // Use dim styling so it doesn't compete with command output\n console.error(`\\n${pc.dim(updateNotification)}`);\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,eAAe;AACxB,SAAS,SAAS,UAAU,SAAS,YAAY;AACjD,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAG9B,OAAO,QAAQ;AAIf,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,MAAM,KAAK,MAAM,aAAa,KAAK,WAAW,iBAAiB,GAAG,OAAO,CAAC;AAEhF,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf,YAAY,6CAA6C,EACzD,QAAQ,IAAI,OAAO;AAEtB,QAAQ,OAAO,gBAAgB,+DAA+D;AAG9F,QAAQ,KAAK,aAAa,MAAM;AAC9B,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,KAAK,KAAK;AACZ,YAAQ,IAAI,eAAe,KAAK;AAAA,EAClC;AACF,CAAC;AAED,QACG,QAAQ,UAAU,EAClB,YAAY,8BAA8B,EAC1C,SAAS,UAAU,4BAA4B,GAAG,EAClD,OAAO,aAAa,mDAAmD,EACvE,OAAO,2BAA2B,+BAA+B,EACjE,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,MAAc,YAAuE;AAClG,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,0BAA0B,CAAC,CAAC;AAAA,IAClF,OAAO;AACL,MAAO,MAAM,yBAAyB;AACtC,MAAO,OAAO,oDAAoD;AAAA,IACpE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,cAAY,UAAU;AAEtB,MAAI,CAAC,QAAQ,MAAM;AACjB,IAAO,OAAO,gCAAgC;AAAA,EAChD;AAEA,QAAM,SAAS,MAAM,gBAAgB,YAAY;AAAA,IAC/C,QAAQ,QAAQ,UAAU;AAAA,IAC1B,YAAY,QAAQ;AAAA,EACtB,CAAC;AAED,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7C,OAAO;AAEL,eAAWA,UAAS,OAAO,QAAQ;AACjC,MAAO,MAAMA,OAAM,IAAI;AACvB,MAAO,OAAOA,OAAM,OAAO;AAC3B,UAAIA,OAAM,YAAY;AACpB,QAAO,OAAOA,OAAM,UAAU;AAAA,MAChC;AAAA,IACF;AAEA,eAAWC,YAAW,OAAO,UAAU;AACrC,MAAO,QAAQA,SAAQ,IAAI;AAC3B,MAAO,OAAOA,SAAQ,OAAO;AAAA,IAC/B;AAEA,IAAO,QAAQ;AAEf,QAAI,OAAO,SAAS;AAClB,MAAO,QAAQ,WAAW,OAAO,MAAM,MAAM,SAAS;AAAA,IACxD,OAAO;AACL,MAAO,MAAM,WAAW,OAAO,MAAM,MAAM,YAAY,OAAO,MAAM,MAAM,SAAS;AAAA,IACrF;AAEA,QAAI,OAAO,aAAa;AACtB,MAAO,QAAQ;AACf,UAAI,OAAO,YAAY,WAAW,GAAG;AACnC,QAAO,QAAQ,YAAY,OAAO,YAAY,MAAM,sBAAsB;AAAA,MAC5E,OAAO;AACL,QAAO,MAAM,YAAY,OAAO,YAAY,MAAM,YAAY,OAAO,YAAY,MAAM,SAAS;AAAA,MAClG;AAAA,IACF;AAEA,IAAO,QAAQ;AAEf,QAAI,OAAO,SAAS;AAClB,MAAO,QAAQ,mBAAmB;AAAA,IACpC,OAAO;AACL,MAAO,MAAM,0BAA0B,OAAO,OAAO,MAAM,WAAW;AAAA,IACxE;AAAA,EACF;AAEA,UAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AACrC,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,0CAA0C,EACtD,SAAS,UAAU,4BAA4B,GAAG,EAClD,OAAO,uBAAuB,qBAAqB,MAAM,EACzD,OAAO,cAAc,2BAA2B,EAChD,OAAO,aAAa,mCAAmC,EACvD,OAAO,OAAO,MAAc,YAAgE;AAC3F,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,QAAQ,KAAK;AAChC,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,mBAAmB;AAEzD,QAAM,aAAa,YAAY;AAAA,IAC7B,MAAM,SAAS,QAAQ,MAAM,EAAE;AAAA,IAC/B,SAAS,QAAQ,WAAW;AAAA,IAC5B,MAAM,QAAQ;AAAA,IACd,SAAS,IAAI;AAAA,IACb,KAAK,WAAW;AAAA,EAClB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,SAAS,eAAe,oBAAoB,GAAG,EAC/C,OAAO,aAAa,kDAAkD,EACtE,OAAO,WAAW,+DAA+D,EACjF,OAAO,WAAW,0BAA0B,EAC5C,OAAO,OAAO,WAAmB,YAAqE;AACrG,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,oBAAoB;AACzD,QAAM,YAAY,QAAQ,SAAS;AAEnC,QAAM,SAAS,MAAM,YAAY,WAAW,OAAO;AAEnD,MAAI,CAAC,OAAO,SAAS;AACnB,IAAO,MAAM,OAAO,SAAS,0BAA0B;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAO,QAAQ;AACf,EAAO,QAAQ,WAAW,cAAc,MAAM,SAAS,SAAS,IAAI,SAAS,GAAG;AAChF,aAAW,QAAQ,OAAO,MAAM,MAAM,GAAG,EAAE,GAAG;AAC5C,IAAO,OAAO,IAAI;AAAA,EACpB;AACA,MAAI,OAAO,MAAM,SAAS,IAAI;AAC5B,IAAO,OAAO,WAAW,OAAO,MAAM,SAAS,EAAE,aAAa;AAAA,EAChE;AACA,EAAO,QAAQ;AACf,EAAO,KAAK,YAAY,cAAc,MAAM,SAAS,SAAS,IAAI,SAAS,8BAA8B;AAC3G,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,oDAAoD,EAChE,OAAO,uBAAuB,yCAAyC,OAAO,EAC9E,OAAO,oBAAoB,wCAAwC,EACnE,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,qBAAqB,kCAAkC,MAAM,EACpE,OAAO,+BAA+B,uBAAuB,EAC7D,OAAO,+BAA+B,uBAAuB,EAC7D,OAAO,uBAAuB,oBAAoB,EAClD,OAAO,aAAa,mCAAmC,EACvD,OAAO,gCAAgC,iEAAiE,EACxG,OAAO,OAAO,YAUT;AACJ,QAAM,EAAE,SAAS,eAAe,IAAI,MAAM,OAAO,wBAAwB;AAGzE,QAAM,aAAa,MAAM,gBAAgB,QAAQ,IAAI,CAAC;AAEtD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,QAAQ,SAAS;AACnB,UAAM,cAAc,MAAM,eAAe,UAAU;AACnD,QAAI,CAAC,aAAa;AAChB,MAAO,MAAM,4BAA4B;AACzC,MAAO,OAAO,sCAAsC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,IAAO,KAAK,mBAAmB,YAAY,MAAM,IAAI,YAAY,QAAQ,YAAY,IAAI,EAAE;AAAA,EAC7F;AAEA,QAAM,OAAc,QAAQ,yBAAyB;AAErD,QAAM,SAAS,MAAM,QAAQ,YAAY;AAAA,IACvC,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ,WAAW,CAAC;AAAA,IAC7B,SAAS,QAAQ,WAAW,CAAC;AAAA,IAC7B,MAAM,QAAQ,OAAO,CAAC;AAAA,IACtB,SAAS,QAAQ;AAAA,IACjB,gBAAgB,QAAQ;AAAA,EAC1B,CAAC;AAED,OAAK,KAAK;AAEV,MAAI,CAAC,OAAO,SAAS;AACnB,IAAO,MAAM,OAAO,SAAS,aAAa;AAC1C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAO,QAAQ,UAAU,OAAO,cAAc,iCAAiC;AAC/E,MAAI,OAAO,iBAAiB,GAAG;AAC7B,IAAO,OAAO,GAAG,OAAO,cAAc,sBAAsB;AAAA,EAC9D;AAGA,MAAI,OAAO,UAAU;AACnB,eAAW,KAAK,OAAO,UAAU;AAC/B,MAAO,QAAQ,CAAC;AAAA,IAClB;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,gBAAgB;AAC3B,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAa;AAC/C,YAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,gCAAgC;AAC3E,YAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,gCAA2B;AAC3E,YAAM,iBAAiB,MAAM,SAAS,KAAK,YAAY,aAAa,cAAc,GAAG,OAAO;AAC5F,YAAM,cAAc,KAAK,MAAM,cAAc;AAC7C,YAAM,aAAa,MAAM,kBAAkB,YAAY,QAAW,QAAQ,KAAK,EAAE,GAAG;AAEpF,YAAM,SAAU,WAAmC,QAAQ;AAC3D,YAAM,WAAW,uBAAuB,YAAY,QAAQ,MAAM;AAClE,UAAI,SAAS,UAAU;AACrB,QAAO;AAAA,UACL,sCAAsC,SAAS,eAAe,uCAC1C,SAAS,kBAAkB;AAAA,QACjD;AACA,QAAO;AAAA,UACL,yDAAyD,SAAS,kBAAkB;AAAA,QACtF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,SAAS,WAAW,uCAAuC,EAC3D,OAAO,UAAU,+CAA+C,EAChE,OAAO,OAAO,OAA2B,YAAgC;AACxE,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,wBAAwB;AAE1D,QAAM,aAAa,MAAM,gBAAgB,QAAQ,IAAI,CAAC;AAEtD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,SAAS,YAAY;AAAA,IACxC;AAAA,IACA,MAAM,QAAQ;AAAA,EAChB,CAAC;AAED,MAAI,CAAC,OAAO,SAAS;AACnB,IAAO,MAAM,OAAO,SAAS,iBAAiB;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAO,QAAQ,aAAa,OAAO,YAAY,cAAc;AAC7D,MAAI,OAAO,eAAe,GAAG;AAC3B,IAAO,OAAO,GAAG,OAAO,YAAY,gBAAgB;AAAA,EACtD;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,qEAAqE,EACjF,SAAS,WAAW,yDAAyD,EAC7E,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,OAA2B,YAAqD;AAC7F,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,0BAA0B,CAAC,CAAC;AAAA,IAClF,OAAO;AACL,MAAO,MAAM,yBAAyB;AACtC,MAAO,OAAO,oDAAoD;AAAA,IACpE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,aAAa,iBAAiB,IAAI,MAAM,OAAO,oBAAoB;AAC3E,UAAM,SAAS,MAAM,YAAY,YAAY,OAAO;AAAA,MAClD,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,uBAAiB,QAAQ,OAAO,cAAc;AAAA,IAChD;AAEA,YAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AAAA,EACrC,SAAS,KAAK;AACZ,QAAI,QAAQ,MAAM;AAChB,cAAQ;AAAA,QACN,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AAAA,MAC5F;AAAA,IACF,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,QAAM,UAAU,IAAI,OAAO;AAC7B,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,qDAAqD,EACjE,eAAe,uBAAuB,2BAA2B,EACjE,OAAO,OAAO,YAA+B;AAC5C,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,8BAA8B;AACrE,QAAM,cAAc,YAAY,QAAQ,KAAK;AAC/C,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,iDAAiD,EAC7D,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,yBAAyB,2CAA2C,EAC3E,OAAO,UAAU,gBAAgB,EACjC,OAAO,mBAAmB,0DAA0D,EACpF,OAAO,aAAa,8CAA8C,EAClE,OAAO,OAAO,YAA6H;AAC1I,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,QAAI,QAAQ,SAAS;AACnB,YAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,+BAA+B;AAC5E,YAAM,EAAE,eAAe,oBAAoB,IAAI,MAAM,OAAO,uBAAuB;AAEnF,UAAI;AACJ,UAAI;AACF,sBAAc,MAAM,oBAAoB,YAAY,WAAW,QAAQ,YAAY;AAAA,UACjF,QAAQ,QAAQ;AAAA,UAChB,UAAU,QAAQ;AAAA,QACpB,CAAC;AAAA,MACH,QAAQ;AACN,YAAI;AACF,wBAAc,MAAM,oBAAoB,YAAY,SAAS,QAAQ,YAAY;AAAA,YAC/E,QAAQ,QAAQ;AAAA,YAChB,UAAU,QAAQ;AAAA,UACpB,CAAC;AAAA,QACH,QAAQ;AACN,UAAO,MAAM,4GAAuG;AACpH,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,oBAAoB,YAAY,MAAM,QAAQ,YAAY;AAAA,QAC/E,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,MACpB,CAAC;AACD,YAAM,QAAQ,cAAc,YAAY,QAAQ,SAAS,MAAM;AAE/D,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,MAC5C,OAAO;AACL,gBAAQ,IAAI,oBAAoB,YAAY,QAAQ,KAAK,CAAC;AAAA,MAC5D;AACA;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,sBAAsB;AAC1D,UAAM,SAAS,MAAM,WAAW,YAAY;AAAA,MAC1C,GAAG;AAAA,MACH,QAAS,QAAQ,UAAkB;AAAA,IACrC,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,IACpD,OAAO;AACL,YAAM,cAAc,OAAO,WAAW,OAClC,GAAG,OAAO,cAAc,KAAK,OAAO,cAAc,MAClD,WAAW,OAAO,MAAM;AAC5B,MAAO,OAAO,aAAa,WAAW,EAAE;AACxC,UAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,QAAO,KAAK,iBAAiB;AAAA,MAC/B,OAAO;AACL,mBAAW,SAAS,OAAO,QAAQ;AACjC,gBAAM,SAAS,MAAM,SAAS,GAAG,MAAM,MAAM,MAAM;AACnD,gBAAM,YAAY,MAAM,SAAS,SAAS,GAAG,IAAI,SAAS,IAAI;AAC9D,kBAAQ,IAAI,KAAK,MAAM,GAAG,MAAM,IAAI,GAAG,SAAS,EAAE;AAAA,QACpD;AACA,QAAO,QAAQ;AACf,QAAO,KAAK,GAAG,OAAO,OAAO,MAAM,kBAAkB,OAAO,aAAa,IAAI,KAAK,OAAO,WAAW,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;AAAA,MAC5H;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,oCAAoC,EAChD,SAAS,WAAW,wDAAwD,EAC5E,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,UAAU,gBAAgB,EACjC,OAAO,mBAAmB,0DAA0D,EACpF,OAAO,aAAa,8CAA8C,EAClE,OAAO,OAAO,OAAe,YAAyF;AACrH,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,QAAI,QAAQ,SAAS;AACnB,YAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,+BAA+B;AAC9E,YAAM,EAAE,gBAAgB,qBAAqB,IAAI,MAAM,OAAO,uBAAuB;AAErF,UAAI;AACJ,UAAI;AACF,sBAAc,MAAM,sBAAsB,YAAY,OAAO,WAAW,QAAQ,UAAU;AAAA,MAC5F,QAAQ;AACN,YAAI;AACF,wBAAc,MAAM,sBAAsB,YAAY,OAAO,SAAS,QAAQ,UAAU;AAAA,QAC1F,QAAQ;AACN,UAAO,MAAM,4GAAuG;AACpH,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,sBAAsB,YAAY,OAAO,MAAM,QAAQ,UAAU;AACxF,YAAM,QAAQ,eAAe,YAAY,SAAS,SAAS,OAAO;AAElE,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,MAC5C,OAAO;AACL,gBAAQ,IAAI,qBAAqB,YAAY,OAAO,YAAY,QAAQ,KAAK,CAAC;AAAA,MAChF;AACA;AAAA,IACF;AAEA,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,wBAAwB;AAC/D,UAAM,SAAS,MAAM,cAAc,YAAY,OAAO;AAAA,MACpD,GAAG;AAAA,MACH,QAAS,QAAQ,UAAkB;AAAA,IACrC,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,CAAC,CAAC;AAAA,IACrD,OAAO;AACL,UAAI,OAAO,cAAc;AACvB,QAAO,OAAO,aAAa,OAAO,YAAY,YAAO,OAAO,KAAK,EAAE;AAAA,MACrE;AACA,YAAM,cAAc,OAAO,WAAW,OAClC,GAAG,OAAO,cAAc,KAAK,OAAO,cAAc,MAClD,WAAW,OAAO,MAAM;AAC5B,MAAO,OAAO,GAAG,OAAO,KAAK,KAAK,WAAW,GAAG;AAEhD,YAAM,YAAY,KAAK,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AACzE,YAAM,YAAY,KAAK,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAEzE,cAAQ,IAAI,KAAK,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC,YAAY;AAClF,cAAQ,IAAI,KAAK,SAAI,OAAO,SAAS,CAAC,KAAK,SAAI,OAAO,SAAS,CAAC,KAAK,SAAI,OAAO,CAAC,CAAC,EAAE;AAEpF,iBAAW,OAAO,OAAO,SAAS;AAChC,cAAM,WAAW,IAAI,aAAa,QAAQ,GAAG,IAAI,KAAK,IAAI;AAC1D,gBAAQ,IAAI,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO,SAAS,CAAC,CAAC,KAAK,QAAQ,EAAE;AAAA,MACnG;AAEA,MAAO,QAAQ;AACf,MAAO,KAAK,GAAG,OAAO,QAAQ,MAAM,aAAa,OAAO,aAAa,IAAI,KAAK,OAAO,WAAW,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;AAAA,IACxH;AAAA,EACF,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,kCAAkC,EAC9C,SAAS,SAAS,sBAAsB,EACxC,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,UAAU,gBAAgB,EACjC,OAAO,wBAAwB,mCAAmC,EAClE,OAAO,OAAO,KAAa,YAAqE;AAC/F,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAqB;AAC3D,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM,OAAO,gCAAgC;AAEjF,UAAM,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,IAAI;AAC5D,UAAM,SAAS,MAAM,aAAa,YAAY,KAAK;AAAA,MACjD,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,WAAW,MAAM,CAAC;AAAA,IAChC,OAAO;AACL,cAAQ,IAAI,YAAY,MAAM,CAAC;AAAA,IACjC;AAAA,EACF,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,SAAS,WAAW,8BAA8B,EAClD,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,wBAAwB,2BAA2B,EAC1D,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,OAAe,YAAqE;AACjG,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,sBAAsB;AAC3D,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM,OAAO,gCAAgC;AAEjF,UAAM,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,IAAI;AAC5D,UAAM,SAAS,MAAM,YAAY,YAAY,OAAO;AAAA,MAClD,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,WAAW,MAAM,CAAC;AAAA,IAChC,OAAO;AACL,UAAI,OAAO,cAAc;AACvB,QAAO,OAAO,aAAa,OAAO,YAAY,YAAO,OAAO,KAAK,EAAE;AAAA,MACrE;AACA,cAAQ,IAAI,YAAY,MAAM,CAAC;AAAA,IACjC;AAAA,EACF,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,0CAA0C,EACtD,SAAS,aAAa,uBAAuB,EAC7C,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,UAAU,gBAAgB,EACjC,OAAO,mBAAmB,0DAA0D,EACpF,OAAO,OAAO,SAAiB,YAAsE;AACpG,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,sBAAsB;AAC9D,UAAM,SAAS,MAAM,eAAe,YAAY,SAAS;AAAA,MACvD,GAAG;AAAA,MACH,QAAS,QAAQ,UAAkB;AAAA,IACrC,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,CAAC,CAAC;AAAA,IACrD,OAAO;AACL,YAAM,cAAc,OAAO,WAAW,OAClC,GAAG,OAAO,cAAc,KAAK,OAAO,cAAc,MAClD,WAAW,OAAO,MAAM;AAC5B,MAAO,OAAO,uBAAuB,OAAO,OAAO,QAAQ,WAAW,EAAE;AAExE,YAAM,SAAS,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAC9D,YAAM,UAAU,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAEhE,UAAI,OAAO,SAAS,GAAG;AACrB,QAAO,QAAQ;AACf,gBAAQ,IAAI,WAAW;AACvB,mBAAW,KAAK,QAAQ;AACtB,gBAAM,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,KAAK,EAAE;AAC1D,kBAAQ,IAAI,OAAO,SAAS,EAAE;AAAA,QAChC;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,GAAG;AACtB,QAAO,QAAQ;AACf,gBAAQ,IAAI,YAAY;AACxB,cAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM;AAC/C,gBAAM,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM;AAC1F,iBAAO,UAAU;AAAA,QACnB,CAAC,CAAC;AACF,mBAAW,KAAK,SAAS;AACvB,gBAAM,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM;AAC1F,gBAAM,UAAU,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,IAAI;AACtD,kBAAQ,IAAI,OAAO,UAAU,OAAO,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE;AAAA,QAChE;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,QAAO,OAAO,kBAAkB;AAAA,MAClC;AAEA,MAAO,QAAQ;AACf,MAAO,KAAK,GAAG,OAAO,QAAQ,MAAM,aAAa,OAAO,aAAa,IAAI,KAAK,OAAO,WAAW,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;AAAA,IACxH;AAAA,EACF,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,IAAM,aAAa,QAChB,QAAQ,SAAS,EACjB,YAAY,+DAA+D;AAE9E,WACG,QAAQ,QAAQ,EAChB,YAAY,iCAAiC,EAC7C,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAiD;AAC9D,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,sBAAsB;AAC1D,UAAM,SAAS,MAAM,WAAW,YAAY;AAAA,MAC1C,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,IACpD,OAAO;AACL,MAAO,OAAO,uBAAuB;AACrC,UAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,QAAO,KAAK,4BAA4B;AACxC,QAAO,OAAO,kEAAkE;AAAA,MAClF,OAAO;AACL,cAAM,WAAW,QAAQ,SACrB,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,SAAS,QAAQ,OAAQ,YAAY,CAAC,CAAC,IAC1F,OAAO;AACX,mBAAW,SAAS,UAAU;AAC5B,gBAAM,SAAS,MAAM,SAAS,GAAG,MAAM,MAAM,MAAM;AACnD,gBAAM,YAAY,MAAM,SAAS,SAAS,GAAG,IAAI,SAAS,IAAI,MAAM,SAAS,WAAW,GAAG,IAAI,WAAW,IAAI;AAC9G,kBAAQ,IAAI,KAAK,MAAM,GAAG,MAAM,IAAI,GAAG,SAAS,EAAE;AAAA,QACpD;AACA,QAAO,QAAQ;AACf,QAAO,KAAK,GAAG,SAAS,MAAM,wBAAwB;AAAA,MACxD;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,kBAAkB,GAAG;AACpE,MAAO,MAAM,kBAAkB;AAC/B,MAAO,OAAO,kEAAkE;AAAA,IAClF,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,WACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,SAAS,WAAW,0BAA0B,EAC9C,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,OAAe,YAAgC;AAC5D,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,wBAAwB;AAC/D,UAAM,SAAS,MAAM,cAAc,YAAY,OAAO,EAAE,QAAQ,UAAU,CAAC;AAE3E,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,CAAC,CAAC;AAAA,IACrD,OAAO;AACL,UAAI,OAAO,cAAc;AACvB,QAAO,OAAO,aAAa,OAAO,YAAY,YAAO,OAAO,KAAK,EAAE;AAAA,MACrE;AACA,MAAO,OAAO,GAAG,OAAO,KAAK,iBAAiB;AAE9C,YAAM,YAAY,KAAK,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AACzE,YAAM,YAAY,KAAK,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAEzE,cAAQ,IAAI,KAAK,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC,YAAY;AAClF,cAAQ,IAAI,KAAK,SAAI,OAAO,SAAS,CAAC,KAAK,SAAI,OAAO,SAAS,CAAC,KAAK,SAAI,OAAO,CAAC,CAAC,EAAE;AAEpF,iBAAW,OAAO,OAAO,SAAS;AAChC,cAAM,WAAW,IAAI,aAAa,QAAQ,GAAG,IAAI,KAAK,IAAI;AAC1D,gBAAQ,IAAI,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO,SAAS,CAAC,CAAC,KAAK,QAAQ,EAAE;AAAA,MACnG;AAEA,MAAO,QAAQ;AACf,MAAO,KAAK,GAAG,OAAO,QAAQ,MAAM,YAAY;AAAA,IAClD;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,kBAAkB,GAAG;AACpE,MAAO,MAAM,kBAAkB;AAC/B,MAAO,OAAO,kEAAkE;AAAA,IAClF,WAAW,eAAe,SAAS,IAAI,QAAQ,SAAS,sBAAsB,GAAG;AAC/E,MAAO,MAAM,IAAI,OAAO;AACxB,MAAO,OAAO,wDAAwD;AAAA,IACxE,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,+CAA+C,EAC3D,SAAS,aAAa,uBAAuB,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,SAAiB,YAAgC;AAC9D,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,sBAAsB;AAC9D,UAAM,SAAS,MAAM,eAAe,YAAY,SAAS,EAAE,QAAQ,UAAU,CAAC;AAE9E,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,SAAS,MAAM,CAAC,CAAC;AAAA,IACrD,OAAO;AACL,MAAO,OAAO,uBAAuB,OAAO,kBAAkB;AAE9D,YAAM,SAAS,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAC9D,YAAM,UAAU,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAEhE,UAAI,OAAO,SAAS,GAAG;AACrB,QAAO,QAAQ;AACf,gBAAQ,IAAI,WAAW;AACvB,mBAAW,KAAK,QAAQ;AACtB,gBAAM,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,KAAK,EAAE;AAC1D,kBAAQ,IAAI,OAAO,SAAS,EAAE;AAAA,QAChC;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,GAAG;AACtB,QAAO,QAAQ;AACf,gBAAQ,IAAI,YAAY;AACxB,cAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM;AAC/C,gBAAM,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM;AAC1F,iBAAO,UAAU;AAAA,QACnB,CAAC,CAAC;AACF,mBAAW,KAAK,SAAS;AACvB,gBAAM,YAAY,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM;AAC1F,gBAAM,UAAU,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,IAAI;AACtD,kBAAQ,IAAI,OAAO,UAAU,OAAO,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE;AAAA,QAChE;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,QAAO,OAAO,6BAA6B;AAC3C,QAAO,OAAO,6DAA6D;AAAA,MAC7E;AAEA,MAAO,QAAQ;AACf,MAAO,KAAK,GAAG,OAAO,QAAQ,MAAM,yBAAyB;AAAA,IAC/D;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,kBAAkB,GAAG;AACpE,MAAO,MAAM,kBAAkB;AAC/B,MAAO,OAAO,kEAAkE;AAAA,IAClF,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,0BAA0B,EACtC,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAgC;AAC7C,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAa;AAC/C,UAAM,cAAc,KAAK,YAAY,aAAa,cAAc;AAEhE,QAAI;AACJ,QAAI;AACF,oBAAc,KAAK,MAAM,MAAM,SAAS,aAAa,OAAO,CAAC;AAAA,IAC/D,QAAQ;AACN,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC/C,OAAO;AACL,QAAO,MAAM,kBAAkB;AAC/B,QAAO,OAAO,kEAAkE;AAAA,MAClF;AACA,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAEA,UAAM,SAAS,YAAY,UAAU,CAAC;AACtC,UAAM,YAAY,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,KAAK;AACzD,UAAM,kBAAkB,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AACrE,UAAM,eAAe,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY;AACnE,UAAM,eAAe,OAAO,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,SAAS,UAAU,IAAI,CAAC;AAGhF,QAAI,YAAmF;AACvF,QAAI;AACF,YAAM,WAAW,KAAK,YAAY,aAAa,qBAAqB;AACpE,kBAAY,KAAK,MAAM,MAAM,SAAS,UAAU,OAAO,CAAC;AAAA,IAC1D,QAAQ;AAAA,IAER;AAEA,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,QAAQ;AAAA,QACR,UAAU,YAAY;AAAA,QACtB,QAAQ,YAAY;AAAA,QACpB,QAAQ,OAAO;AAAA,QACf,WAAW,UAAU;AAAA,QACrB,iBAAiB,gBAAgB;AAAA,QACjC,cAAc,aAAa;AAAA,QAC3B;AAAA,QACA,eAAe,YAAY;AAAA,UACzB,UAAU,UAAU;AAAA,UACpB,YAAY,UAAU;AAAA,UACtB,SAAS,UAAU;AAAA,QACrB,IAAI;AAAA,MACN,GAAG,MAAM,CAAC,CAAC;AAAA,IACb,OAAO;AACL,MAAO,OAAO,gBAAgB;AAC9B,cAAQ,IAAI,mBAAmB,YAAY,YAAY,SAAS,EAAE;AAClE,cAAQ,IAAI,mBAAmB,OAAO,MAAM,WAAW,UAAU,MAAM,SAAS,gBAAgB,MAAM,eAAe,aAAa,MAAM,WAAW;AACnJ,cAAQ,IAAI,mBAAmB,YAAY,EAAE;AAE7C,UAAI,WAAW;AACb,QAAO,QAAQ;AACf,gBAAQ,IAAI,mBAAmB;AAC/B,gBAAQ,IAAI,mBAAmB,UAAU,cAAc,SAAS,EAAE;AAClE,gBAAQ,IAAI,mBAAmB,UAAU,SAAS,KAAK,IAAI,KAAK,KAAK,EAAE;AACvE,gBAAQ,IAAI,mBAAmB,UAAU,YAAY,SAAS,EAAE;AAAA,MAClE;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,gDAAgD,EAC5D,OAAO,2BAA2B,uCAAuC,EACzE,OAAO,0BAA0B,iCAAiC,EAClE,OAAO,yBAAyB,yCAAyC,EACzE,OAAO,kBAAkB,4BAA4B,EACrD,OAAO,aAAa,4CAA4C,EAChE,OAAO,UAAU,+CAA+C,EAChE,OAAO,UAAU,6BAA6B,EAC9C,OAAO,OAAO,YAAY;AACzB,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,8BAA8B;AACxE,UAAM,iBAAiB,YAAY,OAAO;AAAA,EAC5C,SAAS,KAAK;AACZ,IAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,wCAAwC,EACpD,SAAS,WAAW,iCAAiC,EACrD,OAAO,eAAe,6CAA6C,EACnE,OAAO,UAAU,gBAAgB,EACjC,OAAO,mBAAmB,0DAA0D,EACpF,OAAO,OAAO,OAAe,YAAiE;AAC7F,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,uBAAuB;AAC3D,UAAM,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,IAAI;AAC5D,UAAM,SAAS,MAAM,WAAW,YAAY,OAAO;AAAA,MACjD;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,QAAS,QAAQ,UAAkB;AAAA,IACrC,CAAC;AAED,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,IAClD,OAAO;AACL,cAAQ,IAAI,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,QAAQ,GAAG;AAC1D,MAAO,MAAM,kDAAkD;AAAA,IACjE,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,qFAAgF,EAC5F,SAAS,cAAc,wDAAwD,EAC/E,OAAO,aAAa,sCAAsC,EAC1D,OAAO,UAAU,gBAAgB,EACjC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,2BAA2B,+CAA+C,EACjF,OAAO,OAAO,UAA8B,YAAqF;AAChI,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,0BAA0B,CAAC,CAAC;AAAA,IAClF,OAAO;AACL,MAAO,MAAM,yBAAyB;AACtC,MAAO,OAAO,oDAAoD;AAAA,IACpE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,uBAAuB;AAC3D,QAAM,WAAW,YAAY,UAAU;AAAA,IACrC,KAAK,QAAQ,MAAM,SAAS,QAAQ,KAAK,EAAE,IAAI;AAAA,IAC/C,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,EACtB,CAAC;AACH,CAAC;AAEH,IAAM,cAAc,QACjB,QAAQ,UAAU,EAClB,YAAY,4FAAuF,EACnG,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAgC;AAC7C,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,IAAO,OAAO,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAa;AAC/C,UAAM,cAAc,KAAK,YAAY,aAAa,cAAc;AAChE,UAAM,cAAc,KAAK,MAAM,MAAM,SAAS,aAAa,OAAO,CAAC;AAEnE,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,wBAAwB;AACtE,UAAM,SAAS,qBAAqB,WAAW;AAE/C,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,OAAO,UAAU,MAAM,CAAC,CAAC;AACpD;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,WAAW,GAAG;AAChC,MAAO,KAAK,6BAA6B;AACzC,MAAO,OAAO,+EAA+E;AAC7F;AAAA,IACF;AAEA,IAAO,OAAO,yBAAoB,OAAO,SAAS,MAAM,WAAW;AAEnE,eAAW,UAAU,OAAO,UAAU;AACpC,cAAQ,IAAI,KAAK,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE;AACvC,cAAQ,IAAI,KAAK,GAAG,IAAI,OAAO,YAAY,CAAC,EAAE;AAC9C,UAAI,OAAO,aAAa;AACtB,gBAAQ,IAAI,KAAK,OAAO,WAAW,EAAE;AAAA,MACvC;AACA,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,gBAAQ,IAAI,eAAe,OAAO,SAAS,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACrG;AACA,UAAI,OAAO,WAAW,SAAS,GAAG;AAChC,gBAAQ,IAAI,iBAAiB,OAAO,WAAW,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACzG;AACA,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,QAAQ,GAAG;AAC1D,MAAO,MAAM,+EAA+E;AAAA,IAC9F,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,YACG,QAAQ,OAAO,EACf,YAAY,mDAAmD,EAC/D,eAAe,uBAAuB,gCAAgC,EACtE,eAAe,6BAA6B,+BAA+B,EAC3E,OAAO,iCAAiC,iCAAiC,EACzE,OAAO,4BAA4B,mCAAmC,EACtE,OAAO,mBAAmB,gBAAgB,EAC1C,OAAO,UAAU,uCAAuC,EACxD,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,2BAA2B,mBAAmB,EACrD,OAAO,UAAU,gBAAgB,EACjC,OAAO,SAAS,0CAA0C,EAC1D,OAAO,OAAO,YAWT;AACJ,QAAM,YAAY,QAAQ,GAAG;AAC7B,QAAM,aAAa,MAAM,gBAAgB,SAAS;AAElD,MAAI,CAAC,YAAY;AACf,IAAO,MAAM,yBAAyB;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY,UAAU;AAEtB,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAa;AAC/C,UAAM,cAAc,KAAK,YAAY,aAAa,cAAc;AAChE,UAAM,cAAc,KAAK,MAAM,MAAM,SAAS,aAAa,OAAO,CAAC;AAEnE,UAAM,EAAE,oBAAoB,IAAI,MAAM,OAAO,wBAAwB;AAGrE,UAAM,WAAW,QAAQ,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM;AAChD,YAAM,QAAQ,EAAE,QAAQ,GAAG;AAC3B,UAAI,UAAU,GAAI,OAAM,IAAI,MAAM,2BAA2B,CAAC,wBAAwB;AACtF,aAAO;AAAA,QACL,WAAW,EAAE,MAAM,GAAG,KAAK;AAAA,QAC3B,UAAU;AAAA,QACV,OAAO,EAAE,MAAM,QAAQ,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,UAAM,SAAS,oBAAoB,aAAa;AAAA,MAC9C,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,MACzD,YAAY,QAAQ,aAAa,QAAQ,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;AAAA,MACvF;AAAA,MACA,UAAU,QAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAO,WAAW,QAAQ,OAAO,SAAS,MAAM,IAAI;AAAA,MAC/F,OAAO,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,IAAI;AAAA,IACvD,CAAC;AAGD,QAAI,QAAQ,KAAK;AACf,cAAQ,IAAI,OAAO,GAAG;AACtB;AAAA,IACF;AAGA,UAAM,EAAE,mBAAmB,iBAAiB,aAAa,WAAW,IAAI,MAAM,OAAO,gCAAgC;AACrH,UAAM,aAAa,MAAM,kBAAkB,YAAY,QAAQ,YAAY,QAAQ,KAAK,EAAE,GAAG;AAC7F,UAAM,YAAY,gBAAgB,YAAY,UAAU;AAExD,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,UAAU,QAAQ;AACxB,UAAM,cAAc,MAAM,UAAU,QAAQ,OAAO,GAAG;AACtD,UAAM,UAAU,WAAW;AAC3B,UAAM,aAAa,KAAK,OAAO,YAAY,IAAI,IAAI,SAAS,GAAG,IAAI;AAEnE,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,WAAW;AAAA,QACrB,SAAS,YAAY;AAAA,QACrB,MAAM,YAAY;AAAA,QAClB,UAAU,YAAY,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC,CAAC;AAAA,IACJ,OAAO;AACL,MAAO,OAAO,WAAW,OAAO,UAAU,EAAE;AAC5C,MAAO,OAAO,QAAQ,OAAO,IAAI,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK;AACvE,MAAO,QAAQ;AACf,cAAQ,IAAI,YAAY;AAAA,QACtB,SAAS,YAAY;AAAA,QACrB,MAAM,YAAY;AAAA,QAClB,UAAU,YAAY,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC,CAAC;AAAA,IACJ;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,QAAQ,SAAS,QAAQ,GAAG;AAC1D,MAAO,MAAM,+EAA+E;AAAA,IAC9F,OAAO;AACL,MAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,MAAM;AAGd,IAAI,qBAAoC;AAExC,eAAe,IAAI,OAAO,EAAE,KAAK,CAAC,WAAW;AAC3C,MAAI,QAAQ;AACV,yBAAqB;AAAA,sBAAyB,OAAO,OAAO,WAAM,OAAO,MAAM;AAAA;AAAA;AAAA,EACjF;AACF,CAAC;AAED,QAAQ,GAAG,QAAQ,MAAM;AACvB,MAAI,oBAAoB;AAEtB,YAAQ,MAAM;AAAA,EAAK,GAAG,IAAI,kBAAkB,CAAC,EAAE;AAAA,EACjD;AACF,CAAC;","names":["error","warning"]}
@@ -1,4 +1,4 @@
1
- import{p as xe,u as he,q as me,e as be,r as $,j as t,s as E,E as ce,M as fe,t as ve,v as je,w as Ce,a as S}from"./index-BG7tFC30.js";import{a as s}from"./echarts-DtOYsfLX.js";const ge=`
1
+ import{q as xe,u as he,r as me,e as be,s as $,j as t,t as E,E as ce,M as fe,v as ve,w as je,x as Ce,a as S}from"./index-DVSm0iiw.js";import{a as s}from"./echarts-DtOYsfLX.js";const ge=`
2
2
  .rdp-root {
3
3
  --rdp-accent-color: var(--yc-color-primary, #2563eb);
4
4
  --rdp-accent-background-color: color-mix(in srgb, var(--yc-color-primary, #2563eb) 15%, transparent);
@@ -1 +1 @@
1
- import{u,j as e,A as p}from"./index-BG7tFC30.js";import{a as r}from"./echarts-DtOYsfLX.js";const f="",g={google:"Google",microsoft:"Microsoft",oidc:"SSO"};function j(){const m=u(o=>o.login),l=u(o=>o.providers),[a,x]=r.useState(""),[t,b]=r.useState(""),[c,s]=r.useState(""),[n,d]=r.useState(!1);r.useEffect(()=>{window.location.hash.includes("error=account_conflict")&&(s("An account with this email already exists. Please sign in with your password."),window.location.hash="#/")},[]);const y=async o=>{o.preventDefault(),s(""),d(!0);try{await m(a,t)}catch(i){i instanceof p?s(i.message):s("An unexpected error occurred")}finally{d(!1)}},h=o=>{window.location.href=`${f}/api/auth/sso/${o}`};return e.jsx("div",{className:"min-h-screen flex items-center justify-center",style:{backgroundColor:"var(--yc-color-background)"},children:e.jsxs("div",{className:"rounded-lg shadow-sm p-8 w-full max-w-md",style:{backgroundColor:"var(--yc-color-surface)",border:"1px solid var(--yc-color-border)"},children:[e.jsx("h1",{className:"text-2xl font-semibold mb-2",style:{color:"var(--yc-color-text)"},children:"Sign in to Yamchart"}),e.jsx("p",{className:"text-sm mb-6",style:{color:"var(--yc-color-text-secondary)"},children:"Enter your credentials to access dashboards."}),c&&e.jsx("div",{className:"text-sm rounded-md px-4 py-3 mb-4",style:{backgroundColor:"color-mix(in srgb, var(--yc-color-danger) 10%, transparent)",border:"1px solid color-mix(in srgb, var(--yc-color-danger) 30%, transparent)",color:"var(--yc-color-danger)"},children:c}),l.length>0&&e.jsxs("div",{className:"space-y-2 mb-6",children:[l.map(o=>e.jsxs("button",{onClick:()=>h(o),className:"w-full py-2 px-4 text-sm font-medium rounded-md hover:bg-black/5",style:{border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text-secondary)"},children:["Sign in with ",g[o]??o]},o)),e.jsxs("div",{className:"relative my-4",children:[e.jsx("div",{className:"absolute inset-0 flex items-center",children:e.jsx("div",{className:"w-full border-t",style:{borderColor:"var(--yc-color-border)"}})}),e.jsx("div",{className:"relative flex justify-center text-xs",style:{color:"var(--yc-color-text-muted)"},children:e.jsx("span",{className:"px-2",style:{backgroundColor:"var(--yc-color-surface)"},children:"or"})})]})]}),e.jsxs("form",{onSubmit:y,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium mb-1",style:{color:"var(--yc-color-text-secondary)"},children:"Email"}),e.jsx("input",{id:"email",type:"email",value:a,onChange:o=>x(o.target.value),required:!0,className:"w-full px-3 py-2 border rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",style:{backgroundColor:"var(--yc-color-input-bg)",color:"var(--yc-color-text)",borderColor:"var(--yc-color-border)"},placeholder:"you@example.com"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"password",className:"block text-sm font-medium mb-1",style:{color:"var(--yc-color-text-secondary)"},children:"Password"}),e.jsx("input",{id:"password",type:"password",value:t,onChange:o=>b(o.target.value),required:!0,className:"w-full px-3 py-2 border rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",style:{backgroundColor:"var(--yc-color-input-bg)",color:"var(--yc-color-text)",borderColor:"var(--yc-color-border)"},placeholder:"Password"})]}),e.jsx("button",{type:"submit",disabled:n,className:"w-full py-2 px-4 bg-blue-600 text-white text-sm font-medium rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed",children:n?"Signing in...":"Sign in"})]})]})})}export{j as LoginPage};
1
+ import{u,j as e,A as p}from"./index-DVSm0iiw.js";import{a as r}from"./echarts-DtOYsfLX.js";const f="",g={google:"Google",microsoft:"Microsoft",oidc:"SSO"};function j(){const m=u(o=>o.login),l=u(o=>o.providers),[a,x]=r.useState(""),[t,b]=r.useState(""),[c,s]=r.useState(""),[n,d]=r.useState(!1);r.useEffect(()=>{window.location.hash.includes("error=account_conflict")&&(s("An account with this email already exists. Please sign in with your password."),window.location.hash="#/")},[]);const y=async o=>{o.preventDefault(),s(""),d(!0);try{await m(a,t)}catch(i){i instanceof p?s(i.message):s("An unexpected error occurred")}finally{d(!1)}},h=o=>{window.location.href=`${f}/api/auth/sso/${o}`};return e.jsx("div",{className:"min-h-screen flex items-center justify-center",style:{backgroundColor:"var(--yc-color-background)"},children:e.jsxs("div",{className:"rounded-lg shadow-sm p-8 w-full max-w-md",style:{backgroundColor:"var(--yc-color-surface)",border:"1px solid var(--yc-color-border)"},children:[e.jsx("h1",{className:"text-2xl font-semibold mb-2",style:{color:"var(--yc-color-text)"},children:"Sign in to Yamchart"}),e.jsx("p",{className:"text-sm mb-6",style:{color:"var(--yc-color-text-secondary)"},children:"Enter your credentials to access dashboards."}),c&&e.jsx("div",{className:"text-sm rounded-md px-4 py-3 mb-4",style:{backgroundColor:"color-mix(in srgb, var(--yc-color-danger) 10%, transparent)",border:"1px solid color-mix(in srgb, var(--yc-color-danger) 30%, transparent)",color:"var(--yc-color-danger)"},children:c}),l.length>0&&e.jsxs("div",{className:"space-y-2 mb-6",children:[l.map(o=>e.jsxs("button",{onClick:()=>h(o),className:"w-full py-2 px-4 text-sm font-medium rounded-md hover:bg-black/5",style:{border:"1px solid var(--yc-color-border)",color:"var(--yc-color-text-secondary)"},children:["Sign in with ",g[o]??o]},o)),e.jsxs("div",{className:"relative my-4",children:[e.jsx("div",{className:"absolute inset-0 flex items-center",children:e.jsx("div",{className:"w-full border-t",style:{borderColor:"var(--yc-color-border)"}})}),e.jsx("div",{className:"relative flex justify-center text-xs",style:{color:"var(--yc-color-text-muted)"},children:e.jsx("span",{className:"px-2",style:{backgroundColor:"var(--yc-color-surface)"},children:"or"})})]})]}),e.jsxs("form",{onSubmit:y,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium mb-1",style:{color:"var(--yc-color-text-secondary)"},children:"Email"}),e.jsx("input",{id:"email",type:"email",value:a,onChange:o=>x(o.target.value),required:!0,className:"w-full px-3 py-2 border rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",style:{backgroundColor:"var(--yc-color-input-bg)",color:"var(--yc-color-text)",borderColor:"var(--yc-color-border)"},placeholder:"you@example.com"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"password",className:"block text-sm font-medium mb-1",style:{color:"var(--yc-color-text-secondary)"},children:"Password"}),e.jsx("input",{id:"password",type:"password",value:t,onChange:o=>b(o.target.value),required:!0,className:"w-full px-3 py-2 border rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",style:{backgroundColor:"var(--yc-color-input-bg)",color:"var(--yc-color-text)",borderColor:"var(--yc-color-border)"},placeholder:"Password"})]}),e.jsx("button",{type:"submit",disabled:n,className:"w-full py-2 px-4 bg-blue-600 text-white text-sm font-medium rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed",children:n?"Signing in...":"Sign in"})]})]})})}export{j as LoginPage};