@kgdiff/cli 0.0.0-stage → 0.2.0
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/LICENSE +21 -0
- package/README.md +211 -2
- package/dist/apply-command.d.ts +34 -0
- package/dist/apply-command.d.ts.map +1 -0
- package/dist/apply-command.js +137 -0
- package/dist/apply-command.js.map +1 -0
- package/dist/args.d.ts +96 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +463 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +17 -0
- package/dist/bin.js.map +1 -0
- package/dist/diff-command.d.ts +29 -0
- package/dist/diff-command.d.ts.map +1 -0
- package/dist/diff-command.js +236 -0
- package/dist/diff-command.js.map +1 -0
- package/dist/errors.d.ts +48 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +92 -0
- package/dist/errors.js.map +1 -0
- package/dist/help.d.ts +11 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +247 -0
- package/dist/help.js.map +1 -0
- package/dist/html.d.ts +53 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +107 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs.d.ts +54 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +209 -0
- package/dist/inputs.js.map +1 -0
- package/dist/io.d.ts +64 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +2 -0
- package/dist/io.js.map +1 -0
- package/dist/locale.d.ts +58 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +121 -0
- package/dist/locale.js.map +1 -0
- package/dist/main.d.ts +10 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +51 -0
- package/dist/main.js.map +1 -0
- package/dist/markdown.d.ts +30 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +93 -0
- package/dist/markdown.js.map +1 -0
- package/dist/model.d.ts +63 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +151 -0
- package/dist/model.js.map +1 -0
- package/dist/node-io.d.ts +12 -0
- package/dist/node-io.d.ts.map +1 -0
- package/dist/node-io.js +135 -0
- package/dist/node-io.js.map +1 -0
- package/dist/output.d.ts +27 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +50 -0
- package/dist/output.js.map +1 -0
- package/dist/overwrite.d.ts +14 -0
- package/dist/overwrite.d.ts.map +1 -0
- package/dist/overwrite.js +55 -0
- package/dist/overwrite.js.map +1 -0
- package/dist/report.d.ts +52 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +64 -0
- package/dist/report.js.map +1 -0
- package/dist/style.d.ts +46 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +140 -0
- package/dist/style.js.map +1 -0
- package/dist/summary.d.ts +40 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +352 -0
- package/dist/summary.js.map +1 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/dist/width.d.ts +45 -0
- package/dist/width.d.ts.map +1 -0
- package/dist/width.js +232 -0
- package/dist/width.js.map +1 -0
- package/package.json +56 -3
- package/src/apply-command.ts +203 -0
- package/src/args.ts +605 -0
- package/src/bin.ts +22 -0
- package/src/diff-command.ts +299 -0
- package/src/errors.ts +131 -0
- package/src/help.ts +286 -0
- package/src/html.ts +145 -0
- package/src/index.ts +71 -0
- package/src/inputs.ts +269 -0
- package/src/io.ts +68 -0
- package/src/locale.ts +177 -0
- package/src/main.ts +56 -0
- package/src/markdown.ts +119 -0
- package/src/model.ts +181 -0
- package/src/node-io.ts +146 -0
- package/src/output.ts +81 -0
- package/src/overwrite.ts +75 -0
- package/src/report.ts +101 -0
- package/src/style.ts +164 -0
- package/src/summary.ts +440 -0
- package/src/version.ts +21 -0
- package/src/width.ts +222 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kgdiff <before> <after>`: read, parse, diff, then write every requested output.
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { diff, diffToJSON, } from '@kgdiff/core';
|
|
6
|
+
import { STDIO } from './args.js';
|
|
7
|
+
import { CliError, describeError, formatWarning, isKgdiffError } from './errors.js';
|
|
8
|
+
import { parseInput, readInput, readPair, resolvePath } from './inputs.js';
|
|
9
|
+
import { messages } from './locale.js';
|
|
10
|
+
import { overview } from './model.js';
|
|
11
|
+
import { outputContext, writeOutputFile } from './output.js';
|
|
12
|
+
import { checkNoOverwrite } from './overwrite.js';
|
|
13
|
+
import { renderNameStatus, renderStat, renderSummary, totalsText, } from './summary.js';
|
|
14
|
+
import { cliVersion } from './version.js';
|
|
15
|
+
import { sanitize } from './width.js';
|
|
16
|
+
/** Upper bound of the layout width, however wide the terminal. */
|
|
17
|
+
const MAX_WIDTH = 120;
|
|
18
|
+
/** Narrowest layout: below it lines are laid out for 40 columns (and wrap in the terminal). */
|
|
19
|
+
export const MIN_WIDTH = 40;
|
|
20
|
+
/** Width assumed when stdout is not a terminal and `COLUMNS` is unset. */
|
|
21
|
+
const PIPE_WIDTH = 120;
|
|
22
|
+
/**
|
|
23
|
+
* Columns available for text output: the terminal width on a TTY (falling back to `COLUMNS`,
|
|
24
|
+
* then 80, when the terminal reports none), else `COLUMNS` or 120; clamped to 40–120.
|
|
25
|
+
*/
|
|
26
|
+
export function outputWidth(io) {
|
|
27
|
+
const fromEnv = Number(io.env.COLUMNS);
|
|
28
|
+
const env = Number.isFinite(fromEnv) && fromEnv > 0 ? fromEnv : undefined;
|
|
29
|
+
const terminal = io.columns !== undefined && io.columns > 0 ? io.columns : undefined;
|
|
30
|
+
const columns = io.isTTY ? (terminal ?? env ?? 80) : (env ?? PIPE_WIDTH);
|
|
31
|
+
return Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, Math.floor(columns)));
|
|
32
|
+
}
|
|
33
|
+
/** Display name of one side: `name version` from graph meta, else the file name. */
|
|
34
|
+
export function graphLabel(meta, input) {
|
|
35
|
+
const name = typeof meta?.name === 'string' && meta.name.trim() ? meta.name.trim() : undefined;
|
|
36
|
+
const version = typeof meta?.version === 'string' && meta.version.trim() ? meta.version.trim() : undefined;
|
|
37
|
+
if (name && version)
|
|
38
|
+
return `${name} ${version}`;
|
|
39
|
+
return name ?? input.display;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Default title: `name v1 → v2` when both sides share a name, `label → label` when their
|
|
43
|
+
* labels differ, else the inputs as given (`a/g.json → b/g.json`).
|
|
44
|
+
*/
|
|
45
|
+
export function defaultTitle(before, after) {
|
|
46
|
+
const lb = graphLabel(before.meta, before.input);
|
|
47
|
+
const la = graphLabel(after.meta, after.input);
|
|
48
|
+
const nb = before.meta?.name;
|
|
49
|
+
const vb = before.meta?.version;
|
|
50
|
+
const va = after.meta?.version;
|
|
51
|
+
if (typeof nb === 'string' &&
|
|
52
|
+
nb.trim() &&
|
|
53
|
+
nb === after.meta?.name &&
|
|
54
|
+
typeof vb === 'string' &&
|
|
55
|
+
typeof va === 'string' &&
|
|
56
|
+
vb.trim() &&
|
|
57
|
+
va.trim() &&
|
|
58
|
+
vb !== va) {
|
|
59
|
+
return `${nb.trim()} ${vb.trim()} → ${va.trim()}`;
|
|
60
|
+
}
|
|
61
|
+
return lb !== la ? `${lb} → ${la}` : `${before.input.display} → ${after.input.display}`;
|
|
62
|
+
}
|
|
63
|
+
function reportParseWarnings(ctx, input, warnings) {
|
|
64
|
+
const byCode = new Map();
|
|
65
|
+
for (const w of warnings)
|
|
66
|
+
byCode.set(w.code, [...(byCode.get(w.code) ?? []), w]);
|
|
67
|
+
for (const list of byCode.values()) {
|
|
68
|
+
const first = list[0];
|
|
69
|
+
const where = first.line !== undefined ? `${input.display}:${first.line}` : input.display;
|
|
70
|
+
const more = list.length > 1 ? ` (and ${list.length - 1} more like this)` : '';
|
|
71
|
+
ctx.notice(formatWarning(`${where}: ${sanitize(first.message)}${more}`, ctx.errPaint));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function reportIssues(ctx, input, issues) {
|
|
75
|
+
const byCode = new Map();
|
|
76
|
+
for (const issue of issues)
|
|
77
|
+
byCode.set(issue.code, [...(byCode.get(issue.code) ?? []), issue]);
|
|
78
|
+
for (const list of byCode.values()) {
|
|
79
|
+
const first = list[0];
|
|
80
|
+
const more = list.length > 1 ? ` (and ${list.length - 1} more like this)` : '';
|
|
81
|
+
ctx.notice(formatWarning(`${input.display}: ${sanitize(first.message)}${more}`, ctx.errPaint));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function checkOutputPaths(o, io) {
|
|
85
|
+
return checkNoOverwrite(io, [
|
|
86
|
+
{ role: '<before>', path: o.before },
|
|
87
|
+
{ role: '<after>', path: o.after },
|
|
88
|
+
], [
|
|
89
|
+
{ role: '--json', path: o.json },
|
|
90
|
+
{ role: '--delta', path: o.delta },
|
|
91
|
+
{ role: '--markdown', path: o.markdown },
|
|
92
|
+
{ role: '--html', path: o.html },
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
function json(value, pretty) {
|
|
96
|
+
return `${JSON.stringify(value, null, pretty ? 2 : undefined)}\n`;
|
|
97
|
+
}
|
|
98
|
+
function runDiffEngine(before, after, o) {
|
|
99
|
+
try {
|
|
100
|
+
return diff(before.graph, after.graph, o.diff);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (isKgdiffError(error) && error.code === 'invalid-input') {
|
|
104
|
+
throw new CliError('input', error.message, 'Check the diff options. Run `kgdiff --help` for usage.', {
|
|
105
|
+
cause: error,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Short description of the diff (HTML meta description and `<noscript>`). */
|
|
112
|
+
export function describeDiff(result, locale) {
|
|
113
|
+
const m = messages(locale);
|
|
114
|
+
const ov = overview(result);
|
|
115
|
+
const totals = totalsText(result, m);
|
|
116
|
+
return ov.hunks === 0
|
|
117
|
+
? `${m.identical} · ${totals}`
|
|
118
|
+
: `${m.changes(ov.changes, ov.hunks)} · ${totals}`;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The viewer's compute add-on for reports laid out around their changes, unless
|
|
122
|
+
* `--no-compute`. A missing add-on only costs the ability to expand collapsed groups, so it is
|
|
123
|
+
* a warning, not an error.
|
|
124
|
+
*/
|
|
125
|
+
async function loadCompute(o, io, ctx) {
|
|
126
|
+
if (!o.compute)
|
|
127
|
+
return undefined;
|
|
128
|
+
try {
|
|
129
|
+
return await io.loadViewerBundle('compute');
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
ctx.notice(formatWarning(`${describeError(error).message} The report is written without it: collapsed groups cannot be expanded. Pass --no-compute to skip it.`, ctx.errPaint));
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Run the diff command. Returns the exit code. */
|
|
137
|
+
export async function runDiff(o, io) {
|
|
138
|
+
const ctx = outputContext(io, o);
|
|
139
|
+
await checkOutputPaths(o, io);
|
|
140
|
+
const wantsHtml = o.html !== undefined || o.open;
|
|
141
|
+
// Fail fast, before any parsing, when the HTML report cannot be built.
|
|
142
|
+
const bundle = wantsHtml ? await io.loadViewerBundle('main') : undefined;
|
|
143
|
+
const [beforeInput, afterInput] = await readPair(readInput(io, o.before, '<before>', { allowEmpty: o.allowEmpty }), readInput(io, o.after, '<after>', { allowEmpty: o.allowEmpty }));
|
|
144
|
+
const before = parseInput(beforeInput, {
|
|
145
|
+
format: o.beforeFormat,
|
|
146
|
+
formatFlag: o.beforeFormat === o.afterFormat ? '--format' : '--before-format',
|
|
147
|
+
...(o.languages ? { languages: o.languages } : {}),
|
|
148
|
+
});
|
|
149
|
+
const after = parseInput(afterInput, {
|
|
150
|
+
format: o.afterFormat,
|
|
151
|
+
formatFlag: o.beforeFormat === o.afterFormat ? '--format' : '--after-format',
|
|
152
|
+
...(o.languages ? { languages: o.languages } : {}),
|
|
153
|
+
});
|
|
154
|
+
reportParseWarnings(ctx, beforeInput, before.warnings);
|
|
155
|
+
reportParseWarnings(ctx, afterInput, after.warnings);
|
|
156
|
+
const result = runDiffEngine(before, after, o);
|
|
157
|
+
reportIssues(ctx, beforeInput, result.before.issues);
|
|
158
|
+
reportIssues(ctx, afterInput, result.after.issues);
|
|
159
|
+
const title = o.title ??
|
|
160
|
+
defaultTitle({ meta: before.graph.meta, input: beforeInput }, { meta: after.graph.meta, input: afterInput });
|
|
161
|
+
const generator = `kgdiff ${cliVersion()}`;
|
|
162
|
+
// HTML: written to -o, or to a temporary file when only --open was given.
|
|
163
|
+
let htmlPath = o.html;
|
|
164
|
+
if (htmlPath === undefined && o.open) {
|
|
165
|
+
// A fresh private directory (mkdtemp): no predictable path another user could pre-create.
|
|
166
|
+
htmlPath = join(await io.makeTempDir(), 'kgdiff-report.html');
|
|
167
|
+
}
|
|
168
|
+
const files = [];
|
|
169
|
+
let stdoutText;
|
|
170
|
+
if (o.json !== undefined && o.json !== STDIO) {
|
|
171
|
+
files.push({ path: o.json, content: json(diffToJSON(result), o.pretty), label: 'diff' });
|
|
172
|
+
}
|
|
173
|
+
if (o.delta !== undefined && o.delta !== STDIO) {
|
|
174
|
+
files.push({ path: o.delta, content: json(result.delta, o.pretty), label: 'delta' });
|
|
175
|
+
}
|
|
176
|
+
if (o.markdown !== undefined) {
|
|
177
|
+
const { renderMarkdown } = await import('./markdown.js');
|
|
178
|
+
const md = renderMarkdown(result, { locale: ctx.locale, title, generator });
|
|
179
|
+
if (o.markdown !== STDIO)
|
|
180
|
+
files.push({ path: o.markdown, content: md, label: 'Markdown summary' });
|
|
181
|
+
else
|
|
182
|
+
stdoutText = md;
|
|
183
|
+
}
|
|
184
|
+
if (bundle !== undefined && htmlPath !== undefined) {
|
|
185
|
+
const { buildReportHtml } = await import('./report.js');
|
|
186
|
+
const html = await buildReportHtml(result, {
|
|
187
|
+
title,
|
|
188
|
+
generator,
|
|
189
|
+
...(o.reproducible ? {} : { generatedAt: io.now().toISOString() }),
|
|
190
|
+
before: { name: graphLabel(before.graph.meta, beforeInput), format: before.format },
|
|
191
|
+
after: { name: graphLabel(after.graph.meta, afterInput), format: after.format },
|
|
192
|
+
view: {
|
|
193
|
+
...(o.mode ? { mode: o.mode } : {}),
|
|
194
|
+
...(o.theme ? { theme: o.theme } : {}),
|
|
195
|
+
locale: ctx.locale,
|
|
196
|
+
},
|
|
197
|
+
}, { main: bundle, compute: () => loadCompute(o, io, ctx) }, describeDiff(result, ctx.locale));
|
|
198
|
+
files.push({ path: htmlPath, content: html, label: 'report' });
|
|
199
|
+
}
|
|
200
|
+
for (const file of files)
|
|
201
|
+
await writeOutputFile(ctx, file.path, file.content, file.label);
|
|
202
|
+
if (o.open && htmlPath !== undefined) {
|
|
203
|
+
try {
|
|
204
|
+
await io.openFile(resolvePath(io, htmlPath));
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
ctx.notice(formatWarning(`Could not open the report (${error instanceof Error ? error.message : String(error)}). Open ${sanitize(htmlPath)} manually.`, ctx.errPaint));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (stdoutText === undefined && !o.quiet) {
|
|
211
|
+
const text = {
|
|
212
|
+
paint: ctx.paint,
|
|
213
|
+
locale: ctx.locale,
|
|
214
|
+
width: outputWidth(io),
|
|
215
|
+
limit: o.limit,
|
|
216
|
+
};
|
|
217
|
+
if (o.json === STDIO)
|
|
218
|
+
stdoutText = json(diffToJSON(result), o.pretty);
|
|
219
|
+
else if (o.delta === STDIO)
|
|
220
|
+
stdoutText = json(result.delta, o.pretty);
|
|
221
|
+
else if (o.stat || o.nameStatus) {
|
|
222
|
+
const parts = [];
|
|
223
|
+
if (o.stat)
|
|
224
|
+
parts.push(renderStat(result, title, text));
|
|
225
|
+
if (o.nameStatus)
|
|
226
|
+
parts.push(renderNameStatus(result, text, io.isTTY));
|
|
227
|
+
stdoutText = parts.filter(Boolean).join('\n');
|
|
228
|
+
}
|
|
229
|
+
else
|
|
230
|
+
stdoutText = renderSummary(result, title, text);
|
|
231
|
+
}
|
|
232
|
+
if (stdoutText !== undefined)
|
|
233
|
+
ctx.stdout(stdoutText);
|
|
234
|
+
return o.exitCode && !result.stats.identical ? 1 : 0;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=diff-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-command.js","sourceRoot":"","sources":["../src/diff-command.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error reporting: every failure becomes one friendly line on stderr (plus a hint), exit code 2.
|
|
3
|
+
* Stack traces only with `DEBUG=kgdiff`.
|
|
4
|
+
*/
|
|
5
|
+
import type { Painter } from './style.js';
|
|
6
|
+
export type CliErrorCode =
|
|
7
|
+
/** Bad command line. */
|
|
8
|
+
'usage'
|
|
9
|
+
/** A file or stdin could not be read, or its content is not a graph / delta. */
|
|
10
|
+
| 'input'
|
|
11
|
+
/** An output file could not be written. */
|
|
12
|
+
| 'output'
|
|
13
|
+
/** The standalone viewer bundle is missing. */
|
|
14
|
+
| 'viewer-missing';
|
|
15
|
+
/** An error with a message meant for the user and an optional hint on how to fix it. */
|
|
16
|
+
export declare class CliError extends Error {
|
|
17
|
+
readonly code: CliErrorCode;
|
|
18
|
+
readonly hint?: string | undefined;
|
|
19
|
+
readonly name = "CliError";
|
|
20
|
+
constructor(code: CliErrorCode, message: string, hint?: string | undefined, options?: {
|
|
21
|
+
readonly cause?: unknown;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** Shape of `KgdiffError` (checked structurally so `--help` never loads `@kgdiff/core`). */
|
|
25
|
+
interface KgdiffErrorLike {
|
|
26
|
+
readonly name: 'KgdiffError';
|
|
27
|
+
readonly code: string;
|
|
28
|
+
readonly message: string;
|
|
29
|
+
readonly details?: Readonly<Record<string, unknown>>;
|
|
30
|
+
}
|
|
31
|
+
export declare function isKgdiffError(error: unknown): error is KgdiffErrorLike;
|
|
32
|
+
/** Node.js system error code (`ENOENT`, `EACCES`…), if any. */
|
|
33
|
+
export declare function systemErrorCode(error: unknown): string | undefined;
|
|
34
|
+
/** Short human reason for a system error code. */
|
|
35
|
+
export declare function systemReason(error: unknown): string;
|
|
36
|
+
/** User-facing message and hint for any thrown value. */
|
|
37
|
+
export declare function describeError(error: unknown): {
|
|
38
|
+
message: string;
|
|
39
|
+
hint?: string;
|
|
40
|
+
};
|
|
41
|
+
/** True when `DEBUG` enables kgdiff diagnostics (`kgdiff`, `kgdiff*`, `*`, comma-separated). */
|
|
42
|
+
export declare function debugEnabled(debug: string | undefined): boolean;
|
|
43
|
+
/** The text written to stderr for an error (ends with a newline). */
|
|
44
|
+
export declare function formatError(error: unknown, paint: Painter, debug: boolean): string;
|
|
45
|
+
/** A warning line for stderr. */
|
|
46
|
+
export declare function formatWarning(message: string, paint: Painter): string;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,MAAM,MAAM,YAAY;AACtB,wBAAwB;AACtB,OAAO;AACT,gFAAgF;GAC9E,OAAO;AACT,2CAA2C;GACzC,QAAQ;AACV,+CAA+C;GAC7C,gBAAgB,CAAC;AAErB,wFAAwF;AACxF,qBAAa,QAAS,SAAQ,KAAK;IAG/B,QAAQ,CAAC,IAAI,EAAE,YAAY;IAE3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAJxB,SAAkB,IAAI,cAAc;IACpC,YACW,IAAI,EAAE,YAAY,EAC3B,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA,EACtB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,EAGvC;CACF;AAED,4FAA4F;AAC5F,UAAU,eAAe;IACvB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAMtE;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGlE;AAcD,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGnD;AAYD,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAchF;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI/D;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAoBlF;AAED,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAErE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { sanitize, sanitizeLines } from './width.js';
|
|
2
|
+
/** An error with a message meant for the user and an optional hint on how to fix it. */
|
|
3
|
+
export class CliError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
hint;
|
|
6
|
+
name = 'CliError';
|
|
7
|
+
constructor(code, message, hint, options) {
|
|
8
|
+
super(message, options);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.hint = hint;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function isKgdiffError(error) {
|
|
14
|
+
return (error instanceof Error &&
|
|
15
|
+
error.name === 'KgdiffError' &&
|
|
16
|
+
typeof error.code === 'string');
|
|
17
|
+
}
|
|
18
|
+
/** Node.js system error code (`ENOENT`, `EACCES`…), if any. */
|
|
19
|
+
export function systemErrorCode(error) {
|
|
20
|
+
const code = error?.code;
|
|
21
|
+
return typeof code === 'string' && /^E[A-Z]+$/.test(code) ? code : undefined;
|
|
22
|
+
}
|
|
23
|
+
const SYSTEM_REASONS = {
|
|
24
|
+
ENOENT: 'no such file or directory',
|
|
25
|
+
EISDIR: 'is a directory',
|
|
26
|
+
ENOTDIR: 'a path component is not a directory',
|
|
27
|
+
EACCES: 'permission denied',
|
|
28
|
+
EPERM: 'operation not permitted',
|
|
29
|
+
EROFS: 'read-only file system',
|
|
30
|
+
ENOSPC: 'no space left on device',
|
|
31
|
+
EMFILE: 'too many open files',
|
|
32
|
+
EEXIST: 'file already exists',
|
|
33
|
+
};
|
|
34
|
+
/** Short human reason for a system error code. */
|
|
35
|
+
export function systemReason(error) {
|
|
36
|
+
const code = systemErrorCode(error);
|
|
37
|
+
return (code && SYSTEM_REASONS[code]) ?? (error instanceof Error ? error.message : String(error));
|
|
38
|
+
}
|
|
39
|
+
const KGDIFF_HINTS = {
|
|
40
|
+
'delta-base-mismatch': 'The delta was made for a different version of this graph. Use --no-strict to apply it anyway.',
|
|
41
|
+
'delta-conflict': 'The graph changed since the delta was made. --no-strict skips the failing operations.',
|
|
42
|
+
'unsupported-version': 'Upgrade kgdiff (npm install -g @kgdiff/cli@latest), or check that the file is a kgdiff delta.',
|
|
43
|
+
'dangling-edge': 'An edge refers to a node the graph does not define.',
|
|
44
|
+
};
|
|
45
|
+
/** User-facing message and hint for any thrown value. */
|
|
46
|
+
export function describeError(error) {
|
|
47
|
+
if (error instanceof CliError) {
|
|
48
|
+
return error.hint ? { message: error.message, hint: error.hint } : { message: error.message };
|
|
49
|
+
}
|
|
50
|
+
if (isKgdiffError(error)) {
|
|
51
|
+
const hint = KGDIFF_HINTS[error.code];
|
|
52
|
+
return hint ? { message: error.message, hint } : { message: error.message };
|
|
53
|
+
}
|
|
54
|
+
const code = systemErrorCode(error);
|
|
55
|
+
if (code)
|
|
56
|
+
return { message: systemReason(error) };
|
|
57
|
+
return {
|
|
58
|
+
message: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
|
|
59
|
+
hint: 'This is a bug in kgdiff. Run again with DEBUG=kgdiff and report the output.',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** True when `DEBUG` enables kgdiff diagnostics (`kgdiff`, `kgdiff*`, `*`, comma-separated). */
|
|
63
|
+
export function debugEnabled(debug) {
|
|
64
|
+
return (debug ?? '')
|
|
65
|
+
.split(/[\s,]+/)
|
|
66
|
+
.some((d) => d === '*' || d === 'kgdiff' || d === 'kgdiff*' || d === 'kgdiff:*');
|
|
67
|
+
}
|
|
68
|
+
/** The text written to stderr for an error (ends with a newline). */
|
|
69
|
+
export function formatError(error, paint, debug) {
|
|
70
|
+
// Messages quote user input (paths, parser snippets, JSON.parse excerpts): never let it
|
|
71
|
+
// carry escape sequences or bidi controls to the terminal.
|
|
72
|
+
const { message, hint } = describeError(error);
|
|
73
|
+
const lines = [`${paint.bold(paint.tone('removed', 'error:'))} ${sanitize(message)}`];
|
|
74
|
+
if (hint)
|
|
75
|
+
lines.push(`${paint.tone('accent', 'hint:')} ${sanitize(hint)}`);
|
|
76
|
+
if (debug) {
|
|
77
|
+
let current = error;
|
|
78
|
+
for (let depth = 0; current instanceof Error && depth < 5; depth++) {
|
|
79
|
+
lines.push('', paint.dim(sanitizeLines(current.stack ?? `${current.name}: ${current.message}`)));
|
|
80
|
+
if (isKgdiffError(current) && current.details) {
|
|
81
|
+
lines.push(paint.dim(sanitize(`details: ${JSON.stringify(current.details)}`)));
|
|
82
|
+
}
|
|
83
|
+
current = current.cause;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return `${lines.join('\n')}\n`;
|
|
87
|
+
}
|
|
88
|
+
/** A warning line for stderr. */
|
|
89
|
+
export function formatWarning(message, paint) {
|
|
90
|
+
return `${paint.bold(paint.tone('content', 'warning:'))} ${sanitize(message)}\n`;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/help.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kgdiff --help` and `kgdiff apply --help`: grouped options, defaults, examples and exit
|
|
3
|
+
* codes, aligned and wrapped to the terminal width.
|
|
4
|
+
*/
|
|
5
|
+
import type { Painter } from './style.js';
|
|
6
|
+
/**
|
|
7
|
+
* Render help text. `width` is the terminal width (descriptions wrap to it; below 60 columns
|
|
8
|
+
* they go under their flags).
|
|
9
|
+
*/
|
|
10
|
+
export declare function renderHelp(topic: 'main' | 'apply', version: string, paint: Painter, width: number): string;
|
|
11
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAuN1C;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,OAAO,EACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,MAAM,CAyDR"}
|