prolog-trace-viz 2.6.2 → 2.6.4
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/README.md +3 -0
- package/dist/build-info.d.ts +3 -3
- package/dist/build-info.js +3 -3
- package/dist/cli.d.ts +3 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +7 -1
- package/dist/parser.js.map +1 -1
- package/dist/prompt.d.ts +23 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +43 -0
- package/dist/prompt.js.map +1 -0
- package/dist/spinner.d.ts +38 -0
- package/dist/spinner.d.ts.map +1 -0
- package/dist/spinner.js +98 -0
- package/dist/spinner.js.map +1 -0
- package/dist/timeline-formatter.js +99 -28
- package/dist/timeline-formatter.js.map +1 -1
- package/dist/timeline.d.ts +10 -2
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +34 -24
- package/dist/timeline.js.map +1 -1
- package/dist/tree.d.ts +6 -0
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +35 -1
- package/dist/tree.js.map +1 -1
- package/dist/update-notifier.d.ts +38 -0
- package/dist/update-notifier.d.ts.map +1 -0
- package/dist/update-notifier.js +99 -0
- package/dist/update-notifier.js.map +1 -0
- package/dist/updater.d.ts +26 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +93 -0
- package/dist/updater.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update notifier - the automatic, throttled "is a newer ptv available?"
|
|
3
|
+
* check that runs after a normal command and nudges the user to update.
|
|
4
|
+
*
|
|
5
|
+
* Design goals:
|
|
6
|
+
* - Never disrupt the actual command: every failure here is swallowed.
|
|
7
|
+
* - Don't hammer the npm registry: a real network check runs at most once
|
|
8
|
+
* per day; in between, a cached result is reused.
|
|
9
|
+
* - Stay quiet when there is no human to nudge (non-TTY) or when asked
|
|
10
|
+
* to be quiet.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as os from 'node:os';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { BUILD_INFO } from './build-info.js';
|
|
16
|
+
import { compareVersions, fetchLatestVersion, installUpdate } from './updater.js';
|
|
17
|
+
import { promptYesNo } from './prompt.js';
|
|
18
|
+
/** How long a registry check result stays fresh: once per day. */
|
|
19
|
+
export const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
20
|
+
/** Where the throttling cache lives. */
|
|
21
|
+
export const CACHE_FILE = path.join(os.tmpdir(), 'ptv-update-check.json');
|
|
22
|
+
/** Read the throttling cache. Returns null if missing or unreadable. */
|
|
23
|
+
export function readCache(file = CACHE_FILE) {
|
|
24
|
+
try {
|
|
25
|
+
const data = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
26
|
+
if (typeof data?.checkedAt === 'number' && typeof data?.latest === 'string') {
|
|
27
|
+
return { checkedAt: data.checkedAt, latest: data.latest };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Missing or corrupt cache - treated as "no cache".
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/** Write the throttling cache. Best-effort: failures are ignored. */
|
|
36
|
+
export function writeCache(cache, file = CACHE_FILE) {
|
|
37
|
+
try {
|
|
38
|
+
fs.writeFileSync(file, JSON.stringify(cache), 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// A non-writable temp dir must not break anything.
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Whether a fresh network check is due, given the cache and current time. */
|
|
45
|
+
export function isCheckDue(cache, now, intervalMs = CHECK_INTERVAL_MS) {
|
|
46
|
+
if (!cache)
|
|
47
|
+
return true;
|
|
48
|
+
return now - cache.checkedAt >= intervalMs;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the latest known version: reuse the cache when a check isn't due,
|
|
52
|
+
* otherwise query npm and refresh the cache. Returns null if undetermined.
|
|
53
|
+
*/
|
|
54
|
+
async function resolveLatestVersion(now) {
|
|
55
|
+
const cache = readCache();
|
|
56
|
+
if (!isCheckDue(cache, now)) {
|
|
57
|
+
return cache.latest;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const latest = await fetchLatestVersion();
|
|
61
|
+
writeCache({ checkedAt: now, latest });
|
|
62
|
+
return latest;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Offline or registry trouble: fall back to whatever we last saw.
|
|
66
|
+
return cache?.latest ?? null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Automatic update nudge. Intended to run once, after the main command.
|
|
71
|
+
* Checks (at most once per day) whether a newer ptv exists and, if so,
|
|
72
|
+
* offers to install it. Silent and non-fatal on any error.
|
|
73
|
+
*/
|
|
74
|
+
export async function notifyAndMaybeUpdate(options) {
|
|
75
|
+
try {
|
|
76
|
+
if (options.quiet)
|
|
77
|
+
return;
|
|
78
|
+
// Only nudge a real interactive session - we need stdout to show the
|
|
79
|
+
// message and stdin to read the answer.
|
|
80
|
+
if (!process.stdout.isTTY || !process.stdin.isTTY)
|
|
81
|
+
return;
|
|
82
|
+
const latest = await resolveLatestVersion(Date.now());
|
|
83
|
+
if (!latest)
|
|
84
|
+
return;
|
|
85
|
+
if (compareVersions(latest, BUILD_INFO.version) <= 0)
|
|
86
|
+
return;
|
|
87
|
+
process.stderr.write(`\nA new version of ptv is available: v${BUILD_INFO.version} → v${latest}\n`);
|
|
88
|
+
const proceed = await promptYesNo('Update now?', { defaultYes: true });
|
|
89
|
+
if (!proceed) {
|
|
90
|
+
process.stderr.write('Skipped - you will be reminded again later.\n');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
await installUpdate(latest);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// An update nudge must never disrupt or fail the actual command.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=update-notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../src/update-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,wCAAwC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAS1E,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,OAAe,UAAU;IACjD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5E,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,KAAkB,EAAE,OAAe,UAAU;IACtE,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CACxB,KAAyB,EACzB,GAAW,EACX,aAAqB,iBAAiB;IAEtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC1C,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;QAClE,OAAO,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAOD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAsB;IAC/D,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO;QAC1B,qEAAqE;QACrE,wCAAwC;QACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO;QAE1D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO;QAE7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C,UAAU,CAAC,OAAO,OAAO,MAAM,IAAI,CAC9E,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Updater - npm registry primitives for the automatic update check.
|
|
3
|
+
*
|
|
4
|
+
* The orchestration (throttling, cache, the user-facing nudge) lives in
|
|
5
|
+
* update-notifier.ts; this module just provides the building blocks.
|
|
6
|
+
*/
|
|
7
|
+
/** npm registry endpoint for the package's latest published version. */
|
|
8
|
+
export declare const REGISTRY_URL: string;
|
|
9
|
+
/** Default timeout for the registry request, in milliseconds. */
|
|
10
|
+
export declare const FETCH_TIMEOUT_MS = 3000;
|
|
11
|
+
/**
|
|
12
|
+
* Compare two dotted version strings.
|
|
13
|
+
* Returns 1 if a > b, -1 if a < b, 0 if equal. Non-numeric parts count as 0.
|
|
14
|
+
*/
|
|
15
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
16
|
+
/**
|
|
17
|
+
* Fetch the latest published version string from the npm registry.
|
|
18
|
+
* Aborts after `timeoutMs` so a slow network never stalls the CLI.
|
|
19
|
+
*/
|
|
20
|
+
export declare function fetchLatestVersion(url?: string, timeoutMs?: number): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Install the given version globally, showing a progress spinner.
|
|
23
|
+
* Returns the process exit code (0 on success, 1 on failure).
|
|
24
|
+
*/
|
|
25
|
+
export declare function installUpdate(latest: string): Promise<number>;
|
|
26
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wEAAwE;AACxE,eAAO,MAAM,YAAY,QAAyD,CAAC;AAEnF,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,GAAE,MAAqB,EAC1B,SAAS,GAAE,MAAyB,GACnC,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAkBD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnE"}
|
package/dist/updater.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Updater - npm registry primitives for the automatic update check.
|
|
3
|
+
*
|
|
4
|
+
* The orchestration (throttling, cache, the user-facing nudge) lives in
|
|
5
|
+
* update-notifier.ts; this module just provides the building blocks.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { BUILD_INFO } from './build-info.js';
|
|
9
|
+
import { Spinner } from './spinner.js';
|
|
10
|
+
/** npm registry endpoint for the package's latest published version. */
|
|
11
|
+
export const REGISTRY_URL = `https://registry.npmjs.org/${BUILD_INFO.name}/latest`;
|
|
12
|
+
/** Default timeout for the registry request, in milliseconds. */
|
|
13
|
+
export const FETCH_TIMEOUT_MS = 3000;
|
|
14
|
+
/**
|
|
15
|
+
* Compare two dotted version strings.
|
|
16
|
+
* Returns 1 if a > b, -1 if a < b, 0 if equal. Non-numeric parts count as 0.
|
|
17
|
+
*/
|
|
18
|
+
export function compareVersions(a, b) {
|
|
19
|
+
const pa = a.split('.').map(n => parseInt(n, 10) || 0);
|
|
20
|
+
const pb = b.split('.').map(n => parseInt(n, 10) || 0);
|
|
21
|
+
const length = Math.max(pa.length, pb.length);
|
|
22
|
+
for (let i = 0; i < length; i++) {
|
|
23
|
+
const da = pa[i] ?? 0;
|
|
24
|
+
const db = pb[i] ?? 0;
|
|
25
|
+
if (da > db)
|
|
26
|
+
return 1;
|
|
27
|
+
if (da < db)
|
|
28
|
+
return -1;
|
|
29
|
+
}
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch the latest published version string from the npm registry.
|
|
34
|
+
* Aborts after `timeoutMs` so a slow network never stalls the CLI.
|
|
35
|
+
*/
|
|
36
|
+
export async function fetchLatestVersion(url = REGISTRY_URL, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(url, {
|
|
41
|
+
headers: { accept: 'application/json' },
|
|
42
|
+
signal: controller.signal,
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`npm registry returned HTTP ${response.status}`);
|
|
46
|
+
}
|
|
47
|
+
const data = (await response.json());
|
|
48
|
+
if (!data.version) {
|
|
49
|
+
throw new Error('npm registry response did not include a version');
|
|
50
|
+
}
|
|
51
|
+
return data.version;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Run `npm install --global <packageSpec>`. Resolves on success. */
|
|
58
|
+
function runNpmInstall(packageSpec) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
61
|
+
const child = spawn(npm, ['install', '--global', packageSpec], { stdio: 'ignore' });
|
|
62
|
+
child.on('error', reject);
|
|
63
|
+
child.on('close', code => {
|
|
64
|
+
if (code === 0) {
|
|
65
|
+
resolve();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
reject(new Error(`npm exited with code ${code}`));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Install the given version globally, showing a progress spinner.
|
|
75
|
+
* Returns the process exit code (0 on success, 1 on failure).
|
|
76
|
+
*/
|
|
77
|
+
export async function installUpdate(latest) {
|
|
78
|
+
const { name } = BUILD_INFO;
|
|
79
|
+
const spinner = new Spinner();
|
|
80
|
+
spinner.start(`Updating ptv to v${latest}...`);
|
|
81
|
+
try {
|
|
82
|
+
await runNpmInstall(`${name}@${latest}`);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
86
|
+
spinner.fail(`Update failed: ${reason}`);
|
|
87
|
+
console.error(` Try updating manually: npm install --global ${name}@latest`);
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
spinner.succeed(`Updated ptv to v${latest}. Run it again to use the new version.`);
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
|