hacksh 0.16.0 → 0.17.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 +91 -23
- package/dist/{command-B-Ok_6KW.d.ts → command-t16M3-AZ.d.ts} +11 -7
- package/dist/index.d.ts +3 -3
- package/dist/index.js +20 -46
- package/dist/index.js.map +1 -1
- package/dist/{pretty-DJ2CE6TU.js → pretty-Db7-kATM.js} +13 -11
- package/dist/pretty-Db7-kATM.js.map +1 -0
- package/dist/printer-api.d.ts +1 -1
- package/dist/printer-api.js +1 -1
- package/package.json +1 -1
- package/dist/pretty-DJ2CE6TU.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pretty-Db7-kATM.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\" | \"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 type PromptState = SelectPromptState | ConfirmPromptState | TextPromptState;\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 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\"\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 combiningMark = /\\p{Mark}/u;\nconst pictograph = /\\p{Extended_Pictographic}/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\nfunction displayWidth(text: string): number {\n let width = 0;\n for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {\n if (segment === \"\\t\") {\n width += 8 - (width % 8);\n continue;\n }\n if (\n pictograph.test(segment) ||\n Array.from(segment).some((value) => isWideCodePoint(value.codePointAt(0)!))\n ) {\n width += 2;\n continue;\n }\n for (const value of segment) {\n const codePoint = value.codePointAt(0)!;\n if (codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) continue;\n if (codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f)) continue;\n if (!combiningMark.test(value)) width += 1;\n }\n }\n return width;\n}\n\nfunction renderedRows(rendered: string, columns: number | undefined): number {\n const width =\n Number.isInteger(columns) && columns !== undefined && columns > 0 ? columns : undefined;\n return rendered.split(\"\\n\").reduce((rows, line) => {\n if (!width) return rows + 1;\n return rows + Math.max(1, Math.ceil(displayWidth(line) / width));\n }, 0);\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: { rendered: string; lines: number } | undefined;\n\n function render(event: DecoratedEvent): string {\n const color = colors[eventStream(event)];\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 return activePrompt ? \"\\u001b[1A\\u001b[2K\".repeat(activePrompt.lines) : \"\";\n }\n\n return {\n print(event) {\n if (event.type === \"output\") {\n const erase = eraseActivePrompt();\n stdout.write(`${erase}${outputText(event)}`);\n if (activePrompt) stdout.write(`${activePrompt.rendered}\\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 activePrompt = undefined;\n if (erase) stdout.write(erase);\n return;\n }\n if (event.prompt.status === \"submitted\") activePrompt = undefined;\n else activePrompt = { rendered, lines: renderedRows(rendered, stdout.columns) };\n stdout.write(`${erase}${rendered}\\n`);\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 stdout.write(erase);\n if (event.type === \"error\") activePrompt = undefined;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n if (activePrompt) stdout.write(`${activePrompt.rendered}\\n`);\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/printer-api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as HackshErrorKind, A as SelectPromptState, B as UsageArgumentSummary, C as PrintStream, D as PromptState, E as PromptPrintEvent, F as UsagePrintEvent, H as UsageOptionSummary, I as VersionPrintEvent, J as LogLevel, L as createJsonPrinter, M as TerminalInput, N as TerminalOutput, O as PromptStatus, P as TextPromptState, R as resolveOutputMode, S as PrintEvent, T as PromptChoiceState, U as UsageSummary, V as UsageCommandSummary, X as LogRecord, Y as LogProperties, _ as OutputFormat, b as OutputPrintEvent, et as HackshErrorSummary, f as ConfirmPromptState, g as LogPrintEvent, h as JsonPrinterOptions, j as StreamColors, k as ResolveOutputModeOptions, m as ExecPrintEvent, p as ErrorPrintEvent, q as LogKind, ut as ValidationIssueSummary, v as OutputMode, w as Printer, x as OutputWriter, y as OutputPreference } from "./command-t16M3-AZ.js";
|
|
2
2
|
//#region src/pretty.d.ts
|
|
3
3
|
interface PrettyPrinterOptions {
|
|
4
4
|
/** One flag for both streams, or a flag per stream. */
|
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-Db7-kATM.js";
|
|
2
2
|
export { createJsonPrinter, createPrettyPrinter, resolveOutputMode };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pretty-DJ2CE6TU.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\nexport class HackshUsageError extends Error {\n readonly command: AnyCommandDef;\n\n constructor(message: string, command: AnyCommandDef, options?: ErrorOptions) {\n super(message, options);\n this.name = \"HackshUsageError\";\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.name = \"HackshValidationError\";\n this.issues = issues;\n }\n}\n\nexport type PromptKind = \"select\" | \"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 Error {\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.name = \"HackshPromptError\";\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 Error {\n readonly #result: ExecFailure;\n\n constructor(message: string, result: ExecFailure, options?: ErrorOptions) {\n super(message, options);\n this.name = \"HackshExecError\";\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 Error {\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.name = \"HackshExitError\";\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 type PromptState = SelectPromptState | ConfirmPromptState | TextPromptState;\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 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\"\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 combiningMark = /\\p{Mark}/u;\nconst pictograph = /\\p{Extended_Pictographic}/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\nfunction displayWidth(text: string): number {\n let width = 0;\n for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {\n if (segment === \"\\t\") {\n width += 8 - (width % 8);\n continue;\n }\n if (\n pictograph.test(segment) ||\n Array.from(segment).some((value) => isWideCodePoint(value.codePointAt(0)!))\n ) {\n width += 2;\n continue;\n }\n for (const value of segment) {\n const codePoint = value.codePointAt(0)!;\n if (codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) continue;\n if (codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f)) continue;\n if (!combiningMark.test(value)) width += 1;\n }\n }\n return width;\n}\n\nfunction renderedRows(rendered: string, columns: number | undefined): number {\n const width =\n Number.isInteger(columns) && columns !== undefined && columns > 0 ? columns : undefined;\n return rendered.split(\"\\n\").reduce((rows, line) => {\n if (!width) return rows + 1;\n return rows + Math.max(1, Math.ceil(displayWidth(line) / width));\n }, 0);\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: { rendered: string; lines: number } | undefined;\n\n function render(event: DecoratedEvent): string {\n const color = colors[eventStream(event)];\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 return activePrompt ? \"\\u001b[1A\\u001b[2K\".repeat(activePrompt.lines) : \"\";\n }\n\n return {\n print(event) {\n if (event.type === \"output\") {\n const erase = eraseActivePrompt();\n stdout.write(`${erase}${outputText(event)}`);\n if (activePrompt) stdout.write(`${activePrompt.rendered}\\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 activePrompt = undefined;\n if (erase) stdout.write(erase);\n return;\n }\n if (event.prompt.status === \"submitted\") activePrompt = undefined;\n else activePrompt = { rendered, lines: renderedRows(rendered, stdout.columns) };\n stdout.write(`${erase}${rendered}\\n`);\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 stdout.write(erase);\n if (event.type === \"error\") activePrompt = undefined;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n if (activePrompt) stdout.write(`${activePrompt.rendered}\\n`);\n },\n };\n}\n"],"mappings":"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"}
|