infra-kit 0.1.134 → 0.3.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/dist/{boot-YCABHUPP.js → boot-MTVHM4N7.js} +2 -2
- package/dist/{chunk-TFHVQOVF.js → chunk-4MRYIYJP.js} +2 -2
- package/dist/chunk-E2NWNNC6.js +2 -0
- package/dist/chunk-E2NWNNC6.js.map +7 -0
- package/dist/{chunk-3OMHS5RE.js → chunk-E2SEBLGJ.js} +2 -2
- package/dist/chunk-KZP2SY37.js +4 -0
- package/dist/chunk-KZP2SY37.js.map +7 -0
- package/dist/{chunk-27PDA2PN.js → chunk-NC2TIQ3M.js} +2 -2
- package/dist/chunk-RLZ5IB2E.js +238 -0
- package/dist/chunk-RLZ5IB2E.js.map +7 -0
- package/dist/chunk-TI33V5G2.js +6 -0
- package/dist/chunk-TI33V5G2.js.map +7 -0
- package/dist/{chunk-FAR2L74S.js → chunk-TPVXMJ7N.js} +1 -1
- package/dist/cli.js +10 -8
- package/dist/cli.js.map +4 -4
- package/dist/dev-server.js +23 -20
- package/dist/dev-server.js.map +4 -4
- package/dist/dev-wizard-run-5HQOGE3R.js +2 -0
- package/dist/dev-wizard-run-5HQOGE3R.js.map +7 -0
- package/dist/mcp.js +1 -1
- package/dist/mcp.js.map +3 -3
- package/dist/persistent-ink-dev-ui-KOI44ZVT.js +2 -0
- package/dist/persistent-ink-dev-ui-KOI44ZVT.js.map +7 -0
- package/dist/safe-stderr-HXDR2DNJ.js +2 -0
- package/dist/update-check.js +1 -1
- package/package.json +3 -14
- package/dist/chunk-2YHPK2VY.js +0 -221
- package/dist/chunk-2YHPK2VY.js.map +0 -7
- package/dist/chunk-3F7XYJWY.js +0 -3
- package/dist/chunk-3F7XYJWY.js.map +0 -7
- package/dist/chunk-DOG3OPNW.js +0 -2
- package/dist/chunk-DOG3OPNW.js.map +0 -7
- package/dist/chunk-JD5T4VCB.js +0 -6
- package/dist/chunk-JD5T4VCB.js.map +0 -7
- package/dist/chunk-LTKR3F4N.js +0 -2
- package/dist/chunk-LTKR3F4N.js.map +0 -7
- package/dist/chunk-TUVUKM4K.js +0 -2
- package/dist/chunk-TUVUKM4K.js.map +0 -7
- package/dist/chunk-Z6KTUVIC.js +0 -2
- package/dist/chunk-Z6KTUVIC.js.map +0 -7
- package/dist/dev-wizard-run-HGQO6FZV.js +0 -2
- package/dist/dev-wizard-run-HGQO6FZV.js.map +0 -7
- package/dist/entry/index.d.ts +0 -4
- package/dist/entry/vite.d.ts +0 -2
- package/dist/index.js +0 -2
- package/dist/lib/package-config/package-config-schema.d.ts +0 -35
- package/dist/lib/package-config/package-config.d.ts +0 -99
- package/dist/lib/release-slug/release-slug.d.ts +0 -43
- package/dist/lib/vendor/config-schema.d.ts +0 -58
- package/dist/lib/vite/vite.d.ts +0 -168
- package/dist/persistent-ink-dev-ui-FUJQDFNY.js +0 -8
- package/dist/persistent-ink-dev-ui-FUJQDFNY.js.map +0 -7
- package/dist/vite.js +0 -2
- package/dist/vite.js.map +0 -7
- /package/dist/{boot-YCABHUPP.js.map → boot-MTVHM4N7.js.map} +0 -0
- /package/dist/{chunk-TFHVQOVF.js.map → chunk-4MRYIYJP.js.map} +0 -0
- /package/dist/{chunk-3OMHS5RE.js.map → chunk-E2SEBLGJ.js.map} +0 -0
- /package/dist/{chunk-27PDA2PN.js.map → chunk-NC2TIQ3M.js.map} +0 -0
- /package/dist/{chunk-FAR2L74S.js.map → chunk-TPVXMJ7N.js.map} +0 -0
- /package/dist/{index.js.map → safe-stderr-HXDR2DNJ.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/tui/dev-ui/persistent-ink-dev-ui.tsx", "../src/tui/dev-ui/boot-region.tsx", "../src/tui/dev-ui/live-region.tsx", "../src/tui/dev-ui/scroll-region-dev-ui.ts", "../src/dev/scroll-region.ts"],
|
|
4
|
-
"sourcesContent": ["import { render as inkRender } from 'ink'\nimport process from 'node:process'\nimport type { ReactElement } from 'react'\n\nimport type { DevUi, LogLevel, ReadySummary } from 'src/dev/dev-ui'\nimport { DevRenderer, formatClock } from 'src/dev/render'\nimport { createSafeStream } from 'src/tui/safe-stderr'\n\nimport { BootRegion } from './boot-region'\nimport { LiveRegion } from './live-region'\nimport { ScrollRegionDevUi } from './scroll-region-dev-ui'\n\n/**\n * Ink-backed {@link DevUi} for `infra-kit dev` that keeps a PERSISTENT live footer after `ready` on a\n * backend-only session. It is the default UI on any interactive TTY: the boot phase is identical to the\n * plain path, but at {@link ready} it branches on `summary.hasUiChild`.\n *\n * - UI session (`hasUiChild`): unmount Ink and HAND OFF to a {@link ScrollRegionDevUi}, which pins the\n * ready header as a DECSTBM scroll-region footer. The `turbo run dev` child's piped output makes the\n * tail unbounded, and Ink repaints its live region on every appended line; the scroll region appends\n * with a single write instead. The scroll-region UI owns `ready`/`event`/`log`/`refresh`/`dispose`\n * for the rest of the session.\n * - Backend-only (`!hasUiChild`): mount {@link LiveRegion} and STAY mounted \u2014 the header is committed\n * once via `<Static>`, logs accrete above the footer, and `refresh` repaints the footer in place as\n * health flips.\n *\n * The embedded {@link DevRenderer} owns the file-tee format (`teeOnly`) exactly as in `InkDevUi`; in\n * persistent mode it is used ONLY for teeing (never its direct stdout write, which would collide with\n * the live region). Every component here is OUTPUT-ONLY (no `useInput`) \u2014 see live-region.tsx.\n */\n\n/** The subset of an Ink render handle this UI drives \u2014 shared by `ink` and `ink-testing-library`. */\ninterface RenderHandle {\n rerender: (tree: ReactElement) => void\n unmount: () => void\n}\n\n/** Render seam: `ink`'s `render` by default; `ink-testing-library`'s `render` is injected in tests. */\ntype RenderFn = (tree: ReactElement, options?: unknown) => RenderHandle\n\nexport interface PersistentInkDevUiDeps {\n /** File tee \u2014 the same appender the runner hands the plain renderer. */\n appendLog: (text: string) => void\n /** Mirrors the renderer's verbose gate: only in verbose does a `debug` log reach the terminal. */\n verbose?: boolean\n /** Clock seam (for deterministic tee + event timestamps in tests). */\n now?: () => Date\n /** Render seam (default `ink`'s `render`); tests inject `ink-testing-library`'s `render`. */\n render?: RenderFn\n /** Target stream (default: `process.stdout` behind the scrollback-safe filter). */\n stdout?: NodeJS.WriteStream\n}\n\nexport class PersistentInkDevUi implements DevUi {\n private readonly renderer: DevRenderer\n private readonly renderFn: RenderFn\n private readonly stdout: NodeJS.WriteStream\n private readonly verbose: boolean\n private readonly now: () => Date\n /** The file tee appender \u2014 kept so a UI-session handoff can hand the same sink to {@link ScrollRegionDevUi}. */\n private readonly appendLog: (text: string) => void\n /** Live Ink handle, or `null` when not mounted. */\n private instance: RenderHandle | null = null\n /** True once boot is done: never mount the boot region again. */\n private finalized = false\n /**\n * The scroll-region UI a UI session hands off to at {@link ready}, or `null` for a backend-only\n * session. Once set, every post-ready seam (`log`/`event`/`refresh`/`dispose`) delegates to it.\n */\n private handoff: ScrollRegionDevUi | null = null\n /** True while the persistent live region owns the terminal (backend-only session after ready). */\n private persistent = false\n private phase = ''\n private narration = ''\n private headerLines: string[] = []\n private logLines: string[] = []\n private footerLines: string[] = []\n\n constructor(deps: PersistentInkDevUiDeps) {\n this.verbose = deps.verbose ?? false\n this.renderFn = deps.render ?? (inkRender as RenderFn)\n // NOT raw `process.stdout`: Ink writes `ESC[3J` (erase saved lines) whenever a frame overflows the\n // viewport, which wipes the terminal's SCROLLBACK \u2014 the user's history, and every previous command's\n // output when `dev` runs as a session-shell child. `createSafeStream` drops that one escape and\n // forwards everything else live. The handoff at `ready` passes this same stream to ScrollRegionDevUi,\n // so both UIs are covered by this single default.\n this.stdout = deps.stdout ?? createSafeStream(process.stdout as NodeJS.WriteStream)\n this.appendLog = deps.appendLog\n this.now =\n deps.now ??\n ((): Date => {\n return new Date()\n })\n this.renderer = new DevRenderer({\n appendLog: deps.appendLog,\n verbose: this.verbose,\n isTTY: true,\n write: (text) => {\n this.stdout.write(text)\n },\n now: this.now,\n })\n }\n\n /** `LogFn`-shaped adapter for the build runner seam. */\n readonly logFn = (message: string, level: LogLevel = 'info'): void => {\n this.log(message, level)\n }\n\n // ---- boot (identical to InkDevUi) --------------------------------------\n\n /** Mount the Ink boot region (or rerender it in place) with the current phase + narration. */\n private renderBoot(readyLines?: string[]): void {\n const tree = <BootRegion phase={this.phase} narration={this.narration} readyLines={readyLines} />\n\n if (this.instance) {\n this.instance.rerender(tree)\n\n return\n }\n this.instance = this.renderFn(tree, { stdout: this.stdout, exitOnCtrlC: false, patchConsole: false })\n }\n\n /** Unmount Ink if mounted (idempotent). */\n private unmount(): void {\n if (this.instance) {\n this.instance.unmount()\n this.instance = null\n }\n }\n\n narrate(message: string): void {\n if (this.handoff) {\n this.handoff.narrate(message)\n\n return\n }\n this.renderer.teeOnly(message, 'info')\n if (this.persistent) {\n // Visible only in verbose (matches the plain renderer); tee already happened above.\n if (this.verbose) {\n this.logLines.push(message)\n this.rerenderPersistent()\n }\n\n return\n }\n if (this.finalized) {\n return\n }\n this.narration = message\n if (this.instance) {\n this.renderBoot()\n }\n }\n\n log(message: string, level: LogLevel = 'info'): void {\n if (this.handoff) {\n this.handoff.log(message, level)\n\n return\n }\n const willWrite = level !== 'debug' || this.verbose\n\n if (this.persistent) {\n // Never the embedded renderer's direct stdout write here \u2014 append to the live region instead.\n this.renderer.teeOnly(message, level)\n if (willWrite) {\n this.logLines.push(message)\n this.rerenderPersistent()\n }\n\n return\n }\n if (willWrite) {\n this.unmount()\n }\n this.renderer.log(message, level)\n }\n\n bootStep(phase: string): void {\n this.renderer.teeOnly(phase, 'info')\n if (this.finalized) {\n return\n }\n this.phase = phase\n this.renderBoot()\n }\n\n stopSpinner(): void {\n if (!this.persistent) {\n this.unmount()\n }\n }\n\n // ---- ready + persistence -----------------------------------------------\n\n ready(summary: ReadySummary): void {\n if (summary.hasUiChild) {\n this.readyHandoff(summary)\n\n return\n }\n this.readyPersistent(summary)\n }\n\n /**\n * UI session: unmount Ink and hand off to a {@link ScrollRegionDevUi}, which pins the ready header as\n * a scroll-region footer above the `turbo run dev` child's high-volume piped tail. From here on every\n * post-ready seam delegates to the handoff (see {@link log}/{@link event}/{@link refresh}/{@link dispose}).\n */\n private readyHandoff(summary: ReadySummary): void {\n this.finalized = true\n this.unmount()\n this.handoff = new ScrollRegionDevUi({ appendLog: this.appendLog, verbose: this.verbose, stdout: this.stdout })\n this.handoff.ready(summary)\n }\n\n /** Backend-only session: commit the header, tee it, mount the live footer, and STAY mounted. */\n private readyPersistent(summary: ReadySummary): void {\n this.headerLines = this.renderer.formatHeaderLines(summary)\n this.footerLines = this.renderer.formatFooterLines(summary)\n this.logLines = []\n for (const line of this.headerLines) {\n this.renderer.teeOnly(line, 'info')\n }\n this.finalized = true\n this.persistent = true\n // Re-clamp the footer when the terminal resizes. Guarded: an injected (test/piped) stream may not\n // be an EventEmitter TTY.\n if (typeof this.stdout.on === 'function') {\n this.stdout.on('resize', this.onResize)\n }\n this.rerenderPersistent()\n }\n\n /**\n * Cap for the pinned footer: it is a live region and cannot scroll, so it must never exceed the\n * viewport. Reserve rows for the scrolling log tail above it; fall back to an 80\u00D724 assumption when\n * the stream reports no row count (piped / test stdout).\n */\n private maxFooterLines(): number {\n return Math.max(3, (this.stdout.rows ?? 24) - 6)\n }\n\n /** Mount or repaint the live region from the current header / logs / footer snapshot. */\n private rerenderPersistent(): void {\n const tree = (\n <LiveRegion\n headerLines={this.headerLines}\n logLines={this.logLines}\n footerLines={this.footerLines}\n maxFooterLines={this.maxFooterLines()}\n />\n )\n\n if (this.instance) {\n this.instance.rerender(tree)\n\n return\n }\n this.instance = this.renderFn(tree, { stdout: this.stdout, exitOnCtrlC: false, patchConsole: false })\n }\n\n /** Re-clamp + repaint the footer on terminal resize (SIGWINCH), so a shrink never overflows the viewport. */\n private readonly onResize = (): void => {\n if (this.persistent) {\n this.rerenderPersistent()\n }\n }\n\n event(input: { tag: string; text: string }): void {\n if (this.handoff) {\n this.handoff.event(input)\n\n return\n }\n if (this.persistent) {\n const line = ` ${formatClock(this.now())} ${input.tag} ${input.text}`\n\n this.renderer.teeOnly(`${input.tag} ${input.text}`, 'info')\n this.logLines.push(line)\n this.rerenderPersistent()\n\n return\n }\n this.unmount()\n this.renderer.event(input)\n }\n\n /** Repaint the live footer in place from a fresh summary (header + logs untouched). No-op if not persistent. */\n refresh(summary: ReadySummary): void {\n if (this.handoff) {\n this.handoff.refresh(summary)\n\n return\n }\n // A session still in boot has no live footer to refresh.\n if (!this.persistent) {\n return\n }\n this.footerLines = this.renderer.formatFooterLines(summary)\n this.rerenderPersistent()\n }\n\n dispose(): void {\n if (this.handoff) {\n this.handoff.dispose()\n this.handoff = null\n\n return\n }\n if (this.persistent) {\n // Commit the last footer state, then release the terminal.\n this.rerenderPersistent()\n if (typeof this.stdout.off === 'function') {\n this.stdout.off('resize', this.onResize)\n }\n }\n this.finalized = true\n this.persistent = false\n this.unmount()\n }\n}\n", "import { Box, Static, Text } from 'ink'\nimport { useEffect, useState } from 'react'\n\n/**\n * The Ink boot region for `infra-kit dev`: an animated spinner + phase line while the server boots,\n * then the ready header committed to scrollback via `<Static>`.\n *\n * HARD INVARIANT \u2014 this component (and every boot component under `src/tui/dev-ui/`) is OUTPUT-ONLY.\n * It MUST NEVER call `useInput`. `useInput` arms Ink's raw mode + Ctrl-C interception, which would\n * steal SIGINT from the process signal handler that owns dev-server shutdown. The spinner animates via\n * a self-contained interval only; there is no keyboard input during boot. Do not add `useInput` here.\n */\n\nexport interface BootRegionProps {\n /** Current boot phase, shown beside the spinner. */\n phase: string\n /** Latest narration detail (dim subtitle under the spinner); empty hides the line. */\n narration: string\n /**\n * When set, boot is done: the pre-formatted ready-header lines are committed to scrollback via\n * `<Static>` and the transient spinner region is gone. The renderer unmounts right after.\n */\n readyLines?: string[]\n}\n\n/** Animated boot spinner + phase/narration, or the committed ready header once `readyLines` is set. */\nexport const BootRegion = (props: BootRegionProps) => {\n const { phase, narration, readyLines } = props\n\n const [frame, setFrame] = useState(0)\n\n useEffect(() => {\n // No spinner once the ready header is committed.\n if (readyLines) {\n return\n }\n\n const timer = setInterval(() => {\n setFrame((f) => {\n return f + 1\n })\n }, SPINNER_INTERVAL_MS)\n\n return () => {\n clearInterval(timer)\n }\n }, [readyLines])\n\n if (readyLines) {\n // `<Static>` writes each line once, above the (now empty) live region, so the header persists in\n // scrollback after unmount. Lines are pre-formatted by DevRenderer.formatReadyLines.\n return (\n <Static items={readyLines}>\n {(line, index) => {\n return <Text key={index}>{line}</Text>\n }}\n </Static>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color=\"cyan\">{SPINNER_FRAMES[frame % SPINNER_FRAMES.length]}</Text>\n <Text dimColor>{` ${phase}`}</Text>\n </Box>\n {narration ? <Text dimColor>{narration}</Text> : null}\n </Box>\n )\n}\n\nconst SPINNER_FRAMES = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\nconst SPINNER_INTERVAL_MS = 80\n", "import { Box, Static, Text } from 'ink'\n\n/**\n * The persistent Ink live region for `infra-kit dev` (backend-only sessions): the committed header +\n * growing log scrollback above, and a live health footer re-rendered in place below.\n *\n * HARD INVARIANT \u2014 this component (and every component under `src/tui/dev-ui/`) is OUTPUT-ONLY. It\n * MUST NEVER call `useInput`. `useInput` arms Ink's raw mode + Ctrl-C interception, which would steal\n * SIGINT from the process signal handler that owns dev-server shutdown. There is no keyboard input in\n * the live region \u2014 it is props only, with no state, no effects, no input. Do not add `useInput` here.\n */\n\nexport interface LiveRegionProps {\n /** Reference header, committed once to scrollback via `<Static>` (from `formatHeaderLines`). */\n headerLines: string[]\n /** Log lines committed above the footer as they arrive (also via the SAME `<Static>`). */\n logLines: string[]\n /** Live footer, re-rendered in place on every health change (from `formatFooterLines`). */\n footerLines: string[]\n /**\n * Cap on rendered footer rows so a many-backend session never eats a short viewport (the footer is a\n * live region \u2014 it cannot scroll). Overflow collapses into a trailing dim `\u2026 +N more` line. Omit for\n * no cap. The pinned footer must stay short; the full health picture is always in the log file.\n */\n maxFooterLines?: number\n}\n\n/**\n * A SINGLE `<Static>` streams the header then the growing logs (Ink writes only newly-appended items\n * each commit, so the header lands first and logs accrete beneath it \u2014 one block, never two). The\n * footer is an ordinary `<Box>`, so it repaints in place on each rerender without touching scrollback.\n */\nexport const LiveRegion = (props: LiveRegionProps) => {\n const { headerLines, logLines, footerLines } = props\n\n const staticItems = [...headerLines, ...logLines]\n const footer = clampFooter(footerLines, props.maxFooterLines)\n\n return (\n <>\n <Static items={staticItems}>\n {(line, index) => {\n return <Text key={index}>{line}</Text>\n }}\n </Static>\n <Box flexDirection=\"column\">\n {footer.map((line, index) => {\n return <Text key={index}>{line}</Text>\n })}\n </Box>\n </>\n )\n}\n\n/** Cap the footer to `max` rows, collapsing the overflow into one trailing ` \u2026 +N more` line. */\nexport const clampFooter = (lines: string[], max?: number): string[] => {\n if (max == null || max < 1 || lines.length <= max) {\n return lines\n }\n\n const shown = lines.slice(0, max - 1)\n\n return [...shown, ` \u2026 +${lines.length - shown.length} more`]\n}\n", "import process from 'node:process'\n\nimport type { DevUi, LogLevel, ReadySummary } from 'src/dev/dev-ui'\nimport { DevRenderer, formatClock } from 'src/dev/render'\nimport { SHOW_CURSOR, installRegion, moveTo, paintFooter, resetScrollRegion } from 'src/dev/scroll-region'\n\n/**\n * A {@link DevUi} that pins the `infra-kit dev` ready header to the bottom of the terminal as a STICKY\n * FOOTER using a DECSTBM scroll region, for sessions that run a `turbo run dev` UI child\n * (`summary.hasUiChild`). {@link PersistentInkDevUi} hands off to it at `ready`.\n *\n * Deliberately NO React / NO Ink. A UI session's tail is unbounded \u2014 every vite/HMR line the piped\n * child emits arrives as an `event` \u2014 and Ink's reconciler repaints its live region on each one. The\n * scroll region instead confines ALL scrolling (`log` + `event` lines) to the rows above the footer\n * using terminal escapes alone, so an append costs one `write` and the footer never repaints. See\n * {@link file://../../dev/scroll-region.ts}.\n *\n * The embedded {@link DevRenderer} is the single source of the file-tee format (`teeOnly`) and the\n * ready-header layout (`formatReadyLines`) \u2014 reused, never duplicated \u2014 exactly like the Ink UIs. Every\n * terminal write goes through the injected `stdout` so tests drive a fake stream.\n */\n\nexport interface ScrollRegionDevUiDeps {\n /** File tee \u2014 the same appender the runner hands every renderer. */\n appendLog: (text: string) => void\n /** Only in verbose does boot narration reach the terminal (it is always tee'd to the file). */\n verbose: boolean\n /** Target stream (default `process.stdout`). Its `isTTY`/`rows` gate the whole feature. */\n stdout?: NodeJS.WriteStream\n}\n\nexport class ScrollRegionDevUi implements DevUi {\n /** Embedded plain renderer: owns the file-tee format + the ready-header layout. Never drives a spinner. */\n private readonly renderer: DevRenderer\n private readonly stdout: NodeJS.WriteStream\n private readonly verbose: boolean\n /** The current footer block (the full ready header), recomputed on `ready`/`refresh`. */\n private footerLines: string[] = []\n /** True while a scroll region is installed and the footer is live (false when disabled / disposed). */\n private installed = false\n /** True once the resize listener is attached, so it is added at most once and removed exactly once. */\n private resizeBound = false\n\n constructor(deps: ScrollRegionDevUiDeps) {\n this.verbose = deps.verbose\n this.stdout = deps.stdout ?? process.stdout\n this.renderer = new DevRenderer({\n appendLog: deps.appendLog,\n verbose: this.verbose,\n // Colors follow the real stream: a TTY footer is colored; a piped / captured stream stays plain.\n isTTY: Boolean(this.stdout.isTTY),\n write: (text) => {\n this.stdout.write(text)\n },\n })\n }\n\n /** `LogFn`-shaped adapter for the build runner seam. */\n readonly logFn = (message: string, level: LogLevel = 'info'): void => {\n this.log(message, level)\n }\n\n /**\n * Row count, falling back to 24 (the classic terminal default) for any non-positive or absent value.\n *\n * `rows` is NOT merely `undefined` on a row-less stream: a pty allocated without a window size \u2014 what\n * `script(1)` gives us, and what some CI runners and terminal emulators report before their first\n * `SIGWINCH` \u2014 sets `isTTY === true` alongside `rows === 0`. A `??` fallback passes that `0` straight\n * through, `installRegion` then reads the terminal as \"too short\", and the footer silently never\n * installs on a terminal that is in fact perfectly tall enough.\n */\n private rows(): number {\n const reported = this.stdout.rows\n\n return reported != null && reported > 0 ? reported : 24\n }\n\n /** Write each line as its own terminal row (used for the non-TTY / too-short plain fallback). */\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stdout.write(`${line}\\n`)\n }\n }\n\n narrate(message: string): void {\n this.renderer.teeOnly(message, 'info')\n if (this.verbose) {\n this.stdout.write(`${message}\\n`)\n }\n }\n\n /** A general message: lands inside the scroll region and scrolls normally, plus a file tee. */\n log(message: string, level: LogLevel = 'info'): void {\n if (level !== 'debug' || this.verbose) {\n this.stdout.write(`${message}\\n`)\n }\n this.renderer.teeOnly(message, level)\n }\n\n /** Boot narration only \u2014 no spinner (a spinner would fight the child for the cursor). */\n bootStep(phase: string): void {\n this.narrate(phase)\n }\n\n /** No-op: this UI never runs a spinner. */\n stopSpinner(): void {\n // Nothing to stop.\n }\n\n /**\n * Install (or re-install) the scroll region and paint the footer for the CURRENT terminal size.\n * Returns `false` when the terminal is too short to host both a region and the footer \u2014 the caller\n * then falls back to a one-shot plain print (or disposes, on a shrink).\n */\n private applyRegion(): boolean {\n const rows = this.rows()\n const region = installRegion(this.footerLines.length, rows)\n\n if (region === '') return false\n this.stdout.write(`${region}${paintFooter(this.footerLines, rows)}`)\n\n return true\n }\n\n /** Attach the resize listener once (guarded \u2014 an injected stream may not be an EventEmitter TTY). */\n private bindResize(): void {\n if (this.resizeBound || typeof this.stdout.on !== 'function') return\n this.stdout.on('resize', this.onResize)\n this.resizeBound = true\n }\n\n ready(summary: ReadySummary): void {\n this.footerLines = this.renderer.formatReadyLines(summary)\n for (const line of this.footerLines) {\n this.renderer.teeOnly(line, 'info')\n }\n\n // Not a real terminal (piped / test capture): just print the header once, no region.\n if (!this.stdout.isTTY) {\n this.writeLines(this.footerLines)\n\n return\n }\n\n // Too short for a region \u2192 print plainly and leave the feature disabled (installed stays false).\n if (!this.applyRegion()) {\n this.writeLines(this.footerLines)\n\n return\n }\n this.installed = true\n this.bindResize()\n }\n\n /** One tagged, timestamped tail line \u2014 scrolls inside the region like any other `log`. */\n event(input: { tag: string; text: string }): void {\n const line = ` ${formatClock(new Date())} ${input.tag} ${input.text}`\n\n this.stdout.write(`${line}\\n`)\n this.renderer.teeOnly(`${input.tag} ${input.text}`, 'info')\n }\n\n /** Recompute the footer and repaint it in place \u2014 nothing else is reprinted. No-op when not installed. */\n refresh(summary: ReadySummary): void {\n this.footerLines = this.renderer.formatReadyLines(summary)\n if (!this.installed) return\n this.stdout.write(paintFooter(this.footerLines, this.rows()))\n }\n\n /**\n * Re-clamp on terminal resize (SIGWINCH, surfaced as the stream's `resize` event): re-run the region\n * install + repaint for the new size. If the new size is too short to host the footer, dispose\n * gracefully rather than paint a broken region.\n */\n private readonly onResize = (): void => {\n if (!this.installed) return\n if (!this.applyRegion()) {\n this.dispose()\n }\n }\n\n /**\n * Release the terminal: drop the resize listener, reset the scroll region, drop the cursor onto the\n * last row with a fresh newline, and restore the cursor. Idempotent and safe if never installed \u2014 the\n * region escapes are emitted only while a region is actually live, so a second call (or a disposal of\n * a never-installed instance) writes nothing and leaves the terminal usable.\n */\n dispose(): void {\n if (this.resizeBound && typeof this.stdout.off === 'function') {\n this.stdout.off('resize', this.onResize)\n this.resizeBound = false\n }\n if (this.installed) {\n const rows = this.rows()\n\n this.stdout.write(`${resetScrollRegion()}${moveTo(rows, 1)}\\n${SHOW_CURSOR}`)\n this.installed = false\n }\n }\n}\n", "/**\n * Pure, side-effect-free ANSI builders for a terminal SCROLL REGION (DECSTBM) sticky footer.\n *\n * `infra-kit dev` uses these to pin the ready-header block to the bottom of the terminal while a\n * `turbo run dev` UI child owns the same TTY via inherited stdio. DECSTBM (`ESC [ top ; bottom r`)\n * confines normal scrolling \u2014 from both the runner's own writes AND the inherited child's raw bytes \u2014\n * to the region ABOVE the footer, so the footer rows are never scrolled away. That is why this works\n * where a piping approach could not: the child keeps inherited stdio and needs no per-framework flags.\n *\n * Every function here is a pure string builder: no I/O, no `process` access, no terminal queries. The\n * caller ({@link file://../tui/dev-ui/scroll-region-dev-ui.ts}) owns all writes, the row count, and the\n * TTY guard. Each builder is unit-tested with exact-string assertions.\n */\n\n/** Save the cursor position (DECSC). Paired with {@link RESTORE_CURSOR} around a footer repaint. */\nexport const SAVE_CURSOR = '\\x1B7'\n/** Restore the cursor position saved by {@link SAVE_CURSOR} (DECRC). */\nexport const RESTORE_CURSOR = '\\x1B8'\n/** Erase the entire current line without moving the cursor (EL 2), so a repaint leaves no stale glyphs. */\nexport const CLEAR_LINE = '\\x1B[2K'\n/** Hide the cursor (DECTCEM off) \u2014 avoids a cursor flicker while the footer repaints. */\nexport const HIDE_CURSOR = '\\x1B[?25l'\n/** Show the cursor (DECTCEM on) \u2014 restored on teardown so the terminal is left usable. */\nexport const SHOW_CURSOR = '\\x1B[?25h'\n\n/**\n * Set the vertical scroll region (DECSTBM) to lines `top..bottom` inclusive, 1-indexed. Scrolling is\n * thereafter confined to that band; the rows below `bottom` become a static footer area.\n */\nexport const setScrollRegion = (top: number, bottom: number): string => {\n return `\\x1B[${top};${bottom}r`\n}\n\n/** Reset the scroll region to the full screen (DECSTBM with no params) \u2014 the teardown counterpart. */\nexport const resetScrollRegion = (): string => {\n return '\\x1B[r'\n}\n\n/** Absolute cursor move (CUP) to `row`,`col`, both 1-indexed. */\nexport const moveTo = (row: number, col: number): string => {\n return `\\x1B[${row};${col}H`\n}\n\n/**\n * Scroll existing content up by `n` blank lines, then return the cursor to its starting row, so the\n * bottom `n` rows are cleared for a footer WITHOUT overwriting whatever was already on screen. Emits\n * `n` newlines (which scroll the viewport) followed by cursor-up-`n` (CUU). Returns `''` for `n <= 0`.\n */\nexport const reserveRows = (n: number): string => {\n if (n <= 0) return ''\n\n return `${'\\n'.repeat(n)}\\x1B[${n}A`\n}\n\n/**\n * Paint `lines` into the bottom `lines.length` rows of a `rows`-tall terminal, cursor-safe: save the\n * cursor, absolutely position + clear + write each line (top-most footer row first), then restore the\n * cursor so surrounding scroll output is undisturbed. Returns `''` when there are no lines to paint.\n */\nexport const paintFooter = (lines: readonly string[], rows: number): string => {\n if (lines.length === 0) return ''\n\n const base = rows - lines.length + 1\n const painted = lines\n .map((line, i) => {\n return `${moveTo(base + i, 1)}${CLEAR_LINE}${line}`\n })\n .join('')\n\n return `${SAVE_CURSOR}${painted}${RESTORE_CURSOR}`\n}\n\n/**\n * Reserve `footerHeight` rows at the bottom and confine scrolling to the rows above them: emit\n * {@link reserveRows} then a {@link setScrollRegion} of `1..rows - footerHeight`. Returns `''` when the\n * terminal is too short to host both a scroll region and the footer (`rows - footerHeight < 1`); the\n * caller MUST treat `''` as \"skip the whole feature\" and fall back to a one-shot plain print.\n */\nexport const installRegion = (footerHeight: number, rows: number): string => {\n if (rows - footerHeight < 1) return ''\n\n return `${reserveRows(footerHeight)}${setScrollRegion(1, rows - footerHeight)}`\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["inkRender", "process", "Box", "Static", "Text", "useEffect", "useState", "jsx", "jsxs", "BootRegion", "props", "phase", "narration", "readyLines", "frame", "setFrame", "timer", "f", "SPINNER_INTERVAL_MS", "line", "index", "SPINNER_FRAMES", "Box", "Static", "Text", "Fragment", "jsx", "jsxs", "LiveRegion", "props", "headerLines", "logLines", "footerLines", "staticItems", "footer", "clampFooter", "line", "index", "lines", "max", "shown", "process", "CLEAR_LINE", "SHOW_CURSOR", "setScrollRegion", "top", "bottom", "resetScrollRegion", "moveTo", "row", "col", "reserveRows", "n", "paintFooter", "lines", "rows", "base", "line", "i", "CLEAR_LINE", "installRegion", "footerHeight", "ScrollRegionDevUi", "deps", "process", "DevRenderer", "text", "message", "level", "reported", "lines", "line", "phase", "rows", "region", "installRegion", "paintFooter", "summary", "input", "formatClock", "resetScrollRegion", "moveTo", "SHOW_CURSOR", "jsx", "PersistentInkDevUi", "deps", "inkRender", "createSafeStream", "process", "DevRenderer", "text", "message", "level", "readyLines", "tree", "BootRegion", "willWrite", "phase", "summary", "ScrollRegionDevUi", "line", "LiveRegion", "input", "formatClock"]
|
|
7
|
-
}
|
package/dist/vite.js
DELETED
package/dist/vite.js.map
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|