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.
- package/dist/cjs/components/App.js +110 -9
- package/dist/cjs/components/App.js.map +1 -1
- package/dist/cjs/components/CompactProcessLine.js +153 -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/StatusBar.js +104 -0
- package/dist/cjs/components/StatusBar.js.map +1 -0
- package/dist/cjs/createApp.js +30 -33
- package/dist/cjs/createApp.js.map +1 -1
- package/dist/cjs/lib/figures.js +1 -1
- package/dist/cjs/lib/figures.js.map +1 -1
- package/dist/cjs/src/components/App.d.ts +1 -5
- package/dist/cjs/src/components/CompactProcessLine.d.ts +6 -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/StatusBar.d.ts +8 -0
- package/dist/cjs/src/createApp.d.ts +4 -5
- package/dist/cjs/src/state/processStore.d.ts +38 -0
- package/dist/cjs/state/processStore.js +241 -0
- package/dist/cjs/state/processStore.js.map +1 -0
- package/dist/cjs/worker.js +70 -108
- package/dist/cjs/worker.js.map +1 -1
- package/dist/esm/components/App.js +108 -8
- package/dist/esm/components/App.js.map +1 -1
- package/dist/esm/components/CompactProcessLine.js +134 -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/StatusBar.js +87 -0
- package/dist/esm/components/StatusBar.js.map +1 -0
- package/dist/esm/createApp.js +31 -32
- package/dist/esm/createApp.js.map +1 -1
- package/dist/esm/src/components/App.d.ts +1 -5
- package/dist/esm/src/components/CompactProcessLine.d.ts +6 -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/StatusBar.d.ts +8 -0
- package/dist/esm/src/createApp.d.ts +4 -5
- package/dist/esm/src/state/processStore.d.ts +38 -0
- package/dist/esm/state/processStore.js +149 -0
- package/dist/esm/state/processStore.js.map +1 -0
- package/dist/esm/worker.js +59 -91
- package/dist/esm/worker.js.map +1 -1
- package/package.json +1 -2
- package/dist/cjs/src/state/Store.d.ts +0 -11
- package/dist/cjs/state/Store.js +0 -40
- package/dist/cjs/state/Store.js.map +0 -1
- package/dist/esm/src/state/Store.d.ts +0 -11
- package/dist/esm/state/Store.js +0 -19
- 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
|
|
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(
|
|
20
|
-
var
|
|
21
|
-
|
|
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:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
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"}
|