spawn-term 1.1.7 → 2.0.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.
Files changed (61) hide show
  1. package/dist/cjs/components/App.js +110 -9
  2. package/dist/cjs/components/App.js.map +1 -1
  3. package/dist/cjs/components/CompactProcessLine.js +153 -0
  4. package/dist/cjs/components/CompactProcessLine.js.map +1 -0
  5. package/dist/cjs/components/Divider.js +24 -0
  6. package/dist/cjs/components/Divider.js.map +1 -0
  7. package/dist/cjs/components/ErrorDetailModal.js +115 -0
  8. package/dist/cjs/components/ErrorDetailModal.js.map +1 -0
  9. package/dist/cjs/components/ErrorListModal.js +135 -0
  10. package/dist/cjs/components/ErrorListModal.js.map +1 -0
  11. package/dist/cjs/components/StatusBar.js +104 -0
  12. package/dist/cjs/components/StatusBar.js.map +1 -0
  13. package/dist/cjs/createApp.js +30 -33
  14. package/dist/cjs/createApp.js.map +1 -1
  15. package/dist/cjs/lib/figures.js +1 -1
  16. package/dist/cjs/lib/figures.js.map +1 -1
  17. package/dist/cjs/src/components/App.d.ts +1 -5
  18. package/dist/cjs/src/components/CompactProcessLine.d.ts +6 -0
  19. package/dist/cjs/src/components/Divider.d.ts +2 -0
  20. package/dist/cjs/src/components/ErrorDetailModal.d.ts +8 -0
  21. package/dist/cjs/src/components/ErrorListModal.d.ts +8 -0
  22. package/dist/cjs/src/components/StatusBar.d.ts +8 -0
  23. package/dist/cjs/src/createApp.d.ts +4 -5
  24. package/dist/cjs/src/state/processStore.d.ts +38 -0
  25. package/dist/cjs/state/processStore.js +241 -0
  26. package/dist/cjs/state/processStore.js.map +1 -0
  27. package/dist/cjs/worker.js +70 -108
  28. package/dist/cjs/worker.js.map +1 -1
  29. package/dist/esm/components/App.js +108 -8
  30. package/dist/esm/components/App.js.map +1 -1
  31. package/dist/esm/components/CompactProcessLine.js +134 -0
  32. package/dist/esm/components/CompactProcessLine.js.map +1 -0
  33. package/dist/esm/components/Divider.js +13 -0
  34. package/dist/esm/components/Divider.js.map +1 -0
  35. package/dist/esm/components/ErrorDetailModal.js +99 -0
  36. package/dist/esm/components/ErrorDetailModal.js.map +1 -0
  37. package/dist/esm/components/ErrorListModal.js +116 -0
  38. package/dist/esm/components/ErrorListModal.js.map +1 -0
  39. package/dist/esm/components/StatusBar.js +87 -0
  40. package/dist/esm/components/StatusBar.js.map +1 -0
  41. package/dist/esm/createApp.js +31 -32
  42. package/dist/esm/createApp.js.map +1 -1
  43. package/dist/esm/src/components/App.d.ts +1 -5
  44. package/dist/esm/src/components/CompactProcessLine.d.ts +6 -0
  45. package/dist/esm/src/components/Divider.d.ts +2 -0
  46. package/dist/esm/src/components/ErrorDetailModal.d.ts +8 -0
  47. package/dist/esm/src/components/ErrorListModal.d.ts +8 -0
  48. package/dist/esm/src/components/StatusBar.d.ts +8 -0
  49. package/dist/esm/src/createApp.d.ts +4 -5
  50. package/dist/esm/src/state/processStore.d.ts +38 -0
  51. package/dist/esm/state/processStore.js +149 -0
  52. package/dist/esm/state/processStore.js.map +1 -0
  53. package/dist/esm/worker.js +59 -91
  54. package/dist/esm/worker.js.map +1 -1
  55. package/package.json +1 -2
  56. package/dist/cjs/src/state/Store.d.ts +0 -11
  57. package/dist/cjs/state/Store.js +0 -40
  58. package/dist/cjs/state/Store.js.map +0 -1
  59. package/dist/esm/src/state/Store.d.ts +0 -11
  60. package/dist/esm/state/Store.js +0 -19
  61. package/dist/esm/state/Store.js.map +0 -1
@@ -10,21 +10,122 @@ Object.defineProperty(exports, "default", {
10
10
  });
11
11
  var _jsxruntime = require("react/jsx-runtime");
12
12
  var _ink = require("ink");
13
- var _ChildProcessts = /*#__PURE__*/ _interop_require_default(require("./ChildProcess.js"));
13
+ var _react = require("react");
14
+ var _processStorets = require("../state/processStore.js");
15
+ var _CompactProcessLinets = /*#__PURE__*/ _interop_require_default(require("./CompactProcessLine.js"));
16
+ var _Dividerts = /*#__PURE__*/ _interop_require_default(require("./Divider.js"));
17
+ var _ErrorDetailModalts = /*#__PURE__*/ _interop_require_default(require("./ErrorDetailModal.js"));
18
+ var _ErrorListModalts = /*#__PURE__*/ _interop_require_default(require("./ErrorListModal.js"));
19
+ var _StatusBarts = /*#__PURE__*/ _interop_require_default(require("./StatusBar.js"));
14
20
  function _interop_require_default(obj) {
15
21
  return obj && obj.__esModule ? obj : {
16
22
  default: obj
17
23
  };
18
24
  }
