hacksh 0.17.0 → 0.18.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/README.md +58 -5
- package/dist/{command-t16M3-AZ.d.ts → command-Czf4qXhe.d.ts} +23 -8
- package/dist/index.d.ts +2 -2
- package/dist/index.js +91 -18
- package/dist/index.js.map +1 -1
- package/dist/{pretty-Db7-kATM.js → pretty-BjzGnVLM.js} +97 -32
- package/dist/pretty-BjzGnVLM.js.map +1 -0
- package/dist/printer-api.d.ts +2 -2
- package/dist/printer-api.js +1 -1
- package/package.json +3 -1
- package/dist/pretty-Db7-kATM.js.map +0 -1
|
@@ -916,7 +916,7 @@ function eventLines(event) {
|
|
|
916
916
|
case "prompt": {
|
|
917
917
|
const { prompt } = event;
|
|
918
918
|
if (prompt.status === "submitted") {
|
|
919
|
-
const result = prompt.kind === "select" ? prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value : prompt.kind === "confirm" ? prompt.value ? "Yes" : "No" : prompt.value;
|
|
919
|
+
const result = prompt.kind === "select" || prompt.kind === "autocomplete" ? prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value : prompt.kind === "confirm" ? prompt.value ? "Yes" : "No" : prompt.value;
|
|
920
920
|
return [`${prompt.message}: ${result}`];
|
|
921
921
|
}
|
|
922
922
|
const lines = [prompt.message];
|
|
@@ -937,37 +937,49 @@ function colorize(enabled, style, text) {
|
|
|
937
937
|
return enabled ? styleText(style, text, { validateStream: false }) : text;
|
|
938
938
|
}
|
|
939
939
|
const graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
940
|
-
const
|
|
941
|
-
const
|
|
940
|
+
const invisibleGrapheme = /^[\p{Mark}\p{Cf}]+$/u;
|
|
941
|
+
const combiningMark = /[\p{Mark}\p{Cf}]/u;
|
|
942
|
+
const emoji = /\p{Extended_Pictographic}|\p{Regional_Indicator}|\u20e3/u;
|
|
942
943
|
function isWideCodePoint(codePoint) {
|
|
943
944
|
return codePoint >= 4352 && (codePoint <= 4447 || codePoint === 9001 || codePoint === 9002 || codePoint >= 11904 && codePoint <= 42191 && codePoint !== 12351 || codePoint >= 44032 && codePoint <= 55203 || codePoint >= 63744 && codePoint <= 64255 || codePoint >= 65040 && codePoint <= 65049 || codePoint >= 65072 && codePoint <= 65135 || codePoint >= 65280 && codePoint <= 65376 || codePoint >= 65504 && codePoint <= 65510 || codePoint >= 131072 && codePoint <= 262141);
|
|
944
945
|
}
|
|
945
|
-
function
|
|
946
|
-
|
|
946
|
+
function terminalPosition(text, columns) {
|
|
947
|
+
const width = Number.isInteger(columns) && columns !== void 0 && columns > 0 ? columns : void 0;
|
|
948
|
+
let row = 0;
|
|
949
|
+
let column = 0;
|
|
947
950
|
for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {
|
|
948
|
-
if (segment === "
|
|
949
|
-
|
|
951
|
+
if (segment === "\n" || segment === "\r\n") {
|
|
952
|
+
row += 1;
|
|
953
|
+
column = 0;
|
|
950
954
|
continue;
|
|
951
955
|
}
|
|
952
|
-
if (
|
|
953
|
-
|
|
956
|
+
if (segment === "\r") {
|
|
957
|
+
column = 0;
|
|
954
958
|
continue;
|
|
955
959
|
}
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
960
|
+
if (invisibleGrapheme.test(segment)) continue;
|
|
961
|
+
let cells = 0;
|
|
962
|
+
if (segment === " ") cells = 8 - column % 8;
|
|
963
|
+
else if (emoji.test(segment) || isWideCodePoint(segment.codePointAt(0))) cells = 2;
|
|
964
|
+
else for (const value of segment) {
|
|
965
|
+
const point = value.codePointAt(0);
|
|
966
|
+
if (point < 32 || point >= 127 && point < 160) continue;
|
|
967
|
+
if (!combiningMark.test(value)) cells += 1;
|
|
968
|
+
}
|
|
969
|
+
if (cells === 0) continue;
|
|
970
|
+
if (width && column + cells > width) {
|
|
971
|
+
row += 1;
|
|
972
|
+
column = 0;
|
|
961
973
|
}
|
|
974
|
+
column += width ? Math.min(cells, width) : cells;
|
|
962
975
|
}
|
|
963
|
-
return
|
|
976
|
+
return {
|
|
977
|
+
row,
|
|
978
|
+
column
|
|
979
|
+
};
|
|
964
980
|
}
|
|
965
981
|
function renderedRows(rendered, columns) {
|
|
966
|
-
|
|
967
|
-
return rendered.split("\n").reduce((rows, line) => {
|
|
968
|
-
if (!width) return rows + 1;
|
|
969
|
-
return rows + Math.max(1, Math.ceil(displayWidth(line) / width));
|
|
970
|
-
}, 0);
|
|
982
|
+
return terminalPosition(rendered, columns).row + 1;
|
|
971
983
|
}
|
|
972
984
|
/** Create the fixed human-readable renderer used for pretty output. */
|
|
973
985
|
function createPrettyPrinter(options) {
|
|
@@ -979,8 +991,26 @@ function createPrettyPrinter(options) {
|
|
|
979
991
|
stderr: options.color
|
|
980
992
|
} : options.color;
|
|
981
993
|
let activePrompt;
|
|
994
|
+
function renderAutocomplete(prompt, color) {
|
|
995
|
+
const bar = colorize(color, "gray", symbols.bar);
|
|
996
|
+
const accent = (text) => colorize(color, "cyan", text);
|
|
997
|
+
const muted = (text) => colorize(color, "gray", text);
|
|
998
|
+
const input = prompt.phase === "input";
|
|
999
|
+
const lines = [
|
|
1000
|
+
`${accent(symbols.marks.prompt)} ${prompt.message}`,
|
|
1001
|
+
`${bar} ${input ? accent(">") : " "} ${prompt.query || muted(prompt.placeholder ?? "")} `,
|
|
1002
|
+
bar
|
|
1003
|
+
];
|
|
1004
|
+
for (const choice of prompt.choices) lines.push(`${bar} ${choice.selected ? accent(">") : " "} ${choice.selected ? accent(choice.label) : choice.label}${choice.hint ? ` ${muted(`— ${choice.hint}`)}` : ""}`);
|
|
1005
|
+
if (prompt.choices.length === 0) lines.push(`${bar} ${muted("No matches. Keep typing or backspace.")}`);
|
|
1006
|
+
lines.push(bar);
|
|
1007
|
+
lines.push(`${bar} ${muted(input ? "INPUT · type to filter · ↓ select · Esc cancel" : "SELECT · ↑/↓ move · Enter choose · Esc edit")}`);
|
|
1008
|
+
if (prompt.error) lines.push(`${bar} ${prompt.error}`);
|
|
1009
|
+
return lines.join("\n");
|
|
1010
|
+
}
|
|
982
1011
|
function render(event) {
|
|
983
1012
|
const color = colors[eventStream(event)];
|
|
1013
|
+
if (event.type === "prompt" && event.prompt.kind === "autocomplete" && event.prompt.status !== "submitted") return renderAutocomplete(event.prompt, color);
|
|
984
1014
|
const mark = eventMark(event);
|
|
985
1015
|
const lines = eventLines(event);
|
|
986
1016
|
const firstPrefix = colorize(color, markStyles[mark], symbols.marks[mark]);
|
|
@@ -988,29 +1018,64 @@ function createPrettyPrinter(options) {
|
|
|
988
1018
|
return lines.map((line, index) => `${index === 0 ? firstPrefix : barPrefix}${line ? ` ${line}` : ""}`).join("\n");
|
|
989
1019
|
}
|
|
990
1020
|
function eraseActivePrompt() {
|
|
991
|
-
|
|
1021
|
+
if (!activePrompt) return "";
|
|
1022
|
+
if (activePrompt.cursor) return `\u001b[?25l${activePrompt.cursor.row > 0 ? `\u001b[${activePrompt.cursor.row}A` : ""}\r\u001b[0J`;
|
|
1023
|
+
return "\x1B[1A\x1B[2K".repeat(activePrompt.lines);
|
|
1024
|
+
}
|
|
1025
|
+
function drawActivePrompt() {
|
|
1026
|
+
if (!activePrompt) return "";
|
|
1027
|
+
const { rendered, lines, cursor } = activePrompt;
|
|
1028
|
+
if (!cursor) return `${rendered}\n`;
|
|
1029
|
+
const up = lines - cursor.row;
|
|
1030
|
+
return `${rendered}\n${up > 0 ? `\u001b[${up}A` : ""}\u001b[${cursor.column + 1}G\u001b[?25${cursor.visible ? "h" : "l"}`;
|
|
1031
|
+
}
|
|
1032
|
+
function finishActivePrompt() {
|
|
1033
|
+
const restore = activePrompt?.cursor ? "\x1B[?25h" : "";
|
|
1034
|
+
activePrompt = void 0;
|
|
1035
|
+
return restore;
|
|
992
1036
|
}
|
|
993
1037
|
return { print(event) {
|
|
994
1038
|
if (event.type === "output") {
|
|
995
1039
|
const erase = eraseActivePrompt();
|
|
996
|
-
|
|
997
|
-
|
|
1040
|
+
const text = outputText(event);
|
|
1041
|
+
stdout.write(`${erase}${text}`);
|
|
1042
|
+
if (activePrompt) {
|
|
1043
|
+
const separator = activePrompt.cursor && text && !text.endsWith("\n") ? "\n" : "";
|
|
1044
|
+
stdout.write(`${separator}${drawActivePrompt()}`);
|
|
1045
|
+
}
|
|
998
1046
|
return;
|
|
999
1047
|
}
|
|
1000
1048
|
const rendered = render(event);
|
|
1001
1049
|
if (event.type === "prompt") {
|
|
1002
1050
|
const erase = eraseActivePrompt();
|
|
1003
1051
|
if (event.prompt.status === "closed") {
|
|
1004
|
-
|
|
1005
|
-
if (erase) stdout.write(erase);
|
|
1052
|
+
const restore = finishActivePrompt();
|
|
1053
|
+
if (erase || restore) stdout.write(`${erase}${restore}`);
|
|
1006
1054
|
return;
|
|
1007
1055
|
}
|
|
1008
|
-
if (event.prompt.status === "submitted")
|
|
1009
|
-
|
|
1056
|
+
if (event.prompt.status === "submitted") {
|
|
1057
|
+
const restore = finishActivePrompt();
|
|
1058
|
+
stdout.write(`${erase}${restore}${rendered}\n`);
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
1061
|
+
const restore = activePrompt?.cursor && event.prompt.kind !== "autocomplete" ? "\x1B[?25h" : "";
|
|
1062
|
+
activePrompt = {
|
|
1010
1063
|
rendered,
|
|
1011
1064
|
lines: renderedRows(rendered, stdout.columns)
|
|
1012
1065
|
};
|
|
1013
|
-
|
|
1066
|
+
if (event.prompt.kind === "autocomplete") {
|
|
1067
|
+
const { prompt } = event;
|
|
1068
|
+
const cursor = terminalPosition(`${symbols.marks.prompt} ${prompt.message}\n${symbols.bar} > ${prompt.query}`, stdout.columns);
|
|
1069
|
+
if (cursor.column === stdout.columns) {
|
|
1070
|
+
cursor.row += 1;
|
|
1071
|
+
cursor.column = 0;
|
|
1072
|
+
}
|
|
1073
|
+
activePrompt.cursor = {
|
|
1074
|
+
...cursor,
|
|
1075
|
+
visible: prompt.phase === "input"
|
|
1076
|
+
};
|
|
1077
|
+
}
|
|
1078
|
+
stdout.write(`${erase}${restore}${drawActivePrompt()}`);
|
|
1014
1079
|
return;
|
|
1015
1080
|
}
|
|
1016
1081
|
const erase = eraseActivePrompt();
|
|
@@ -1018,13 +1083,13 @@ function createPrettyPrinter(options) {
|
|
|
1018
1083
|
(eventStream(event) === "stdout" ? stdout : stderr).write(`${rendered}\n`);
|
|
1019
1084
|
return;
|
|
1020
1085
|
}
|
|
1021
|
-
|
|
1022
|
-
|
|
1086
|
+
const restore = event.type === "error" ? finishActivePrompt() : "";
|
|
1087
|
+
stdout.write(`${erase}${restore}`);
|
|
1023
1088
|
(eventStream(event) === "stdout" ? stdout : stderr).write(`${rendered}\n`);
|
|
1024
|
-
if (activePrompt) stdout.write(
|
|
1089
|
+
if (activePrompt) stdout.write(drawActivePrompt());
|
|
1025
1090
|
} };
|
|
1026
1091
|
}
|
|
1027
1092
|
//#endregion
|
|
1028
1093
|
export { createExec as a, HackshExitError as c, HackshValidationError as d, summarizeError as f, resolveOutputMode as i, HackshPromptError as l, createJsonPrinter as n, HackshError as o, summarizeErrors as p, createPrintQueue as r, HackshExecError as s, createPrettyPrinter as t, HackshUsageError as u };
|
|
1029
1094
|
|
|
1030
|
-
//# sourceMappingURL=pretty-
|
|
1095
|
+
//# sourceMappingURL=pretty-BjzGnVLM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretty-BjzGnVLM.js","names":["#result","safeString"],"sources":["../src/errors.ts","../src/exec.ts","../src/serialization.ts","../src/printer.ts","../src/pretty.ts"],"sourcesContent":["import type { $ZodIssue } from \"zod/v4/core\";\nimport type { AnyCommandDef } from \"./command.ts\";\nimport type { ExecFailure } from \"./exec.ts\";\n\nexport interface HackshIssue {\n arg: string;\n message: string;\n issue?: $ZodIssue;\n}\n\n/** An expected CLI failure that runMain reports; application errors can extend this class. */\nexport class HackshError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class HackshUsageError extends HackshError {\n readonly command: AnyCommandDef;\n\n constructor(message: string, command: AnyCommandDef, options?: ErrorOptions) {\n super(message, options);\n this.command = command;\n }\n}\n\nexport class HackshValidationError extends HackshUsageError {\n readonly issues: ReadonlyArray<HackshIssue>;\n\n constructor(command: AnyCommandDef, issues: ReadonlyArray<HackshIssue>) {\n super(\n `Invalid arguments:\\n${issues.map(({ arg, message }) => ` ${arg}: ${message}`).join(\"\\n\")}`,\n command,\n );\n this.issues = issues;\n }\n}\n\nexport type PromptKind = \"select\" | \"autocomplete\" | \"confirm\" | \"text\";\n\nexport type HackshPromptErrorReason =\n | \"non-interactive\"\n | \"cancelled\"\n | \"aborted\"\n | \"eof\"\n | \"overlapping\"\n | \"invalid-options\"\n | \"input-error\"\n | \"printer-error\";\n\nexport interface PromptErrorDetails {\n kind: PromptKind;\n message: string;\n choices?: readonly string[];\n}\n\n/** An input request that could not be completed safely. */\nexport class HackshPromptError extends HackshError {\n readonly reason: HackshPromptErrorReason;\n readonly prompt: PromptErrorDetails;\n\n constructor(\n reason: HackshPromptErrorReason,\n prompt: PromptErrorDetails,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.reason = reason;\n this.prompt = prompt;\n }\n}\n\n/** An external command that did not succeed; `result` is not enumerable so error summaries omit child output. */\nexport class HackshExecError extends HackshError {\n readonly #result: ExecFailure;\n\n constructor(message: string, result: ExecFailure, options?: ErrorOptions) {\n super(message, options);\n this.#result = result;\n }\n\n get result(): ExecFailure {\n return this.#result;\n }\n}\n\n/** A requested process exit status; `runMain` exits with it and reports only a non-empty message. */\nexport class HackshExitError extends HackshError {\n readonly exitCode: number;\n\n constructor(exitCode: number, message?: string, options?: ErrorOptions) {\n if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > 255) {\n throw new TypeError(\"Exit code must be an integer from 0 to 255\");\n }\n super(message, options);\n this.exitCode = exitCode;\n }\n}\n\nexport type HackshErrorKind = \"error\" | \"prompt\" | \"usage\" | \"validation\" | \"thrown\";\n\nexport interface ValidationIssueSummary {\n arg: string;\n message: string;\n code?: string;\n path?: readonly PropertyKey[];\n details?: Readonly<Record<string, unknown>>;\n}\n\nexport interface HackshErrorSummary {\n kind: HackshErrorKind;\n name: string;\n message: string;\n stack?: string;\n cause?: unknown;\n issues?: readonly ValidationIssueSummary[];\n properties?: Readonly<Record<string, unknown>>;\n value?: unknown;\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\nfunction readProperty(value: object, key: PropertyKey): unknown {\n try {\n return Reflect.get(value, key);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction enumerableKeys(value: object): string[] {\n try {\n return Object.keys(value);\n } catch {\n return [];\n }\n}\n\nfunction hasToJSON(value: object): boolean {\n try {\n return typeof Reflect.get(value, \"toJSON\") === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isPlainObject(value: object): boolean {\n try {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n } catch {\n return false;\n }\n}\n\nfunction summarizeIssue(\n { arg, message, issue }: HackshIssue,\n seen: WeakMap<object, unknown>,\n): ValidationIssueSummary {\n if (!issue) return { arg, message };\n const details: Record<string, unknown> = {};\n for (const key of enumerableKeys(issue)) {\n if ([\"code\", \"path\", \"message\", \"inst\"].includes(key)) continue;\n details[key] = summarizeErrors(readProperty(issue, key), seen);\n }\n const code = readProperty(issue, \"code\");\n const path = readProperty(issue, \"path\");\n return {\n arg,\n message,\n ...(typeof code === \"string\" ? { code } : {}),\n ...(Array.isArray(path) ? { path } : {}),\n ...(Object.keys(details).length === 0 ? {} : { details }),\n };\n}\n\nfunction errorKind(error: Error): HackshErrorKind {\n if (error instanceof HackshPromptError) return \"prompt\";\n if (error instanceof HackshValidationError) return \"validation\";\n if (error instanceof HackshUsageError) return \"usage\";\n return \"error\";\n}\n\nfunction summarizeErrorWithSeen(error: Error, seen: WeakMap<object, unknown>): HackshErrorSummary {\n const summary: HackshErrorSummary = {\n kind: errorKind(error),\n name: safeString(readProperty(error, \"name\"), \"Error\"),\n message: safeString(readProperty(error, \"message\"), \"[Unserializable error message]\"),\n };\n seen.set(error, summary);\n\n const stack = readProperty(error, \"stack\");\n const cause = readProperty(error, \"cause\");\n if (typeof stack === \"string\") summary.stack = stack;\n if (cause !== undefined) summary.cause = summarizeErrors(cause, seen);\n if (error instanceof HackshValidationError) {\n summary.issues = error.issues.map((issue) => summarizeIssue(issue, seen));\n }\n\n const reserved = new Set([\"name\", \"message\", \"stack\", \"cause\", \"command\", \"issues\"]);\n const properties: Record<string, unknown> = {};\n for (const key of enumerableKeys(error)) {\n if (reserved.has(key)) continue;\n properties[key] = summarizeErrors(readProperty(error, key), seen);\n }\n if (Object.keys(properties).length > 0) summary.properties = properties;\n return summary;\n}\n\n/** Recursively replace Error values with command- and schema-free summaries. */\nexport function summarizeErrors(\n value: unknown,\n seen: WeakMap<object, unknown> = new WeakMap(),\n): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const existing = seen.get(value);\n if (existing !== undefined) return existing;\n if (value instanceof Error) return summarizeErrorWithSeen(value, seen);\n\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.push(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Map) {\n const result = new Map<unknown, unknown>();\n seen.set(value, result);\n let changed = false;\n for (const [key, item] of value) {\n const summarizedKey = summarizeErrors(key, seen);\n const summarizedItem = summarizeErrors(item, seen);\n result.set(summarizedKey, summarizedItem);\n changed ||= summarizedKey !== key || summarizedItem !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Set) {\n const result = new Set<unknown>();\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.add(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (ArrayBuffer.isView(value) || hasToJSON(value) || !isPlainObject(value)) return value;\n\n const result: Record<string, unknown> = {};\n seen.set(value, result);\n let changed = false;\n for (const key of enumerableKeys(value)) {\n const original = readProperty(value, key);\n const summarized = summarizeErrors(original, seen);\n result[key] = summarized;\n changed ||= summarized !== original;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n}\n\n/** Convert any thrown value into a canonical error description. */\nexport function summarizeError(error: unknown): HackshErrorSummary {\n if (error instanceof Error) return summarizeErrorWithSeen(error, new WeakMap());\n return {\n kind: \"thrown\",\n name: \"NonErrorThrown\",\n message: safeString(error, \"[Unserializable thrown value]\"),\n value: summarizeErrors(error),\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport { HackshExecError } from \"./errors.ts\";\nimport type { ExecPrintEvent, OutputFormat } from \"./printer.ts\";\nimport { TerminalLock } from \"./terminal.ts\";\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\nexport interface ExecOptions {\n cwd?: string;\n env?: Environment;\n input?: string;\n reject?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n maxBuffer?: number;\n forceKillAfterDelay?: number;\n stdin?: \"pipe\" | \"inherit\";\n stdout?: \"pipe\" | \"inherit\";\n stderr?: \"pipe\" | \"inherit\";\n interactive?: boolean;\n display?: boolean;\n redact?: readonly string[];\n dryRun?: boolean;\n}\n\nexport interface ExecCommand {\n file: string;\n args: readonly string[];\n cwd: string | undefined;\n}\n\nexport interface ExecSuccess {\n status: \"succeeded\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n exitCode: 0;\n}\n\nexport type ExecFailure = {\n status: \"failed\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n} & (\n | { reason: \"exit-code\"; exitCode: number }\n | { reason: \"signal\"; signal: string }\n | { reason: \"spawn\"; error: Error }\n | { reason: \"timeout\" | \"aborted\" | \"output-limit\" }\n | { reason: \"json-output\" | \"non-interactive\" | \"overlapping\" }\n);\n\nexport type ExecFailureReason = ExecFailure[\"reason\"];\n\nexport type ExecResult = ExecSuccess | ExecFailure;\n\nexport interface ExecSkipped {\n status: \"skipped\";\n command: ExecCommand;\n}\n\ntype ExecOutcome<O extends ExecOptions> = \"reject\" extends keyof O\n ? false extends O[\"reject\"]\n ? ExecResult\n : ExecSuccess\n : ExecSuccess;\n\ntype SpecifiedDryRun<O> = \"dryRun\" extends keyof O ? O[\"dryRun\"] : false;\n\ntype ReturnsFailure<O extends ExecOptions> = \"reject\" extends keyof O\n ? false extends O[\"reject\"]\n ? true\n : false\n : false;\n\ntype AbortedFailure = {\n status: \"failed\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n reason: \"aborted\";\n};\n\ntype DefiniteSkip<O extends ExecOptions> =\n ReturnsFailure<O> extends true ? ExecSkipped | AbortedFailure : ExecSkipped;\n\nexport type ExecReturn<O extends ExecOptions> =\n true extends SpecifiedDryRun<O>\n ? false extends SpecifiedDryRun<O>\n ? ExecSkipped | ExecOutcome<O>\n : undefined extends SpecifiedDryRun<O>\n ? ExecSkipped | ExecOutcome<O>\n : DefiniteSkip<O>\n : ExecOutcome<O>;\n\ntype RejectInheritedInput<O> = O extends { input: string; stdin: \"inherit\" } ? never : unknown;\n\nexport type Exec = <const O extends ExecOptions = {}>(\n file: string,\n args?: readonly string[],\n options?: O & { [K in Exclude<keyof O, keyof ExecOptions>]: never } & RejectInheritedInput<O>,\n) => Promise<ExecReturn<O>>;\n\nexport interface ExecContext {\n env: Environment | undefined;\n mode: { format: OutputFormat; interactive: boolean };\n print(event: ExecPrintEvent): void | Promise<void>;\n terminal: TerminalLock;\n signal: AbortSignal;\n}\n\nconst OPTION_KEYS: ReadonlySet<string> = new Set([\n \"cwd\",\n \"env\",\n \"input\",\n \"reject\",\n \"timeout\",\n \"signal\",\n \"maxBuffer\",\n \"forceKillAfterDelay\",\n \"stdin\",\n \"stdout\",\n \"stderr\",\n \"interactive\",\n \"display\",\n \"redact\",\n \"dryRun\",\n] satisfies (keyof ExecOptions)[]);\n\ntype TerminationCause = \"timeout\" | \"aborted\" | \"output-limit\";\ntype StreamMode = \"pipe\" | \"inherit\";\ntype ExecStdio = ExecPrintEvent[\"stdio\"];\ntype RefusalReason = \"aborted\" | \"json-output\" | \"non-interactive\" | \"overlapping\";\n\ninterface SpawnError extends NodeJS.ErrnoException {\n spawnargs?: readonly string[];\n}\n\ninterface ExecPlan {\n command: ExecCommand;\n reported: ExecCommand;\n env: NodeJS.ProcessEnv | undefined;\n input: string | undefined;\n reject: boolean;\n timeout: number | undefined;\n signal: AbortSignal;\n maxBuffer: number;\n forceKillAfterDelay: number;\n stdin: StreamMode;\n stdout: StreamMode;\n stderr: StreamMode;\n interactive: boolean;\n display: boolean;\n redact: readonly string[];\n dryRun: boolean;\n}\n\ninterface Outcome {\n cause: TerminationCause | undefined;\n spawnError: Error | undefined;\n exit: { code: number | null; signal: string | null } | undefined;\n}\n\nconst MAX_DELAY = 2_147_483_647;\nconst REFUSAL_MESSAGE = {\n \"json-output\": \"Command cannot use the terminal in JSON output mode\",\n \"non-interactive\": \"Command requires an interactive terminal\",\n overlapping: \"Command cannot use the terminal while it is in use\",\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNoNul(value: string, label: string): void {\n if (value.includes(\"\\0\")) throw new TypeError(`${label} must not contain NUL characters`);\n}\n\nfunction readInteger(value: unknown, label: string, minimum: number, maximum: number): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < minimum || value > maximum) {\n throw new TypeError(`${label} must be an integer from ${minimum} to ${maximum}`);\n }\n return value;\n}\n\nfunction readEnum<const T extends string>(value: unknown, label: string, allowed: readonly T[]): T {\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value))\n return value as T;\n throw new TypeError(\n `Exec option \\`${label}\\` must be ${allowed.map((item) => JSON.stringify(item)).join(\" or \")}`,\n );\n}\n\nfunction readBoolean(value: unknown, label: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`Exec option \\`${label}\\` must be a boolean`);\n return value;\n}\n\nfunction readRedact(value: unknown): readonly string[] {\n if (!Array.isArray(value)) throw new TypeError(\"Exec option `redact` must be an array\");\n for (const item of value) {\n if (typeof item !== \"string\" || item === \"\") {\n throw new TypeError(\"Exec option `redact` must contain only non-empty strings\");\n }\n assertNoNul(item, \"Exec option `redact`\");\n }\n return value as readonly string[];\n}\n\nfunction mergeEnvironment(\n base: Environment | undefined,\n overrides: unknown,\n): NodeJS.ProcessEnv | undefined {\n if (overrides === undefined && base === undefined) return undefined;\n if (overrides !== undefined && !isRecord(overrides)) {\n throw new TypeError(\"Exec option `env` must be an object\");\n }\n const merged: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(base ?? process.env)) {\n if (value !== undefined) merged[key] = value;\n }\n for (const [key, value] of Object.entries(overrides ?? {})) {\n if (key === \"\" || key.includes(\"=\") || key.includes(\"\\0\")) {\n throw new TypeError(`Invalid environment variable name ${JSON.stringify(key)}`);\n }\n if (value === undefined) {\n delete merged[key];\n continue;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(`Environment variable ${key} must be a string or undefined`);\n }\n assertNoNul(value, `Environment variable ${key}`);\n merged[key] = value;\n }\n return merged;\n}\n\nfunction redactValue(value: string, secrets: readonly string[]): string {\n let redacted = value;\n for (const secret of [...secrets].sort((left, right) => right.length - left.length)) {\n redacted = redacted.split(secret).join(\"***\");\n }\n return redacted;\n}\n\nfunction redactCommand(command: ExecCommand, secrets: readonly string[]): ExecCommand {\n if (secrets.length === 0) return command;\n return {\n file: redactValue(command.file, secrets),\n args: command.args.map((arg) => redactValue(arg, secrets)),\n cwd: command.cwd === undefined ? undefined : redactValue(command.cwd, secrets),\n };\n}\n\nfunction redactError(error: Error, secrets: readonly string[]): Error {\n const source = error as SpawnError;\n const redacted = new Error(redactValue(error.message, secrets)) as SpawnError;\n if (typeof error.stack === \"string\") redacted.stack = redactValue(error.stack, secrets);\n if (source.code !== undefined) redacted.code = source.code;\n if (source.errno !== undefined) redacted.errno = source.errno;\n if (typeof source.syscall === \"string\") redacted.syscall = redactValue(source.syscall, secrets);\n if (typeof source.path === \"string\") redacted.path = redactValue(source.path, secrets);\n if (Array.isArray(source.spawnargs)) {\n redacted.spawnargs = source.spawnargs.map((arg) =>\n typeof arg === \"string\" ? redactValue(arg, secrets) : arg,\n );\n }\n return redacted;\n}\n\nfunction observedError(plan: ExecPlan, error: Error): Error {\n return plan.redact.length === 0 ? error : redactError(error, plan.redact);\n}\n\nfunction parsePlan(file: unknown, args: unknown, options: unknown, context: ExecContext): ExecPlan {\n if (typeof file !== \"string\" || file === \"\") {\n throw new TypeError(\"Exec file must be a non-empty string\");\n }\n assertNoNul(file, \"Exec file\");\n const argv = args === undefined ? [] : args;\n if (!Array.isArray(argv) || !argv.every((arg) => typeof arg === \"string\")) {\n throw new TypeError(\"Exec args must be an array of strings\");\n }\n for (const arg of argv) assertNoNul(arg, \"Exec args\");\n const raw = options === undefined ? {} : options;\n if (!isRecord(raw)) throw new TypeError(\"Exec options must be an object\");\n for (const key of Object.keys(raw)) {\n if (!OPTION_KEYS.has(key)) throw new TypeError(`Unknown exec option \\`${key}\\``);\n }\n\n const { cwd, input, reject, timeout, signal, maxBuffer, forceKillAfterDelay } = raw;\n if (cwd !== undefined) {\n if (typeof cwd !== \"string\" || cwd === \"\") {\n throw new TypeError(\"Exec option `cwd` must be a non-empty string\");\n }\n assertNoNul(cwd, \"Exec option `cwd`\");\n }\n if (input !== undefined && typeof input !== \"string\") {\n throw new TypeError(\"Exec option `input` must be a string\");\n }\n if (reject !== undefined && typeof reject !== \"boolean\") {\n throw new TypeError(\"Exec option `reject` must be a boolean\");\n }\n if (signal !== undefined && !(signal instanceof AbortSignal)) {\n throw new TypeError(\"Exec option `signal` must be an AbortSignal\");\n }\n const stdin =\n raw.stdin === undefined ? \"pipe\" : readEnum(raw.stdin, \"stdin\", [\"pipe\", \"inherit\"]);\n const stdout =\n raw.stdout === undefined ? \"pipe\" : readEnum(raw.stdout, \"stdout\", [\"pipe\", \"inherit\"]);\n const stderr =\n raw.stderr === undefined ? \"pipe\" : readEnum(raw.stderr, \"stderr\", [\"pipe\", \"inherit\"]);\n if (input !== undefined && stdin === \"inherit\") {\n throw new TypeError(\"Exec option `input` cannot be combined with stdin inherit\");\n }\n const command = { file, args: [...argv], cwd };\n const redact = raw.redact === undefined ? [] : readRedact(raw.redact);\n return {\n command,\n reported: redactCommand(command, redact),\n env: mergeEnvironment(context.env, raw.env),\n input,\n reject: reject ?? true,\n timeout:\n timeout === undefined\n ? undefined\n : readInteger(timeout, \"Exec option `timeout`\", 1, MAX_DELAY),\n signal: signal === undefined ? context.signal : AbortSignal.any([context.signal, signal]),\n maxBuffer:\n maxBuffer === undefined\n ? 100_000_000\n : readInteger(maxBuffer, \"Exec option `maxBuffer`\", 1, Number.MAX_SAFE_INTEGER),\n forceKillAfterDelay:\n forceKillAfterDelay === undefined\n ? 5_000\n : readInteger(forceKillAfterDelay, \"Exec option `forceKillAfterDelay`\", 0, MAX_DELAY),\n stdin,\n stdout,\n stderr,\n interactive:\n raw.interactive === undefined ? false : readBoolean(raw.interactive, \"interactive\"),\n display: raw.display === undefined ? true : readBoolean(raw.display, \"display\"),\n redact,\n dryRun: raw.dryRun === undefined ? false : readBoolean(raw.dryRun, \"dryRun\"),\n };\n}\n\nfunction stripFinalNewline(text: string): string {\n if (text.endsWith(\"\\r\\n\")) return text.slice(0, -2);\n if (text.endsWith(\"\\n\")) return text.slice(0, -1);\n return text;\n}\n\nfunction collect(stream: Readable, limit: number, onLimit: () => void): () => string {\n const chunks: Buffer[] = [];\n let length = 0;\n let exceeded = false;\n stream.on(\"data\", (chunk: Buffer) => {\n if (exceeded) return;\n const remaining = limit - length;\n if (chunk.length <= remaining) {\n chunks.push(chunk);\n length += chunk.length;\n return;\n }\n chunks.push(chunk.subarray(0, remaining));\n length = limit;\n exceeded = true;\n onLimit();\n });\n return () => stripFinalNewline(Buffer.concat(chunks).toString(\"utf8\"));\n}\n\nfunction toResult(\n command: ExecCommand,\n outcome: Outcome,\n stdout: string,\n stderr: string,\n): ExecResult {\n const failed = { status: \"failed\", command, stdout, stderr } as const;\n if (outcome.cause) return { ...failed, reason: outcome.cause };\n if (outcome.spawnError) return { ...failed, reason: \"spawn\", error: outcome.spawnError };\n const { code, signal } = outcome.exit ?? { code: null, signal: null };\n if (signal !== null) return { ...failed, reason: \"signal\", signal };\n if (code !== 0) return { ...failed, reason: \"exit-code\", exitCode: code ?? 1 };\n return { status: \"succeeded\", command, stdout, stderr, exitCode: 0 };\n}\n\nfunction isSpawnErrno(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"syscall\" in error;\n}\n\nfunction execEvent(plan: ExecPlan, phase: \"start\" | \"skip\"): ExecPrintEvent {\n const { file, args, cwd } = plan.reported;\n return {\n type: \"exec\",\n phase,\n command: cwd === undefined ? { file, args } : { file, args, cwd },\n stdio: commandStdio(plan),\n interactive: plan.interactive,\n };\n}\n\nfunction commandStdio(plan: ExecPlan): ExecStdio {\n return {\n stdin: plan.stdin === \"inherit\" ? \"inherit\" : plan.input === undefined ? \"ignore\" : \"input\",\n stdout: plan.stdout,\n stderr: plan.stderr,\n };\n}\n\nfunction usesTerminal(plan: ExecPlan, stdio: ExecStdio): boolean {\n return (\n plan.interactive ||\n stdio.stdin === \"inherit\" ||\n stdio.stdout === \"inherit\" ||\n stdio.stderr === \"inherit\"\n );\n}\n\nfunction startChild(plan: ExecPlan): ChildProcess | Error {\n const stdio = commandStdio(plan);\n try {\n return spawn(plan.command.file, plan.command.args, {\n cwd: plan.command.cwd,\n env: plan.env,\n shell: false,\n windowsHide: true,\n stdio: [\n stdio.stdin === \"inherit\" ? \"inherit\" : stdio.stdin === \"input\" ? \"pipe\" : \"ignore\",\n stdio.stdout,\n stdio.stderr,\n ],\n });\n } catch (error) {\n if (isSpawnErrno(error)) return error;\n throw error;\n }\n}\n\nfunction runPlan(plan: ExecPlan): Promise<ExecResult> {\n const outcome: Outcome = { cause: undefined, spawnError: undefined, exit: undefined };\n if (plan.signal.aborted) {\n outcome.cause = \"aborted\";\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n const child = startChild(plan);\n if (child instanceof Error) {\n outcome.spawnError = observedError(plan, child);\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n\n return new Promise((resolve) => {\n const stdout = child.stdout;\n const stderr = child.stderr;\n let settled = false;\n let killTimer: NodeJS.Timeout | undefined;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutTimer);\n clearTimeout(killTimer);\n plan.signal.removeEventListener(\"abort\", onAbort);\n resolve(toResult(plan.reported, outcome, readStdout(), readStderr()));\n };\n const release = () => {\n stdout?.destroy();\n stderr?.destroy();\n settle();\n };\n const terminate = (cause: TerminationCause) => {\n if (settled || outcome.cause) return;\n outcome.cause = cause;\n if (outcome.exit) {\n release();\n return;\n }\n child.kill(\"SIGTERM\");\n killTimer = setTimeout(() => child.kill(\"SIGKILL\"), plan.forceKillAfterDelay);\n };\n const onAbort = () => terminate(\"aborted\");\n\n const readStdout = stdout\n ? collect(stdout, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const readStderr = stderr\n ? collect(stderr, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const timeoutTimer =\n plan.timeout === undefined ? undefined : setTimeout(() => terminate(\"timeout\"), plan.timeout);\n plan.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.on(\"error\", (error) => {\n if (child.pid !== undefined) return;\n outcome.spawnError = observedError(plan, error);\n release();\n });\n child.on(\"exit\", (code, signal) => {\n outcome.exit = { code, signal };\n clearTimeout(killTimer);\n // A grandchild may keep the pipes open after hacksh terminates the direct child.\n if (outcome.cause) release();\n });\n child.on(\"close\", settle);\n\n if (child.stdin) {\n child.stdin.on(\"error\", () => undefined);\n child.stdin.end(plan.input);\n }\n });\n}\n\nfunction formatArgument(value: string): string {\n return value === \"\" || /[\\s\"'\\\\$`;|&<>*?()[\\]{}~#!]/.test(value) ? JSON.stringify(value) : value;\n}\n\nexport function formatExecCommand(command: Pick<ExecCommand, \"file\" | \"args\">): string {\n return [command.file, ...command.args].map(formatArgument).join(\" \");\n}\n\nfunction failureMessage(plan: ExecPlan, result: ExecFailure): string {\n const display = formatExecCommand(plan.reported);\n switch (result.reason) {\n case \"exit-code\":\n return `Command failed with exit code ${result.exitCode}: ${display}`;\n case \"signal\":\n return `Command was terminated by ${result.signal}: ${display}`;\n case \"spawn\": {\n const code = (result.error as NodeJS.ErrnoException).code;\n return `Command could not be started (${code ?? result.error.message}): ${display}`;\n }\n case \"timeout\":\n return `Command timed out after ${plan.timeout} ms: ${display}`;\n case \"aborted\":\n return `Command was aborted: ${display}`;\n case \"output-limit\":\n return `Command output exceeded ${plan.maxBuffer} bytes: ${display}`;\n case \"json-output\":\n case \"non-interactive\":\n case \"overlapping\":\n return `${REFUSAL_MESSAGE[result.reason]}: ${display}`;\n }\n}\n\nfunction emptyFailure(plan: ExecPlan, reason: RefusalReason): ExecFailure {\n return { status: \"failed\", command: plan.reported, stdout: \"\", stderr: \"\", reason };\n}\n\nfunction complete(plan: ExecPlan, result: ExecResult): ExecResult {\n if (result.status === \"failed\" && plan.reject) {\n throw new HackshExecError(\n failureMessage(plan, result),\n result,\n result.reason === \"spawn\" ? { cause: result.error } : undefined,\n );\n }\n return result;\n}\n\nfunction blockedReason(\n plan: ExecPlan,\n context: ExecContext,\n stdio: ExecStdio,\n): \"json-output\" | \"non-interactive\" | undefined {\n const inherited =\n stdio.stdin === \"inherit\" || stdio.stdout === \"inherit\" || stdio.stderr === \"inherit\";\n if (context.mode.format === \"json\" && inherited) return \"json-output\";\n if (plan.interactive && !context.mode.interactive) return \"non-interactive\";\n return undefined;\n}\n\nasync function execute(\n file: unknown,\n args: unknown,\n options: unknown,\n context: ExecContext,\n): Promise<ExecResult | ExecSkipped> {\n const plan = parsePlan(file, args, options, context);\n if (plan.signal.aborted) return complete(plan, emptyFailure(plan, \"aborted\"));\n if (plan.dryRun) {\n if (plan.display) await context.print(execEvent(plan, \"skip\"));\n return { status: \"skipped\", command: plan.reported };\n }\n\n const stdio = commandStdio(plan);\n const blocked = blockedReason(plan, context, stdio);\n if (blocked) return complete(plan, emptyFailure(plan, blocked));\n\n const holdTerminal = usesTerminal(plan, stdio);\n if (holdTerminal && !context.terminal.acquire(\"exec\")) {\n return complete(plan, emptyFailure(plan, \"overlapping\"));\n }\n try {\n if (plan.display) await context.print(execEvent(plan, \"start\"));\n return complete(plan, await runPlan(plan));\n } finally {\n if (holdTerminal) context.terminal.release();\n }\n}\n\nexport function createExec(context: ExecContext): Exec {\n return ((file, args, options) => execute(file, args, options, context)) as Exec;\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport { summarizeError } from \"./errors.ts\";\n\nfunction safeString(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizeProperty(value: object, key: PropertyKey, ancestors: Set<object>): unknown {\n try {\n return normalizeJson(Reflect.get(value, key), ancestors);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizedKeys(value: object): string[] | undefined {\n try {\n return Object.keys(value);\n } catch {\n return undefined;\n }\n}\n\nconst noToJson = Symbol(\"noToJson\");\n\nfunction normalizedToJson(value: object, ancestors: Set<object>): unknown {\n let toJSON: unknown;\n try {\n toJSON = Reflect.get(value, \"toJSON\");\n } catch {\n return noToJson;\n }\n if (typeof toJSON !== \"function\") return noToJson;\n try {\n const result = Reflect.apply(toJSON, value, []);\n return result === value ? noToJson : normalizeJson(result, ancestors);\n } catch {\n return noToJson;\n }\n}\n\nfunction isArrayBufferView(value: object): value is ArrayBufferView {\n try {\n return ArrayBuffer.isView(value);\n } catch {\n return false;\n }\n}\n\n/** Normalize arbitrary event data into values accepted by JSON.stringify. */\nexport function normalizeJson(value: unknown, ancestors = new Set<object>()): unknown {\n switch (typeof value) {\n case \"string\":\n return stripVTControlCharacters(value);\n case \"boolean\":\n return value;\n case \"number\":\n return Number.isFinite(value) ? value : null;\n case \"bigint\":\n return value.toString();\n case \"undefined\":\n return \"[undefined]\";\n case \"symbol\":\n return `[symbol:${stripVTControlCharacters(value.description ?? \"\")}]`;\n case \"function\":\n return `[function:${stripVTControlCharacters(value.name || \"anonymous\")}]`;\n case \"object\":\n break;\n }\n if (value === null) return null;\n if (ancestors.has(value)) return \"[Circular]\";\n\n const nextAncestors = new Set(ancestors).add(value);\n if (value instanceof Error) return normalizeJson(summarizeError(value), nextAncestors);\n\n const jsonValue = normalizedToJson(value, nextAncestors);\n if (jsonValue !== noToJson) return jsonValue;\n\n if (isArrayBufferView(value)) {\n if (value instanceof DataView) {\n return Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n }\n try {\n return Array.from(value as unknown as Iterable<unknown>, (item) =>\n normalizeJson(item, nextAncestors),\n );\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof ArrayBuffer) return Array.from(new Uint8Array(value));\n if (Array.isArray(value)) {\n return Array.from({ length: value.length }, (_, index) =>\n normalizeProperty(value, index, nextAncestors),\n );\n }\n if (value instanceof Map) {\n try {\n return [...value].map(([key, item]) => [\n normalizeJson(key, nextAncestors),\n normalizeJson(item, nextAncestors),\n ]);\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof Set) {\n try {\n return [...value].map((item) => normalizeJson(item, nextAncestors));\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n const keys = normalizedKeys(value);\n if (!keys) return safeString(value);\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n result[stripVTControlCharacters(key)] = normalizeProperty(value, key, nextAncestors);\n }\n return result;\n}\n","import type { HackshErrorSummary } from \"./errors.ts\";\nimport type { ExecCommand } from \"./exec.ts\";\nimport type { LogRecord } from \"./logger.ts\";\nimport { normalizeJson } from \"./serialization.ts\";\nimport type { UsageSummary } from \"./usage.ts\";\n\nexport type PrintStream = \"stdout\" | \"stderr\";\nexport type OutputPreference = \"auto\" | \"pretty\" | \"json\";\nexport type OutputFormat = Exclude<OutputPreference, \"auto\">;\n\nexport interface StreamColors {\n stdout: boolean;\n stderr: boolean;\n}\n\nexport interface OutputMode {\n format: OutputFormat;\n interactive: boolean;\n color: StreamColors;\n}\n\nexport interface ResolveOutputModeOptions {\n output?: OutputPreference;\n env?: Readonly<Record<string, string | undefined>>;\n inputIsTTY?: boolean;\n outputIsTTY?: boolean;\n errorOutputIsTTY?: boolean;\n}\n\nfunction fallbackValue(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction validatePreference(value: unknown, source: string): OutputPreference | undefined {\n if (value === undefined) return undefined;\n if (value === \"auto\" || value === \"pretty\" || value === \"json\") return value;\n throw new TypeError(\n `Invalid ${source} value ${fallbackValue(value)}; expected auto, pretty, or json`,\n );\n}\n\nfunction readEnvironment(\n env: Readonly<Record<string, string | undefined>>,\n key: string,\n): string | undefined {\n try {\n return env[key];\n } catch {\n return undefined;\n }\n}\n\n/** Resolve output behavior once, before command routing or argument parsing. */\nexport function resolveOutputMode(options: ResolveOutputModeOptions = {}): OutputMode {\n const env = options.env ?? process.env;\n const configured = validatePreference(options.output, \"output\");\n const overridden = validatePreference(readEnvironment(env, \"HACKSH_OUTPUT\"), \"HACKSH_OUTPUT\");\n const requested = overridden ?? configured ?? \"auto\";\n const ci = Boolean(readEnvironment(env, \"CI\"));\n const format = requested === \"auto\" ? (ci ? \"json\" : \"pretty\") : requested;\n const inputIsTTY = options.inputIsTTY ?? process.stdin.isTTY === true;\n const outputIsTTY = options.outputIsTTY ?? process.stdout.isTTY === true;\n const errorOutputIsTTY = options.errorOutputIsTTY ?? process.stderr.isTTY === true;\n const colorable = format === \"pretty\" && !readEnvironment(env, \"NO_COLOR\");\n return {\n format,\n interactive: format === \"pretty\" && !ci && inputIsTTY && outputIsTTY,\n color: { stdout: colorable && outputIsTTY, stderr: colorable && errorOutputIsTTY },\n };\n}\n\nexport interface UsagePrintEvent {\n type: \"usage\";\n usage: UsageSummary;\n text: string;\n stream: PrintStream;\n}\n\nexport interface VersionPrintEvent {\n type: \"version\";\n version: string;\n}\n\nexport interface ErrorPrintEvent {\n type: \"error\";\n error: HackshErrorSummary;\n}\n\nexport interface LogPrintEvent {\n type: \"log\";\n record: LogRecord;\n}\n\nexport interface PromptChoiceState {\n value: string;\n label: string;\n hint?: string;\n selected: boolean;\n}\n\nexport type PromptStatus = \"active\" | \"error\" | \"submitted\" | \"closed\";\n\ninterface PromptStateBase {\n message: string;\n status: PromptStatus;\n error?: string;\n}\n\nexport interface SelectPromptState extends PromptStateBase {\n kind: \"select\";\n choices: readonly PromptChoiceState[];\n value: string;\n}\n\nexport interface ConfirmPromptState extends PromptStateBase {\n kind: \"confirm\";\n value: boolean;\n defaultValue?: boolean;\n}\n\nexport interface TextPromptState extends PromptStateBase {\n kind: \"text\";\n value: string;\n placeholder?: string;\n}\n\nexport interface AutocompletePromptState extends PromptStateBase {\n kind: \"autocomplete\";\n query: string;\n placeholder?: string;\n phase: \"input\" | \"select\";\n choices: readonly PromptChoiceState[];\n value?: string;\n}\n\nexport type PromptState =\n | SelectPromptState\n | ConfirmPromptState\n | TextPromptState\n | AutocompletePromptState;\n\nexport interface PromptPrintEvent {\n type: \"prompt\";\n prompt: PromptState;\n}\n\n/** Command output: exact text written to stdout, or a JSON value. */\nexport type OutputPrintEvent =\n | { type: \"output\"; kind: \"text\"; text: string }\n | { type: \"output\"; kind: \"json\"; data: unknown };\n\nexport interface ExecPrintEvent {\n type: \"exec\";\n phase: \"start\" | \"skip\";\n command: Omit<ExecCommand, \"cwd\"> & { cwd?: string };\n stdio: {\n stdin: \"ignore\" | \"input\" | \"inherit\";\n stdout: \"pipe\" | \"inherit\";\n stderr: \"pipe\" | \"inherit\";\n };\n interactive: boolean;\n}\n\n/** A semantic, command- and schema-free output value emitted by hacksh. */\nexport type PrintEvent =\n | UsagePrintEvent\n | VersionPrintEvent\n | ErrorPrintEvent\n | LogPrintEvent\n | PromptPrintEvent\n | OutputPrintEvent\n | ExecPrintEvent;\n\n/** Receives every output event produced by one command invocation. */\nexport interface Printer {\n print(event: PrintEvent): void | Promise<void>;\n}\n\nexport function eventStream(event: PrintEvent): PrintStream {\n if (event.type === \"error\" || event.type === \"exec\" || event.type === \"log\") return \"stderr\";\n if (event.type === \"usage\") return event.stream;\n return \"stdout\";\n}\n\nexport interface OutputWriter {\n write(text: string): unknown;\n}\n\nexport interface TerminalInput {\n readonly isTTY?: boolean;\n readonly isRaw?: boolean;\n readonly readableFlowing?: boolean | null;\n setRawMode?(mode: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: string, listener: (...args: never[]) => void): unknown;\n removeListener(event: string, listener: (...args: never[]) => void): unknown;\n}\n\nexport interface TerminalOutput extends OutputWriter {\n readonly isTTY?: boolean;\n readonly columns?: number;\n}\n\nexport interface JsonPrinterOptions {\n stdout?: OutputWriter;\n stderr?: OutputWriter;\n}\n\n/** Create a one-semantic-event-per-line JSON printer. */\nexport function createJsonPrinter(options: JsonPrinterOptions = {}): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n return {\n print(event) {\n let serialized: string;\n try {\n serialized = JSON.stringify(normalizeJson(event));\n } catch {\n serialized = JSON.stringify({\n type: event.type,\n serializationError: \"Event data could not be serialized\",\n });\n }\n const line = `${serialized}\\n`;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(line);\n },\n };\n}\n\nexport interface PrintQueue {\n printer: Printer;\n printChecked(event: PrintEvent): Promise<void>;\n drain(): Promise<void>;\n}\n\n/** Serialize printer calls and retain failures until the invocation drains its output. */\nexport function createPrintQueue(target: Printer): PrintQueue {\n let pending: Promise<void> | undefined;\n let failure: unknown;\n let failed = false;\n\n function recordFailure(error: unknown): void {\n if (!failed) failure = error;\n failed = true;\n }\n\n function track(execution: Promise<void>, retainFailure: boolean): Promise<void> {\n const barrier = execution.catch((error: unknown) => {\n if (retainFailure) recordFailure(error);\n });\n pending = barrier;\n void barrier.then(() => {\n if (pending === barrier) pending = undefined;\n });\n return retainFailure ? barrier : execution;\n }\n\n function enqueue(event: PrintEvent, retainFailure: boolean): void | Promise<void> {\n if (pending)\n return track(\n pending.then(() => target.print(event)),\n retainFailure,\n );\n try {\n const result = target.print(event);\n if (result) return track(Promise.resolve(result), retainFailure);\n } catch (error) {\n if (retainFailure) recordFailure(error);\n else return Promise.reject(error);\n }\n }\n\n const printer: Printer = {\n print(event) {\n return enqueue(event, true);\n },\n };\n\n return {\n printer,\n async printChecked(event) {\n await enqueue(event, false);\n },\n async drain() {\n await pending;\n if (failed) throw failure;\n },\n };\n}\n","import { inspect, stripVTControlCharacters, styleText } from \"node:util\";\nimport type { HackshErrorSummary } from \"./errors.ts\";\nimport { formatExecCommand } from \"./exec.ts\";\nimport type { LogLevel, LogRecord } from \"./logger.ts\";\nimport {\n eventStream,\n type AutocompletePromptState,\n type OutputPrintEvent,\n type OutputWriter,\n type Printer,\n type PrintEvent,\n type StreamColors,\n type TerminalOutput,\n} from \"./printer.ts\";\nimport { normalizeJson } from \"./serialization.ts\";\n\ntype DecoratedEvent = Exclude<PrintEvent, OutputPrintEvent>;\n\ntype PrettyMark =\n | LogLevel\n | \"step\"\n | \"success\"\n | \"usage\"\n | \"version\"\n | \"errorEvent\"\n | \"prompt\"\n | \"exec\"\n | \"execSkip\";\ntype TextStyle = Parameters<typeof styleText>[0];\n\ninterface PrettySymbols {\n bar: string;\n marks: Record<PrettyMark, string>;\n}\n\nconst unicodeSymbols: PrettySymbols = {\n bar: \"│\",\n marks: {\n trace: \"·\",\n debug: \"◆\",\n info: \"●\",\n warning: \"▲\",\n error: \"■\",\n fatal: \"✖\",\n step: \"◇\",\n success: \"✔\",\n usage: \"◆\",\n version: \"●\",\n errorEvent: \"■\",\n prompt: \"?\",\n exec: \"$\",\n execSkip: \"#\",\n },\n};\n\nconst asciiSymbols: PrettySymbols = {\n bar: \"|\",\n marks: {\n trace: \".\",\n debug: \":\",\n info: \"i\",\n warning: \"!\",\n error: \"x\",\n fatal: \"X\",\n step: \">\",\n success: \"+\",\n usage: \"?\",\n version: \"i\",\n errorEvent: \"x\",\n prompt: \"?\",\n exec: \"$\",\n execSkip: \"#\",\n },\n};\n\nconst markStyles: Record<PrettyMark, TextStyle> = {\n trace: \"gray\",\n debug: \"magenta\",\n info: \"blue\",\n warning: \"yellow\",\n error: \"red\",\n fatal: [\"bgRed\", \"white\", \"bold\"],\n step: \"cyan\",\n success: \"green\",\n usage: \"cyan\",\n version: \"blue\",\n errorEvent: \"red\",\n prompt: \"cyan\",\n exec: \"gray\",\n execSkip: \"gray\",\n};\n\nexport interface PrettyPrinterOptions {\n /** One flag for both streams, or a flag per stream. */\n color: boolean | StreamColors;\n unicode: boolean;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction safelyInspect(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return inspect(value, {\n breakLength: 80,\n colors: false,\n compact: false,\n depth: null,\n sorted: true,\n });\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction propertyLines(properties: Readonly<Record<string, unknown>>): string[] {\n const lines: string[] = [];\n for (const key of Object.keys(properties).sort()) {\n const rendered = ` ${key}: ${safelyInspect(properties[key])}`.split(\"\\n\");\n lines.push(rendered[0] ?? \"\");\n for (const continuation of rendered.slice(1)) lines.push(` ${continuation}`);\n }\n return lines;\n}\n\nfunction logLines(record: LogRecord): string[] {\n const category = record.category.length > 0 ? `[${record.category.join(\":\")}] ` : \"\";\n const message = record.message.split(\"\\n\");\n return [\n `${category}${message[0] ?? \"\"}`,\n ...message.slice(1),\n ...propertyLines(record.properties),\n ];\n}\n\nfunction errorLines(error: HackshErrorSummary): string[] {\n const lines = error.message.split(\"\\n\");\n const details: Record<string, unknown> = {};\n if (error.cause !== undefined) details.cause = error.cause;\n if (error.properties !== undefined) Object.assign(details, error.properties);\n if (error.value !== undefined) details.value = error.value;\n return [...lines, ...propertyLines(details)];\n}\n\nfunction outputText(event: OutputPrintEvent): string {\n if (event.kind === \"text\") return event.text;\n return `${JSON.stringify(normalizeJson(event.data), null, 2)}\\n`;\n}\n\nfunction eventMark(event: DecoratedEvent): PrettyMark {\n if (event.type === \"usage\") return \"usage\";\n if (event.type === \"version\") return \"version\";\n if (event.type === \"error\") return \"errorEvent\";\n if (event.type === \"prompt\") return event.prompt.status === \"submitted\" ? \"success\" : \"prompt\";\n if (event.type === \"exec\") return event.phase === \"skip\" ? \"execSkip\" : \"exec\";\n return event.record.kind === \"message\" ? event.record.level : event.record.kind;\n}\n\nfunction eventLines(event: DecoratedEvent): string[] {\n switch (event.type) {\n case \"usage\":\n return event.text.split(\"\\n\");\n case \"version\":\n return event.version.split(\"\\n\");\n case \"error\":\n return errorLines(event.error);\n case \"log\":\n return logLines(event.record);\n case \"prompt\": {\n const { prompt } = event;\n if (prompt.status === \"submitted\") {\n const result =\n prompt.kind === \"select\" || prompt.kind === \"autocomplete\"\n ? (prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value)\n : prompt.kind === \"confirm\"\n ? prompt.value\n ? \"Yes\"\n : \"No\"\n : prompt.value;\n return [`${prompt.message}: ${result}`];\n }\n const lines = [prompt.message];\n if (prompt.kind === \"select\") {\n for (const choice of prompt.choices) {\n lines.push(\n `${choice.selected ? \">\" : \" \"} ${choice.label}${choice.hint ? ` — ${choice.hint}` : \"\"}`,\n );\n }\n } else if (prompt.kind === \"confirm\") {\n lines.push(\n `${prompt.value ? \"Yes\" : \"No\"}${prompt.defaultValue === undefined ? \"\" : ` (default: ${prompt.defaultValue ? \"yes\" : \"no\"})`}`,\n );\n } else {\n lines.push(prompt.value || (prompt.placeholder ? `(${prompt.placeholder})` : \"\"));\n }\n if (prompt.error) lines.push(prompt.error);\n return lines;\n }\n case \"exec\": {\n const lines = [formatExecCommand(event.command)];\n if (event.command.cwd !== undefined) lines.push(...propertyLines({ cwd: event.command.cwd }));\n return lines;\n }\n }\n}\n\nfunction colorize(enabled: boolean, style: TextStyle, text: string): string {\n return enabled ? styleText(style, text, { validateStream: false }) : text;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst invisibleGrapheme = /^[\\p{Mark}\\p{Cf}]+$/u;\nconst combiningMark = /[\\p{Mark}\\p{Cf}]/u;\nconst emoji = /\\p{Extended_Pictographic}|\\p{Regional_Indicator}|\\u20e3/u;\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n codePoint >= 0x1100 &&\n (codePoint <= 0x115f ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd))\n );\n}\n\ninterface TerminalPosition {\n row: number;\n column: number;\n}\n\nfunction terminalPosition(text: string, columns: number | undefined): TerminalPosition {\n const width =\n Number.isInteger(columns) && columns !== undefined && columns > 0 ? columns : undefined;\n let row = 0;\n let column = 0;\n for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {\n if (segment === \"\\n\" || segment === \"\\r\\n\") {\n row += 1;\n column = 0;\n continue;\n }\n if (segment === \"\\r\") {\n column = 0;\n continue;\n }\n if (invisibleGrapheme.test(segment)) continue;\n let cells = 0;\n if (segment === \"\\t\") {\n cells = 8 - (column % 8);\n } else if (emoji.test(segment) || isWideCodePoint(segment.codePointAt(0)!)) {\n cells = 2;\n } else {\n for (const value of segment) {\n const point = value.codePointAt(0)!;\n if (point < 0x20 || (point >= 0x7f && point < 0xa0)) continue;\n if (!combiningMark.test(value)) cells += 1;\n }\n }\n if (cells === 0) continue;\n if (width && column + cells > width) {\n row += 1;\n column = 0;\n }\n column += width ? Math.min(cells, width) : cells;\n }\n return { row, column };\n}\n\nfunction renderedRows(rendered: string, columns: number | undefined): number {\n return terminalPosition(rendered, columns).row + 1;\n}\n\ninterface ActivePrompt {\n rendered: string;\n lines: number;\n cursor?: TerminalPosition & { visible: boolean };\n}\n\n/** Create the fixed human-readable renderer used for pretty output. */\nexport function createPrettyPrinter(options: PrettyPrinterOptions): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const symbols = options.unicode ? unicodeSymbols : asciiSymbols;\n const colors =\n typeof options.color === \"boolean\"\n ? { stdout: options.color, stderr: options.color }\n : options.color;\n let activePrompt: ActivePrompt | undefined;\n\n function renderAutocomplete(prompt: AutocompletePromptState, color: boolean): string {\n const bar = colorize(color, \"gray\", symbols.bar);\n const accent = (text: string): string => colorize(color, \"cyan\", text);\n const muted = (text: string): string => colorize(color, \"gray\", text);\n const input = prompt.phase === \"input\";\n const lines = [\n `${accent(symbols.marks.prompt)} ${prompt.message}`,\n `${bar} ${input ? accent(\">\") : \" \"} ${prompt.query || muted(prompt.placeholder ?? \"\")} `,\n bar,\n ];\n for (const choice of prompt.choices) {\n lines.push(\n `${bar} ${choice.selected ? accent(\">\") : \" \"} ${choice.selected ? accent(choice.label) : choice.label}${choice.hint ? ` ${muted(`— ${choice.hint}`)}` : \"\"}`,\n );\n }\n if (prompt.choices.length === 0) {\n lines.push(`${bar} ${muted(\"No matches. Keep typing or backspace.\")}`);\n }\n lines.push(bar);\n lines.push(\n `${bar} ${muted(input ? \"INPUT · type to filter · ↓ select · Esc cancel\" : \"SELECT · ↑/↓ move · Enter choose · Esc edit\")}`,\n );\n if (prompt.error) lines.push(`${bar} ${prompt.error}`);\n return lines.join(\"\\n\");\n }\n\n function render(event: DecoratedEvent): string {\n const color = colors[eventStream(event)];\n if (\n event.type === \"prompt\" &&\n event.prompt.kind === \"autocomplete\" &&\n event.prompt.status !== \"submitted\"\n ) {\n return renderAutocomplete(event.prompt, color);\n }\n const mark = eventMark(event);\n const lines = eventLines(event);\n const firstPrefix = colorize(color, markStyles[mark], symbols.marks[mark]);\n const barPrefix = colorize(color, \"gray\", symbols.bar);\n return lines\n .map((line, index) => `${index === 0 ? firstPrefix : barPrefix}${line ? ` ${line}` : \"\"}`)\n .join(\"\\n\");\n }\n\n function eraseActivePrompt(): string {\n if (!activePrompt) return \"\";\n if (activePrompt.cursor) {\n const up = activePrompt.cursor.row > 0 ? `\\u001b[${activePrompt.cursor.row}A` : \"\";\n return `\\u001b[?25l${up}\\r\\u001b[0J`;\n }\n return \"\\u001b[1A\\u001b[2K\".repeat(activePrompt.lines);\n }\n\n function drawActivePrompt(): string {\n if (!activePrompt) return \"\";\n const { rendered, lines, cursor } = activePrompt;\n if (!cursor) return `${rendered}\\n`;\n const up = lines - cursor.row;\n return `${rendered}\\n${up > 0 ? `\\u001b[${up}A` : \"\"}\\u001b[${cursor.column + 1}G\\u001b[?25${cursor.visible ? \"h\" : \"l\"}`;\n }\n\n function finishActivePrompt(): string {\n const restore = activePrompt?.cursor ? \"\\u001b[?25h\" : \"\";\n activePrompt = undefined;\n return restore;\n }\n\n return {\n print(event) {\n if (event.type === \"output\") {\n const erase = eraseActivePrompt();\n const text = outputText(event);\n stdout.write(`${erase}${text}`);\n if (activePrompt) {\n // Keep a partial output line outside the frame that the next redraw erases.\n const separator = activePrompt.cursor && text && !text.endsWith(\"\\n\") ? \"\\n\" : \"\";\n stdout.write(`${separator}${drawActivePrompt()}`);\n }\n return;\n }\n const rendered = render(event);\n if (event.type === \"prompt\") {\n const erase = eraseActivePrompt();\n if (event.prompt.status === \"closed\") {\n const restore = finishActivePrompt();\n if (erase || restore) stdout.write(`${erase}${restore}`);\n return;\n }\n if (event.prompt.status === \"submitted\") {\n const restore = finishActivePrompt();\n stdout.write(`${erase}${restore}${rendered}\\n`);\n return;\n }\n const restore =\n activePrompt?.cursor && event.prompt.kind !== \"autocomplete\" ? \"\\u001b[?25h\" : \"\";\n activePrompt = { rendered, lines: renderedRows(rendered, stdout.columns) };\n if (event.prompt.kind === \"autocomplete\") {\n const { prompt } = event;\n const cursor = terminalPosition(\n `${symbols.marks.prompt} ${prompt.message}\\n${symbols.bar} > ${prompt.query}`,\n stdout.columns,\n );\n // The input's trailing space resolves pending wrap at an exact right edge.\n if (cursor.column === stdout.columns) {\n cursor.row += 1;\n cursor.column = 0;\n }\n activePrompt.cursor = { ...cursor, visible: prompt.phase === \"input\" };\n }\n stdout.write(`${erase}${restore}${drawActivePrompt()}`);\n return;\n }\n\n const erase = eraseActivePrompt();\n if (!activePrompt) {\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n return;\n }\n\n const restore = event.type === \"error\" ? finishActivePrompt() : \"\";\n stdout.write(`${erase}${restore}`);\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n if (activePrompt) stdout.write(drawActivePrompt());\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/printer-api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as PromptStatus, B as resolveOutputMode, C as OutputWriter, D as PromptChoiceState, E as Printer, F as TerminalOutput, G as UsageSummary, H as UsageArgumentSummary, I as TextPromptState, L as UsagePrintEvent, M as SelectPromptState, N as StreamColors, O as PromptPrintEvent, P as TerminalInput, Q as LogRecord, R as VersionPrintEvent, S as OutputPrintEvent, T as PrintStream, U as UsageCommandSummary, W as UsageOptionSummary, X as LogLevel, Y as LogKind, Z as LogProperties, _ as JsonPrinterOptions, b as OutputMode, ft as ValidationIssueSummary, g as ExecPrintEvent, h as ErrorPrintEvent, j as ResolveOutputModeOptions, k as PromptState, m as ConfirmPromptState, nt as HackshErrorSummary, p as AutocompletePromptState, tt as HackshErrorKind, v as LogPrintEvent, w as PrintEvent, x as OutputPreference, y as OutputFormat, z as createJsonPrinter } from "./command-Czf4qXhe.js";
|
|
2
2
|
//#region src/pretty.d.ts
|
|
3
3
|
interface PrettyPrinterOptions {
|
|
4
4
|
/** One flag for both streams, or a flag per stream. */
|
|
@@ -10,5 +10,5 @@ interface PrettyPrinterOptions {
|
|
|
10
10
|
/** Create the fixed human-readable renderer used for pretty output. */
|
|
11
11
|
declare function createPrettyPrinter(options: PrettyPrinterOptions): Printer;
|
|
12
12
|
//#endregion
|
|
13
|
-
export { type ConfirmPromptState, type ErrorPrintEvent, type ExecPrintEvent, type HackshErrorKind, type HackshErrorSummary, type JsonPrinterOptions, type LogKind, type LogLevel, type LogPrintEvent, type LogProperties, type LogRecord, type OutputFormat, type OutputMode, type OutputPreference, type OutputPrintEvent, type OutputWriter, type PrettyPrinterOptions, type PrintEvent, type PrintStream, type Printer, type PromptChoiceState, type PromptPrintEvent, type PromptState, type PromptStatus, type ResolveOutputModeOptions, type SelectPromptState, type StreamColors, type TerminalInput, type TerminalOutput, type TextPromptState, type UsageArgumentSummary, type UsageCommandSummary, type UsageOptionSummary, type UsagePrintEvent, type UsageSummary, type ValidationIssueSummary, type VersionPrintEvent, createJsonPrinter, createPrettyPrinter, resolveOutputMode };
|
|
13
|
+
export { type AutocompletePromptState, type ConfirmPromptState, type ErrorPrintEvent, type ExecPrintEvent, type HackshErrorKind, type HackshErrorSummary, type JsonPrinterOptions, type LogKind, type LogLevel, type LogPrintEvent, type LogProperties, type LogRecord, type OutputFormat, type OutputMode, type OutputPreference, type OutputPrintEvent, type OutputWriter, type PrettyPrinterOptions, type PrintEvent, type PrintStream, type Printer, type PromptChoiceState, type PromptPrintEvent, type PromptState, type PromptStatus, type ResolveOutputModeOptions, type SelectPromptState, type StreamColors, type TerminalInput, type TerminalOutput, type TextPromptState, type UsageArgumentSummary, type UsageCommandSummary, type UsageOptionSummary, type UsagePrintEvent, type UsageSummary, type ValidationIssueSummary, type VersionPrintEvent, createJsonPrinter, createPrettyPrinter, resolveOutputMode };
|
|
14
14
|
//# sourceMappingURL=printer-api.d.ts.map
|
package/dist/printer-api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as resolveOutputMode, n as createJsonPrinter, t as createPrettyPrinter } from "./pretty-
|
|
1
|
+
import { i as resolveOutputMode, n as createJsonPrinter, t as createPrettyPrinter } from "./pretty-BjzGnVLM.js";
|
|
2
2
|
export { createJsonPrinter, createPrettyPrinter, resolveOutputMode };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hacksh",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Type-safe command-line interfaces powered by Zod 4 schemas.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -36,6 +36,8 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^24",
|
|
38
38
|
"@vitest/coverage-v8": "4.1.10",
|
|
39
|
+
"@xterm/headless": "^6.0.0",
|
|
40
|
+
"node-pty": "1.0.0",
|
|
39
41
|
"typescript": "^7.0.2",
|
|
40
42
|
"vite": "npm:@voidzero-dev/vite-plus-core@0.2.8",
|
|
41
43
|
"vite-plus": "0.2.8",
|