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 +1 -1
- package/dist/{chunk-F6QAWPYU.js → chunk-TZKNU5TD.js} +2 -2
- package/dist/chunk-TZKNU5TD.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/templates/default/CLAUDE.md +1 -1
- package/dist/{update-UKMEWCSO.js → update-WMATDZTO.js} +2 -2
- package/package.json +4 -4
- package/dist/chunk-F6QAWPYU.js.map +0 -1
- /package/dist/{update-UKMEWCSO.js.map → update-WMATDZTO.js.map} +0 -0
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/
|
|
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/
|
|
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-
|
|
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-
|
|
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-
|
|
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/
|
|
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-
|
|
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-
|
|
220
|
+
//# sourceMappingURL=update-WMATDZTO.js.map
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yamchart",
|
|
3
|
-
"version": "0.8.
|
|
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/
|
|
10
|
+
"url": "git+https://github.com/yamchart/yamchart.git",
|
|
11
11
|
"directory": "apps/cli"
|
|
12
12
|
},
|
|
13
|
-
"homepage": "https://github.com/
|
|
13
|
+
"homepage": "https://github.com/yamchart/yamchart#readme",
|
|
14
14
|
"bugs": {
|
|
15
|
-
"url": "https://github.com/
|
|
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":[]}
|
|
File without changes
|