19
- function App(param) {
20
- var store = param.store;
21
- return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
25
+ function App() {
26
+ var exit = (0, _ink.useApp)().exit;
27
+ var isRawModeSupported = (0, _ink.useStdin)().isRawModeSupported;
28
+ // Subscribe to store state
29
+ var processes = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getSnapshot);
30
+ var shouldExit = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getShouldExit);
31
+ var mode = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getMode);
32
+ var selectedErrorIndex = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getSelectedErrorIndex);
33
+ // Derived state
34
+ var completedProcesses = _processStorets.processStore.getCompletedProcesses();
35
+ var runningProcesses = _processStorets.processStore.getRunningProcesses();
36
+ var failedProcesses = _processStorets.processStore.getFailedProcesses();
37
+ var runningCount = _processStorets.processStore.getRunningCount();
38
+ var doneCount = _processStorets.processStore.getDoneCount();
39
+ var errorCount = _processStorets.processStore.getErrorCount();
40
+ var errorLineCount = _processStorets.processStore.getErrorLineCount();
41
+ // Handle exit signal
42
+ (0, _react.useEffect)(function() {
43
+ if (shouldExit) {
44
+ exit();
45
+ }
46
+ }, [
47
+ shouldExit,
48
+ exit
49
+ ]);
50
+ // Keyboard handling (only active when raw mode is supported)
51
+ (0, _ink.useInput)(function(input, key) {
52
+ if (mode === 'normal') {
53
+ if (input === 'e' && errorCount > 0) {
54
+ _processStorets.processStore.setMode('errorList');
55
+ }
56
+ } else if (mode === 'errorList') {
57
+ if (key.escape) {
58
+ _processStorets.processStore.setMode('normal');
59
+ } else if (key.downArrow) {
60
+ _processStorets.processStore.selectNextError();
61
+ } else if (key.upArrow) {
62
+ _processStorets.processStore.selectPrevError();
63
+ } else if (key.return) {
64
+ _processStorets.processStore.setMode('errorDetail');
65
+ }
66
+ } else if (mode === 'errorDetail') {
67
+ if (key.escape) {
68
+ _processStorets.processStore.setMode('errorList');
69
+ } else if (key.downArrow) {
70
+ _processStorets.processStore.selectNextError();
71
+ } else if (key.upArrow) {
72
+ _processStorets.processStore.selectPrevError();
73
+ }
74
+ }
75
+ }, {
76
+ isActive: isRawModeSupported === true
77
+ });
78
+ // Error list modal
79
+ if (mode === 'errorList') {
80
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ErrorListModalts.default, {
81
+ errors: failedProcesses,
82
+ selectedIndex: selectedErrorIndex,
83
+ totalErrorLines: errorLineCount
84
+ });
85
+ }
86
+ // Error detail modal
87
+ if (mode === 'errorDetail') {
88
+ var selectedError = _processStorets.processStore.getSelectedError();
89
+ if (selectedError) {
90
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ErrorDetailModalts.default, {
91
+ error: selectedError,
92
+ currentIndex: selectedErrorIndex,
93
+ totalErrors: failedProcesses.length
94
+ });
95
+ }
96
+ // Fallback if no error selected
97
+ _processStorets.processStore.setMode('errorList');
98
+ }
99
+ // Normal view
100
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
22
101
  flexDirection: "column",
23
- children: store.processes.map(function(item) {
24
- return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ChildProcessts.default, {
25
- item: item
26
- }, item.id);
27
- })
102
+ children: [
103
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Static, {
104
+ items: completedProcesses,
105
+ children: function(item) {
106
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_CompactProcessLinets.default, {
107
+ item: item
108
+ }, item.id);
109
+ }
110
+ }),
111
+ completedProcesses.length > 0 && runningProcesses.length > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_Dividerts.default, {}),
112
+ runningProcesses.map(function(item) {
113
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_CompactProcessLinets.default, {
114
+ item: item
115
+ }, item.id);
116
+ }),
117
+ processes.length > 0 && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
118
+ children: [
119
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_Dividerts.default, {}),
120
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_StatusBarts.default, {
121
+ running: runningCount,
122
+ done: doneCount,
123
+ errors: errorCount,
124
+ errorLines: errorLineCount
125
+ })
126
+ ]
127
+ })
128
+ ]
28
129
  });
29
130
  }
