yamchart 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -8,7 +8,7 @@ If you identify a bug in yamchart's core behavior (rendering, cross-filtering, t
8
8
 
9
9
  1. Diagnose and confirm the root cause is in the framework
10
10
  2. Write a bug report with: yamchart version, repro steps, root cause analysis, suggested fix
11
- 3. Present the report to the user to file at https://github.com/simon-spenc/yamchart/issues
11
+ 3. Present the report to the user to file at https://github.com/yamchart/yamchart/issues
12
12
 
13
13
  Examples of things you must NOT do:
14
14
  - Add type-detection logic in Nunjucks templates to handle framework type mismatches
@@ -3,7 +3,7 @@ import { readFileSync, writeFileSync, mkdirSync } from "fs";
3
3
  import { join } from "path";
4
4
  import { homedir } from "os";
5
5
  var REGISTRY_URL = "https://registry.npmjs.org/yamchart";
6
- var GITHUB_RELEASES_URL = "https://api.github.com/repos/simon-spenc/yamchart/releases/tags";
6
+ var GITHUB_RELEASES_URL = "https://api.github.com/repos/yamchart/yamchart/releases/tags";
7
7
  var CACHE_DIR = join(homedir(), ".yamchart");
8
8
  var CACHE_FILE = join(CACHE_DIR, "update-check.json");
9
9
  var CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
@@ -97,4 +97,4 @@ export {
97
97
  checkForUpdate,
98
98
  fetchReleaseNotes
99
99
  };
100
- //# sourceMappingURL=chunk-F6QAWPYU.js.map
100
+ //# sourceMappingURL=chunk-TZKNU5TD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/update-check.ts"],"sourcesContent":["import { readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst REGISTRY_URL = 'https://registry.npmjs.org/yamchart';\nconst GITHUB_RELEASES_URL = 'https://api.github.com/repos/yamchart/yamchart/releases/tags';\nconst CACHE_DIR = join(homedir(), '.yamchart');\nconst CACHE_FILE = join(CACHE_DIR, 'update-check.json');\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\nexport interface UpdateCheckResult {\n current: string;\n latest: string;\n}\n\ninterface CachedCheck {\n latest: string;\n checkedAt: number;\n}\n\nfunction readCache(): CachedCheck | null {\n try {\n const raw = readFileSync(CACHE_FILE, 'utf-8');\n const data = JSON.parse(raw) as CachedCheck;\n if (Date.now() - data.checkedAt < CACHE_TTL_MS) {\n return data;\n }\n } catch {\n // Cache miss or corrupt — ignore\n }\n return null;\n}\n\nfunction writeCache(latest: string): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify({ latest, checkedAt: Date.now() }));\n } catch {\n // Non-critical — ignore write errors\n }\n}\n\nexport async function checkForUpdate(currentVersion: string, { skipCache = false } = {}): Promise<UpdateCheckResult | null> {\n try {\n // Check cache first (unless explicitly bypassed)\n const cached = skipCache ? null : readCache();\n const latest = cached?.latest ?? await fetchLatestVersion();\n if (!latest) return null;\n\n if (!cached) {\n writeCache(latest);\n }\n\n if (latest !== currentVersion && isNewerVersion(latest, currentVersion)) {\n return { current: currentVersion, latest };\n }\n\n return null;\n } catch {\n return null; // Silent fail — never block CLI on update check\n }\n}\n\nexport async function fetchReleaseNotes(version: string): Promise<string | null> {\n // Try with v prefix first (v0.4.0), then without (0.4.0)\n for (const tag of [`v${version}`, version]) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n\n const response = await fetch(`${GITHUB_RELEASES_URL}/${tag}`, {\n signal: controller.signal,\n headers: {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'yamchart-cli',\n },\n });\n clearTimeout(timeout);\n\n if (!response.ok) continue;\n\n const data = await response.json() as { body?: string | null };\n const body = data.body?.trim();\n return body || null;\n } catch {\n continue;\n }\n }\n return null;\n}\n\n/** Compare semver strings numerically (a > b). */\nfunction isNewerVersion(a: string, b: string): boolean {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const na = pa[i] ?? 0;\n const nb = pb[i] ?? 0;\n if (na > nb) return true;\n if (na < nb) return false;\n }\n return false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000); // 3s timeout\n\n try {\n const response = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: { Accept: 'application/vnd.npm.install-v1+json' },\n });\n clearTimeout(timeout);\n\n if (!response.ok) return null;\n\n const data = await response.json() as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n clearTimeout(timeout);\n return null;\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  checkForUpdate
4
- } from "./chunk-F6QAWPYU.js";
4
+ } from "./chunk-TZKNU5TD.js";
5
5
  import {
6
6
  findProjectRoot,
7
7
  loadEnvFile,
@@ -246,7 +246,7 @@ program.command("test").description("Run model tests (@returns schema checks and
246
246
  }
247
247
  });
