yamchart 0.7.1 → 0.7.2

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 (41) hide show
  1. package/dist/{advisor-YW2EBXGR.js → advisor-5BTRAICH.js} +4 -4
  2. package/dist/{chunk-45SP26I2.js → chunk-565OEBW7.js} +2 -2
  3. package/dist/{chunk-3RYZTXPH.js → chunk-5VA43CTW.js} +3 -3
  4. package/dist/{chunk-23E6YT4S.js → chunk-SSUVEADJ.js} +6 -3
  5. package/dist/chunk-SSUVEADJ.js.map +1 -0
  6. package/dist/{connection-utils-26ZE4KUZ.js → connection-utils-AGSQ5HNN.js} +3 -3
  7. package/dist/{describe-ZM2JI2XS.js → describe-AA4UT4U6.js} +3 -3
  8. package/dist/{dev-CBUHSRXH.js → dev-EUWIRL4N.js} +3 -3
  9. package/dist/{dist-LJOCG7C5.js → dist-LZNDQDH3.js} +2 -2
  10. package/dist/index.js +14 -14
  11. package/dist/public/assets/{LoginPage-NNsbTBPo.js → LoginPage-BwMmpq8e.js} +1 -1
  12. package/dist/public/assets/{PublicViewer-DDsvIFas.js → PublicViewer-vIDojjIR.js} +1 -1
  13. package/dist/public/assets/{SetupWizard-CY-o51--.js → SetupWizard-DU8R2dPp.js} +1 -1
  14. package/dist/public/assets/{ShareManagement-B-Kz0tT8.js → ShareManagement-7iS6lM2T.js} +1 -1
  15. package/dist/public/assets/{UserManagement-B6LjBcOb.js → UserManagement-By7YRZrF.js} +1 -1
  16. package/dist/public/assets/{index-D7Le1t6t.css → index-C0hWblBI.css} +1 -1
  17. package/dist/public/assets/{index-IDI-DDZi.js → index-CXx1PiRF.js} +36 -36
  18. package/dist/public/assets/{index.es-DK8yr16j.js → index.es-YeJujQ5o.js} +1 -1
  19. package/dist/public/assets/{jspdf.es.min-CDLoTXR9.js → jspdf.es.min-BzZgn3ka.js} +3 -3
  20. package/dist/public/index.html +2 -2
  21. package/dist/{query-LRPR6YRE.js → query-THDVBBVZ.js} +3 -3
  22. package/dist/{sample-D4HDOJWP.js → sample-6WPQS7PA.js} +3 -3
  23. package/dist/{search-ECGHSZBU.js → search-657DXBRS.js} +3 -3
  24. package/dist/{sync-warehouse-WPNGI6YP.js → sync-warehouse-4KBV5S3L.js} +3 -3
  25. package/dist/{tables-5BVEKUPB.js → tables-KLDBUUSE.js} +3 -3
  26. package/dist/{test-AJM3CBYW.js → test-JSAWS5ZP.js} +3 -3
  27. package/package.json +4 -4
  28. package/dist/chunk-23E6YT4S.js.map +0 -1
  29. /package/dist/{advisor-YW2EBXGR.js.map → advisor-5BTRAICH.js.map} +0 -0
  30. /package/dist/{chunk-45SP26I2.js.map → chunk-565OEBW7.js.map} +0 -0
  31. /package/dist/{chunk-3RYZTXPH.js.map → chunk-5VA43CTW.js.map} +0 -0
  32. /package/dist/{connection-utils-26ZE4KUZ.js.map → connection-utils-AGSQ5HNN.js.map} +0 -0
  33. /package/dist/{describe-ZM2JI2XS.js.map → describe-AA4UT4U6.js.map} +0 -0
  34. /package/dist/{dev-CBUHSRXH.js.map → dev-EUWIRL4N.js.map} +0 -0
  35. /package/dist/{dist-LJOCG7C5.js.map → dist-LZNDQDH3.js.map} +0 -0
  36. /package/dist/{query-LRPR6YRE.js.map → query-THDVBBVZ.js.map} +0 -0
  37. /package/dist/{sample-D4HDOJWP.js.map → sample-6WPQS7PA.js.map} +0 -0
  38. /package/dist/{search-ECGHSZBU.js.map → search-657DXBRS.js.map} +0 -0
  39. /package/dist/{sync-warehouse-WPNGI6YP.js.map → sync-warehouse-4KBV5S3L.js.map} +0 -0
  40. /package/dist/{tables-5BVEKUPB.js.map → tables-KLDBUUSE.js.map} +0 -0
  41. /package/dist/{test-AJM3CBYW.js.map → test-JSAWS5ZP.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createConnector,
3
3
  resolveConnection
4
- } from "./chunk-45SP26I2.js";
4
+ } from "./chunk-565OEBW7.js";
5
5
  import {
6
6
  detail,
7
7
  error,
@@ -11,7 +11,7 @@ import {
11
11
  warning
12
12
  } from "./chunk-HJVVHYVN.js";
13
13
  import "./chunk-UDRJFEJU.js";
14
- import "./chunk-23E6YT4S.js";
14
+ import "./chunk-SSUVEADJ.js";
15
15
  import "./chunk-DGUM43GV.js";
16
16
 
17
17
  // src/commands/advisor.ts
@@ -43,7 +43,7 @@ async function getDbtProjectPath(projectDir, override) {
43
43
  return null;
44
44
  }
45
45
  async function buildContext(projectDir, options) {
46
- const { parseModelMetadata } = await import("./dist-LJOCG7C5.js");
46
+ const { parseModelMetadata } = await import("./dist-LZNDQDH3.js");
47
47
  const modelsDir = join(projectDir, "models");
48
48
  const yamchartModels = [];
49
49
  try {
@@ -378,4 +378,4 @@ async function offerApply(context, proposals) {
378
378
  export {
379
379
  runAdvisor
380
380
  };
381
- //# sourceMappingURL=advisor-YW2EBXGR.js.map
381
+ //# sourceMappingURL=advisor-5BTRAICH.js.map
@@ -10,7 +10,7 @@ import {
10
10
  resolveMySQLAuth,
11
11
  resolvePostgresAuth,
12
12
  resolveSnowflakeAuth
13
- } from "./chunk-23E6YT4S.js";
13
+ } from "./chunk-SSUVEADJ.js";
14
14
 
15
15
  // src/commands/connection-utils.ts
16
16
  import { readFile, access } from "fs/promises";
@@ -166,4 +166,4 @@ export {
166
166
  formatTable,
167
167
  formatJSON
168
168
  };
169
- //# sourceMappingURL=chunk-45SP26I2.js.map
169
+ //# sourceMappingURL=chunk-565OEBW7.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-UDRJFEJU.js";
8
8
  import {
9
9
  parseModelMetadata
10
- } from "./chunk-23E6YT4S.js";
10
+ } from "./chunk-SSUVEADJ.js";
11
11
 
12
12
  // src/commands/validate.ts
13
13
  import { readFile, readdir, access } from "fs/promises";
@@ -282,7 +282,7 @@ function levenshtein(a, b) {
282
282
  return matrix[b.length][a.length];
283
283
  }
284
284
  async function dryRunValidation(projectDir, config, connectionName, errors) {
285
- const { DuckDBConnector } = await import("./dist-LJOCG7C5.js");
285
+ const { DuckDBConnector } = await import("./dist-LZNDQDH3.js");
286
286
  let passed = 0;
287
287
  let failed = 0;
288
288
  const connName = connectionName || config.project?.defaults?.connection;
@@ -365,4 +365,4 @@ export {
365
365
  findProjectRoot,
366
366
  loadEnvFile
367
367
  };
368
- //# sourceMappingURL=chunk-3RYZTXPH.js.map
368
+ //# sourceMappingURL=chunk-5VA43CTW.js.map
@@ -423,7 +423,7 @@ var QueryCompiler = class {
423
423
  compile(chart, inputParams, userContext) {
424
424
  const { sql, modelParams } = this.getSQL(chart);
425
425
  const params = this.resolveParams(chart, modelParams, inputParams);
426
- const expandedParams = this.expandPresets(params);
426
+ const expandedParams = this.expandPresets(params, inputParams);
427
427
  const context = createTemplateContext(expandedParams, this.refs, userContext);
428
428
  const renderedSQL = renderTemplate(sql, context);
429
429
  const cacheKey = this.generateCacheKey(chart.name, renderedSQL, expandedParams, userContext);
@@ -466,8 +466,11 @@ var QueryCompiler = class {
466
466
  Object.assign(params, inputParams);
467
467
  return params;
468
468
  }
469
- expandPresets(params) {
469
+ expandPresets(params, inputParams) {
470
470
  const expanded = { ...params };
471
+ if (inputParams.start_date && inputParams.end_date) {
472
+ return expanded;
473
+ }
471
474
  if (isCustomDateRange(params.date_range)) {
472
475
  const dateRange = expandCustomDateRange(params.date_range);
473
476
  expanded.start_date = dateRange.start_date;
@@ -1459,4 +1462,4 @@ export {
1459
1462
  checkSchema,
1460
1463
  VERSION
1461
1464
  };
1462
- //# sourceMappingURL=chunk-23E6YT4S.js.map
1465
+ //# sourceMappingURL=chunk-SSUVEADJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/query/src/parser.ts","../../../packages/query/src/presets.ts","../../../packages/query/src/template.ts","../../../packages/query/src/compiler.ts","../../../packages/query/src/connectors/duckdb.ts","../../../packages/query/src/connectors/postgres.ts","../../../packages/query/src/connectors/mysql.ts","../../../packages/query/src/connectors/sqlite.ts","../../../packages/query/src/connectors/snowflake.ts","../../../packages/query/src/connectors/auth.ts","../../../packages/query/src/test-runner.ts","../../../packages/query/src/index.ts"],"sourcesContent":["import type { ModelMetadata, ModelParam, ReturnColumn } from '@yamchart/schema';\n\nexport interface ParsedModel {\n metadata: ModelMetadata;\n sql: string;\n}\n\ninterface ParseResult extends ModelMetadata {\n sql: string;\n}\n\n/**\n * Parse model metadata from SQL comments.\n *\n * Supports:\n * - @name: model_name\n * - @description: text\n * - @owner: team-name\n * - @tags: [tag1, tag2]\n * - @param name: type = default {option1, option2}\n * - @returns: (multiline)\n * - @tests: (multiline)\n */\nexport function parseModelMetadata(sql: string): ParseResult {\n const lines = sql.split('\\n');\n const metadataLines: string[] = [];\n const sqlLines: string[] = [];\n\n let inMetadata = true;\n let inMultiline: 'returns' | 'tests' | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if this is a metadata comment\n if (trimmed.startsWith('-- @') || (inMultiline && trimmed.startsWith('--'))) {\n metadataLines.push(trimmed);\n inMetadata = true;\n } else if (trimmed.startsWith('--') && inMetadata && metadataLines.length > 0) {\n // Continuation of metadata block\n metadataLines.push(trimmed);\n } else if (trimmed === '' && inMetadata) {\n // Empty line in metadata section, keep going\n continue;\n } else {\n // SQL content\n inMetadata = false;\n sqlLines.push(line);\n }\n }\n\n // Parse metadata\n const metadata = parseMetadataLines(metadataLines);\n\n if (!metadata.name) {\n throw new Error('Model must have a @name');\n }\n\n return {\n ...metadata,\n name: metadata.name,\n sql: sqlLines.join('\\n').trim(),\n };\n}\n\nfunction parseMetadataLines(lines: string[]): Partial<ModelMetadata> & { sql?: string } {\n const result: Partial<ModelMetadata> = {};\n const params: ModelParam[] = [];\n const returns: ReturnColumn[] = [];\n const tests: string[] = [];\n\n let currentMultiline: 'returns' | 'tests' | null = null;\n\n for (const line of lines) {\n const content = line.replace(/^--\\s*/, '').trim();\n\n // Check for multiline content (indented with -)\n if (currentMultiline && content.startsWith('- ')) {\n const itemContent = content.slice(2).trim();\n\n if (currentMultiline === 'returns') {\n const returnCol = parseReturnColumn(itemContent);\n if (returnCol) returns.push(returnCol);\n } else if (currentMultiline === 'tests') {\n tests.push(itemContent);\n }\n continue;\n }\n\n // Check for new directive\n if (content.startsWith('@')) {\n currentMultiline = null;\n\n if (content.startsWith('@name:')) {\n result.name = content.slice(6).trim();\n } else if (content.startsWith('@description:')) {\n result.description = content.slice(13).trim();\n } else if (content.startsWith('@owner:')) {\n result.owner = content.slice(7).trim();\n } else if (content.startsWith('@tags:')) {\n result.tags = parseTags(content.slice(6).trim());\n } else if (content.startsWith('@param')) {\n const param = parseParam(content.slice(6).trim());\n if (param) params.push(param);\n } else if (content.startsWith('@returns:')) {\n currentMultiline = 'returns';\n } else if (content.startsWith('@tests:')) {\n currentMultiline = 'tests';\n }\n }\n }\n\n if (params.length > 0) result.params = params;\n if (returns.length > 0) result.returns = returns;\n if (tests.length > 0) result.tests = tests;\n\n return result;\n}\n\nfunction parseTags(input: string): string[] {\n // Parse [tag1, tag2, tag3]\n const match = input.match(/\\[(.*)\\]/);\n if (!match?.[1]) return [];\n return match[1].split(',').map(t => t.trim());\n}\n\nfunction parseParam(input: string): ModelParam | null {\n // Parse: name: type = default {option1, option2}\n // Or: name: type = default\n // Or: name: type\n\n const match = input.match(/^(\\w+):\\s*(\\w+(?:\\[\\])?)\\s*(?:=\\s*([^{]+))?\\s*(?:\\{([^}]+)\\})?/);\n if (!match) return null;\n\n const [, name, type, defaultValue, options] = match;\n if (!name || !type) return null;\n\n const param: ModelParam = {\n name: name.trim(),\n type: type.trim() as ModelParam['type'],\n };\n\n if (defaultValue) {\n param.default = defaultValue.trim();\n }\n\n if (options) {\n param.options = options.split(',').map(o => o.trim());\n }\n\n return param;\n}\n\nfunction parseReturnColumn(input: string): ReturnColumn | null {\n // Parse: name: type -- description\n // Or: name: type\n\n const match = input.match(/^(\\w+):\\s*(\\w+)\\s*(?:--\\s*(.+))?/);\n if (!match) return null;\n\n const [, name, type, description] = match;\n if (!name || !type) return null;\n\n const col: ReturnColumn = {\n name: name.trim(),\n type: type.trim(),\n };\n\n if (description) {\n col.description = description.trim();\n }\n\n return col;\n}\n","import {\n subDays,\n subWeeks,\n subMonths,\n subYears,\n subQuarters,\n addDays,\n addWeeks,\n addMonths,\n addYears,\n addQuarters,\n startOfDay,\n startOfWeek,\n startOfYear,\n startOfMonth,\n startOfQuarter,\n endOfDay,\n endOfWeek,\n endOfMonth,\n endOfQuarter,\n endOfYear,\n differenceInDays,\n parseISO,\n format,\n} from 'date-fns';\n\nexport interface DateRange {\n start_date: string;\n end_date: string;\n}\n\nexport interface CustomDateRange {\n type: 'custom';\n start: string;\n end: string;\n}\n\n/**\n * Check if a value is a custom date range object.\n */\nexport function isCustomDateRange(value: unknown): value is CustomDateRange {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as CustomDateRange).type === 'custom' &&\n 'start' in value &&\n 'end' in value\n );\n}\n\n/**\n * Expand a custom date range into start_date and end_date.\n */\nexport function expandCustomDateRange(range: CustomDateRange): DateRange {\n return {\n start_date: range.start,\n end_date: range.end,\n };\n}\n\nexport const DATE_PRESETS = [\n 'last_7_days',\n 'last_30_days',\n 'last_90_days',\n 'last_12_months',\n 'year_to_date',\n 'month_to_date',\n 'quarter_to_date',\n 'previous_month',\n 'previous_quarter',\n 'previous_year',\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number];\n\nconst DATE_FORMAT = 'yyyy-MM-dd';\n\nfunction formatDate(date: Date): string {\n return format(date, DATE_FORMAT);\n}\n\n/**\n * Expand a date preset into start_date and end_date.\n * Returns null if preset is not recognized.\n */\nexport function expandDatePreset(preset: string): DateRange | null {\n const now = new Date();\n const today = formatDate(now);\n\n switch (preset) {\n case 'last_7_days':\n return {\n start_date: formatDate(subDays(now, 7)),\n end_date: today,\n };\n\n case 'last_30_days':\n return {\n start_date: formatDate(subDays(now, 30)),\n end_date: today,\n };\n\n case 'last_90_days':\n return {\n start_date: formatDate(subDays(now, 90)),\n end_date: today,\n };\n\n case 'last_12_months':\n return {\n start_date: formatDate(subMonths(now, 12)),\n end_date: today,\n };\n\n case 'year_to_date':\n return {\n start_date: formatDate(startOfYear(now)),\n end_date: today,\n };\n\n case 'month_to_date':\n return {\n start_date: formatDate(startOfMonth(now)),\n end_date: today,\n };\n\n case 'quarter_to_date':\n return {\n start_date: formatDate(startOfQuarter(now)),\n end_date: today,\n };\n\n case 'previous_month': {\n const lastMonth = subMonths(now, 1);\n return {\n start_date: formatDate(startOfMonth(lastMonth)),\n end_date: formatDate(endOfMonth(lastMonth)),\n };\n }\n\n case 'previous_quarter': {\n const lastQuarter = subMonths(now, 3);\n return {\n start_date: formatDate(startOfQuarter(lastQuarter)),\n end_date: formatDate(endOfQuarter(lastQuarter)),\n };\n }\n\n case 'previous_year': {\n const lastYear = subYears(now, 1);\n return {\n start_date: formatDate(startOfYear(lastYear)),\n end_date: formatDate(endOfYear(lastYear)),\n };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Compute the equivalent previous period for a given date range.\n * Uses semantic shifting for named presets, day-length shifting for custom ranges.\n */\nexport function computePreviousPeriod(\n startDate: string,\n endDate: string,\n presetName?: string\n): DateRange {\n const start = parseISO(startDate);\n const end = parseISO(endDate);\n\n switch (presetName) {\n case 'last_7_days': {\n return {\n start_date: formatDate(subDays(start, 7)),\n end_date: formatDate(subDays(end, 7)),\n };\n }\n case 'last_30_days': {\n return {\n start_date: formatDate(subDays(start, 30)),\n end_date: formatDate(subDays(end, 30)),\n };\n }\n case 'last_90_days': {\n return {\n start_date: formatDate(subDays(start, 90)),\n end_date: formatDate(subDays(end, 90)),\n };\n }\n case 'last_12_months':\n case 'last_365_days': {\n return {\n start_date: formatDate(subMonths(start, 12)),\n end_date: formatDate(subMonths(end, 12)),\n };\n }\n case 'year_to_date': {\n return {\n start_date: formatDate(subYears(start, 1)),\n end_date: formatDate(subYears(end, 1)),\n };\n }\n case 'month_to_date': {\n return {\n start_date: formatDate(subMonths(start, 1)),\n end_date: formatDate(subMonths(end, 1)),\n };\n }\n case 'quarter_to_date': {\n return {\n start_date: formatDate(subQuarters(start, 1)),\n end_date: formatDate(subQuarters(end, 1)),\n };\n }\n case 'previous_month': {\n const shifted = subMonths(start, 1);\n return {\n start_date: formatDate(startOfMonth(shifted)),\n end_date: formatDate(endOfMonth(shifted)),\n };\n }\n case 'previous_quarter': {\n const shifted = subQuarters(start, 1);\n return {\n start_date: formatDate(startOfQuarter(shifted)),\n end_date: formatDate(endOfQuarter(shifted)),\n };\n }\n case 'previous_year': {\n const shifted = subYears(start, 1);\n return {\n start_date: formatDate(startOfYear(shifted)),\n end_date: formatDate(endOfYear(shifted)),\n };\n }\n default: {\n // Custom range: shift back by the range length in days\n const days = differenceInDays(end, start);\n return {\n start_date: formatDate(subDays(start, days)),\n end_date: formatDate(subDays(end, days)),\n };\n }\n }\n}\n\n/**\n * Format a date range as a human-readable label.\n * Same year: \"Jan 17 – Feb 16\"\n * Cross year: \"Dec 18, 2025 – Jan 17, 2026\"\n * Single day: \"Feb 16\"\n */\nexport function formatPeriodLabel(startDate: string, endDate: string): string {\n const start = parseISO(startDate);\n const end = parseISO(endDate);\n\n if (startDate === endDate) {\n return format(start, 'MMM d');\n }\n\n const startYear = start.getFullYear();\n const endYear = end.getFullYear();\n\n if (startYear === endYear) {\n return `${format(start, 'MMM d')} – ${format(end, 'MMM d')}`;\n }\n\n return `${format(start, 'MMM d, yyyy')} – ${format(end, 'MMM d, yyyy')}`;\n}\n\n/**\n * Check if a string is a known date preset.\n */\nexport function isDatePreset(value: string): value is DatePreset {\n return DATE_PRESETS.includes(value as DatePreset);\n}\n\n// --- Relative date range support ---\n\nexport interface RelativeDateRange {\n type: 'relative';\n direction: 'previous' | 'current' | 'next';\n value?: number;\n unit: 'day' | 'week' | 'month' | 'quarter' | 'year';\n includeToday?: boolean;\n}\n\n/**\n * Check if a value is a relative date range object.\n */\nexport function isRelativeDateRange(value: unknown): value is RelativeDateRange {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n (value as RelativeDateRange).type === 'relative'\n );\n}\n\n/**\n * Expand a relative date range into start_date and end_date.\n */\nexport function expandRelativeDateRange(rel: RelativeDateRange): DateRange {\n const now = new Date();\n const today = startOfDay(now);\n\n if (rel.direction === 'current') {\n switch (rel.unit) {\n case 'day':\n return { start_date: formatDate(today), end_date: formatDate(today) };\n case 'week':\n return {\n start_date: formatDate(startOfWeek(today, { weekStartsOn: 1 })),\n end_date: formatDate(endOfWeek(today, { weekStartsOn: 1 })),\n };\n case 'month':\n return { start_date: formatDate(startOfMonth(today)), end_date: formatDate(endOfMonth(today)) };\n case 'quarter':\n return { start_date: formatDate(startOfQuarter(today)), end_date: formatDate(endOfQuarter(today)) };\n case 'year':\n return { start_date: formatDate(startOfYear(today)), end_date: formatDate(endOfYear(today)) };\n }\n }\n\n const n = rel.value ?? 1;\n\n if (rel.direction === 'previous') {\n const end = rel.includeToday ? today : subDays(today, 1);\n const shiftFns = { day: subDays, week: subWeeks, month: subMonths, quarter: subQuarters, year: subYears };\n const start = shiftFns[rel.unit](rel.includeToday ? today : today, n);\n return {\n start_date: formatDate(start < end ? start : end),\n end_date: formatDate(start < end ? end : start),\n };\n }\n\n // next\n const start = rel.includeToday ? today : addDays(today, 1);\n const shiftFns = { day: addDays, week: addWeeks, month: addMonths, quarter: addQuarters, year: addYears };\n const end = shiftFns[rel.unit](start, n);\n return {\n start_date: formatDate(start < end ? start : end),\n end_date: formatDate(start < end ? end : start),\n };\n}\n","import nunjucks from 'nunjucks';\n\n// Configure Nunjucks environment\nconst env = new nunjucks.Environment(null, {\n autoescape: false, // SQL doesn't need HTML escaping\n throwOnUndefined: false, // user.x may be undefined for RLS\n});\n\nexport interface TemplateContext {\n [key: string]: unknown;\n ref: (name: string) => string;\n}\n\nexport interface ModelRefs {\n [modelName: string]: string; // model name -> table/subquery\n}\n\n/**\n * Create a template context with parameters and ref() function.\n */\nexport function createTemplateContext(\n params: Record<string, unknown>,\n refs: ModelRefs = {},\n userContext?: Record<string, unknown>\n): TemplateContext {\n return {\n ...params,\n user: userContext ?? {},\n ref: (name: string): string => {\n const resolved = refs[name];\n if (resolved === undefined) {\n throw new Error(`Unknown model reference: ${name}`);\n }\n return resolved;\n },\n };\n}\n\n/**\n * Render a SQL template with the given context.\n */\nexport function renderTemplate(\n template: string,\n context: Record<string, unknown>\n): string {\n const rendered = env.renderString(template, context);\n // Clean up extra whitespace from conditionals\n return rendered\n .split('\\n')\n .map(line => line.trimEnd())\n .filter((line, i, arr) => {\n // Remove consecutive blank lines\n if (line === '' && arr[i - 1] === '') return false;\n return true;\n })\n .join('\\n')\n .trim();\n}\n\n/**\n * Check if a template contains a specific variable reference.\n */\nexport function templateHasVariable(template: string, varName: string): boolean {\n // Match {{ varName }} or {{ varName | filter }}\n const regex = new RegExp(`\\\\{\\\\{\\\\s*${varName}(?:\\\\s*\\\\|[^}]+)?\\\\s*\\\\}\\\\}`, 'g');\n return regex.test(template);\n}\n\n/**\n * Extract all variable names from a template.\n */\nexport function extractTemplateVariables(template: string): string[] {\n const variables = new Set<string>();\n\n // Match {{ variable }} or {{ variable | filter }}\n const regex = /\\{\\{\\s*(\\w+)(?:\\s*\\|[^}]+)?\\s*\\}\\}/g;\n let match;\n\n while ((match = regex.exec(template)) !== null) {\n const varName = match[1];\n // Exclude built-in functions\n if (varName && varName !== 'ref' && varName !== 'loop') {\n variables.add(varName);\n }\n }\n\n return Array.from(variables);\n}\n","import type { Chart, ModelMetadata } from '@yamchart/schema';\nimport { renderTemplate, createTemplateContext, type ModelRefs } from './template.js';\nimport { expandDatePreset, isDatePreset, isCustomDateRange, expandCustomDateRange } from './presets.js';\nimport { createHash } from 'node:crypto';\nimport { format } from 'date-fns';\n\n/**\n * Resolve dynamic default values like current_date() to actual values\n */\nfunction resolveDynamicDefault(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n\n const trimmed = value.trim().toLowerCase();\n\n // Handle current_date() and similar SQL date functions\n if (trimmed === 'current_date()' || trimmed === 'current_date' || trimmed === 'now()') {\n return format(new Date(), 'yyyy-MM-dd');\n }\n\n // Handle date arithmetic like current_date() - interval '1 month'\n // For now, just return today's date for any current_date reference\n if (trimmed.includes('current_date')) {\n return format(new Date(), 'yyyy-MM-dd');\n }\n\n return value;\n}\n\nexport interface CompiledQuery {\n sql: string;\n params: Record<string, unknown>;\n cacheKey: string;\n chartName: string;\n}\n\nexport interface CompilerConfig {\n models: Record<string, { metadata: ModelMetadata; sql: string }>;\n refs: ModelRefs;\n}\n\nexport class QueryCompiler {\n private models: Map<string, { metadata: ModelMetadata; sql: string }>;\n private refs: ModelRefs;\n\n constructor(config: CompilerConfig) {\n this.models = new Map(Object.entries(config.models));\n this.refs = config.refs;\n }\n\n /**\n * Compile a chart definition into an executable SQL query.\n */\n compile(\n chart: Chart,\n inputParams: Record<string, unknown>,\n userContext?: Record<string, unknown>\n ): CompiledQuery {\n // Get SQL template\n const { sql, modelParams } = this.getSQL(chart);\n\n // Merge parameters: model defaults < chart defaults < input params\n const params = this.resolveParams(chart, modelParams, inputParams);\n\n // Expand date presets (pass inputParams to avoid overwriting explicit start_date/end_date)\n const expandedParams = this.expandPresets(params, inputParams);\n\n // Create template context with params, refs, and user context\n const context = createTemplateContext(expandedParams, this.refs, userContext);\n\n // Render template\n const renderedSQL = renderTemplate(sql, context);\n\n // Generate cache key (includes user context hash for RLS)\n const cacheKey = this.generateCacheKey(chart.name, renderedSQL, expandedParams, userContext);\n\n return {\n sql: renderedSQL,\n params: expandedParams,\n cacheKey,\n chartName: chart.name,\n };\n }\n\n private getSQL(chart: Chart): { sql: string; modelParams: ModelMetadata['params'] } {\n if (chart.source.sql) {\n return { sql: chart.source.sql, modelParams: undefined };\n }\n\n if (chart.source.model) {\n const model = this.models.get(chart.source.model);\n if (!model) {\n throw new Error(`Unknown model: ${chart.source.model}`);\n }\n return { sql: model.sql, modelParams: model.metadata.params };\n }\n\n throw new Error('Chart source must specify either model or sql');\n }\n\n private resolveParams(\n chart: Chart,\n modelParams: ModelMetadata['params'],\n inputParams: Record<string, unknown>\n ): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n // Apply model parameter defaults (resolve dynamic values like current_date())\n if (modelParams) {\n for (const param of modelParams) {\n if (param.default !== undefined) {\n params[param.name] = resolveDynamicDefault(param.default);\n }\n }\n }\n\n // Apply chart parameter defaults (resolve dynamic values)\n if (chart.parameters) {\n for (const param of chart.parameters) {\n if (param.default !== undefined) {\n params[param.name] = resolveDynamicDefault(param.default);\n }\n }\n }\n\n // Apply input params (overrides defaults)\n Object.assign(params, inputParams);\n\n return params;\n }\n\n private expandPresets(params: Record<string, unknown>, inputParams: Record<string, unknown>): Record<string, unknown> {\n const expanded: Record<string, unknown> = { ...params };\n\n // If input explicitly provided start_date and end_date, don't overwrite from date_range.\n // This prevents previous-period comparison queries from having their dates\n // clobbered by a default date_range parameter re-expanding to the current period.\n if (inputParams.start_date && inputParams.end_date) {\n return expanded;\n }\n\n // Check for date_range and expand it (preset string or custom range object)\n if (isCustomDateRange(params.date_range)) {\n const dateRange = expandCustomDateRange(params.date_range);\n expanded.start_date = dateRange.start_date;\n expanded.end_date = dateRange.end_date;\n } else if (typeof params.date_range === 'string' && isDatePreset(params.date_range)) {\n const dateRange = expandDatePreset(params.date_range);\n if (dateRange) {\n expanded.start_date = dateRange.start_date;\n expanded.end_date = dateRange.end_date;\n }\n }\n\n return expanded;\n }\n\n private generateCacheKey(\n chartName: string,\n sql: string,\n params: Record<string, unknown>,\n userContext?: Record<string, unknown>\n ): string {\n const sqlHash = createHash('sha256').update(sql).digest('hex').slice(0, 8);\n const paramsHash = createHash('sha256')\n .update(JSON.stringify(params, Object.keys(params).sort()))\n .digest('hex')\n .slice(0, 8);\n\n let key = `${chartName}:${sqlHash}:${paramsHash}`;\n\n if (userContext && Object.keys(userContext).length > 0) {\n const userHash = createHash('sha256')\n .update(JSON.stringify(userContext, Object.keys(userContext).sort()))\n .digest('hex')\n .slice(0, 8);\n key += `:${userHash}`;\n }\n\n return key;\n }\n\n /**\n * Add or update a model in the compiler.\n */\n addModel(name: string, metadata: ModelMetadata, sql: string): void {\n this.models.set(name, { metadata, sql });\n }\n\n /**\n * Add or update a ref mapping.\n */\n addRef(name: string, target: string): void {\n this.refs[name] = target;\n }\n}\n","import duckdb from 'duckdb';\nimport { performance } from 'node:perf_hooks';\nimport type { Connector, QueryResult } from './index.js';\n\nexport interface DuckDBConfig {\n path: string; // file path or ':memory:'\n}\n\nexport class DuckDBConnector implements Connector {\n private config: DuckDBConfig;\n private db: duckdb.Database | null = null;\n private connection: duckdb.Connection | null = null;\n\n constructor(config: DuckDBConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.db = new duckdb.Database(this.config.path, (err) => {\n if (err) {\n reject(err);\n return;\n }\n this.connection = this.db!.connect();\n resolve();\n });\n });\n }\n\n async disconnect(): Promise<void> {\n return new Promise((resolve) => {\n if (this.connection) {\n this.connection.close(() => {\n this.connection = null;\n });\n }\n if (this.db) {\n this.db.close(() => {\n this.db = null;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n async execute(sql: string): Promise<QueryResult> {\n if (!this.connection) {\n throw new Error('Not connected to database');\n }\n\n const startTime = performance.now();\n\n return new Promise((resolve, reject) => {\n const stmt = this.connection!.prepare(sql, (prepErr) => {\n if (prepErr) {\n reject(prepErr);\n return;\n }\n\n // Extract column metadata from the prepared statement\n const columnInfo = stmt.columns();\n\n stmt.all((err, rows) => {\n const durationMs = performance.now() - startTime;\n\n if (err) {\n reject(err);\n return;\n }\n\n const typedRows = rows as Array<Record<string, unknown>>;\n // Convert BigInt values to numbers for JSON serialization\n const serializedRows = typedRows.map((row) => this.serializeRow(row));\n\n const columns = columnInfo.map((col) => ({\n name: col.name,\n type: col.type.sql_type,\n }));\n\n stmt.finalize();\n\n resolve({\n columns,\n rows: serializedRows,\n rowCount: serializedRows.length,\n durationMs,\n });\n });\n });\n });\n }\n\n isConnected(): boolean {\n return this.connection !== null;\n }\n\n async explain(sql: string): Promise<{ valid: boolean; error?: string }> {\n if (!this.connection) {\n throw new Error('Not connected to database');\n }\n\n return new Promise((resolve) => {\n this.connection!.all(`EXPLAIN ${sql}`, (err) => {\n if (err) {\n resolve({ valid: false, error: err.message });\n } else {\n resolve({ valid: true });\n }\n });\n });\n }\n\n private serializeRow(row: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n if (typeof value === 'bigint') {\n // Convert BigInt to number for JSON serialization\n result[key] = Number(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n}\n","import { performance } from 'node:perf_hooks';\nimport type { Connector, QueryResult } from './index.js';\n\nexport interface PostgresConfig {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n schema?: string;\n ssl?: boolean | object;\n // Pool settings\n min?: number;\n max?: number;\n idleTimeoutMillis?: number;\n connectTimeoutMillis?: number;\n // Query settings\n statementTimeout?: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet sdk: any = null;\nlet typeParserConfigured = false;\n\nasync function loadSDK() {\n if (!sdk) {\n try {\n sdk = await import('pg');\n } catch {\n throw new Error(\n 'pg is not installed. Install it with: npm install pg'\n );\n }\n\n // Configure pg to return int8 (bigint) as JavaScript BigInt instead of string\n // OID 20 = int8 in PostgreSQL\n if (!typeParserConfigured) {\n sdk.types.setTypeParser(20, (val: string) => {\n if (val === null) return null;\n return BigInt(val);\n });\n typeParserConfigured = true;\n }\n }\n return sdk;\n}\n\n// Safe identifier escaping for schema names\nfunction escapeIdentifier(identifier: string): string {\n // Only allow alphanumeric and underscores for safety\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier)) {\n throw new Error(`Invalid identifier: ${identifier}`);\n }\n return `\"${identifier}\"`;\n}\n\nexport class PostgresConnector implements Connector {\n private config: PostgresConfig;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pool: any = null;\n\n constructor(config: PostgresConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n const pg = await loadSDK();\n\n const poolConfig = {\n host: this.config.host,\n port: this.config.port,\n database: this.config.database,\n user: this.config.user,\n password: this.config.password,\n ssl: this.config.ssl,\n min: this.config.min ?? 2,\n max: this.config.max ?? 10,\n idleTimeoutMillis: this.config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: this.config.connectTimeoutMillis ?? 10000,\n statement_timeout: this.config.statementTimeout,\n };\n\n this.pool = new pg.Pool(poolConfig);\n\n // Handle pool errors (idle client errors)\n this.pool.on('error', (err: Error) => {\n console.error('Unexpected postgres pool error:', err.message);\n });\n\n // Set search_path on each new client from the pool\n if (this.config.schema) {\n const schema = escapeIdentifier(this.config.schema);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.pool.on('connect', (client: any) => {\n client.query(`SET search_path TO ${schema}`).catch((err: Error) => {\n console.error('Failed to set search_path:', err.message);\n });\n });\n }\n\n // Verify connection works\n const client = await this.pool.connect();\n client.release();\n }\n\n async disconnect(): Promise<void> {\n if (this.pool) {\n await this.pool.end();\n this.pool = null;\n }\n }\n\n isConnected(): boolean {\n return this.pool !== null;\n }\n\n async execute(sql: string): Promise<QueryResult> {\n if (!this.pool) {\n throw new Error('Not connected to database');\n }\n\n const start = performance.now();\n const result = await this.pool.query(sql);\n const durationMs = performance.now() - start;\n\n return {\n columns: this.extractColumns(result),\n rows: result.rows.map((row: Record<string, unknown>) => this.serializeRow(row)),\n rowCount: result.rowCount ?? result.rows.length,\n durationMs,\n };\n }\n\n async explain(sql: string): Promise<{ valid: boolean; error?: string }> {\n if (!this.pool) {\n throw new Error('Not connected to database');\n }\n\n try {\n await this.pool.query(`EXPLAIN ${sql}`);\n return { valid: true };\n } catch (err) {\n return {\n valid: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private extractColumns(result: any): Array<{ name: string; type: string }> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return result.fields.map((field: any) => ({\n name: field.name,\n type: this.pgTypeToString(field.dataTypeID),\n }));\n }\n\n private pgTypeToString(oid: number): string {\n // Common Postgres type OIDs\n const typeMap: Record<number, string> = {\n 16: 'boolean', // bool\n 20: 'integer', // int8\n 21: 'integer', // int2\n 23: 'integer', // int4\n 700: 'number', // float4\n 701: 'number', // float8\n 1700: 'number', // numeric\n 25: 'string', // text\n 1043: 'string', // varchar\n 1082: 'date', // date\n 1114: 'date', // timestamp\n 1184: 'date', // timestamptz\n 114: 'unknown', // json\n 3802: 'unknown', // jsonb\n };\n return typeMap[oid] ?? 'unknown';\n }\n\n private serializeRow(row: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n serialized[key] = this.serializeValue(value);\n }\n return serialized;\n }\n\n private serializeValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'bigint') {\n // Return as string if value exceeds safe integer range to preserve precision\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n return value.toString();\n }\n return Number(value);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n }\n}\n","import { performance } from 'node:perf_hooks';\nimport type { Connector, QueryResult } from './index.js';\n\nexport interface MySQLConfig {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | object;\n // Pool settings\n min?: number;\n max?: number;\n idleTimeoutMillis?: number;\n connectTimeoutMillis?: number;\n // Query settings\n statementTimeout?: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet sdk: any = null;\n\nasync function loadSDK() {\n if (!sdk) {\n try {\n sdk = await import('mysql2/promise');\n } catch {\n throw new Error(\n 'mysql2 is not installed. Install it with: npm install mysql2'\n );\n }\n }\n return sdk;\n}\n\nexport class MySQLConnector implements Connector {\n private config: MySQLConfig;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private pool: any = null;\n\n constructor(config: MySQLConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n const mysql = await loadSDK();\n\n const poolConfig = {\n host: this.config.host,\n port: this.config.port,\n database: this.config.database,\n user: this.config.user,\n password: this.config.password,\n ssl: this.config.ssl ? {} : undefined,\n waitForConnections: true,\n connectionLimit: this.config.max ?? 10,\n queueLimit: 0,\n connectTimeout: this.config.connectTimeoutMillis ?? 10000,\n };\n\n this.pool = mysql.createPool(poolConfig);\n\n // Verify connection works\n const connection = await this.pool.getConnection();\n connection.release();\n }\n\n async disconnect(): Promise<void> {\n if (this.pool) {\n await this.pool.end();\n this.pool = null;\n }\n }\n\n isConnected(): boolean {\n return this.pool !== null;\n }\n\n async execute(sql: string): Promise<QueryResult> {\n if (!this.pool) {\n throw new Error('Not connected to database');\n }\n\n const start = performance.now();\n const [rows, fields] = await this.pool.query(sql);\n const durationMs = performance.now() - start;\n\n return {\n columns: this.extractColumns(fields),\n rows: rows.map((row: Record<string, unknown>) => this.serializeRow(row)),\n rowCount: rows.length,\n durationMs,\n };\n }\n\n async explain(sql: string): Promise<{ valid: boolean; error?: string }> {\n if (!this.pool) {\n throw new Error('Not connected to database');\n }\n\n try {\n await this.pool.query(`EXPLAIN ${sql}`);\n return { valid: true };\n } catch (err) {\n return {\n valid: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private extractColumns(fields: any[]): Array<{ name: string; type: string }> {\n return fields.map(field => ({\n name: field.name,\n type: this.mysqlTypeToString(field.type),\n }));\n }\n\n private mysqlTypeToString(type: number | undefined): string {\n // MySQL field type constants\n const typeMap: Record<number, string> = {\n 0: 'number', // DECIMAL\n 1: 'integer', // TINY\n 2: 'integer', // SHORT\n 3: 'integer', // LONG\n 4: 'number', // FLOAT\n 5: 'number', // DOUBLE\n 7: 'date', // TIMESTAMP\n 8: 'integer', // LONGLONG\n 9: 'integer', // INT24\n 10: 'date', // DATE\n 11: 'string', // TIME\n 12: 'date', // DATETIME\n 13: 'integer', // YEAR\n 15: 'string', // VARCHAR\n 245: 'unknown', // JSON\n 246: 'number', // NEWDECIMAL\n 252: 'string', // BLOB\n 253: 'string', // VAR_STRING\n 254: 'string', // STRING\n };\n return typeMap[type ?? 0] ?? 'unknown';\n }\n\n private serializeRow(row: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n serialized[key] = this.serializeValue(value);\n }\n return serialized;\n }\n\n private serializeValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'bigint') {\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n return value.toString();\n }\n return Number(value);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (Buffer.isBuffer(value)) {\n return value.toString('utf-8');\n }\n return value;\n }\n}\n","import Database, { type Database as DatabaseType } from 'better-sqlite3';\nimport { performance } from 'node:perf_hooks';\nimport type { Connector, QueryResult } from './index.js';\n\nexport interface SQLiteConfig {\n path: string; // file path or :memory:\n readonly?: boolean;\n}\n\nexport class SQLiteConnector implements Connector {\n private config: SQLiteConfig;\n private db: DatabaseType | null = null;\n\n constructor(config: SQLiteConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n this.db = new Database(this.config.path, {\n readonly: this.config.readonly ?? false,\n });\n\n // Enable foreign keys and WAL mode for better performance\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n }\n\n async disconnect(): Promise<void> {\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n\n isConnected(): boolean {\n return this.db !== null;\n }\n\n async execute(sql: string): Promise<QueryResult> {\n if (!this.db) {\n throw new Error('Not connected to database');\n }\n\n const start = performance.now();\n const stmt = this.db.prepare(sql);\n const rows = stmt.all() as Record<string, unknown>[];\n const durationMs = performance.now() - start;\n\n // Extract column info from the statement\n const columns = stmt.columns().map(col => ({\n name: col.name,\n type: this.sqliteTypeToString(col.type),\n }));\n\n return {\n columns,\n rows: rows.map(row => this.serializeRow(row)),\n rowCount: rows.length,\n durationMs,\n };\n }\n\n async explain(sql: string): Promise<{ valid: boolean; error?: string }> {\n if (!this.db) {\n throw new Error('Not connected to database');\n }\n\n try {\n this.db.prepare(`EXPLAIN ${sql}`);\n return { valid: true };\n } catch (err) {\n return {\n valid: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n }\n\n private sqliteTypeToString(type: string | null): string {\n if (!type) return 'unknown';\n\n const upperType = type.toUpperCase();\n\n if (upperType.includes('INT')) return 'integer';\n if (upperType.includes('CHAR') || upperType.includes('TEXT') || upperType.includes('CLOB')) return 'string';\n if (upperType.includes('BLOB')) return 'unknown';\n if (upperType.includes('REAL') || upperType.includes('FLOA') || upperType.includes('DOUB')) return 'number';\n if (upperType.includes('NUMERIC') || upperType.includes('DECIMAL')) return 'number';\n if (upperType.includes('DATE') || upperType.includes('TIME')) return 'date';\n if (upperType.includes('BOOL')) return 'boolean';\n\n return 'unknown';\n }\n\n private serializeRow(row: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n serialized[key] = this.serializeValue(value);\n }\n return serialized;\n }\n\n private serializeValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'bigint') {\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n return value.toString();\n }\n return Number(value);\n }\n if (Buffer.isBuffer(value)) {\n return value.toString('base64');\n }\n return value;\n }\n}\n","import { performance } from 'node:perf_hooks';\nimport type { Connector, QueryResult } from './index.js';\n\nexport interface SnowflakeConfig {\n account: string;\n username: string;\n password?: string;\n privateKey?: string;\n authenticator?: string;\n clientStoreTemporaryCredential?: boolean;\n warehouse: string;\n database: string;\n schema?: string;\n role?: string;\n // Connection settings\n connectTimeoutMillis?: number;\n // Query settings\n statementTimeout?: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet sdk: any = null;\n\nasync function loadSDK() {\n if (!sdk) {\n try {\n sdk = (await import('snowflake-sdk')).default;\n } catch {\n throw new Error(\n 'snowflake-sdk is not installed. Snowflake support requires a separate install:\\n' +\n ' npm install -g snowflake-sdk\\n' +\n 'This package is optional and not bundled with yamchart to keep the default install lightweight.'\n );\n }\n }\n return sdk;\n}\n\nexport class SnowflakeConnector implements Connector {\n private config: SnowflakeConfig;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private connection: any = null;\n\n constructor(config: SnowflakeConfig) {\n this.config = config;\n }\n\n async connect(): Promise<void> {\n const snowflake = await loadSDK();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const connectionOptions: Record<string, any> = {\n account: this.config.account,\n username: this.config.username,\n password: this.config.password,\n privateKey: this.config.privateKey,\n warehouse: this.config.warehouse,\n database: this.config.database,\n schema: this.config.schema,\n role: this.config.role,\n timeout: this.config.connectTimeoutMillis ?? 60000,\n };\n\n if (this.config.authenticator) {\n connectionOptions.authenticator = this.config.authenticator;\n }\n if (this.config.clientStoreTemporaryCredential !== undefined) {\n connectionOptions.clientStoreTemporaryCredential = this.config.clientStoreTemporaryCredential;\n }\n\n this.connection = snowflake.createConnection(connectionOptions);\n\n if (this.config.authenticator === 'EXTERNALBROWSER') {\n // connectAsync handles browser-based SSO flow\n await this.connection!.connectAsync();\n } else {\n return new Promise((resolve, reject) => {\n this.connection!.connect((err: Error | undefined) => {\n if (err) {\n this.connection = null;\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.connection) {\n return new Promise((resolve, reject) => {\n this.connection!.destroy((err: Error | undefined) => {\n this.connection = null;\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n }\n }\n\n isConnected(): boolean {\n return this.connection !== null && this.connection.isUp();\n }\n\n async execute(sql: string): Promise<QueryResult> {\n if (!this.connection) {\n throw new Error('Not connected to database');\n }\n\n const start = performance.now();\n\n return new Promise((resolve, reject) => {\n this.connection!.execute({\n sqlText: sql,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n complete: (err: Error | undefined, stmt: any, rows: any[]) => {\n const durationMs = performance.now() - start;\n\n if (err) {\n reject(err);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const columns = stmt ? stmt.getColumns().map((col: any) => ({\n name: col.getName(),\n type: this.snowflakeTypeToString(col.getType()),\n })) : [];\n\n resolve({\n columns,\n rows: (rows || []).map(row => this.serializeRow(row as Record<string, unknown>)),\n rowCount: rows?.length ?? 0,\n durationMs,\n });\n },\n });\n });\n }\n\n async explain(sql: string): Promise<{ valid: boolean; error?: string }> {\n if (!this.connection) {\n throw new Error('Not connected to database');\n }\n\n try {\n await this.execute(`EXPLAIN ${sql}`);\n return { valid: true };\n } catch (err) {\n return {\n valid: false,\n error: err instanceof Error ? err.message : String(err)\n };\n }\n }\n\n private snowflakeTypeToString(type: string): string {\n const typeMap: Record<string, string> = {\n 'NUMBER': 'number',\n 'DECIMAL': 'number',\n 'NUMERIC': 'number',\n 'INT': 'integer',\n 'INTEGER': 'integer',\n 'BIGINT': 'integer',\n 'SMALLINT': 'integer',\n 'TINYINT': 'integer',\n 'BYTEINT': 'integer',\n 'FLOAT': 'number',\n 'FLOAT4': 'number',\n 'FLOAT8': 'number',\n 'DOUBLE': 'number',\n 'DOUBLE PRECISION': 'number',\n 'REAL': 'number',\n 'VARCHAR': 'string',\n 'CHAR': 'string',\n 'CHARACTER': 'string',\n 'STRING': 'string',\n 'TEXT': 'string',\n 'BINARY': 'unknown',\n 'VARBINARY': 'unknown',\n 'BOOLEAN': 'boolean',\n 'DATE': 'date',\n 'DATETIME': 'date',\n 'TIME': 'string',\n 'TIMESTAMP': 'date',\n 'TIMESTAMP_LTZ': 'date',\n 'TIMESTAMP_NTZ': 'date',\n 'TIMESTAMP_TZ': 'date',\n 'VARIANT': 'unknown',\n 'OBJECT': 'unknown',\n 'ARRAY': 'unknown',\n };\n\n const upperType = type.toUpperCase();\n return typeMap[upperType] ?? 'unknown';\n }\n\n private serializeRow(row: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n serialized[key] = this.serializeValue(value);\n }\n return serialized;\n }\n\n private serializeValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'bigint') {\n if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER) {\n return value.toString();\n }\n return Number(value);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n }\n}\n","import type { PostgresConnection, MySQLConnection, SnowflakeConnection } from '@yamchart/schema';\n\nexport interface ResolvedCredentials {\n user: string;\n password: string;\n}\n\nexport interface ResolvedSnowflakeCredentials {\n username: string;\n password?: string;\n privateKey?: string;\n authenticator?: string;\n clientStoreTemporaryCredential?: boolean;\n}\n\nexport function resolvePostgresAuth(connection: PostgresConnection): ResolvedCredentials {\n const auth = connection.auth;\n\n // Auth is optional for Postgres (local dev with trust auth)\n if (!auth) {\n return {\n user: process.env.PGUSER ?? 'postgres',\n password: process.env.PGPASSWORD ?? '',\n };\n }\n\n if (auth.type === 'env') {\n const user = process.env[auth.user_var];\n const password = process.env[auth.password_var];\n\n if (!user) {\n throw new Error(`Missing environment variable: ${auth.user_var}`);\n }\n\n return { user, password: password ?? '' };\n }\n\n // key_pair and secret_manager deferred to post-MVP\n throw new Error(`Auth type \"${auth.type}\" not yet implemented`);\n}\n\nexport function resolveMySQLAuth(connection: MySQLConnection): ResolvedCredentials {\n const auth = connection.auth;\n\n // Auth is optional for MySQL (local dev)\n if (!auth) {\n return {\n user: process.env.MYSQL_USER ?? 'root',\n password: process.env.MYSQL_PASSWORD ?? '',\n };\n }\n\n if (auth.type === 'env') {\n const user = process.env[auth.user_var];\n const password = process.env[auth.password_var];\n\n if (!user) {\n throw new Error(`Missing environment variable: ${auth.user_var}`);\n }\n\n return { user, password: password ?? '' };\n }\n\n throw new Error(`Auth type \"${auth.type}\" not yet implemented`);\n}\n\nexport function resolveSnowflakeAuth(connection: SnowflakeConnection): ResolvedSnowflakeCredentials {\n const auth = connection.auth;\n\n if (auth.type === 'env') {\n const username = process.env[auth.user_var];\n const password = process.env[auth.password_var];\n\n if (!username) {\n throw new Error(`Missing environment variable: ${auth.user_var}`);\n }\n\n return { username, password: password ?? undefined };\n }\n\n if (auth.type === 'key_pair') {\n const username = process.env[auth.user_var];\n\n if (!username) {\n throw new Error(`Missing environment variable: ${auth.user_var}`);\n }\n\n // Read private key from file path\n const fs = require('fs');\n const privateKey = fs.readFileSync(auth.private_key_path, 'utf-8');\n\n return { username, privateKey };\n }\n\n if (auth.type === 'externalbrowser') {\n const username = process.env[auth.user_var];\n\n if (!username) {\n throw new Error(`Missing environment variable: ${auth.user_var}`);\n }\n\n return {\n username,\n authenticator: 'EXTERNALBROWSER',\n clientStoreTemporaryCredential: auth.cache_token ?? false,\n };\n }\n\n throw new Error(`Auth type \"${auth.type}\" not yet implemented for Snowflake`);\n}\n","import type { ModelMetadata, ReturnColumn } from '@yamchart/schema';\nimport type { Connector, QueryResult } from './connectors/index.js';\n\nexport interface AssertionResult {\n sql: string;\n passed: boolean;\n violationCount?: number;\n sampleViolations?: Array<Record<string, unknown>>;\n error?: string;\n warning?: string;\n}\n\nexport interface SchemaCheckResult {\n passed: boolean;\n expectedColumns: string[];\n actualColumns: string[];\n missingColumns: string[];\n extraColumns: string[];\n typeMismatches: Array<{ column: string; expected: string; actual: string }>;\n}\n\nexport interface ModelTestResult {\n modelName: string;\n schemaCheck?: SchemaCheckResult;\n assertions: AssertionResult[];\n durationMs: number;\n error?: string;\n}\n\nexport interface TestSuiteResult {\n models: ModelTestResult[];\n passed: number;\n failed: number;\n skipped: number;\n durationMs: number;\n}\n\nexport interface TestModelInput {\n compiledSql: string;\n metadata: ModelMetadata;\n}\n\nconst TYPE_MAP: Record<string, string[]> = {\n date: ['date', 'timestamp', 'datetime', 'timestamptz', 'timestamp with time zone'],\n number: ['integer', 'int', 'bigint', 'float', 'double', 'decimal', 'numeric', 'real', 'smallint', 'tinyint', 'hugeint', 'int4', 'int8', 'float4', 'float8'],\n integer: ['integer', 'int', 'bigint', 'smallint', 'tinyint', 'hugeint', 'int4', 'int8'],\n string: ['varchar', 'text', 'char', 'string', 'character varying', 'nvarchar'],\n boolean: ['boolean', 'bool'],\n};\n\nfunction typesMatch(expectedType: string, actualType: string): boolean {\n const expected = expectedType.toLowerCase();\n const actual = actualType.toLowerCase();\n if (expected === actual) return true;\n const acceptedTypes = TYPE_MAP[expected];\n if (acceptedTypes) return acceptedTypes.includes(actual);\n return false;\n}\n\n/**\n * Replace {{this}} (with optional whitespace) with compiled model SQL.\n */\nexport function expandThis(assertionSql: string, compiledSql: string): string {\n return assertionSql.replace(/\\{\\{\\s*this\\s*\\}\\}/g, compiledSql);\n}\n\nconst MAX_SAMPLE_VIOLATIONS = 5;\n\nexport async function runAssertion(\n compiledSql: string,\n assertionSql: string,\n connector: Connector,\n): Promise<AssertionResult> {\n const warning = !/\\{\\{\\s*this\\s*\\}\\}/.test(assertionSql)\n ? 'Test assertion does not reference {{this}} — did you mean to include it?'\n : undefined;\n\n const expandedSql = expandThis(assertionSql, compiledSql);\n\n try {\n const result = await connector.execute(expandedSql);\n\n return {\n sql: assertionSql,\n passed: result.rowCount === 0,\n violationCount: result.rowCount,\n sampleViolations: result.rows.slice(0, MAX_SAMPLE_VIOLATIONS),\n warning,\n };\n } catch (err) {\n return {\n sql: assertionSql,\n passed: false,\n error: err instanceof Error ? err.message : String(err),\n warning,\n };\n }\n}\n\nexport async function runModel(\n compiledSql: string,\n metadata: ModelMetadata,\n connector: Connector,\n): Promise<ModelTestResult> {\n const start = performance.now();\n const hasReturns = metadata.returns && metadata.returns.length > 0;\n const hasTests = metadata.tests && metadata.tests.length > 0;\n\n // Nothing to test\n if (!hasReturns && !hasTests) {\n return {\n modelName: metadata.name,\n assertions: [],\n durationMs: performance.now() - start,\n };\n }\n\n // Schema check\n let schemaCheckResult: SchemaCheckResult | undefined;\n if (hasReturns) {\n try {\n schemaCheckResult = await checkSchema(compiledSql, connector, metadata.returns!);\n } catch (err) {\n return {\n modelName: metadata.name,\n assertions: [],\n durationMs: performance.now() - start,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n // Data assertions\n const assertions: AssertionResult[] = [];\n if (hasTests) {\n for (const testSql of metadata.tests!) {\n const result = await runAssertion(compiledSql, testSql, connector);\n assertions.push(result);\n }\n }\n\n return {\n modelName: metadata.name,\n schemaCheck: schemaCheckResult,\n assertions,\n durationMs: performance.now() - start,\n };\n}\n\nexport async function runAll(\n models: TestModelInput[],\n connector: Connector,\n): Promise<TestSuiteResult> {\n const start = performance.now();\n const results: ModelTestResult[] = [];\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n\n for (const model of models) {\n const result = await runModel(model.compiledSql, model.metadata, connector);\n results.push(result);\n\n const hasAnyCheck = result.schemaCheck || result.assertions.length > 0;\n if (!hasAnyCheck && !result.error) {\n skipped++;\n continue;\n }\n\n if (result.error) {\n failed++;\n continue;\n }\n\n // Count individual checks\n if (result.schemaCheck) {\n if (result.schemaCheck.passed) passed++;\n else failed++;\n }\n for (const assertion of result.assertions) {\n if (assertion.passed) passed++;\n else failed++;\n }\n }\n\n return {\n models: results,\n passed,\n failed,\n skipped,\n durationMs: performance.now() - start,\n };\n}\n\nexport async function checkSchema(\n compiledSql: string,\n connector: Connector,\n expectedReturns: ReturnColumn[],\n): Promise<SchemaCheckResult> {\n const wrappedSql = `SELECT * FROM (${compiledSql}) AS _model LIMIT 0`;\n const result = await connector.execute(wrappedSql);\n\n const actualColumns = result.columns.map((c) => c.name);\n const expectedColumns = expectedReturns.map((c) => c.name);\n\n const missingColumns = expectedColumns.filter((name) => !actualColumns.includes(name));\n const extraColumns = actualColumns.filter((name) => !expectedColumns.includes(name));\n\n const typeMismatches: SchemaCheckResult['typeMismatches'] = [];\n for (const expected of expectedReturns) {\n const actual = result.columns.find((c) => c.name === expected.name);\n if (actual && !typesMatch(expected.type, actual.type)) {\n typeMismatches.push({\n column: expected.name,\n expected: expected.type,\n actual: actual.type,\n });\n }\n }\n\n return {\n passed: missingColumns.length === 0 && typeMismatches.length === 0,\n expectedColumns,\n actualColumns,\n missingColumns,\n extraColumns,\n typeMismatches,\n };\n}\n","// Dashbook Query Engine\nexport const VERSION = '0.1.0';\n\nexport * from './parser.js';\nexport * from './presets.js';\nexport * from './template.js';\nexport * from './compiler.js';\nexport * from './connectors/index.js';\nexport * from './test-runner.js';\n"],"mappings":"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","names":["end","shiftFns","start","format","performance","performance","client","performance","sdk","loadSDK","performance","performance","sdk","loadSDK"]}
@@ -4,9 +4,9 @@ import {
4
4
  formatTable,
5
5
  loadProjectConfig,
6
6
  resolveConnection
7
- } from "./chunk-45SP26I2.js";
7
+ } from "./chunk-565OEBW7.js";
8
8
  import "./chunk-UDRJFEJU.js";
9
- import "./chunk-23E6YT4S.js";
9
+ import "./chunk-SSUVEADJ.js";
10
10
  import "./chunk-DGUM43GV.js";
11
11
  export {
12
12
  createConnector,
@@ -15,4 +15,4 @@ export {
15
15
  loadProjectConfig,
16
16
  resolveConnection
17
17
  };
18
- //# sourceMappingURL=connection-utils-26ZE4KUZ.js.map
18
+ //# sourceMappingURL=connection-utils-AGSQ5HNN.js.map
@@ -7,9 +7,9 @@ import {
7
7
  import {
8
8
  createConnector,
9
9
  resolveConnection
10
- } from "./chunk-45SP26I2.js";
10
+ } from "./chunk-565OEBW7.js";
11
11
  import "./chunk-UDRJFEJU.js";
12
- import "./chunk-23E6YT4S.js";
12
+ import "./chunk-SSUVEADJ.js";
13
13
  import "./chunk-DGUM43GV.js";
14
14
 
15
15
  // src/commands/describe.ts
@@ -40,4 +40,4 @@ async function describeTable(projectDir, table, options) {
40
40
  export {
41
41
  describeTable
42
42
  };
43
- //# sourceMappingURL=describe-ZM2JI2XS.js.map
43
+ //# sourceMappingURL=describe-AA4UT4U6.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadEnvFile,
3
3
  validateProject
4
- } from "./chunk-3RYZTXPH.js";
4
+ } from "./chunk-5VA43CTW.js";
5
5
  import {
6
6
  box,
7
7
  detail,
@@ -40,7 +40,7 @@ import {
40
40
  resolveMySQLAuth,
41
41
  resolvePostgresAuth,
42
42
  resolveSnowflakeAuth
43
- } from "./chunk-23E6YT4S.js";
43
+ } from "./chunk-SSUVEADJ.js";
44
44
  import {
45
45
  AuthDatabase,
46
46
  generateSessionToken,
@@ -14023,4 +14023,4 @@ async function runDevServer(projectDir, options) {
14023
14023
  export {
14024
14024
  runDevServer
14025
14025
  };
14026
- //# sourceMappingURL=dev-CBUHSRXH.js.map
14026
+ //# sourceMappingURL=dev-EUWIRL4N.js.map
@@ -28,7 +28,7 @@ import {
28
28
  runAssertion,
29
29
  runModel,
30
30
  templateHasVariable
31
- } from "./chunk-23E6YT4S.js";
31
+ } from "./chunk-SSUVEADJ.js";
32
32
  import "./chunk-DGUM43GV.js";
33
33
  export {
34
34
  DATE_PRESETS,
@@ -61,4 +61,4 @@ export {
61
61
  runModel,
62
62
  templateHasVariable
63
63
  };
64
- //# sourceMappingURL=dist-LJOCG7C5.js.map
64
+ //# sourceMappingURL=dist-LZNDQDH3.js.map
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  findProjectRoot,
7
7
  loadEnvFile,
8
8
  validateProject
9
- } from "./chunk-3RYZTXPH.js";
9
+ } from "./chunk-5VA43CTW.js";
10
10
  import {
11
11
  detail,
12
12
  error,
@@ -18,7 +18,7 @@ import {
18
18
  warning
19
19
  } from "./chunk-HJVVHYVN.js";
20
20
  import "./chunk-UDRJFEJU.js";
21
- import "./chunk-23E6YT4S.js";
21
+ import "./chunk-SSUVEADJ.js";
22
22
  import "./chunk-DGUM43GV.js";
23
23
 
24
24
  // src/index.ts
@@ -96,7 +96,7 @@ program.command("dev").description("Start development server with hot reload").a
96
96
  detail("Run this command from a yamchart project directory");
97
97
  process.exit(2);
98
98
  }
99
- const { runDevServer } = await import("./dev-CBUHSRXH.js");
99
+ const { runDevServer } = await import("./dev-EUWIRL4N.js");
100
100
  await runDevServer(projectDir, {
101
101
  port: parseInt(options.port, 10),
102
102
  apiOnly: options.apiOnly ?? false,
@@ -168,7 +168,7 @@ program.command("sync-dbt").description("Sync dbt project metadata into AI-reada
168
168
  if (!options.targetDatabase) {
169
169
  try {
170
170
  const { readFile } = await import("fs/promises");
171
- const { resolveConnection } = await import("./connection-utils-26ZE4KUZ.js");
171
+ const { resolveConnection } = await import("./connection-utils-AGSQ5HNN.js");
172
172
  const { detectDatabaseMismatch } = await import("./rewrite-database-FDJIXKZ2.js");
173
173
  const catalogJsonStr = await readFile(join(projectDir, ".yamchart", "catalog.json"), "utf-8");
174
174
  const catalogData = JSON.parse(catalogJsonStr);
@@ -222,7 +222,7 @@ program.command("test").description("Run model tests (@returns schema checks and
222
222
  }
223
223
  loadEnvFile(projectDir);
224
224
  try {
225
- const { testProject, formatTestOutput } = await import("./test-AJM3CBYW.js");
225
+ const { testProject, formatTestOutput } = await import("./test-JSAWS5ZP.js");
226
226
  const result = await testProject(projectDir, model, {
227
227
  connection: options.connection,
228
228
  json: options.json
@@ -270,7 +270,7 @@ program.command("tables").description("List tables and views in the connected da
270
270
  }
271
271
  loadEnvFile(projectDir);
272
272
  try {
273
- const { listTables } = await import("./tables-5BVEKUPB.js");
273
+ const { listTables } = await import("./tables-KLDBUUSE.js");
274
274
  const result = await listTables(projectDir, options);
275
275
  if (options.json) {
276
276
  console.log(JSON.stringify(result.tables, null, 2));
@@ -303,7 +303,7 @@ program.command("describe").description("Show columns and types for a table").ar
303
303
  }
304
304
  loadEnvFile(projectDir);
305
305
  try {
306
- const { describeTable } = await import("./describe-ZM2JI2XS.js");
306
+ const { describeTable } = await import("./describe-AA4UT4U6.js");
307
307
  const result = await describeTable(projectDir, table, options);
308
308
  if (options.json) {
309
309
  console.log(JSON.stringify(result.columns, null, 2));
@@ -338,8 +338,8 @@ program.command("query").description("Execute SQL against a connection").argumen
338
338
  }
339
339
  loadEnvFile(projectDir);
340
340
  try {
341
- const { executeQuery } = await import("./query-LRPR6YRE.js");
342
- const { formatTable, formatJSON } = await import("./connection-utils-26ZE4KUZ.js");
341
+ const { executeQuery } = await import("./query-THDVBBVZ.js");
342
+ const { formatTable, formatJSON } = await import("./connection-utils-AGSQ5HNN.js");
343
343
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
344
344
  const result = await executeQuery(projectDir, sql, {
345
345
  connection: options.connection,
@@ -366,8 +366,8 @@ program.command("sample").description("Show sample rows from a table or dbt mode
366
366
  }
367
367
  loadEnvFile(projectDir);
368
368
  try {
369
- const { sampleTable } = await import("./sample-D4HDOJWP.js");
370
- const { formatTable, formatJSON } = await import("./connection-utils-26ZE4KUZ.js");
369
+ const { sampleTable } = await import("./sample-6WPQS7PA.js");
370
+ const { formatTable, formatJSON } = await import("./connection-utils-AGSQ5HNN.js");
371
371
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
372
372
  const result = await sampleTable(projectDir, table, {
373
373
  connection: options.connection,
@@ -397,7 +397,7 @@ program.command("search").description("Search for tables and columns by keyword"
397
397
  }
398
398
  loadEnvFile(projectDir);
399
399
  try {
400
- const { searchDatabase } = await import("./search-ECGHSZBU.js");
400
+ const { searchDatabase } = await import("./search-657DXBRS.js");
401
401
  const result = await searchDatabase(projectDir, keyword, options);
402
402
  if (options.json) {
403
403
  console.log(JSON.stringify(result.results, null, 2));
@@ -447,7 +447,7 @@ program.command("sync-warehouse").description("Sync warehouse table metadata int
447
447
  }
448
448
  loadEnvFile(projectDir);
449
449
  try {
450
- const { runSyncWarehouse } = await import("./sync-warehouse-WPNGI6YP.js");
450
+ const { runSyncWarehouse } = await import("./sync-warehouse-4KBV5S3L.js");
451
451
  await runSyncWarehouse(projectDir, options);
452
452
  } catch (err) {
453
453
  error(err instanceof Error ? err.message : String(err));
@@ -493,7 +493,7 @@ program.command("advisor").description("AI-powered dbt model advisor \u2014 sugg
493
493
  process.exit(2);
494
494
  }
495
495
  loadEnvFile(projectDir);
496
- const { runAdvisor } = await import("./advisor-YW2EBXGR.js");
496
+ const { runAdvisor } = await import("./advisor-5BTRAICH.js");
497
497
  await runAdvisor(projectDir, question, {
498
498
  top: options.top ? parseInt(options.top, 10) : 5,
499
499
  json: options.json,
@@ -1 +1 @@
1
- import{u,j as e,A as p}from"./index-IDI-DDZi.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-CXx1PiRF.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 +1 @@
1
- import{j as r,c as P,b as U,d as I,e as Y,f as q,g as _,F as z,S as G,C as K,D as X,h as Q,T as J,G as Z,W as ee,i as re,H as te,k as se,l as ae,m as ce,P as le,n as oe,B as ne,L as ie,a as de,o as xe}from"./index-IDI-DDZi.js";import{a as y}from"./echarts-DtOYsfLX.js";function he({title:a,description:c,loading:e=!1,error:o=null,cached:s,durationMs:l,hasDrillDown:N,onRefresh:t,children:h}){return r.jsxs("div",{className:"chart-container",children:[r.jsxs("div",{className:"flex items-start justify-between p-4 border-b",style:{borderColor:"var(--yc-color-border)"},children:[r.jsxs("div",{children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("h2",{className:"text-lg font-semibold",style:{color:"var(--yc-color-text)"},children:a}),N&&r.jsxs("svg",{className:"w-4 h-4 flex-shrink-0",style:{color:"var(--yc-color-text-muted)"},viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",children:[r.jsx("title",{children:"Right-click to drill down"}),r.jsx("path",{fillRule:"evenodd",d:"M5.22 14.78a.75.75 0 001.06 0l7.22-7.22v5.69a.75.75 0 001.5 0v-7.5a.75.75 0 00-.75-.75h-7.5a.75.75 0 000 1.5h5.69l-7.22 7.22a.75.75 0 000 1.06z",clipRule:"evenodd"})]})]}),c&&r.jsx("p",{className:"text-sm mt-1",style:{color:"var(--yc-color-text-secondary)"},children:c})]}),r.jsxs("div",{className:"flex items-center gap-2",children:[s!==void 0&&r.jsx("span",{className:"text-xs px-2 py-1 rounded",style:s?{backgroundColor:"color-mix(in srgb, var(--yc-color-success) 15%, transparent)",color:"var(--yc-color-success)"}:{backgroundColor:"color-mix(in srgb, var(--yc-color-primary) 15%, transparent)",color:"var(--yc-color-primary)"},children:s?"Cached":"Fresh"}),l!==void 0&&r.jsxs("span",{className:"text-xs",style:{color:"var(--yc-color-text-muted)"},children:[l,"ms"]}),t&&r.jsx("button",{onClick:t,disabled:e,className:"p-1.5 hover:bg-black/5 rounded transition-colors disabled:opacity-50",style:{color:"var(--yc-color-text-muted)"},title:"Refresh",children:r.jsx("svg",{className:P("w-4 h-4",e&&"animate-spin"),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})})]})]}),r.jsx("div",{className:"p-4",children:o?r.jsx("div",{className:"flex items-center justify-center h-64",style:{color:"var(--yc-color-danger)"},children:r.jsxs("div",{className:"text-center",children:[r.jsx("p",{className:"font-medium",children:"Failed to load chart"}),r.jsx("p",{className:"text-sm mt-1",children:o.message})]})}):h})]})}const me={day:{label:"Date",format:"%b %d, %Y"},week:{label:"Week Starting",format:"%b %d"},month:{label:"Month",format:"%b '%y"},quarter:{label:"Quarter",format:"quarter"},year:{label:"Year",format:"%Y"}};function ue({chartName:a}){const[c,e]=y.useState(!1),o=async()=>{const s=`{{${a}}}`;try{await navigator.clipboard.writeText(s),e(!0),setTimeout(()=>e(!1),2e3)}catch(l){console.error("Failed to copy:",l)}};return r.jsx("button",{onClick:o,className:"text-sm flex items-center gap-1.5 px-2 py-1 rounded hover:bg-black/5 transition-colors",style:{color:"var(--yc-color-text-secondary)"},title:`Copy {{${a}}} for use in markdown widgets`,children:c?r.jsxs(r.Fragment,{children:[r.jsx("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",style:{color:"var(--yc-color-success)"},children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})}),r.jsx("span",{style:{color:"var(--yc-color-success)"},children:"Copied!"})]}):r.jsxs(r.Fragment,{children:[r.jsx("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})}),r.jsx("span",{children:"Copy Reference"})]})})}function M(a,c){if(!c)return a.toLocaleString();const e=c.decimals??0;switch(c.type){case"currency":return new Intl.NumberFormat("en-US",{style:"currency",currency:c.currency||"USD",minimumFractionDigits:e,maximumFractionDigits:e}).format(a);case"percent":return new Intl.NumberFormat("en-US",{style:"percent",minimumFractionDigits:e,maximumFractionDigits:e}).format(a/100);default:return a.toLocaleString(void 0,{minimumFractionDigits:e,maximumFractionDigits:e})}}function ye(a,c){const e=a>=0?"+":"";return c==="percent_change"?`${e}${a.toFixed(1)}%`:`${e}${a.toLocaleString()}`}function fe({data:a,config:c,title:e,comparison:o}){var g,b,w;if(!(a!=null&&a[0])||!((g=c.value)!=null&&g.field))return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-muted)"},children:"No data available"});const s=a[0],l=s[c.value.field],N=M(l,c.format);let t=null,h="percent_change",D,k,f;if(o)t=o.change,h=o.changeType,D=o.currentPeriodLabel,k=o.previousPeriodLabel,f=M(o.previousValue,c.format);else if((b=c.comparison)!=null&&b.enabled&&c.comparison.field){const i=s[c.comparison.field];h=c.comparison.type,i&&i!==0&&(h==="percent_change"?t=(l-i)/i*100:t=l-i,f=M(i,c.format))}return r.jsxs("div",{className:"h-80 flex flex-col items-center justify-center p-8",children:[r.jsxs("div",{className:"text-6xl font-bold tabular-nums",style:{color:"var(--yc-color-text)"},children:[N,c.unit&&r.jsx("span",{className:"text-3xl font-normal ml-2",style:{color:"var(--yc-color-text-muted)"},children:c.unit})]}),D&&r.jsx("div",{className:"text-sm mt-2",style:{color:"var(--yc-color-text-muted)"},children:D}),e&&r.jsx("div",{className:"text-lg mt-3",style:{color:"var(--yc-color-text-secondary)"},children:e}),t!==null&&r.jsxs("div",{className:"mt-4 flex flex-col items-center gap-1",children:[r.jsxs("div",{className:"flex items-center gap-3",children:[r.jsx("span",{className:"text-lg font-medium px-3 py-1 rounded",style:t>=0?{backgroundColor:"color-mix(in srgb, var(--yc-color-success) 15%, transparent)",color:"var(--yc-color-success)"}:{backgroundColor:"color-mix(in srgb, var(--yc-color-danger) 15%, transparent)",color:"var(--yc-color-danger)"},children:ye(t,h)}),f&&r.jsxs("span",{className:"text-sm",style:{color:"var(--yc-color-text-muted)"},children:["vs ",f]}),!f&&((w=c.comparison)==null?void 0:w.label)&&r.jsx("span",{className:"text-sm",style:{color:"var(--yc-color-text-muted)"},children:c.comparison.label})]}),k&&r.jsx("div",{className:"text-xs",style:{color:"var(--yc-color-text-muted)"},children:k})]})]})}function ve({chartName:a,drillParams:c}){var T,V,$,R;const{data:e,isLoading:o}=U(a),{data:s,isLoading:l,error:N}=I(a),{data:t}=Y(),h=q(),D=_(n=>n.getEffectiveFilters),k=_(n=>n.setChartFilter),f=o||l,g=c==null?void 0:c._from,b=c?Object.fromEntries(Object.entries(c).filter(([n])=>!n.startsWith("_"))):{},w=Object.keys(b).length>0,i=Object.entries(b).map(([n,x])=>`${n}: ${x}`).join(", ");y.useEffect(()=>{if(w)for(const[n,x]of Object.entries(b))k(a,n,x)},[a,w]);const[v,A]=y.useState(null),C=y.useCallback((n,x,m)=>{var u;(u=e==null?void 0:e.drillDown)!=null&&u.chart&&A({x:m.x,y:m.y,field:n,value:x})},[(T=e==null?void 0:e.drillDown)==null?void 0:T.chart]),H=y.useCallback(()=>{var m,u;if(!v||!((m=e==null?void 0:e.drillDown)!=null&&m.chart))return;const n=e.drillDown.field??((u=e.chart.x)==null?void 0:u.field)??v.field,x=new URLSearchParams({[n]:v.value,_from:a});window.location.hash=`/charts/${e.drillDown.chart}?${x.toString()}`,A(null)},[v,e,a]),S=D(a).granularity,d=S?me[S]:void 0,F=d==null?void 0:d.label,L=d==null?void 0:d.format;if(o)return r.jsxs("div",{className:"chart-container animate-pulse",children:[r.jsx("div",{className:"p-4 border-b",style:{borderColor:"var(--yc-color-border)"},children:r.jsx("div",{className:"h-6 rounded w-48",style:{backgroundColor:"var(--yc-color-surface-hover)"}})}),r.jsx("div",{className:"p-4",children:r.jsx("div",{className:"h-80 rounded",style:{backgroundColor:"var(--yc-color-surface-hover)"}})})]});if(!e)return r.jsxs("div",{className:"chart-container p-8 text-center",style:{color:"var(--yc-color-text-secondary)"},children:["Chart not found: ",a]});const O=()=>{var x,m,u,B,E,W;if(!s)return r.jsx("div",{className:"h-80 rounded animate-pulse",style:{backgroundColor:"var(--yc-color-surface-hover)"}});const n=e.chart.type;switch(n){case"line":if(!e.chart.x||!e.chart.y&&!e.chart.series)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(x=e.drillDown)!=null&&x.chart?C:void 0;return r.jsx(ie,{data:s.rows,columns:s.columns,xAxis:j,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"bar":if(!e.chart.x||!e.chart.y&&!e.chart.series)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(m=e.drillDown)!=null&&m.chart?C:void 0;return r.jsx(ne,{data:s.rows,xAxis:j,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"area":if(!e.chart.x||!e.chart.y&&!e.chart.series)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(u=e.drillDown)!=null&&u.chart?C:void 0;return r.jsx(oe,{data:s.rows,xAxis:j,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"pie":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing pie chart configuration"}):r.jsx(le,{data:s.rows,xAxis:e.chart.x,yAxis:e.chart.y,theme:t==null?void 0:t.theme,loading:l,onDrillDown:(B=e.drillDown)!=null&&B.chart?C:void 0});case"donut":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing donut chart configuration"}):r.jsx(ce,{data:s.rows,xAxis:e.chart.x,yAxis:e.chart.y,centerValue:e.chart.centerValue,theme:t==null?void 0:t.theme,loading:l,onDrillDown:(E=e.drillDown)!=null&&E.chart?C:void 0});case"scatter":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"}):r.jsx(ae,{data:s.rows,xAxis:e.chart.x,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"combo":if(!e.chart.x)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(W=e.drillDown)!=null&&W.chart?C:void 0;return r.jsx(se,{data:s.rows,xAxis:j,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"kpi":return r.jsx(fe,{data:s.rows,config:e.chart,title:e.title,comparison:s.comparison});case"heatmap":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"}):r.jsx(te,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"funnel":return r.jsx(re,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"waterfall":return r.jsx(ee,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"gauge":return r.jsx(Z,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"table":return r.jsx(J,{data:s.rows,columns:s.columns,chartConfig:e.chart,height:"100%",loading:l});default:return r.jsxs("div",{className:"h-80 flex items-center justify-center text-gray-500",children:['Chart type "',n,'" not yet implemented']})}};return r.jsxs("div",{className:"space-y-4",children:[g&&r.jsxs("div",{className:"flex items-center gap-2 text-sm",style:{color:"var(--yc-color-text-secondary)"},children:[r.jsx("button",{onClick:()=>{window.location.hash=`/charts/${g}`},className:"transition-colors hover:opacity-80",style:{color:"var(--yc-color-primary)"},children:g}),r.jsx("span",{children:"/"}),r.jsx("span",{className:"font-medium",style:{color:"var(--yc-color-text)"},children:e.title}),i&&r.jsxs("span",{style:{color:"var(--yc-color-text-muted)"},children:["(",i,")"]})]}),r.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-4",children:[e.parameters.length>0?r.jsx(z,{parameters:e.parameters,chartName:a}):r.jsx("div",{}),r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx(ue,{chartName:a}),r.jsx(G,{resourceType:"chart",resourceName:a})]})]}),r.jsx(he,{title:e.title,description:e.description,loading:f,cached:s==null?void 0:s.meta.cached,durationMs:s==null?void 0:s.meta.durationMs,hasDrillDown:!!((V=e.drillDown)!=null&&V.chart),onRefresh:()=>h(a),children:r.jsx(K,{isLoading:l,error:N,data:s==null?void 0:s.rows,onRetry:()=>h(a),children:O()})}),w&&s&&r.jsx(X,{data:s.rows,columns:s.columns,drillDownColumns:($=e.drillDown)==null?void 0:$.columns,filterDisplay:i,chartName:a}),v&&((R=e.drillDown)==null?void 0:R.chart)&&r.jsx(Q,{x:v.x,y:v.y,targetChartTitle:e.drillDown.chart,onDrillDown:H,onClose:()=>A(null)})]})}function be({parsed:a}){const c=a.params.token,[e,o]=y.useState(null),[s,l]=y.useState(!1);return y.useEffect(()=>{if(!c){o("No share token provided");return}de.getPublicConfig(c).then(()=>l(!0)).catch(()=>o("This link has expired or been revoked"))},[c]),e?r.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:r.jsx("div",{className:"text-center",children:r.jsx("div",{className:"text-gray-400 text-lg",children:e})})}):s?r.jsxs("div",{className:"min-h-screen bg-gray-50",children:[r.jsx("div",{className:"max-w-7xl mx-auto py-6 px-4",children:a.type==="public_chart"?r.jsx(ve,{chartName:a.name}):r.jsx(xe,{dashboardId:a.name,initialTab:a.params.tab})}),r.jsx("div",{className:"text-center py-4 text-xs text-gray-400",children:"Shared via yamchart"})]}):r.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:r.jsx("div",{className:"text-gray-500",children:"Loading..."})})}export{be as PublicViewer};
1
+ import{j as r,c as P,b as U,d as I,e as Y,f as q,g as _,F as z,S as G,C as K,D as X,h as Q,T as J,G as Z,W as ee,i as re,H as te,k as se,l as ae,m as ce,P as le,n as oe,B as ne,L as ie,a as de,o as xe}from"./index-CXx1PiRF.js";import{a as y}from"./echarts-DtOYsfLX.js";function he({title:a,description:c,loading:e=!1,error:o=null,cached:s,durationMs:l,hasDrillDown:N,onRefresh:t,children:h}){return r.jsxs("div",{className:"chart-container",children:[r.jsxs("div",{className:"flex items-start justify-between p-4 border-b",style:{borderColor:"var(--yc-color-border)"},children:[r.jsxs("div",{children:[r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx("h2",{className:"text-lg font-semibold",style:{color:"var(--yc-color-text)"},children:a}),N&&r.jsxs("svg",{className:"w-4 h-4 flex-shrink-0",style:{color:"var(--yc-color-text-muted)"},viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true",children:[r.jsx("title",{children:"Right-click to drill down"}),r.jsx("path",{fillRule:"evenodd",d:"M5.22 14.78a.75.75 0 001.06 0l7.22-7.22v5.69a.75.75 0 001.5 0v-7.5a.75.75 0 00-.75-.75h-7.5a.75.75 0 000 1.5h5.69l-7.22 7.22a.75.75 0 000 1.06z",clipRule:"evenodd"})]})]}),c&&r.jsx("p",{className:"text-sm mt-1",style:{color:"var(--yc-color-text-secondary)"},children:c})]}),r.jsxs("div",{className:"flex items-center gap-2",children:[s!==void 0&&r.jsx("span",{className:"text-xs px-2 py-1 rounded",style:s?{backgroundColor:"color-mix(in srgb, var(--yc-color-success) 15%, transparent)",color:"var(--yc-color-success)"}:{backgroundColor:"color-mix(in srgb, var(--yc-color-primary) 15%, transparent)",color:"var(--yc-color-primary)"},children:s?"Cached":"Fresh"}),l!==void 0&&r.jsxs("span",{className:"text-xs",style:{color:"var(--yc-color-text-muted)"},children:[l,"ms"]}),t&&r.jsx("button",{onClick:t,disabled:e,className:"p-1.5 hover:bg-black/5 rounded transition-colors disabled:opacity-50",style:{color:"var(--yc-color-text-muted)"},title:"Refresh",children:r.jsx("svg",{className:P("w-4 h-4",e&&"animate-spin"),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})})]})]}),r.jsx("div",{className:"p-4",children:o?r.jsx("div",{className:"flex items-center justify-center h-64",style:{color:"var(--yc-color-danger)"},children:r.jsxs("div",{className:"text-center",children:[r.jsx("p",{className:"font-medium",children:"Failed to load chart"}),r.jsx("p",{className:"text-sm mt-1",children:o.message})]})}):h})]})}const me={day:{label:"Date",format:"%b %d, %Y"},week:{label:"Week Starting",format:"%b %d"},month:{label:"Month",format:"%b '%y"},quarter:{label:"Quarter",format:"quarter"},year:{label:"Year",format:"%Y"}};function ue({chartName:a}){const[c,e]=y.useState(!1),o=async()=>{const s=`{{${a}}}`;try{await navigator.clipboard.writeText(s),e(!0),setTimeout(()=>e(!1),2e3)}catch(l){console.error("Failed to copy:",l)}};return r.jsx("button",{onClick:o,className:"text-sm flex items-center gap-1.5 px-2 py-1 rounded hover:bg-black/5 transition-colors",style:{color:"var(--yc-color-text-secondary)"},title:`Copy {{${a}}} for use in markdown widgets`,children:c?r.jsxs(r.Fragment,{children:[r.jsx("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",style:{color:"var(--yc-color-success)"},children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})}),r.jsx("span",{style:{color:"var(--yc-color-success)"},children:"Copied!"})]}):r.jsxs(r.Fragment,{children:[r.jsx("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:r.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})}),r.jsx("span",{children:"Copy Reference"})]})})}function M(a,c){if(!c)return a.toLocaleString();const e=c.decimals??0;switch(c.type){case"currency":return new Intl.NumberFormat("en-US",{style:"currency",currency:c.currency||"USD",minimumFractionDigits:e,maximumFractionDigits:e}).format(a);case"percent":return new Intl.NumberFormat("en-US",{style:"percent",minimumFractionDigits:e,maximumFractionDigits:e}).format(a/100);default:return a.toLocaleString(void 0,{minimumFractionDigits:e,maximumFractionDigits:e})}}function ye(a,c){const e=a>=0?"+":"";return c==="percent_change"?`${e}${a.toFixed(1)}%`:`${e}${a.toLocaleString()}`}function fe({data:a,config:c,title:e,comparison:o}){var g,b,w;if(!(a!=null&&a[0])||!((g=c.value)!=null&&g.field))return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-muted)"},children:"No data available"});const s=a[0],l=s[c.value.field],N=M(l,c.format);let t=null,h="percent_change",D,k,f;if(o)t=o.change,h=o.changeType,D=o.currentPeriodLabel,k=o.previousPeriodLabel,f=M(o.previousValue,c.format);else if((b=c.comparison)!=null&&b.enabled&&c.comparison.field){const i=s[c.comparison.field];h=c.comparison.type,i&&i!==0&&(h==="percent_change"?t=(l-i)/i*100:t=l-i,f=M(i,c.format))}return r.jsxs("div",{className:"h-80 flex flex-col items-center justify-center p-8",children:[r.jsxs("div",{className:"text-6xl font-bold tabular-nums",style:{color:"var(--yc-color-text)"},children:[N,c.unit&&r.jsx("span",{className:"text-3xl font-normal ml-2",style:{color:"var(--yc-color-text-muted)"},children:c.unit})]}),D&&r.jsx("div",{className:"text-sm mt-2",style:{color:"var(--yc-color-text-muted)"},children:D}),e&&r.jsx("div",{className:"text-lg mt-3",style:{color:"var(--yc-color-text-secondary)"},children:e}),t!==null&&r.jsxs("div",{className:"mt-4 flex flex-col items-center gap-1",children:[r.jsxs("div",{className:"flex items-center gap-3",children:[r.jsx("span",{className:"text-lg font-medium px-3 py-1 rounded",style:t>=0?{backgroundColor:"color-mix(in srgb, var(--yc-color-success) 15%, transparent)",color:"var(--yc-color-success)"}:{backgroundColor:"color-mix(in srgb, var(--yc-color-danger) 15%, transparent)",color:"var(--yc-color-danger)"},children:ye(t,h)}),f&&r.jsxs("span",{className:"text-sm",style:{color:"var(--yc-color-text-muted)"},children:["vs ",f]}),!f&&((w=c.comparison)==null?void 0:w.label)&&r.jsx("span",{className:"text-sm",style:{color:"var(--yc-color-text-muted)"},children:c.comparison.label})]}),k&&r.jsx("div",{className:"text-xs",style:{color:"var(--yc-color-text-muted)"},children:k})]})]})}function ve({chartName:a,drillParams:c}){var T,V,$,R;const{data:e,isLoading:o}=U(a),{data:s,isLoading:l,error:N}=I(a),{data:t}=Y(),h=q(),D=_(n=>n.getEffectiveFilters),k=_(n=>n.setChartFilter),f=o||l,g=c==null?void 0:c._from,b=c?Object.fromEntries(Object.entries(c).filter(([n])=>!n.startsWith("_"))):{},w=Object.keys(b).length>0,i=Object.entries(b).map(([n,x])=>`${n}: ${x}`).join(", ");y.useEffect(()=>{if(w)for(const[n,x]of Object.entries(b))k(a,n,x)},[a,w]);const[v,A]=y.useState(null),C=y.useCallback((n,x,m)=>{var u;(u=e==null?void 0:e.drillDown)!=null&&u.chart&&A({x:m.x,y:m.y,field:n,value:x})},[(T=e==null?void 0:e.drillDown)==null?void 0:T.chart]),H=y.useCallback(()=>{var m,u;if(!v||!((m=e==null?void 0:e.drillDown)!=null&&m.chart))return;const n=e.drillDown.field??((u=e.chart.x)==null?void 0:u.field)??v.field,x=new URLSearchParams({[n]:v.value,_from:a});window.location.hash=`/charts/${e.drillDown.chart}?${x.toString()}`,A(null)},[v,e,a]),S=D(a).granularity,d=S?me[S]:void 0,F=d==null?void 0:d.label,L=d==null?void 0:d.format;if(o)return r.jsxs("div",{className:"chart-container animate-pulse",children:[r.jsx("div",{className:"p-4 border-b",style:{borderColor:"var(--yc-color-border)"},children:r.jsx("div",{className:"h-6 rounded w-48",style:{backgroundColor:"var(--yc-color-surface-hover)"}})}),r.jsx("div",{className:"p-4",children:r.jsx("div",{className:"h-80 rounded",style:{backgroundColor:"var(--yc-color-surface-hover)"}})})]});if(!e)return r.jsxs("div",{className:"chart-container p-8 text-center",style:{color:"var(--yc-color-text-secondary)"},children:["Chart not found: ",a]});const O=()=>{var x,m,u,B,E,W;if(!s)return r.jsx("div",{className:"h-80 rounded animate-pulse",style:{backgroundColor:"var(--yc-color-surface-hover)"}});const n=e.chart.type;switch(n){case"line":if(!e.chart.x||!e.chart.y&&!e.chart.series)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(x=e.drillDown)!=null&&x.chart?C:void 0;return r.jsx(ie,{data:s.rows,columns:s.columns,xAxis:j,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"bar":if(!e.chart.x||!e.chart.y&&!e.chart.series)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(m=e.drillDown)!=null&&m.chart?C:void 0;return r.jsx(ne,{data:s.rows,xAxis:j,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"area":if(!e.chart.x||!e.chart.y&&!e.chart.series)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(u=e.drillDown)!=null&&u.chart?C:void 0;return r.jsx(oe,{data:s.rows,xAxis:j,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"pie":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing pie chart configuration"}):r.jsx(le,{data:s.rows,xAxis:e.chart.x,yAxis:e.chart.y,theme:t==null?void 0:t.theme,loading:l,onDrillDown:(B=e.drillDown)!=null&&B.chart?C:void 0});case"donut":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing donut chart configuration"}):r.jsx(ce,{data:s.rows,xAxis:e.chart.x,yAxis:e.chart.y,centerValue:e.chart.centerValue,theme:t==null?void 0:t.theme,loading:l,onDrillDown:(E=e.drillDown)!=null&&E.chart?C:void 0});case"scatter":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"}):r.jsx(ae,{data:s.rows,xAxis:e.chart.x,yAxis:e.chart.y,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"combo":if(!e.chart.x)return r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"});{const j=d?{...e.chart.x,label:F,format:L}:e.chart.x,p=(W=e.drillDown)!=null&&W.chart?C:void 0;return r.jsx(se,{data:s.rows,xAxis:j,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l,onDrillDown:p})}case"kpi":return r.jsx(fe,{data:s.rows,config:e.chart,title:e.title,comparison:s.comparison});case"heatmap":return!e.chart.x||!e.chart.y?r.jsx("div",{className:"h-80 flex items-center justify-center",style:{color:"var(--yc-color-text-secondary)"},children:"Missing axis configuration"}):r.jsx(te,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"funnel":return r.jsx(re,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"waterfall":return r.jsx(ee,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"gauge":return r.jsx(Z,{data:s.rows,chartConfig:e.chart,theme:t==null?void 0:t.theme,loading:l});case"table":return r.jsx(J,{data:s.rows,columns:s.columns,chartConfig:e.chart,height:"100%",loading:l});default:return r.jsxs("div",{className:"h-80 flex items-center justify-center text-gray-500",children:['Chart type "',n,'" not yet implemented']})}};return r.jsxs("div",{className:"space-y-4",children:[g&&r.jsxs("div",{className:"flex items-center gap-2 text-sm",style:{color:"var(--yc-color-text-secondary)"},children:[r.jsx("button",{onClick:()=>{window.location.hash=`/charts/${g}`},className:"transition-colors hover:opacity-80",style:{color:"var(--yc-color-primary)"},children:g}),r.jsx("span",{children:"/"}),r.jsx("span",{className:"font-medium",style:{color:"var(--yc-color-text)"},children:e.title}),i&&r.jsxs("span",{style:{color:"var(--yc-color-text-muted)"},children:["(",i,")"]})]}),r.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-4",children:[e.parameters.length>0?r.jsx(z,{parameters:e.parameters,chartName:a}):r.jsx("div",{}),r.jsxs("div",{className:"flex items-center gap-2",children:[r.jsx(ue,{chartName:a}),r.jsx(G,{resourceType:"chart",resourceName:a})]})]}),r.jsx(he,{title:e.title,description:e.description,loading:f,cached:s==null?void 0:s.meta.cached,durationMs:s==null?void 0:s.meta.durationMs,hasDrillDown:!!((V=e.drillDown)!=null&&V.chart),onRefresh:()=>h(a),children:r.jsx(K,{isLoading:l,error:N,data:s==null?void 0:s.rows,onRetry:()=>h(a),children:O()})}),w&&s&&r.jsx(X,{data:s.rows,columns:s.columns,drillDownColumns:($=e.drillDown)==null?void 0:$.columns,filterDisplay:i,chartName:a}),v&&((R=e.drillDown)==null?void 0:R.chart)&&r.jsx(Q,{x:v.x,y:v.y,targetChartTitle:e.drillDown.chart,onDrillDown:H,onClose:()=>A(null)})]})}function be({parsed:a}){const c=a.params.token,[e,o]=y.useState(null),[s,l]=y.useState(!1);return y.useEffect(()=>{if(!c){o("No share token provided");return}de.getPublicConfig(c).then(()=>l(!0)).catch(()=>o("This link has expired or been revoked"))},[c]),e?r.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:r.jsx("div",{className:"text-center",children:r.jsx("div",{className:"text-gray-400 text-lg",children:e})})}):s?r.jsxs("div",{className:"min-h-screen bg-gray-50",children:[r.jsx("div",{className:"max-w-7xl mx-auto py-6 px-4",children:a.type==="public_chart"?r.jsx(ve,{chartName:a.name}):r.jsx(xe,{dashboardId:a.name,initialTab:a.params.tab})}),r.jsx("div",{className:"text-center py-4 text-xs text-gray-400",children:"Shared via yamchart"})]}):r.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center",children:r.jsx("div",{className:"text-gray-500",children:"Loading..."})})}export{be as PublicViewer};