30
131
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/App.tsx"],"sourcesContent":["import { Box } from 'ink';\nimport type Store from '../state/Store.ts';\nimport type { ChildProcess as ChildProcessT } from '../types.ts';\nimport ChildProcess from './ChildProcess.ts';\n\nexport interface AppProps {\n store: Store;\n}\n\nexport default function App({ store }: AppProps): React.JSX.Element {\n return (\n <Box flexDirection=\"column\">\n {store.processes.map((item: ChildProcessT) => (\n <ChildProcess key={item.id} item={item} />\n ))}\n </Box>\n );\n}\n"],"names":["App","store","Box","flexDirection","processes","map","item","ChildProcess","id"],"mappings":";;;;+BASA;;;eAAwBA;;;;mBATJ;qEAGK;;;;;;AAMV,SAASA,IAAI,KAAmB;QAAnB,AAAEC,QAAF,MAAEA;IAC5B,qBACE,qBAACC,QAAG;QAACC,eAAc;kBAChBF,MAAMG,SAAS,CAACC,GAAG,CAAC,SAACC;iCACpB,qBAACC,uBAAY;gBAAeD,MAAMA;eAAfA,KAAKE,EAAE;;;AAIlC"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/App.tsx"],"sourcesContent":["import { Box, Static, useApp, useInput, useStdin } from 'ink';\nimport { useEffect, useSyncExternalStore } from 'react';\nimport { processStore } from '../state/processStore.ts';\nimport CompactProcessLine from './CompactProcessLine.ts';\nimport Divider from './Divider.ts';\nimport ErrorDetailModal from './ErrorDetailModal.ts';\nimport ErrorListModal from './ErrorListModal.ts';\nimport StatusBar from './StatusBar.ts';\n\nexport default function App(): React.JSX.Element {\n const { exit } = useApp();\n const { isRawModeSupported } = useStdin();\n\n // Subscribe to store state\n const processes = useSyncExternalStore(processStore.subscribe, processStore.getSnapshot);\n const shouldExit = useSyncExternalStore(processStore.subscribe, processStore.getShouldExit);\n const mode = useSyncExternalStore(processStore.subscribe, processStore.getMode);\n const selectedErrorIndex = useSyncExternalStore(processStore.subscribe, processStore.getSelectedErrorIndex);\n\n // Derived state\n const completedProcesses = processStore.getCompletedProcesses();\n const runningProcesses = processStore.getRunningProcesses();\n const failedProcesses = processStore.getFailedProcesses();\n const runningCount = processStore.getRunningCount();\n const doneCount = processStore.getDoneCount();\n const errorCount = processStore.getErrorCount();\n const errorLineCount = processStore.getErrorLineCount();\n\n // Handle exit signal\n useEffect(() => {\n if (shouldExit) {\n exit();\n }\n }, [shouldExit, exit]);\n\n // Keyboard handling (only active when raw mode is supported)\n useInput(\n (input, key) => {\n if (mode === 'normal') {\n if (input === 'e' && errorCount > 0) {\n processStore.setMode('errorList');\n }\n } else if (mode === 'errorList') {\n if (key.escape) {\n processStore.setMode('normal');\n } else if (key.downArrow) {\n processStore.selectNextError();\n } else if (key.upArrow) {\n processStore.selectPrevError();\n } else if (key.return) {\n processStore.setMode('errorDetail');\n }\n } else if (mode === 'errorDetail') {\n if (key.escape) {\n processStore.setMode('errorList');\n } else if (key.downArrow) {\n processStore.selectNextError();\n } else if (key.upArrow) {\n processStore.selectPrevError();\n }\n }\n },\n { isActive: isRawModeSupported === true }\n );\n\n // Error list modal\n if (mode === 'errorList') {\n return <ErrorListModal errors={failedProcesses} selectedIndex={selectedErrorIndex} totalErrorLines={errorLineCount} />;\n }\n\n // Error detail modal\n if (mode === 'errorDetail') {\n const selectedError = processStore.getSelectedError();\n if (selectedError) {\n return <ErrorDetailModal error={selectedError} currentIndex={selectedErrorIndex} totalErrors={failedProcesses.length} />;\n }\n // Fallback if no error selected\n processStore.setMode('errorList');\n }\n\n // Normal view\n return (\n <Box flexDirection=\"column\">\n {/* Static area - completed processes (completion order) */}\n <Static items={completedProcesses}>{(item) => <CompactProcessLine key={item.id} item={item} />}</Static>\n\n {/* Divider between completed and running */}\n {completedProcesses.length > 0 && runningProcesses.length > 0 && <Divider />}\n\n {/* Dynamic area - running processes */}\n {runningProcesses.map((item) => (\n <CompactProcessLine key={item.id} item={item} />\n ))}\n\n {/* Status bar */}\n {processes.length > 0 && (\n <>\n <Divider />\n <StatusBar running={runningCount} done={doneCount} errors={errorCount} errorLines={errorLineCount} />\n </>\n )}\n </Box>\n );\n}\n"],"names":["App","exit","useApp","isRawModeSupported","useStdin","processes","useSyncExternalStore","processStore","subscribe","getSnapshot","shouldExit","getShouldExit","mode","getMode","selectedErrorIndex","getSelectedErrorIndex","completedProcesses","getCompletedProcesses","runningProcesses","getRunningProcesses","failedProcesses","getFailedProcesses","runningCount","getRunningCount","doneCount","getDoneCount","errorCount","getErrorCount","errorLineCount","getErrorLineCount","useEffect","useInput","input","key","setMode","escape","downArrow","selectNextError","upArrow","selectPrevError","return","isActive","ErrorListModal","errors","selectedIndex","totalErrorLines","selectedError","getSelectedError","ErrorDetailModal","error","currentIndex","totalErrors","length","Box","flexDirection","Static","items","item","CompactProcessLine","id","Divider","map","StatusBar","running","done","errorLines"],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _ink = require("ink");
13
+ var _react = require("react");
14
+ var _figurests = /*#__PURE__*/ _interop_require_default(require("../lib/figures.js"));
15
+ var _typests = require("../types.js");
16
+ var _Spinnerts = /*#__PURE__*/ _interop_require_default(require("./Spinner.js"));
17
+ function _define_property(obj, key, value) {
18
+ if (key in obj) {
19
+ Object.defineProperty(obj, key, {
20
+ value: value,
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true
24
+ });
25
+ } else {
26
+ obj[key] = value;
27
+ }
28
+ return obj;
29
+ }
30
+ function _interop_require_default(obj) {
31
+ return obj && obj.__esModule ? obj : {
32
+ default: obj
33
+ };
34
+ }
35
+ function _object_spread(target) {
36
+ for(var i = 1; i < arguments.length; i++){
37
+ var source = arguments[i] != null ? arguments[i] : {};
38
+ var ownKeys = Object.keys(source);
39
+ if (typeof Object.getOwnPropertySymbols === "function") {
40
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
41
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
42
+ }));
43
+ }
44
+ ownKeys.forEach(function(key) {
45
+ _define_property(target, key, source[key]);
46
+ });
47
+ }
48
+ return target;
49
+ }
50
+ // From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2
51
+ var SPINNER = {
52
+ interval: 80,
53
+ frames: [
54
+ '⠋',
55
+ '⠙',
56
+ '⠹',
57
+ '⠸',
58
+ '⠼',
59
+ '⠴',
60
+ '⠦',
61
+ '⠧',
62
+ '⠇',
63
+ '⠏'
64
+ ]
65
+ };
66
+ function truncate(str, maxLength) {
67
+ if (str.length <= maxLength) return str;
68
+ return "".concat(str.slice(0, maxLength - 1), "…");
69
+ }
70
+ function getLastOutputLine(lines) {
71
+ for(var i = lines.length - 1; i >= 0; i--){
72
+ if (lines[i].text.length > 0) {
73
+ return lines[i].text;
74
+ }
75
+ }
76
+ return '';
77
+ }
78
+ function getErrorCount(lines) {
79
+ return lines.filter(function(line) {
80
+ return line.type === _typests.LineType.stderr;
81
+ }).length;
82
+ }
83
+ var _default = /*#__PURE__*/ (0, _react.memo)(function CompactProcessLine(param) {
84
+ var item = param.item;
85
+ var stdout = (0, _ink.useStdout)().stdout;
86
+ var terminalWidth = (stdout === null || stdout === void 0 ? void 0 : stdout.columns) || 80;
87
+ var group = item.group, title = item.title, state = item.state, lines = item.lines;
88
+ // Display name: prefer group, fall back to title
89
+ var displayName = group || title;
90
+ // Calculate widths - use fixed-width columns for alignment
91
+ var iconWidth = 2; // icon + space
92
+ var nameColumnWidth = 15; // fixed width for name column
93
+ var gap = 1; // space between name and status
94
+ var statusWidth = terminalWidth - iconWidth - nameColumnWidth - gap;
95
+ // Truncate name if needed and pad to column width
96
+ var truncatedName = truncate(displayName, nameColumnWidth).padEnd(nameColumnWidth);
97
+ // Status text based on state
98
+ var statusText = (0, _react.useMemo)(function() {
99
+ if (state === 'running') {
100
+ var lastLine = getLastOutputLine(lines);
101
+ return lastLine ? truncate(lastLine, statusWidth) : '';
102
+ }
103
+ if (state === 'error') {
104
+ var errorCount = getErrorCount(lines);
105
+ return errorCount > 0 ? "".concat(errorCount, " error").concat(errorCount > 1 ? 's' : '') : 'failed';
106
+ }
107
+ return ''; // success - no status text
108
+ }, [
109
+ state,
110
+ lines,
111
+ statusWidth
112
+ ]);
113
+ // Icon based on state
114
+ var icon = (0, _react.useMemo)(function() {
115
+ switch(state){
116
+ case 'running':
117
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_Spinnerts.default, _object_spread({}, SPINNER));
118
+ case 'success':
119
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
120
+ color: "green",
121
+ children: _figurests.default.tick
122
+ });
123
+ case 'error':
124
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
125
+ color: "red",
126
+ children: _figurests.default.cross
127
+ });
128
+ }
129
+ }, [
130
+ state
131
+ ]);
132
+ // Status text color
133
+ var statusColor = state === 'error' ? 'red' : 'gray';
134
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
135
+ children: [
136
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
137
+ width: iconWidth,
138
+ children: icon
139
+ }),
140
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
141
+ children: truncatedName
142
+ }),
143
+ statusText && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
144
+ color: statusColor,
145
+ children: [
146
+ " ",
147
+ statusText
148
+ ]
149
+ })
150
+ ]
151
+ });
152
+ });
153
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/CompactProcessLine.tsx"],"sourcesContent":["import { Box, Text, useStdout } from 'ink';\nimport { memo, useMemo } from 'react';\nimport figures from '../lib/figures.ts';\nimport type { ChildProcess, Line } from '../types.ts';\nimport { LineType } from '../types.ts';\nimport Spinner from './Spinner.ts';\n\n// From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2\nconst SPINNER = {\n interval: 80,\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n};\n\ntype Props = {\n item: ChildProcess;\n};\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return `${str.slice(0, maxLength - 1)}…`;\n}\n\nfunction getLastOutputLine(lines: Line[]): string {\n for (let i = lines.length - 1; i >= 0; i--) {\n if (lines[i].text.length > 0) {\n return lines[i].text;\n }\n }\n return '';\n}\n\nfunction getErrorCount(lines: Line[]): number {\n return lines.filter((line) => line.type === LineType.stderr).length;\n}\n\nexport default memo(function CompactProcessLine({ item }: Props) {\n const { stdout } = useStdout();\n const terminalWidth = stdout?.columns || 80;\n\n const { group, title, state, lines } = item;\n\n // Display name: prefer group, fall back to title\n const displayName = group || title;\n\n // Calculate widths - use fixed-width columns for alignment\n const iconWidth = 2; // icon + space\n const nameColumnWidth = 15; // fixed width for name column\n const gap = 1; // space between name and status\n const statusWidth = terminalWidth - iconWidth - nameColumnWidth - gap;\n\n // Truncate name if needed and pad to column width\n const truncatedName = truncate(displayName, nameColumnWidth).padEnd(nameColumnWidth);\n\n // Status text based on state\n const statusText = useMemo(() => {\n if (state === 'running') {\n const lastLine = getLastOutputLine(lines);\n return lastLine ? truncate(lastLine, statusWidth) : '';\n }\n if (state === 'error') {\n const errorCount = getErrorCount(lines);\n return errorCount > 0 ? `${errorCount} error${errorCount > 1 ? 's' : ''}` : 'failed';\n }\n return ''; // success - no status text\n }, [state, lines, statusWidth]);\n\n // Icon based on state\n const icon = useMemo(() => {\n switch (state) {\n case 'running':\n return <Spinner {...SPINNER} />;\n case 'success':\n return <Text color=\"green\">{figures.tick}</Text>;\n case 'error':\n return <Text color=\"red\">{figures.cross}</Text>;\n }\n }, [state]);\n\n // Status text color\n const statusColor = state === 'error' ? 'red' : 'gray';\n\n return (\n <Box>\n <Box width={iconWidth}>{icon}</Box>\n <Text>{truncatedName}</Text>\n {statusText && <Text color={statusColor}> {statusText}</Text>}\n </Box>\n );\n});\n"],"names":["SPINNER","interval","frames","truncate","str","maxLength","length","slice","getLastOutputLine","lines","i","text","getErrorCount","filter","line","type","LineType","stderr","memo","CompactProcessLine","item","stdout","useStdout","terminalWidth","columns","group","title","state","displayName","iconWidth","nameColumnWidth","gap","statusWidth","truncatedName","padEnd","statusText","useMemo","lastLine","errorCount","icon","Spinner","Text","color","figures","tick","cross","statusColor","Box","width"],"mappings":";;;;+BAmCA;;;eAAA;;;;mBAnCqC;qBACP;gEACV;uBAEK;gEACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpB,oHAAoH;AACpH,IAAMA,UAAU;IACdC,UAAU;IACVC,QAAQ;QAAC;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAAI;AAC5D;AAMA,SAASC,SAASC,GAAW,EAAEC,SAAiB;IAC9C,IAAID,IAAIE,MAAM,IAAID,WAAW,OAAOD;IACpC,OAAO,AAAC,GAA8B,OAA5BA,IAAIG,KAAK,CAAC,GAAGF,YAAY,IAAG;AACxC;AAEA,SAASG,kBAAkBC,KAAa;IACtC,IAAK,IAAIC,IAAID,MAAMH,MAAM,GAAG,GAAGI,KAAK,GAAGA,IAAK;QAC1C,IAAID,KAAK,CAACC,EAAE,CAACC,IAAI,CAACL,MAAM,GAAG,GAAG;YAC5B,OAAOG,KAAK,CAACC,EAAE,CAACC,IAAI;QACtB;IACF;IACA,OAAO;AACT;AAEA,SAASC,cAAcH,KAAa;IAClC,OAAOA,MAAMI,MAAM,CAAC,SAACC;eAASA,KAAKC,IAAI,KAAKC,iBAAQ,CAACC,MAAM;OAAEX,MAAM;AACrE;IAEA,yBAAeY,IAAAA,WAAI,EAAC,SAASC,mBAAmB,KAAe;QAAf,AAAEC,OAAF,MAAEA;IAChD,IAAM,AAAEC,SAAWC,IAAAA,cAAS,IAApBD;IACR,IAAME,gBAAgBF,CAAAA,mBAAAA,6BAAAA,OAAQG,OAAO,KAAI;IAEzC,IAAQC,QAA+BL,KAA/BK,OAAOC,QAAwBN,KAAxBM,OAAOC,QAAiBP,KAAjBO,OAAOlB,QAAUW,KAAVX;IAE7B,iDAAiD;IACjD,IAAMmB,cAAcH,SAASC;IAE7B,2DAA2D;IAC3D,IAAMG,YAAY,GAAG,eAAe;IACpC,IAAMC,kBAAkB,IAAI,8BAA8B;IAC1D,IAAMC,MAAM,GAAG,gCAAgC;IAC/C,IAAMC,cAAcT,gBAAgBM,YAAYC,kBAAkBC;IAElE,kDAAkD;IAClD,IAAME,gBAAgB9B,SAASyB,aAAaE,iBAAiBI,MAAM,CAACJ;IAEpE,6BAA6B;IAC7B,IAAMK,aAAaC,IAAAA,cAAO,EAAC;QACzB,IAAIT,UAAU,WAAW;YACvB,IAAMU,WAAW7B,kBAAkBC;YACnC,OAAO4B,WAAWlC,SAASkC,UAAUL,eAAe;QACtD;QACA,IAAIL,UAAU,SAAS;YACrB,IAAMW,aAAa1B,cAAcH;YACjC,OAAO6B,aAAa,IAAI,AAAC,GAAqBA,OAAnBA,YAAW,UAAkC,OAA1BA,aAAa,IAAI,MAAM,MAAO;QAC9E;QACA,OAAO,IAAI,2BAA2B;IACxC,GAAG;QAACX;QAAOlB;QAAOuB;KAAY;IAE9B,sBAAsB;IACtB,IAAMO,OAAOH,IAAAA,cAAO,EAAC;QACnB,OAAQT;YACN,KAAK;gBACH,qBAAO,qBAACa,kBAAO,qBAAKxC;YACtB,KAAK;gBACH,qBAAO,qBAACyC,SAAI;oBAACC,OAAM;8BAASC,kBAAO,CAACC,IAAI;;YAC1C,KAAK;gBACH,qBAAO,qBAACH,SAAI;oBAACC,OAAM;8BAAOC,kBAAO,CAACE,KAAK;;QAC3C;IACF,GAAG;QAAClB;KAAM;IAEV,oBAAoB;IACpB,IAAMmB,cAAcnB,UAAU,UAAU,QAAQ;IAEhD,qBACE,sBAACoB,QAAG;;0BACF,qBAACA,QAAG;gBAACC,OAAOnB;0BAAYU;;0BACxB,qBAACE,SAAI;0BAAER;;YACNE,4BAAc,sBAACM,SAAI;gBAACC,OAAOI;;oBAAa;oBAAEX;;;;;AAGjD"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _ink = require("ink");
13
+ var _react = require("react");
14
+ var _default = /*#__PURE__*/ (0, _react.memo)(function Divider() {
15
+ var stdout = (0, _ink.useStdout)().stdout;
16
+ var width = (stdout === null || stdout === void 0 ? void 0 : stdout.columns) || 80;
17
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
18
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
19
+ dimColor: true,
20
+ children: '─'.repeat(width)
21
+ })
22
+ });
23
+ });
24
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/Divider.tsx"],"sourcesContent":["import { Box, Text, useStdout } from 'ink';\nimport { memo } from 'react';\n\nexport default memo(function Divider() {\n const { stdout } = useStdout();\n const width = stdout?.columns || 80;\n\n return (\n <Box>\n <Text dimColor>{'─'.repeat(width)}</Text>\n </Box>\n );\n});\n"],"names":["memo","Divider","stdout","useStdout","width","columns","Box","Text","dimColor","repeat"],"mappings":";;;;+BAGA;;;eAAA;;;;mBAHqC;qBAChB;IAErB,yBAAeA,IAAAA,WAAI,EAAC,SAASC;IAC3B,IAAM,AAAEC,SAAWC,IAAAA,cAAS,IAApBD;IACR,IAAME,QAAQF,CAAAA,mBAAAA,6BAAAA,OAAQG,OAAO,KAAI;IAEjC,qBACE,qBAACC,QAAG;kBACF,cAAA,qBAACC,SAAI;YAACC,QAAQ;sBAAE,IAAIC,MAAM,CAACL;;;AAGjC"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _ink = require("ink");
13
+ var _react = require("react");
14
+ var _typests = require("../types.js");
15
+ var _default = /*#__PURE__*/ (0, _react.memo)(function ErrorDetailModal(param) {
16
+ var error = param.error, currentIndex = param.currentIndex, totalErrors = param.totalErrors;
17
+ var stdout = (0, _ink.useStdout)().stdout;
18
+ var width = (stdout === null || stdout === void 0 ? void 0 : stdout.columns) || 80;
19
+ var borderH = '─'.repeat(width - 2);
20
+ var title = " Error Detail (".concat(currentIndex + 1, "/").concat(totalErrors, ") ");
21
+ var titleBorder = "┌".concat(title).concat(borderH.slice(title.length + 1), "┐");
22
+ var name = error.group || error.title;
23
+ var stderrLines = error.lines.filter(function(l) {
24
+ return l.type === _typests.LineType.stderr;
25
+ });
26
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
27
+ flexDirection: "column",
28
+ children: [
29
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
30
+ children: titleBorder
31
+ }),
32
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
33
+ paddingX: 1,
34
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
35
+ bold: true,
36
+ children: name
37
+ })
38
+ }),
39
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
40
+ paddingX: 1,
41
+ children: [
42
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
43
+ dimColor: true,
44
+ children: "Command: "
45
+ }),
46
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
47
+ children: error.title
48
+ })
49
+ ]
50
+ }),
51
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
52
+ paddingX: 1,
53
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
54
+ dimColor: true,
55
+ children: '─'.repeat(width - 4)
56
+ })
57
+ }),
58
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
59
+ paddingX: 1,
60
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
61
+ dimColor: true,
62
+ children: "stderr:"
63
+ })
64
+ }),
65
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
66
+ flexDirection: "column",
67
+ paddingX: 2,
68
+ children: stderrLines.length === 0 ? /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
69
+ dimColor: true,
70
+ children: "(no stderr output)"
71
+ }) : stderrLines.map(function(line, index) {
72
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
73
+ color: "red",
74
+ children: line.text
75
+ }, "stderr-".concat(index, "-").concat(line.text.slice(0, 20)));
76
+ })
77
+ }),
78
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
79
+ paddingX: 1,
80
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
81
+ children: " "
82
+ })
83
+ }),
84
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
85
+ children: [
86
+ "├",
87
+ borderH,
88
+ "┤"
89
+ ]
90
+ }),
91
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
92
+ paddingX: 1,
93
+ justifyContent: "space-between",
94
+ children: [
95
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
96
+ dimColor: true,
97
+ children: "[↑↓] prev/next error"
98
+ }),
99
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
100
+ dimColor: true,
101
+ children: "[Esc] back to list"
102
+ })
103
+ ]
104
+ }),
105
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
106
+ children: [
107
+ "└",
108
+ borderH,
109
+ "┘"
110
+ ]
111
+ })
112
+ ]
113
+ });
114
+ });
115
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/ErrorDetailModal.tsx"],"sourcesContent":["import { Box, Text, useStdout } from 'ink';\nimport { memo } from 'react';\nimport type { ChildProcess } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Props = {\n error: ChildProcess;\n currentIndex: number;\n totalErrors: number;\n};\n\nexport default memo(function ErrorDetailModal({ error, currentIndex, totalErrors }: Props) {\n const { stdout } = useStdout();\n const width = stdout?.columns || 80;\n\n const borderH = '─'.repeat(width - 2);\n const title = ` Error Detail (${currentIndex + 1}/${totalErrors}) `;\n const titleBorder = `┌${title}${borderH.slice(title.length + 1)}┐`;\n\n const name = error.group || error.title;\n const stderrLines = error.lines.filter((l) => l.type === LineType.stderr);\n\n return (\n <Box flexDirection=\"column\">\n {/* Top border with title */}\n <Text>{titleBorder}</Text>\n\n {/* Process name */}\n <Box paddingX={1}>\n <Text bold>{name}</Text>\n </Box>\n\n {/* Command */}\n <Box paddingX={1}>\n <Text dimColor>Command: </Text>\n <Text>{error.title}</Text>\n </Box>\n\n {/* Separator */}\n <Box paddingX={1}>\n <Text dimColor>{'─'.repeat(width - 4)}</Text>\n </Box>\n\n {/* Error output */}\n <Box paddingX={1}>\n <Text dimColor>stderr:</Text>\n </Box>\n\n {/* Error lines in a box */}\n <Box flexDirection=\"column\" paddingX={2}>\n {stderrLines.length === 0 ? (\n <Text dimColor>(no stderr output)</Text>\n ) : (\n stderrLines.map((line, index) => (\n <Text key={`stderr-${index}-${line.text.slice(0, 20)}`} color=\"red\">\n {line.text}\n </Text>\n ))\n )}\n </Box>\n\n {/* Empty line for padding */}\n <Box paddingX={1}>\n <Text> </Text>\n </Box>\n\n {/* Bottom border with hints */}\n <Text>├{borderH}┤</Text>\n <Box paddingX={1} justifyContent=\"space-between\">\n <Text dimColor>[↑↓] prev/next error</Text>\n <Text dimColor>[Esc] back to list</Text>\n </Box>\n <Text>└{borderH}┘</Text>\n </Box>\n );\n});\n"],"names":["memo","ErrorDetailModal","error","currentIndex","totalErrors","stdout","useStdout","width","columns","borderH","repeat","title","titleBorder","slice","length","name","group","stderrLines","lines","filter","l","type","LineType","stderr","Box","flexDirection","Text","paddingX","bold","dimColor","map","line","index","color","text","justifyContent"],"mappings":";;;;+BAWA;;;eAAA;;;;mBAXqC;qBAChB;uBAEI;IAQzB,yBAAeA,IAAAA,WAAI,EAAC,SAASC,iBAAiB,KAA2C;QAAzCC,QAAF,MAAEA,OAAOC,eAAT,MAASA,cAAcC,cAAvB,MAAuBA;IACnE,IAAM,AAAEC,SAAWC,IAAAA,cAAS,IAApBD;IACR,IAAME,QAAQF,CAAAA,mBAAAA,6BAAAA,OAAQG,OAAO,KAAI;IAEjC,IAAMC,UAAU,IAAIC,MAAM,CAACH,QAAQ;IACnC,IAAMI,QAAQ,AAAC,kBAAqCP,OAApBD,eAAe,GAAE,KAAe,OAAZC,aAAY;IAChE,IAAMQ,cAAc,AAAC,IAAWH,OAARE,OAAwC,OAAhCF,QAAQI,KAAK,CAACF,MAAMG,MAAM,GAAG,IAAG;IAEhE,IAAMC,OAAOb,MAAMc,KAAK,IAAId,MAAMS,KAAK;IACvC,IAAMM,cAAcf,MAAMgB,KAAK,CAACC,MAAM,CAAC,SAACC;eAAMA,EAAEC,IAAI,KAAKC,iBAAQ,CAACC,MAAM;;IAExE,qBACE,sBAACC,QAAG;QAACC,eAAc;;0BAEjB,qBAACC,SAAI;0BAAEd;;0BAGP,qBAACY,QAAG;gBAACG,UAAU;0BACb,cAAA,qBAACD,SAAI;oBAACE,IAAI;8BAAEb;;;0BAId,sBAACS,QAAG;gBAACG,UAAU;;kCACb,qBAACD,SAAI;wBAACG,QAAQ;kCAAC;;kCACf,qBAACH,SAAI;kCAAExB,MAAMS,KAAK;;;;0BAIpB,qBAACa,QAAG;gBAACG,UAAU;0BACb,cAAA,qBAACD,SAAI;oBAACG,QAAQ;8BAAE,IAAInB,MAAM,CAACH,QAAQ;;;0BAIrC,qBAACiB,QAAG;gBAACG,UAAU;0BACb,cAAA,qBAACD,SAAI;oBAACG,QAAQ;8BAAC;;;0BAIjB,qBAACL,QAAG;gBAACC,eAAc;gBAASE,UAAU;0BACnCV,YAAYH,MAAM,KAAK,kBACtB,qBAACY,SAAI;oBAACG,QAAQ;8BAAC;qBAEfZ,YAAYa,GAAG,CAAC,SAACC,MAAMC;yCACrB,qBAACN,SAAI;wBAAmDO,OAAM;kCAC3DF,KAAKG,IAAI;uBADD,AAAC,UAAkBH,OAATC,OAAM,KAA0B,OAAvBD,KAAKG,IAAI,CAACrB,KAAK,CAAC,GAAG;;;0BAQvD,qBAACW,QAAG;gBAACG,UAAU;0BACb,cAAA,qBAACD,SAAI;8BAAC;;;0BAIR,sBAACA,SAAI;;oBAAC;oBAAEjB;oBAAQ;;;0BAChB,sBAACe,QAAG;gBAACG,UAAU;gBAAGQ,gBAAe;;kCAC/B,qBAACT,SAAI;wBAACG,QAAQ;kCAAC;;kCACf,qBAACH,SAAI;wBAACG,QAAQ;kCAAC;;;;0BAEjB,sBAACH,SAAI;;oBAAC;oBAAEjB;oBAAQ;;;;;AAGtB"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _ink = require("ink");
13
+ var _react = require("react");
14
+ var _figurests = /*#__PURE__*/ _interop_require_default(require("../lib/figures.js"));
15
+ var _typests = require("../types.js");
16
+ function _interop_require_default(obj) {
17
+ return obj && obj.__esModule ? obj : {
18
+ default: obj
19
+ };
20
+ }
21
+ function truncate(str, maxLength) {
22
+ if (str.length <= maxLength) return str;
23
+ return "".concat(str.slice(0, maxLength - 1), "…");
24
+ }
25
+ function getErrorLineCount(process) {
26
+ return process.lines.filter(function(l) {
27
+ return l.type === _typests.LineType.stderr;
28
+ }).length;
29
+ }
30
+ var _default = /*#__PURE__*/ (0, _react.memo)(function ErrorListModal(param) {
31
+ var errors = param.errors, selectedIndex = param.selectedIndex, totalErrorLines = param.totalErrorLines;
32
+ var stdout = (0, _ink.useStdout)().stdout;
33
+ var width = (stdout === null || stdout === void 0 ? void 0 : stdout.columns) || 80;
34
+ var innerWidth = width - 4; // 2 chars padding each side
35
+ var borderH = '─'.repeat(width - 2);
36
+ var title = ' Errors ';
37
+ var titleBorder = "┌".concat(title).concat(borderH.slice(title.length + 1), "┐");
38
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
39
+ flexDirection: "column",
40
+ children: [
41
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
42
+ children: titleBorder
43
+ }),
44
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
45
+ paddingX: 1,
46
+ children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
47
+ children: [
48
+ errors.length,
49
+ " process",
50
+ errors.length !== 1 ? 'es' : '',
51
+ " failed (",
52
+ totalErrorLines,
53
+ " error line",
54
+ totalErrorLines !== 1 ? 's' : '',
55
+ " total)"
56
+ ]
57
+ })
58
+ }),
59
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
60
+ paddingX: 1,
61
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
62
+ children: " "
63
+ })
64
+ }),
65
+ errors.map(function(error, index) {
66
+ var isSelected = index === selectedIndex;
67
+ var indicator = isSelected ? _figurests.default.pointer : ' ';
68
+ var name = error.group || error.title;
69
+ var lineCount = getErrorLineCount(error);
70
+ var lineText = "".concat(lineCount, " line").concat(lineCount !== 1 ? 's' : '');
71
+ // Calculate available space for name
72
+ var prefixLen = 3; // indicator + space + space
73
+ var suffixLen = lineText.length + 2; // space + lineText
74
+ var maxNameLen = innerWidth - prefixLen - suffixLen;
75
+ var truncatedName = truncate(name, maxNameLen);
76
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
77
+ paddingX: 1,
78
+ children: [
79
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
80
+ color: isSelected ? 'cyan' : undefined,
81
+ bold: isSelected,
82
+ children: [
83
+ indicator,
84
+ " ",
85
+ truncatedName
86
+ ]
87
+ }),
88
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
89
+ flexGrow: 1
90
+ }),
91
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
92
+ dimColor: true,
93
+ children: lineText
94
+ })
95
+ ]
96
+ }, error.id);
97
+ }),
98
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
99
+ paddingX: 1,
100
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
101
+ children: " "
102
+ })
103
+ }),
104
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
105
+ children: [
106
+ "├",
107
+ borderH,
108
+ "┤"
109
+ ]
110
+ }),
111
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
112
+ paddingX: 1,
113
+ justifyContent: "space-between",
114
+ children: [
115
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
116
+ dimColor: true,
117
+ children: "[↑↓] navigate [Enter] view details"
118
+ }),
119
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
120
+ dimColor: true,
121
+ children: "[Esc] close"
122
+ })
123
+ ]
124
+ }),
125
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
126
+ children: [
127
+ "└",
128
+ borderH,
129
+ "┘"
130
+ ]
131
+ })
132
+ ]
133
+ });
134
+ });
135
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/ErrorListModal.tsx"],"sourcesContent":["import { Box, Text, useStdout } from 'ink';\nimport { memo } from 'react';\nimport figures from '../lib/figures.ts';\nimport type { ChildProcess } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Props = {\n errors: ChildProcess[];\n selectedIndex: number;\n totalErrorLines: number;\n};\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return `${str.slice(0, maxLength - 1)}…`;\n}\n\nfunction getErrorLineCount(process: ChildProcess): number {\n return process.lines.filter((l) => l.type === LineType.stderr).length;\n}\n\nexport default memo(function ErrorListModal({ errors, selectedIndex, totalErrorLines }: Props) {\n const { stdout } = useStdout();\n const width = stdout?.columns || 80;\n const innerWidth = width - 4; // 2 chars padding each side\n\n const borderH = '─'.repeat(width - 2);\n const title = ' Errors ';\n const titleBorder = `┌${title}${borderH.slice(title.length + 1)}┐`;\n\n return (\n <Box flexDirection=\"column\">\n {/* Top border with title */}\n <Text>{titleBorder}</Text>\n\n {/* Summary */}\n <Box paddingX={1}>\n <Text>\n {errors.length} process{errors.length !== 1 ? 'es' : ''} failed ({totalErrorLines} error line\n {totalErrorLines !== 1 ? 's' : ''} total)\n </Text>\n </Box>\n\n {/* Empty line */}\n <Box paddingX={1}>\n <Text> </Text>\n </Box>\n\n {/* Error list */}\n {errors.map((error, index) => {\n const isSelected = index === selectedIndex;\n const indicator = isSelected ? figures.pointer : ' ';\n const name = error.group || error.title;\n const lineCount = getErrorLineCount(error);\n const lineText = `${lineCount} line${lineCount !== 1 ? 's' : ''}`;\n\n // Calculate available space for name\n const prefixLen = 3; // indicator + space + space\n const suffixLen = lineText.length + 2; // space + lineText\n const maxNameLen = innerWidth - prefixLen - suffixLen;\n const truncatedName = truncate(name, maxNameLen);\n\n return (\n <Box key={error.id} paddingX={1}>\n <Text color={isSelected ? 'cyan' : undefined} bold={isSelected}>\n {indicator} {truncatedName}\n </Text>\n <Box flexGrow={1} />\n <Text dimColor>{lineText}</Text>\n </Box>\n );\n })}\n\n {/* Empty line for padding */}\n <Box paddingX={1}>\n <Text> </Text>\n </Box>\n\n {/* Bottom border with hints */}\n <Text>├{borderH}┤</Text>\n <Box paddingX={1} justifyContent=\"space-between\">\n <Text dimColor>[↑↓] navigate [Enter] view details</Text>\n <Text dimColor>[Esc] close</Text>\n </Box>\n <Text>└{borderH}┘</Text>\n </Box>\n );\n});\n"],"names":["truncate","str","maxLength","length","slice","getErrorLineCount","process","lines","filter","l","type","LineType","stderr","memo","ErrorListModal","errors","selectedIndex","totalErrorLines","stdout","useStdout","width","columns","innerWidth","borderH","repeat","title","titleBorder","Box","flexDirection","Text","paddingX","map","error","index","isSelected","indicator","figures","pointer","name","group","lineCount","lineText","prefixLen","suffixLen","maxNameLen","truncatedName","color","undefined","bold","flexGrow","dimColor","id","justifyContent"],"mappings":";;;;+BAqBA;;;eAAA;;;;mBArBqC;qBAChB;gEACD;uBAEK;;;;;;AAQzB,SAASA,SAASC,GAAW,EAAEC,SAAiB;IAC9C,IAAID,IAAIE,MAAM,IAAID,WAAW,OAAOD;IACpC,OAAO,AAAC,GAA8B,OAA5BA,IAAIG,KAAK,CAAC,GAAGF,YAAY,IAAG;AACxC;AAEA,SAASG,kBAAkBC,OAAqB;IAC9C,OAAOA,QAAQC,KAAK,CAACC,MAAM,CAAC,SAACC;eAAMA,EAAEC,IAAI,KAAKC,iBAAQ,CAACC,MAAM;OAAET,MAAM;AACvE;IAEA,yBAAeU,IAAAA,WAAI,EAAC,SAASC,eAAe,KAAiD;QAA/CC,SAAF,MAAEA,QAAQC,gBAAV,MAAUA,eAAeC,kBAAzB,MAAyBA;IACnE,IAAM,AAAEC,SAAWC,IAAAA,cAAS,IAApBD;IACR,IAAME,QAAQF,CAAAA,mBAAAA,6BAAAA,OAAQG,OAAO,KAAI;IACjC,IAAMC,aAAaF,QAAQ,GAAG,4BAA4B;IAE1D,IAAMG,UAAU,IAAIC,MAAM,CAACJ,QAAQ;IACnC,IAAMK,QAAQ;IACd,IAAMC,cAAc,AAAC,IAAWH,OAARE,OAAwC,OAAhCF,QAAQnB,KAAK,CAACqB,MAAMtB,MAAM,GAAG,IAAG;IAEhE,qBACE,sBAACwB,QAAG;QAACC,eAAc;;0BAEjB,qBAACC,SAAI;0BAAEH;;0BAGP,qBAACC,QAAG;gBAACG,UAAU;0BACb,cAAA,sBAACD,SAAI;;wBACFd,OAAOZ,MAAM;wBAAC;wBAASY,OAAOZ,MAAM,KAAK,IAAI,OAAO;wBAAG;wBAAUc;wBAAgB;wBACjFA,oBAAoB,IAAI,MAAM;wBAAG;;;;0BAKtC,qBAACU,QAAG;gBAACG,UAAU;0BACb,cAAA,qBAACD,SAAI;8BAAC;;;YAIPd,OAAOgB,GAAG,CAAC,SAACC,OAAOC;gBAClB,IAAMC,aAAaD,UAAUjB;gBAC7B,IAAMmB,YAAYD,aAAaE,kBAAO,CAACC,OAAO,GAAG;gBACjD,IAAMC,OAAON,MAAMO,KAAK,IAAIP,MAAMP,KAAK;gBACvC,IAAMe,YAAYnC,kBAAkB2B;gBACpC,IAAMS,WAAW,AAAC,GAAmBD,OAAjBA,WAAU,SAAkC,OAA3BA,cAAc,IAAI,MAAM;gBAE7D,qCAAqC;gBACrC,IAAME,YAAY,GAAG,4BAA4B;gBACjD,IAAMC,YAAYF,SAAStC,MAAM,GAAG,GAAG,mBAAmB;gBAC1D,IAAMyC,aAAatB,aAAaoB,YAAYC;gBAC5C,IAAME,gBAAgB7C,SAASsC,MAAMM;gBAErC,qBACE,sBAACjB,QAAG;oBAAgBG,UAAU;;sCAC5B,sBAACD,SAAI;4BAACiB,OAAOZ,aAAa,SAASa;4BAAWC,MAAMd;;gCACjDC;gCAAU;gCAAEU;;;sCAEf,qBAAClB,QAAG;4BAACsB,UAAU;;sCACf,qBAACpB,SAAI;4BAACqB,QAAQ;sCAAET;;;mBALRT,MAAMmB,EAAE;YAQtB;0BAGA,qBAACxB,QAAG;gBAACG,UAAU;0BACb,cAAA,qBAACD,SAAI;8BAAC;;;0BAIR,sBAACA,SAAI;;oBAAC;oBAAEN;oBAAQ;;;0BAChB,sBAACI,QAAG;gBAACG,UAAU;gBAAGsB,gBAAe;;kCAC/B,qBAACvB,SAAI;wBAACqB,QAAQ;kCAAC;;kCACf,qBAACrB,SAAI;wBAACqB,QAAQ;kCAAC;;;;0BAEjB,sBAACrB,SAAI;;oBAAC;oBAAEN;oBAAQ;;;;;AAGtB"}