spawn-term 1.1.8 → 2.1.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/cjs/components/App.js +159 -9
- package/dist/cjs/components/App.js.map +1 -1
- package/dist/cjs/components/CompactProcessLine.js +162 -0
- package/dist/cjs/components/CompactProcessLine.js.map +1 -0
- package/dist/cjs/components/Divider.js +24 -0
- package/dist/cjs/components/Divider.js.map +1 -0
- package/dist/cjs/components/ErrorDetailModal.js +115 -0
- package/dist/cjs/components/ErrorDetailModal.js.map +1 -0
- package/dist/cjs/components/ErrorListModal.js +135 -0
- package/dist/cjs/components/ErrorListModal.js.map +1 -0
- package/dist/cjs/components/ExpandedOutput.js +55 -0
- package/dist/cjs/components/ExpandedOutput.js.map +1 -0
- package/dist/cjs/components/StatusBar.js +104 -0
- package/dist/cjs/components/StatusBar.js.map +1 -0
- package/dist/cjs/constants.js +42 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/createApp.js +7 -2
- package/dist/cjs/createApp.js.map +1 -1
- package/dist/cjs/lib/addLines.js +58 -4
- package/dist/cjs/lib/addLines.js.map +1 -1
- package/dist/cjs/lib/format.js +21 -0
- package/dist/cjs/lib/format.js.map +1 -0
- package/dist/cjs/src/components/CompactProcessLine.d.ts +7 -0
- package/dist/cjs/src/components/Divider.d.ts +2 -0
- package/dist/cjs/src/components/ErrorDetailModal.d.ts +8 -0
- package/dist/cjs/src/components/ErrorListModal.d.ts +8 -0
- package/dist/cjs/src/components/ExpandedOutput.d.ts +8 -0
- package/dist/cjs/src/components/StatusBar.d.ts +8 -0
- package/dist/cjs/src/constants.d.ts +7 -0
- package/dist/cjs/src/lib/addLines.d.ts +6 -1
- package/dist/cjs/src/lib/format.d.ts +2 -0
- package/dist/cjs/src/state/processStore.d.ts +36 -0
- package/dist/cjs/src/types.d.ts +6 -0
- package/dist/cjs/state/processStore.js +202 -0
- package/dist/cjs/state/processStore.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/components/App.js +159 -9
- package/dist/esm/components/App.js.map +1 -1
- package/dist/esm/components/CompactProcessLine.js +143 -0
- package/dist/esm/components/CompactProcessLine.js.map +1 -0
- package/dist/esm/components/Divider.js +13 -0
- package/dist/esm/components/Divider.js.map +1 -0
- package/dist/esm/components/ErrorDetailModal.js +99 -0
- package/dist/esm/components/ErrorDetailModal.js.map +1 -0
- package/dist/esm/components/ErrorListModal.js +116 -0
- package/dist/esm/components/ErrorListModal.js.map +1 -0
- package/dist/esm/components/ExpandedOutput.js +41 -0
- package/dist/esm/components/ExpandedOutput.js.map +1 -0
- package/dist/esm/components/StatusBar.js +87 -0
- package/dist/esm/components/StatusBar.js.map +1 -0
- package/dist/esm/constants.js +11 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/createApp.js +7 -2
- package/dist/esm/createApp.js.map +1 -1
- package/dist/esm/lib/addLines.js +32 -5
- package/dist/esm/lib/addLines.js.map +1 -1
- package/dist/esm/lib/format.js +10 -0
- package/dist/esm/lib/format.js.map +1 -0
- package/dist/esm/src/components/CompactProcessLine.d.ts +7 -0
- package/dist/esm/src/components/Divider.d.ts +2 -0
- package/dist/esm/src/components/ErrorDetailModal.d.ts +8 -0
- package/dist/esm/src/components/ErrorListModal.d.ts +8 -0
- package/dist/esm/src/components/ExpandedOutput.d.ts +8 -0
- package/dist/esm/src/components/StatusBar.d.ts +8 -0
- package/dist/esm/src/constants.d.ts +7 -0
- package/dist/esm/src/lib/addLines.d.ts +6 -1
- package/dist/esm/src/lib/format.d.ts +2 -0
- package/dist/esm/src/state/processStore.d.ts +36 -0
- package/dist/esm/src/types.d.ts +6 -0
- package/dist/esm/state/processStore.js +146 -0
- package/dist/esm/state/processStore.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,8 +11,14 @@ Object.defineProperty(exports, "default", {
|
|
|
11
11
|
var _jsxruntime = require("react/jsx-runtime");
|
|
12
12
|
var _ink = require("ink");
|
|
13
13
|
var _react = require("react");
|
|
14
|
+
var _constantsts = require("../constants.js");
|
|
14
15
|
var _processStorets = require("../state/processStore.js");
|
|
15
|
-
var
|
|
16
|
+
var _CompactProcessLinets = /*#__PURE__*/ _interop_require_default(require("./CompactProcessLine.js"));
|
|
17
|
+
var _Dividerts = /*#__PURE__*/ _interop_require_default(require("./Divider.js"));
|
|
18
|
+
var _ErrorDetailModalts = /*#__PURE__*/ _interop_require_default(require("./ErrorDetailModal.js"));
|
|
19
|
+
var _ErrorListModalts = /*#__PURE__*/ _interop_require_default(require("./ErrorListModal.js"));
|
|
20
|
+
var _ExpandedOutputts = /*#__PURE__*/ _interop_require_default(require("./ExpandedOutput.js"));
|
|
21
|
+
var _StatusBarts = /*#__PURE__*/ _interop_require_default(require("./StatusBar.js"));
|
|
16
22
|
function _interop_require_default(obj) {
|
|
17
23
|
return obj && obj.__esModule ? obj : {
|
|
18
24
|
default: obj
|
|
@@ -20,10 +26,26 @@ function _interop_require_default(obj) {
|
|
|
20
26
|
}
|
|
21
27
|
function App() {
|
|
22
28
|
var exit = (0, _ink.useApp)().exit;
|
|
23
|
-
|
|
29
|
+
var isRawModeSupported = (0, _ink.useStdin)().isRawModeSupported;
|
|
30
|
+
// Subscribe to store state
|
|
24
31
|
var processes = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getSnapshot);
|
|
25
|
-
// Handle exit signal
|
|
26
32
|
var shouldExit = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getShouldExit);
|
|
33
|
+
var mode = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getMode);
|
|
34
|
+
var selectedIndex = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getSelectedIndex);
|
|
35
|
+
var selectedErrorIndex = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getSelectedErrorIndex);
|
|
36
|
+
var expandedId = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getExpandedId);
|
|
37
|
+
var scrollOffset = (0, _react.useSyncExternalStore)(_processStorets.processStore.subscribe, _processStorets.processStore.getScrollOffset);
|
|
38
|
+
// Derived state
|
|
39
|
+
var failedProcesses = _processStorets.processStore.getFailedProcesses();
|
|
40
|
+
var runningCount = _processStorets.processStore.getRunningCount();
|
|
41
|
+
var doneCount = _processStorets.processStore.getDoneCount();
|
|
42
|
+
var errorCount = _processStorets.processStore.getErrorCount();
|
|
43
|
+
var errorLineCount = _processStorets.processStore.getErrorLineCount();
|
|
44
|
+
var header = _processStorets.processStore.getHeader();
|
|
45
|
+
var showStatusBar = _processStorets.processStore.getShowStatusBar();
|
|
46
|
+
var isInteractive = _processStorets.processStore.getIsInteractive();
|
|
47
|
+
var isAllComplete = _processStorets.processStore.isAllComplete();
|
|
48
|
+
// Handle exit signal
|
|
27
49
|
(0, _react.useEffect)(function() {
|
|
28
50
|
if (shouldExit) {
|
|
29
51
|
exit();
|
|
@@ -32,13 +54,141 @@ function App() {
|
|
|
32
54
|
shouldExit,
|
|
33
55
|
exit
|
|
34
56
|
]);
|
|
35
|
-
|
|
57
|
+
// Auto-enter interactive mode when all complete and interactive flag is set
|
|
58
|
+
(0, _react.useEffect)(function() {
|
|
59
|
+
if (isAllComplete && isInteractive && mode === 'normal') {
|
|
60
|
+
_processStorets.processStore.setMode('interactive');
|
|
61
|
+
}
|
|
62
|
+
}, [
|
|
63
|
+
isAllComplete,
|
|
64
|
+
isInteractive,
|
|
65
|
+
mode
|
|
66
|
+
]);
|
|
67
|
+
// Keyboard handling (only active when raw mode is supported)
|
|
68
|
+
(0, _ink.useInput)(function(input, key) {
|
|
69
|
+
if (mode === 'normal') {
|
|
70
|
+
if (input === 'e' && errorCount > 0) {
|
|
71
|
+
_processStorets.processStore.setMode('errorList');
|
|
72
|
+
}
|
|
73
|
+
} else if (mode === 'interactive') {
|
|
74
|
+
if (input === 'q' || key.escape) {
|
|
75
|
+
if (expandedId) {
|
|
76
|
+
_processStorets.processStore.collapse();
|
|
77
|
+
} else {
|
|
78
|
+
_processStorets.processStore.signalExit(function() {});
|
|
79
|
+
}
|
|
80
|
+
} else if (key.return) {
|
|
81
|
+
_processStorets.processStore.toggleExpand();
|
|
82
|
+
} else if (key.downArrow) {
|
|
83
|
+
if (expandedId) {
|
|
84
|
+
_processStorets.processStore.scrollDown(_constantsts.EXPANDED_MAX_VISIBLE_LINES);
|
|
85
|
+
} else {
|
|
86
|
+
_processStorets.processStore.selectNext();
|
|
87
|
+
}
|
|
88
|
+
} else if (key.upArrow) {
|
|
89
|
+
if (expandedId) {
|
|
90
|
+
_processStorets.processStore.scrollUp();
|
|
91
|
+
} else {
|
|
92
|
+
_processStorets.processStore.selectPrev();
|
|
93
|
+
}
|
|
94
|
+
} else if (input === 'j') {
|
|
95
|
+
if (expandedId) {
|
|
96
|
+
_processStorets.processStore.scrollDown(_constantsts.EXPANDED_MAX_VISIBLE_LINES);
|
|
97
|
+
} else {
|
|
98
|
+
_processStorets.processStore.selectNext();
|
|
99
|
+
}
|
|
100
|
+
} else if (input === 'k') {
|
|
101
|
+
if (expandedId) {
|
|
102
|
+
_processStorets.processStore.scrollUp();
|
|
103
|
+
} else {
|
|
104
|
+
_processStorets.processStore.selectPrev();
|
|
105
|
+
}
|
|
106
|
+
} else if (input === 'e' && errorCount > 0) {
|
|
107
|
+
_processStorets.processStore.setMode('errorList');
|
|
108
|
+
}
|
|
109
|
+
} else if (mode === 'errorList') {
|
|
110
|
+
if (key.escape) {
|
|
111
|
+
_processStorets.processStore.setMode(isInteractive ? 'interactive' : 'normal');
|
|
112
|
+
} else if (key.downArrow) {
|
|
113
|
+
_processStorets.processStore.selectNextError();
|
|
114
|
+
} else if (key.upArrow) {
|
|
115
|
+
_processStorets.processStore.selectPrevError();
|
|
116
|
+
} else if (key.return) {
|
|
117
|
+
_processStorets.processStore.setMode('errorDetail');
|
|
118
|
+
}
|
|
119
|
+
} else if (mode === 'errorDetail') {
|
|
120
|
+
if (key.escape) {
|
|
121
|
+
_processStorets.processStore.setMode('errorList');
|
|
122
|
+
} else if (key.downArrow) {
|
|
123
|
+
_processStorets.processStore.selectNextError();
|
|
124
|
+
} else if (key.upArrow) {
|
|
125
|
+
_processStorets.processStore.selectPrevError();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}, {
|
|
129
|
+
isActive: isRawModeSupported === true
|
|
130
|
+
});
|
|
131
|
+
// Error list modal
|
|
132
|
+
if (mode === 'errorList') {
|
|
133
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ErrorListModalts.default, {
|
|
134
|
+
errors: failedProcesses,
|
|
135
|
+
selectedIndex: selectedErrorIndex,
|
|
136
|
+
totalErrorLines: errorLineCount
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Error detail modal
|
|
140
|
+
if (mode === 'errorDetail') {
|
|
141
|
+
var selectedError = _processStorets.processStore.getSelectedError();
|
|
142
|
+
if (selectedError) {
|
|
143
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ErrorDetailModalts.default, {
|
|
144
|
+
error: selectedError,
|
|
145
|
+
currentIndex: selectedErrorIndex,
|
|
146
|
+
totalErrors: failedProcesses.length
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Fallback if no error selected
|
|
150
|
+
_processStorets.processStore.setMode('errorList');
|
|
151
|
+
}
|
|
152
|
+
// Normal/Interactive view - render in original registration order
|
|
153
|
+
var showSelection = mode === 'interactive';
|
|
154
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
|
|
36
155
|
flexDirection: "column",
|
|
37
|
-
children:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
156
|
+
children: [
|
|
157
|
+
header && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
|
|
158
|
+
children: [
|
|
159
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
160
|
+
children: header
|
|
161
|
+
}),
|
|
162
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Dividerts.default, {})
|
|
163
|
+
]
|
|
164
|
+
}),
|
|
165
|
+
processes.map(function(item, index) {
|
|
166
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
|
|
167
|
+
flexDirection: "column",
|
|
168
|
+
children: [
|
|
169
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_CompactProcessLinets.default, {
|
|
170
|
+
item: item,
|
|
171
|
+
isSelected: showSelection && index === selectedIndex
|
|
172
|
+
}),
|
|
173
|
+
expandedId === item.id && /*#__PURE__*/ (0, _jsxruntime.jsx)(_ExpandedOutputts.default, {
|
|
174
|
+
lines: item.lines,
|
|
175
|
+
scrollOffset: scrollOffset
|
|
176
|
+
})
|
|
177
|
+
]
|
|
178
|
+
}, item.id);
|
|
179
|
+
}),
|
|
180
|
+
showStatusBar && processes.length > 0 && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
|
|
181
|
+
children: [
|
|
182
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_Dividerts.default, {}),
|
|
183
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_StatusBarts.default, {
|
|
184
|
+
running: runningCount,
|
|
185
|
+
done: doneCount,
|
|
186
|
+
errors: errorCount,
|
|
187
|
+
errorLines: errorLineCount
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
})
|
|
191
|
+
]
|
|
42
192
|
});
|
|
43
193
|
}
|
|
44
194
|
/* 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, useApp } from 'ink';\nimport { useEffect, useSyncExternalStore } from 'react';\nimport { processStore } from '../state/processStore.ts';\nimport type { ChildProcess as ChildProcessT } from '../types.ts';\nimport ChildProcess from './ChildProcess.ts';\n\nexport default function App(): React.JSX.Element {\n const { exit } = useApp();\n\n // Subscribe to process state\n const processes = useSyncExternalStore(processStore.subscribe, processStore.getSnapshot);\n\n // Handle exit signal\n const shouldExit = useSyncExternalStore(processStore.subscribe, processStore.getShouldExit);\n\n useEffect(() => {\n if (shouldExit) {\n exit();\n }\n }, [shouldExit, exit]);\n\n return (\n <Box flexDirection=\"column\">\n {processes.map((item: ChildProcessT) => (\n <ChildProcess key={item.id} item={item} />\n ))}\n </Box>\n );\n}\n"],"names":["App","exit","useApp","processes","useSyncExternalStore","processStore","subscribe","getSnapshot","shouldExit","getShouldExit","useEffect","Box","flexDirection","map","item","ChildProcess","id"],"mappings":";;;;+BAMA;;;eAAwBA;;;;mBANI;qBACoB;8BACnB;qEAEJ;;;;;;AAEV,SAASA;IACtB,IAAM,AAAEC,OAASC,IAAAA,WAAM,IAAfD;IAER,6BAA6B;IAC7B,IAAME,YAAYC,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACE,WAAW;IAEvF,qBAAqB;IACrB,IAAMC,aAAaJ,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACI,aAAa;IAE1FC,IAAAA,gBAAS,EAAC;QACR,IAAIF,YAAY;YACdP;QACF;IACF,GAAG;QAACO;QAAYP;KAAK;IAErB,qBACE,qBAACU,QAAG;QAACC,eAAc;kBAChBT,UAAUU,GAAG,CAAC,SAACC;iCACd,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, Text, useApp, useInput, useStdin } from 'ink';\nimport { useEffect, useSyncExternalStore } from 'react';\nimport { EXPANDED_MAX_VISIBLE_LINES } from '../constants.ts';\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 ExpandedOutput from './ExpandedOutput.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 selectedIndex = useSyncExternalStore(processStore.subscribe, processStore.getSelectedIndex);\n const selectedErrorIndex = useSyncExternalStore(processStore.subscribe, processStore.getSelectedErrorIndex);\n const expandedId = useSyncExternalStore(processStore.subscribe, processStore.getExpandedId);\n const scrollOffset = useSyncExternalStore(processStore.subscribe, processStore.getScrollOffset);\n\n // Derived state\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 const header = processStore.getHeader();\n const showStatusBar = processStore.getShowStatusBar();\n const isInteractive = processStore.getIsInteractive();\n const isAllComplete = processStore.isAllComplete();\n\n // Handle exit signal\n useEffect(() => {\n if (shouldExit) {\n exit();\n }\n }, [shouldExit, exit]);\n\n // Auto-enter interactive mode when all complete and interactive flag is set\n useEffect(() => {\n if (isAllComplete && isInteractive && mode === 'normal') {\n processStore.setMode('interactive');\n }\n }, [isAllComplete, isInteractive, mode]);\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 === 'interactive') {\n if (input === 'q' || key.escape) {\n if (expandedId) {\n processStore.collapse();\n } else {\n processStore.signalExit(() => {});\n }\n } else if (key.return) {\n processStore.toggleExpand();\n } else if (key.downArrow) {\n if (expandedId) {\n processStore.scrollDown(EXPANDED_MAX_VISIBLE_LINES);\n } else {\n processStore.selectNext();\n }\n } else if (key.upArrow) {\n if (expandedId) {\n processStore.scrollUp();\n } else {\n processStore.selectPrev();\n }\n } else if (input === 'j') {\n if (expandedId) {\n processStore.scrollDown(EXPANDED_MAX_VISIBLE_LINES);\n } else {\n processStore.selectNext();\n }\n } else if (input === 'k') {\n if (expandedId) {\n processStore.scrollUp();\n } else {\n processStore.selectPrev();\n }\n } else if (input === 'e' && errorCount > 0) {\n processStore.setMode('errorList');\n }\n } else if (mode === 'errorList') {\n if (key.escape) {\n processStore.setMode(isInteractive ? 'interactive' : '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/Interactive view - render in original registration order\n const showSelection = mode === 'interactive';\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n {header && (\n <>\n <Text>{header}</Text>\n <Divider />\n </>\n )}\n\n {/* All processes in registration order */}\n {processes.map((item, index) => (\n <Box key={item.id} flexDirection=\"column\">\n <CompactProcessLine item={item} isSelected={showSelection && index === selectedIndex} />\n {expandedId === item.id && <ExpandedOutput lines={item.lines} scrollOffset={scrollOffset} />}\n </Box>\n ))}\n\n {/* Status bar */}\n {showStatusBar && 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","selectedIndex","getSelectedIndex","selectedErrorIndex","getSelectedErrorIndex","expandedId","getExpandedId","scrollOffset","getScrollOffset","failedProcesses","getFailedProcesses","runningCount","getRunningCount","doneCount","getDoneCount","errorCount","getErrorCount","errorLineCount","getErrorLineCount","header","getHeader","showStatusBar","getShowStatusBar","isInteractive","getIsInteractive","isAllComplete","useEffect","setMode","useInput","input","key","escape","collapse","signalExit","return","toggleExpand","downArrow","scrollDown","EXPANDED_MAX_VISIBLE_LINES","selectNext","upArrow","scrollUp","selectPrev","selectNextError","selectPrevError","isActive","ErrorListModal","errors","totalErrorLines","selectedError","getSelectedError","ErrorDetailModal","error","currentIndex","totalErrors","length","showSelection","Box","flexDirection","Text","Divider","map","item","index","CompactProcessLine","isSelected","id","ExpandedOutput","lines","StatusBar","running","done","errorLines"],"mappings":";;;;+BAWA;;;eAAwBA;;;;mBAX8B;qBACN;2BACL;8BACd;2EACE;gEACX;yEACS;uEACF;uEACA;kEACL;;;;;;AAEP,SAASA;IACtB,IAAM,AAAEC,OAASC,IAAAA,WAAM,IAAfD;IACR,IAAM,AAAEE,qBAAuBC,IAAAA,aAAQ,IAA/BD;IAER,2BAA2B;IAC3B,IAAME,YAAYC,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACE,WAAW;IACvF,IAAMC,aAAaJ,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACI,aAAa;IAC1F,IAAMC,OAAON,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACM,OAAO;IAC9E,IAAMC,gBAAgBR,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACQ,gBAAgB;IAChG,IAAMC,qBAAqBV,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACU,qBAAqB;IAC1G,IAAMC,aAAaZ,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACY,aAAa;IAC1F,IAAMC,eAAed,IAAAA,2BAAoB,EAACC,4BAAY,CAACC,SAAS,EAAED,4BAAY,CAACc,eAAe;IAE9F,gBAAgB;IAChB,IAAMC,kBAAkBf,4BAAY,CAACgB,kBAAkB;IACvD,IAAMC,eAAejB,4BAAY,CAACkB,eAAe;IACjD,IAAMC,YAAYnB,4BAAY,CAACoB,YAAY;IAC3C,IAAMC,aAAarB,4BAAY,CAACsB,aAAa;IAC7C,IAAMC,iBAAiBvB,4BAAY,CAACwB,iBAAiB;IACrD,IAAMC,SAASzB,4BAAY,CAAC0B,SAAS;IACrC,IAAMC,gBAAgB3B,4BAAY,CAAC4B,gBAAgB;IACnD,IAAMC,gBAAgB7B,4BAAY,CAAC8B,gBAAgB;IACnD,IAAMC,gBAAgB/B,4BAAY,CAAC+B,aAAa;IAEhD,qBAAqB;IACrBC,IAAAA,gBAAS,EAAC;QACR,IAAI7B,YAAY;YACdT;QACF;IACF,GAAG;QAACS;QAAYT;KAAK;IAErB,4EAA4E;IAC5EsC,IAAAA,gBAAS,EAAC;QACR,IAAID,iBAAiBF,iBAAiBxB,SAAS,UAAU;YACvDL,4BAAY,CAACiC,OAAO,CAAC;QACvB;IACF,GAAG;QAACF;QAAeF;QAAexB;KAAK;IAEvC,6DAA6D;IAC7D6B,IAAAA,aAAQ,EACN,SAACC,OAAOC;QACN,IAAI/B,SAAS,UAAU;YACrB,IAAI8B,UAAU,OAAOd,aAAa,GAAG;gBACnCrB,4BAAY,CAACiC,OAAO,CAAC;YACvB;QACF,OAAO,IAAI5B,SAAS,eAAe;YACjC,IAAI8B,UAAU,OAAOC,IAAIC,MAAM,EAAE;gBAC/B,IAAI1B,YAAY;oBACdX,4BAAY,CAACsC,QAAQ;gBACvB,OAAO;oBACLtC,4BAAY,CAACuC,UAAU,CAAC,YAAO;gBACjC;YACF,OAAO,IAAIH,IAAII,MAAM,EAAE;gBACrBxC,4BAAY,CAACyC,YAAY;YAC3B,OAAO,IAAIL,IAAIM,SAAS,EAAE;gBACxB,IAAI/B,YAAY;oBACdX,4BAAY,CAAC2C,UAAU,CAACC,uCAA0B;gBACpD,OAAO;oBACL5C,4BAAY,CAAC6C,UAAU;gBACzB;YACF,OAAO,IAAIT,IAAIU,OAAO,EAAE;gBACtB,IAAInC,YAAY;oBACdX,4BAAY,CAAC+C,QAAQ;gBACvB,OAAO;oBACL/C,4BAAY,CAACgD,UAAU;gBACzB;YACF,OAAO,IAAIb,UAAU,KAAK;gBACxB,IAAIxB,YAAY;oBACdX,4BAAY,CAAC2C,UAAU,CAACC,uCAA0B;gBACpD,OAAO;oBACL5C,4BAAY,CAAC6C,UAAU;gBACzB;YACF,OAAO,IAAIV,UAAU,KAAK;gBACxB,IAAIxB,YAAY;oBACdX,4BAAY,CAAC+C,QAAQ;gBACvB,OAAO;oBACL/C,4BAAY,CAACgD,UAAU;gBACzB;YACF,OAAO,IAAIb,UAAU,OAAOd,aAAa,GAAG;gBAC1CrB,4BAAY,CAACiC,OAAO,CAAC;YACvB;QACF,OAAO,IAAI5B,SAAS,aAAa;YAC/B,IAAI+B,IAAIC,MAAM,EAAE;gBACdrC,4BAAY,CAACiC,OAAO,CAACJ,gBAAgB,gBAAgB;YACvD,OAAO,IAAIO,IAAIM,SAAS,EAAE;gBACxB1C,4BAAY,CAACiD,eAAe;YAC9B,OAAO,IAAIb,IAAIU,OAAO,EAAE;gBACtB9C,4BAAY,CAACkD,eAAe;YAC9B,OAAO,IAAId,IAAII,MAAM,EAAE;gBACrBxC,4BAAY,CAACiC,OAAO,CAAC;YACvB;QACF,OAAO,IAAI5B,SAAS,eAAe;YACjC,IAAI+B,IAAIC,MAAM,EAAE;gBACdrC,4BAAY,CAACiC,OAAO,CAAC;YACvB,OAAO,IAAIG,IAAIM,SAAS,EAAE;gBACxB1C,4BAAY,CAACiD,eAAe;YAC9B,OAAO,IAAIb,IAAIU,OAAO,EAAE;gBACtB9C,4BAAY,CAACkD,eAAe;YAC9B;QACF;IACF,GACA;QAAEC,UAAUvD,uBAAuB;IAAK;IAG1C,mBAAmB;IACnB,IAAIS,SAAS,aAAa;QACxB,qBAAO,qBAAC+C,yBAAc;YAACC,QAAQtC;YAAiBR,eAAeE;YAAoB6C,iBAAiB/B;;IACtG;IAEA,qBAAqB;IACrB,IAAIlB,SAAS,eAAe;QAC1B,IAAMkD,gBAAgBvD,4BAAY,CAACwD,gBAAgB;QACnD,IAAID,eAAe;YACjB,qBAAO,qBAACE,2BAAgB;gBAACC,OAAOH;gBAAeI,cAAclD;gBAAoBmD,aAAa7C,gBAAgB8C,MAAM;;QACtH;QACA,gCAAgC;QAChC7D,4BAAY,CAACiC,OAAO,CAAC;IACvB;IAEA,kEAAkE;IAClE,IAAM6B,gBAAgBzD,SAAS;IAC/B,qBACE,sBAAC0D,QAAG;QAACC,eAAc;;YAEhBvC,wBACC;;kCACE,qBAACwC,SAAI;kCAAExC;;kCACP,qBAACyC,kBAAO;;;YAKXpE,UAAUqE,GAAG,CAAC,SAACC,MAAMC;qCACpB,sBAACN,QAAG;oBAAeC,eAAc;;sCAC/B,qBAACM,6BAAkB;4BAACF,MAAMA;4BAAMG,YAAYT,iBAAiBO,UAAU9D;;wBACtEI,eAAeyD,KAAKI,EAAE,kBAAI,qBAACC,yBAAc;4BAACC,OAAON,KAAKM,KAAK;4BAAE7D,cAAcA;;;mBAFpEuD,KAAKI,EAAE;;YAOlB7C,iBAAiB7B,UAAU+D,MAAM,GAAG,mBACnC;;kCACE,qBAACK,kBAAO;kCACR,qBAACS,oBAAS;wBAACC,SAAS3D;wBAAc4D,MAAM1D;wBAAWkC,QAAQhC;wBAAYyD,YAAYvD;;;;;;AAK7F"}
|
|
@@ -0,0 +1,162 @@
|
|
|
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 _formatts = require("../lib/format.js");
|
|
16
|
+
var _processStorets = require("../state/processStore.js");
|
|
17
|
+
var _typests = require("../types.js");
|
|
18
|
+
var _Spinnerts = /*#__PURE__*/ _interop_require_default(require("./Spinner.js"));
|
|
19
|
+
function _define_property(obj, key, value) {
|
|
20
|
+
if (key in obj) {
|
|
21
|
+
Object.defineProperty(obj, key, {
|
|
22
|
+
value: value,
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true
|
|
26
|
+
});
|
|
27
|
+
} else {
|
|
28
|
+
obj[key] = value;
|
|
29
|
+
}
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
function _interop_require_default(obj) {
|
|
33
|
+
return obj && obj.__esModule ? obj : {
|
|
34
|
+
default: obj
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function _object_spread(target) {
|
|
38
|
+
for(var i = 1; i < arguments.length; i++){
|
|
39
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
40
|
+
var ownKeys = Object.keys(source);
|
|
41
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
42
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
43
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
ownKeys.forEach(function(key) {
|
|
47
|
+
_define_property(target, key, source[key]);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return target;
|
|
51
|
+
}
|
|
52
|
+
// From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2
|
|
53
|
+
var SPINNER = {
|
|
54
|
+
interval: 80,
|
|
55
|
+
frames: [
|
|
56
|
+
'⠋',
|
|
57
|
+
'⠙',
|
|
58
|
+
'⠹',
|
|
59
|
+
'⠸',
|
|
60
|
+
'⠼',
|
|
61
|
+
'⠴',
|
|
62
|
+
'⠦',
|
|
63
|
+
'⠧',
|
|
64
|
+
'⠇',
|
|
65
|
+
'⠏'
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
function truncate(str, maxLength) {
|
|
69
|
+
if (str.length <= maxLength) return str;
|
|
70
|
+
return "".concat(str.slice(0, maxLength - 1), "…");
|
|
71
|
+
}
|
|
72
|
+
function getLastOutputLine(lines) {
|
|
73
|
+
for(var i = lines.length - 1; i >= 0; i--){
|
|
74
|
+
if (lines[i].text.length > 0) {
|
|
75
|
+
return lines[i].text;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return '';
|
|
79
|
+
}
|
|
80
|
+
function getErrorCount(lines) {
|
|
81
|
+
return lines.filter(function(line) {
|
|
82
|
+
return line.type === _typests.LineType.stderr;
|
|
83
|
+
}).length;
|
|
84
|
+
}
|
|
85
|
+
var _default = /*#__PURE__*/ (0, _react.memo)(function CompactProcessLine(param) {
|
|
86
|
+
var item = param.item, _param_isSelected = param.isSelected, isSelected = _param_isSelected === void 0 ? false : _param_isSelected;
|
|
87
|
+
var stdout = (0, _ink.useStdout)().stdout;
|
|
88
|
+
var terminalWidth = (stdout === null || stdout === void 0 ? void 0 : stdout.columns) || 80;
|
|
89
|
+
var group = item.group, title = item.title, state = item.state, lines = item.lines;
|
|
90
|
+
var selectionIndicator = isSelected ? _figurests.default.pointer : ' ';
|
|
91
|
+
// Display name: prefer group, fall back to title
|
|
92
|
+
var displayName = group || title;
|
|
93
|
+
// Calculate widths - use dynamic column width based on longest name
|
|
94
|
+
var iconWidth = 2; // icon + space
|
|
95
|
+
var maxGroupLength = _processStorets.processStore.getMaxGroupLength();
|
|
96
|
+
var nameColumnWidth = (0, _formatts.calculateColumnWidth)('max', terminalWidth, maxGroupLength);
|
|
97
|
+
var gap = 1; // space between name and status
|
|
98
|
+
var statusWidth = terminalWidth - iconWidth - nameColumnWidth - gap;
|
|
99
|
+
// Truncate name if needed and pad to column width
|
|
100
|
+
var truncatedName = truncate(displayName, nameColumnWidth).padEnd(nameColumnWidth);
|
|
101
|
+
// Status text based on state
|
|
102
|
+
var statusText = (0, _react.useMemo)(function() {
|
|
103
|
+
if (state === 'running') {
|
|
104
|
+
var lastLine = getLastOutputLine(lines);
|
|
105
|
+
return lastLine ? truncate(lastLine, statusWidth) : '';
|
|
106
|
+
}
|
|
107
|
+
if (state === 'error') {
|
|
108
|
+
var errorCount = getErrorCount(lines);
|
|
109
|
+
return errorCount > 0 ? "".concat(errorCount, " error").concat(errorCount > 1 ? 's' : '') : 'failed';
|
|
110
|
+
}
|
|
111
|
+
return ''; // success - no status text
|
|
112
|
+
}, [
|
|
113
|
+
state,
|
|
114
|
+
lines,
|
|
115
|
+
statusWidth
|
|
116
|
+
]);
|
|
117
|
+
// Icon based on state
|
|
118
|
+
var icon = (0, _react.useMemo)(function() {
|
|
119
|
+
switch(state){
|
|
120
|
+
case 'running':
|
|
121
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_Spinnerts.default, _object_spread({}, SPINNER));
|
|
122
|
+
case 'success':
|
|
123
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
124
|
+
color: "green",
|
|
125
|
+
children: _figurests.default.tick
|
|
126
|
+
});
|
|
127
|
+
case 'error':
|
|
128
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
129
|
+
color: "red",
|
|
130
|
+
children: _figurests.default.cross
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}, [
|
|
134
|
+
state
|
|
135
|
+
]);
|
|
136
|
+
// Status text color
|
|
137
|
+
var statusColor = state === 'error' ? 'red' : 'gray';
|
|
138
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
|
|
139
|
+
children: [
|
|
140
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
141
|
+
color: isSelected ? 'cyan' : undefined,
|
|
142
|
+
children: selectionIndicator
|
|
143
|
+
}),
|
|
144
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
|
|
145
|
+
width: iconWidth,
|
|
146
|
+
children: icon
|
|
147
|
+
}),
|
|
148
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
149
|
+
inverse: isSelected,
|
|
150
|
+
children: truncatedName
|
|
151
|
+
}),
|
|
152
|
+
statusText && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
|
|
153
|
+
color: statusColor,
|
|
154
|
+
children: [
|
|
155
|
+
" ",
|
|
156
|
+
statusText
|
|
157
|
+
]
|
|
158
|
+
})
|
|
159
|
+
]
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
/* 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 { calculateColumnWidth } from '../lib/format.ts';\nimport { processStore } from '../state/processStore.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 isSelected?: boolean;\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, isSelected = false }: Props) {\n const { stdout } = useStdout();\n const terminalWidth = stdout?.columns || 80;\n\n const { group, title, state, lines } = item;\n const selectionIndicator = isSelected ? figures.pointer : ' ';\n\n // Display name: prefer group, fall back to title\n const displayName = group || title;\n\n // Calculate widths - use dynamic column width based on longest name\n const iconWidth = 2; // icon + space\n const maxGroupLength = processStore.getMaxGroupLength();\n const nameColumnWidth = calculateColumnWidth('max', terminalWidth, maxGroupLength);\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 <Text color={isSelected ? 'cyan' : undefined}>{selectionIndicator}</Text>\n <Box width={iconWidth}>{icon}</Box>\n <Text inverse={isSelected}>{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","isSelected","stdout","useStdout","terminalWidth","columns","group","title","state","selectionIndicator","figures","pointer","displayName","iconWidth","maxGroupLength","processStore","getMaxGroupLength","nameColumnWidth","calculateColumnWidth","gap","statusWidth","truncatedName","padEnd","statusText","useMemo","lastLine","errorCount","icon","Spinner","Text","color","tick","cross","statusColor","Box","undefined","width","inverse"],"mappings":"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"}
|
|
@@ -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"}
|