248
248
  program.command("update").description("Check for yamchart updates").action(async () => {
249
- const { runUpdate } = await import("./update-UKMEWCSO.js");
249
+ const { runUpdate } = await import("./update-WMATDZTO.js");
250
250
  await runUpdate(pkg.version);
251
251
  });
252
252
  program.command("reset-password").description("Reset a user password (requires auth to be enabled)").requiredOption("-e, --email <email>", "Email address of the user").action(async (options) => {
@@ -1,6 +1,6 @@
1
1
  # {{name}}
2
2
 
3
- This is a [Yamchart](https://github.com/simon-spenc/yamchart) project — Git-native BI dashboards defined as YAML configs and SQL models.
3
+ This is a [Yamchart](https://github.com/yamchart/yamchart) project — Git-native BI dashboards defined as YAML configs and SQL models.
4
4
 
5
5
  ## Project Notes
6
6
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  checkForUpdate,
3
3
  fetchReleaseNotes
4
- } from "./chunk-F6QAWPYU.js";
4
+ } from "./chunk-TZKNU5TD.js";
5
5
  import {
6
6
  detail,
7
7
  error,
@@ -217,4 +217,4 @@ export {
217
217
  refreshSkills,
218
218
  runUpdate
219
219
  };
220
- //# sourceMappingURL=update-UKMEWCSO.js.map
220
+ //# sourceMappingURL=update-WMATDZTO.js.map
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "yamchart",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Git-native business intelligence dashboards",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Simon Spencer",
8
8
  "repository": {
9
9
  "type": "git",
10
- "url": "git+https://github.com/simon-spenc/yamchart.git",
10
+ "url": "git+https://github.com/yamchart/yamchart.git",
11
11
  "directory": "apps/cli"
12
12
  },
13
- "homepage": "https://github.com/simon-spenc/yamchart#readme",
13
+ "homepage": "https://github.com/yamchart/yamchart#readme",
14
14
  "bugs": {
15
- "url": "https://github.com/simon-spenc/yamchart/issues"
15
+ "url": "https://github.com/yamchart/yamchart/issues"
16
16
  },
17
17
  "keywords": [
18
18
  "bi",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/update-check.ts"],"sourcesContent":["import { readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nconst REGISTRY_URL = 'https://registry.npmjs.org/yamchart';\nconst GITHUB_RELEASES_URL = 'https://api.github.com/repos/simon-spenc/yamchart/releases/tags';\nconst CACHE_DIR = join(homedir(), '.yamchart');\nconst CACHE_FILE = join(CACHE_DIR, 'update-check.json');\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\nexport interface UpdateCheckResult {\n current: string;\n latest: string;\n}\n\ninterface CachedCheck {\n latest: string;\n checkedAt: number;\n}\n\nfunction readCache(): CachedCheck | null {\n try {\n const raw = readFileSync(CACHE_FILE, 'utf-8');\n const data = JSON.parse(raw) as CachedCheck;\n if (Date.now() - data.checkedAt < CACHE_TTL_MS) {\n return data;\n }\n } catch {\n // Cache miss or corrupt — ignore\n }\n return null;\n}\n\nfunction writeCache(latest: string): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify({ latest, checkedAt: Date.now() }));\n } catch {\n // Non-critical — ignore write errors\n }\n}\n\nexport async function checkForUpdate(currentVersion: string, { skipCache = false } = {}): Promise<UpdateCheckResult | null> {\n try {\n // Check cache first (unless explicitly bypassed)\n const cached = skipCache ? null : readCache();\n const latest = cached?.latest ?? await fetchLatestVersion();\n if (!latest) return null;\n\n if (!cached) {\n writeCache(latest);\n }\n\n if (latest !== currentVersion && isNewerVersion(latest, currentVersion)) {\n return { current: currentVersion, latest };\n }\n\n return null;\n } catch {\n return null; // Silent fail — never block CLI on update check\n }\n}\n\nexport async function fetchReleaseNotes(version: string): Promise<string | null> {\n // Try with v prefix first (v0.4.0), then without (0.4.0)\n for (const tag of [`v${version}`, version]) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n\n const response = await fetch(`${GITHUB_RELEASES_URL}/${tag}`, {\n signal: controller.signal,\n headers: {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'yamchart-cli',\n },\n });\n clearTimeout(timeout);\n\n if (!response.ok) continue;\n\n const data = await response.json() as { body?: string | null };\n const body = data.body?.trim();\n return body || null;\n } catch {\n continue;\n }\n }\n return null;\n}\n\n/** Compare semver strings numerically (a > b). */\nfunction isNewerVersion(a: string, b: string): boolean {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const na = pa[i] ?? 0;\n const nb = pb[i] ?? 0;\n if (na > nb) return true;\n if (na < nb) return false;\n }\n return false;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000); // 3s timeout\n\n try {\n const response = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: { Accept: 'application/vnd.npm.install-v1+json' },\n });\n clearTimeout(timeout);\n\n if (!response.ok) return null;\n\n const data = await response.json() as { 'dist-tags'?: { latest?: string } };\n return data['dist-tags']?.latest ?? null;\n } catch {\n clearTimeout(timeout);\n return null;\n }\n}\n"],"mappings":";AAAA,SAAS,cAAc,eAAe,iBAAiB;AACvD,SAAS,YAAY;AACrB,SAAS,eAAe;AAExB,IAAM,eAAe;AACrB,IAAM,sBAAsB;AAC5B,IAAM,YAAY,KAAK,QAAQ,GAAG,WAAW;AAC7C,IAAM,aAAa,KAAK,WAAW,mBAAmB;AACtD,IAAM,eAAe,KAAK,KAAK,KAAK;AAYpC,SAAS,YAAgC;AACvC,MAAI;AACF,UAAM,MAAM,aAAa,YAAY,OAAO;AAC5C,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,KAAK,IAAI,IAAI,KAAK,YAAY,cAAc;AAC9C,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,WAAW,QAAsB;AACxC,MAAI;AACF,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,kBAAc,YAAY,KAAK,UAAU,EAAE,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7E,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,eAAe,gBAAwB,EAAE,YAAY,MAAM,IAAI,CAAC,GAAsC;AAC1H,MAAI;AAEF,UAAM,SAAS,YAAY,OAAO,UAAU;AAC5C,UAAM,SAAS,QAAQ,UAAU,MAAM,mBAAmB;AAC1D,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI,CAAC,QAAQ;AACX,iBAAW,MAAM;AAAA,IACnB;AAEA,QAAI,WAAW,kBAAkB,eAAe,QAAQ,cAAc,GAAG;AACvE,aAAO,EAAE,SAAS,gBAAgB,OAAO;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBAAkB,SAAyC;AAE/E,aAAW,OAAO,CAAC,IAAI,OAAO,IAAI,OAAO,GAAG;AAC1C,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEzD,YAAM,WAAW,MAAM,MAAM,GAAG,mBAAmB,IAAI,GAAG,IAAI;AAAA,QAC5D,QAAQ,WAAW;AAAA,QACnB,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB;AAAA,MACF,CAAC;AACD,mBAAa,OAAO;AAEpB,UAAI,CAAC,SAAS,GAAI;AAElB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,aAAO,QAAQ;AAAA,IACjB,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,eAAe,GAAW,GAAoB;AACrD,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAClC,QAAM,KAAK,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AAClC,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK;AACvD,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEA,eAAe,qBAA6C;AAC1D,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEzD,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,cAAc;AAAA,MACzC,QAAQ,WAAW;AAAA,MACnB,SAAS,EAAE,QAAQ,sCAAsC;AAAA,IAC3D,CAAC;AACD,iBAAa,OAAO;AAEpB,QAAI,CAAC,SAAS,GAAI,QAAO;AAEzB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK,WAAW,GAAG,UAAU;AAAA,EACtC,QAAQ;AACN,iBAAa,OAAO;AACpB,WAAO;AAAA,EACT;AACF;","names":[]}