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
|
@@ -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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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 _constantsts = require("../constants.js");
|
|
15
|
+
var _typests = require("../types.js");
|
|
16
|
+
var _default = /*#__PURE__*/ (0, _react.memo)(function ExpandedOutput(param) {
|
|
17
|
+
var lines = param.lines, scrollOffset = param.scrollOffset, _param_maxVisible = param.maxVisible, maxVisible = _param_maxVisible === void 0 ? _constantsts.EXPANDED_MAX_VISIBLE_LINES : _param_maxVisible;
|
|
18
|
+
var visibleLines = lines.slice(scrollOffset, scrollOffset + maxVisible);
|
|
19
|
+
var hasMore = lines.length > scrollOffset + maxVisible;
|
|
20
|
+
var remaining = lines.length - scrollOffset - maxVisible;
|
|
21
|
+
if (lines.length === 0) {
|
|
22
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
|
|
23
|
+
paddingLeft: 2,
|
|
24
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
25
|
+
dimColor: true,
|
|
26
|
+
children: "│ (no output)"
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
|
|
31
|
+
flexDirection: "column",
|
|
32
|
+
paddingLeft: 2,
|
|
33
|
+
children: [
|
|
34
|
+
visibleLines.map(function(line, i) {
|
|
35
|
+
return(// biome-ignore lint/suspicious/noArrayIndexKey: Lines have no unique ID, index is stable for this scrolling view
|
|
36
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
|
|
37
|
+
color: line.type === _typests.LineType.stderr ? 'red' : undefined,
|
|
38
|
+
children: [
|
|
39
|
+
"│ ",
|
|
40
|
+
line.text
|
|
41
|
+
]
|
|
42
|
+
}, scrollOffset + i));
|
|
43
|
+
}),
|
|
44
|
+
hasMore && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
|
|
45
|
+
dimColor: true,
|
|
46
|
+
children: [
|
|
47
|
+
"│ [+",
|
|
48
|
+
remaining,
|
|
49
|
+
" more, j/k to scroll]"
|
|
50
|
+
]
|
|
51
|
+
})
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
/* 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/ExpandedOutput.tsx"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport { EXPANDED_MAX_VISIBLE_LINES } from '../constants.ts';\nimport type { Line } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Props = {\n lines: Line[];\n scrollOffset: number;\n maxVisible?: number;\n};\n\nexport default memo(function ExpandedOutput({ lines, scrollOffset, maxVisible = EXPANDED_MAX_VISIBLE_LINES }: Props) {\n const visibleLines = lines.slice(scrollOffset, scrollOffset + maxVisible);\n const hasMore = lines.length > scrollOffset + maxVisible;\n const remaining = lines.length - scrollOffset - maxVisible;\n\n if (lines.length === 0) {\n return (\n <Box paddingLeft={2}>\n <Text dimColor>│ (no output)</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {visibleLines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: Lines have no unique ID, index is stable for this scrolling view\n <Text key={scrollOffset + i} color={line.type === LineType.stderr ? 'red' : undefined}>\n │ {line.text}\n </Text>\n ))}\n {hasMore && <Text dimColor>│ [+{remaining} more, j/k to scroll]</Text>}\n </Box>\n );\n});\n"],"names":["memo","ExpandedOutput","lines","scrollOffset","maxVisible","EXPANDED_MAX_VISIBLE_LINES","visibleLines","slice","hasMore","length","remaining","Box","paddingLeft","Text","dimColor","flexDirection","map","line","i","color","type","LineType","stderr","undefined","text"],"mappings":";;;;+BAYA;;;eAAA;;;;mBAZ0B;qBACL;2BACsB;uBAElB;IAQzB,yBAAeA,IAAAA,WAAI,EAAC,SAASC,eAAe,KAAuE;QAArEC,QAAF,MAAEA,OAAOC,eAAT,MAASA,kCAAT,MAAuBC,YAAAA,4CAAaC,uCAA0B;IACxG,IAAMC,eAAeJ,MAAMK,KAAK,CAACJ,cAAcA,eAAeC;IAC9D,IAAMI,UAAUN,MAAMO,MAAM,GAAGN,eAAeC;IAC9C,IAAMM,YAAYR,MAAMO,MAAM,GAAGN,eAAeC;IAEhD,IAAIF,MAAMO,MAAM,KAAK,GAAG;QACtB,qBACE,qBAACE,QAAG;YAACC,aAAa;sBAChB,cAAA,qBAACC,SAAI;gBAACC,QAAQ;0BAAC;;;IAGrB;IAEA,qBACE,sBAACH,QAAG;QAACI,eAAc;QAASH,aAAa;;YACtCN,aAAaU,GAAG,CAAC,SAACC,MAAMC;uBACvB,iHAAiH;8BACjH,sBAACL,SAAI;oBAAwBM,OAAOF,KAAKG,IAAI,KAAKC,iBAAQ,CAACC,MAAM,GAAG,QAAQC;;wBAAW;wBAClFN,KAAKO,IAAI;;mBADHrB,eAAee;;YAI3BV,yBAAW,sBAACK,SAAI;gBAACC,QAAQ;;oBAAC;oBAAKJ;oBAAU;;;;;AAGhD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
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 _Spinnerts = /*#__PURE__*/ _interop_require_default(require("./Spinner.js"));
|
|
16
|
+
function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
26
|
+
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
function _interop_require_default(obj) {
|
|
30
|
+
return obj && obj.__esModule ? obj : {
|
|
31
|
+
default: obj
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function _object_spread(target) {
|
|
35
|
+
for(var i = 1; i < arguments.length; i++){
|
|
36
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
37
|
+
var ownKeys = Object.keys(source);
|
|
38
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
39
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
40
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
ownKeys.forEach(function(key) {
|
|
44
|
+
_define_property(target, key, source[key]);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return target;
|
|
48
|
+
}
|
|
49
|
+
// From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2
|
|
50
|
+
var SPINNER = {
|
|
51
|
+
interval: 80,
|
|
52
|
+
frames: [
|
|
53
|
+
'⠋',
|
|
54
|
+
'⠙',
|
|
55
|
+
'⠹',
|
|
56
|
+
'⠸',
|
|
57
|
+
'⠼',
|
|
58
|
+
'⠴',
|
|
59
|
+
'⠦',
|
|
60
|
+
'⠧',
|
|
61
|
+
'⠇',
|
|
62
|
+
'⠏'
|
|
63
|
+
]
|
|
64
|
+
};
|
|
65
|
+
var _default = /*#__PURE__*/ (0, _react.memo)(function StatusBar(param) {
|
|
66
|
+
var running = param.running, done = param.done, errors = param.errors, errorLines = param.errorLines;
|
|
67
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
|
|
68
|
+
justifyContent: "space-between",
|
|
69
|
+
children: [
|
|
70
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
|
|
71
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
|
|
72
|
+
children: [
|
|
73
|
+
running > 0 ? /*#__PURE__*/ (0, _jsxruntime.jsx)(_Spinnerts.default, _object_spread({}, SPINNER)) : /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
74
|
+
color: "green",
|
|
75
|
+
children: _figurests.default.tick
|
|
76
|
+
}),
|
|
77
|
+
" Running: ".concat(running, " "),
|
|
78
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
79
|
+
color: "green",
|
|
80
|
+
children: _figurests.default.tick
|
|
81
|
+
}),
|
|
82
|
+
" Done: ".concat(done, " "),
|
|
83
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
84
|
+
color: "red",
|
|
85
|
+
children: _figurests.default.cross
|
|
86
|
+
}),
|
|
87
|
+
" Errors: ".concat(errors),
|
|
88
|
+
errorLines > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
89
|
+
dimColor: true,
|
|
90
|
+
children: " (".concat(errorLines, " lines)")
|
|
91
|
+
})
|
|
92
|
+
]
|
|
93
|
+
})
|
|
94
|
+
}),
|
|
95
|
+
errors > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
|
|
96
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
|
|
97
|
+
dimColor: true,
|
|
98
|
+
children: "[e]rrors"
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
]
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
/* 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/StatusBar.tsx"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport figures from '../lib/figures.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 running: number;\n done: number;\n errors: number;\n errorLines: number;\n};\n\nexport default memo(function StatusBar({ running, done, errors, errorLines }: Props) {\n return (\n <Box justifyContent=\"space-between\">\n <Box>\n <Text>\n {running > 0 ? <Spinner {...SPINNER} /> : <Text color=\"green\">{figures.tick}</Text>}\n {` Running: ${running} `}\n <Text color=\"green\">{figures.tick}</Text>\n {` Done: ${done} `}\n <Text color=\"red\">{figures.cross}</Text>\n {` Errors: ${errors}`}\n {errorLines > 0 && <Text dimColor>{` (${errorLines} lines)`}</Text>}\n </Text>\n </Box>\n {errors > 0 && (\n <Box>\n <Text dimColor>[e]rrors</Text>\n </Box>\n )}\n </Box>\n );\n});\n"],"names":["SPINNER","interval","frames","memo","StatusBar","running","done","errors","errorLines","Box","justifyContent","Text","Spinner","color","figures","tick","cross","dimColor"],"mappings":";;;;+BAkBA;;;eAAA;;;;mBAlB0B;qBACL;gEACD;gEACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpB,oHAAoH;AACpH,IAAMA,UAAU;IACdC,UAAU;IACVC,QAAQ;QAAC;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAAI;AAC5D;IASA,yBAAeC,IAAAA,WAAI,EAAC,SAASC,UAAU,KAA4C;QAA1CC,UAAF,MAAEA,SAASC,OAAX,MAAWA,MAAMC,SAAjB,MAAiBA,QAAQC,aAAzB,MAAyBA;IAC9D,qBACE,sBAACC,QAAG;QAACC,gBAAe;;0BAClB,qBAACD,QAAG;0BACF,cAAA,sBAACE,SAAI;;wBACFN,UAAU,kBAAI,qBAACO,kBAAO,qBAAKZ,0BAAc,qBAACW,SAAI;4BAACE,OAAM;sCAASC,kBAAO,CAACC,IAAI;;wBACzE,aAAoB,OAARV,SAAQ;sCACtB,qBAACM,SAAI;4BAACE,OAAM;sCAASC,kBAAO,CAACC,IAAI;;wBAC/B,UAAc,OAALT,MAAK;sCAChB,qBAACK,SAAI;4BAACE,OAAM;sCAAOC,kBAAO,CAACE,KAAK;;wBAC9B,YAAkB,OAAPT;wBACZC,aAAa,mBAAK,qBAACG,SAAI;4BAACM,QAAQ;sCAAE,AAAC,KAAe,OAAXT,YAAW;;;;;YAGtDD,SAAS,mBACR,qBAACE,QAAG;0BACF,cAAA,qBAACE,SAAI;oBAACM,QAAQ;8BAAC;;;;;AAKzB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Column width defaults
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
function _export(target, all) {
|
|
7
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
_export(exports, {
|
|
13
|
+
get BATCH_MAX_LINES () {
|
|
14
|
+
return BATCH_MAX_LINES;
|
|
15
|
+
},
|
|
16
|
+
get BATCH_MAX_WAIT_MS () {
|
|
17
|
+
return BATCH_MAX_WAIT_MS;
|
|
18
|
+
},
|
|
19
|
+
get DEFAULT_COLUMN_WIDTH () {
|
|
20
|
+
return DEFAULT_COLUMN_WIDTH;
|
|
21
|
+
},
|
|
22
|
+
get DEFAULT_MAX_FPS () {
|
|
23
|
+
return DEFAULT_MAX_FPS;
|
|
24
|
+
},
|
|
25
|
+
get EXPANDED_MAX_VISIBLE_LINES () {
|
|
26
|
+
return EXPANDED_MAX_VISIBLE_LINES;
|
|
27
|
+
},
|
|
28
|
+
get FALLBACK_COLUMN_WIDTH () {
|
|
29
|
+
return FALLBACK_COLUMN_WIDTH;
|
|
30
|
+
},
|
|
31
|
+
get MAX_COLUMN_WIDTH_PERCENT () {
|
|
32
|
+
return MAX_COLUMN_WIDTH_PERCENT;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
var DEFAULT_COLUMN_WIDTH = 15;
|
|
36
|
+
var MAX_COLUMN_WIDTH_PERCENT = 0.4; // 40% of terminal width
|
|
37
|
+
var FALLBACK_COLUMN_WIDTH = 25;
|
|
38
|
+
var BATCH_MAX_LINES = 20;
|
|
39
|
+
var BATCH_MAX_WAIT_MS = 50;
|
|
40
|
+
var DEFAULT_MAX_FPS = 20;
|
|
41
|
+
var EXPANDED_MAX_VISIBLE_LINES = 10;
|
|
42
|
+
/* 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/constants.ts"],"sourcesContent":["// Column width defaults\nexport const DEFAULT_COLUMN_WIDTH = 15;\nexport const MAX_COLUMN_WIDTH_PERCENT = 0.4; // 40% of terminal width\nexport const FALLBACK_COLUMN_WIDTH = 25;\n\n// Batching defaults\nexport const BATCH_MAX_LINES = 20;\nexport const BATCH_MAX_WAIT_MS = 50;\n\n// Rendering\nexport const DEFAULT_MAX_FPS = 20;\n\n// Expansion\nexport const EXPANDED_MAX_VISIBLE_LINES = 10;\n"],"names":["BATCH_MAX_LINES","BATCH_MAX_WAIT_MS","DEFAULT_COLUMN_WIDTH","DEFAULT_MAX_FPS","EXPANDED_MAX_VISIBLE_LINES","FALLBACK_COLUMN_WIDTH","MAX_COLUMN_WIDTH_PERCENT"],"mappings":"AAAA,wBAAwB;;;;;;;;;;;;QAMXA;eAAAA;;QACAC;eAAAA;;QANAC;eAAAA;;QASAC;eAAAA;;QAGAC;eAAAA;;QAVAC;eAAAA;;QADAC;eAAAA;;;AADN,IAAMJ,uBAAuB;AAC7B,IAAMI,2BAA2B,KAAK,wBAAwB;AAC9D,IAAMD,wBAAwB;AAG9B,IAAML,kBAAkB;AACxB,IAAMC,oBAAoB;AAG1B,IAAME,kBAAkB;AAGxB,IAAMC,6BAA6B"}
|
package/dist/cjs/createApp.js
CHANGED
|
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "default", {
|
|
|
11
11
|
var _jsxruntime = require("react/jsx-runtime");
|
|
12
12
|
var _ink = require("ink");
|
|
13
13
|
var _Appts = /*#__PURE__*/ _interop_require_default(require("./components/App.js"));
|
|
14
|
+
var _constantsts = require("./constants.js");
|
|
14
15
|
var _processStorets = require("./state/processStore.js");
|
|
15
16
|
function _interop_require_default(obj) {
|
|
16
17
|
return obj && obj.__esModule ? obj : {
|
|
@@ -24,7 +25,11 @@ function createApp() {
|
|
|
24
25
|
retain: function retain() {
|
|
25
26
|
if (++refCount > 1) return _processStorets.processStore;
|
|
26
27
|
// Render once - React handles all subsequent updates via useSyncExternalStore
|
|
27
|
-
|
|
28
|
+
// Enable incremental rendering to only rewrite changed lines (reduces flicker)
|
|
29
|
+
inkApp = (0, _ink.render)(/*#__PURE__*/ (0, _jsxruntime.jsx)(_Appts.default, {}), {
|
|
30
|
+
incrementalRendering: true,
|
|
31
|
+
maxFps: _constantsts.DEFAULT_MAX_FPS
|
|
32
|
+
});
|
|
28
33
|
return _processStorets.processStore;
|
|
29
34
|
},
|
|
30
35
|
release: function release(callback) {
|
|
@@ -33,7 +38,7 @@ function createApp() {
|
|
|
33
38
|
return;
|
|
34
39
|
}
|
|
35
40
|
if (!inkApp) throw new Error('Expecting inkApp');
|
|
36
|
-
// Signal exit to React component
|
|
41
|
+
// Signal exit to React component
|
|
37
42
|
_processStorets.processStore.signalExit(function() {
|
|
38
43
|
_processStorets.processStore.reset();
|
|
39
44
|
process.stdout.write('\x1b[?25h'); // show cursor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/createApp.tsx"],"sourcesContent":["import { render } from 'ink';\nimport App from './components/App.ts';\nimport { type ProcessStore, processStore } from './state/processStore.ts';\n\nexport type ReleaseCallback = () => void;\n\nexport default function createApp() {\n let refCount = 0;\n let inkApp: ReturnType<typeof render> | null = null;\n\n return {\n retain(): ProcessStore {\n if (++refCount > 1) return processStore;\n\n // Render once - React handles all subsequent updates via useSyncExternalStore\n inkApp = render(<App
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/createApp.tsx"],"sourcesContent":["import { render } from 'ink';\nimport App from './components/App.ts';\nimport { DEFAULT_MAX_FPS } from './constants.ts';\nimport { type ProcessStore, processStore } from './state/processStore.ts';\n\nexport type ReleaseCallback = () => void;\n\nexport default function createApp() {\n let refCount = 0;\n let inkApp: ReturnType<typeof render> | null = null;\n\n return {\n retain(): ProcessStore {\n if (++refCount > 1) return processStore;\n\n // Render once - React handles all subsequent updates via useSyncExternalStore\n // Enable incremental rendering to only rewrite changed lines (reduces flicker)\n inkApp = render(<App />, {\n incrementalRendering: true,\n maxFps: DEFAULT_MAX_FPS,\n });\n return processStore;\n },\n\n release(callback: ReleaseCallback): void {\n if (--refCount > 0) {\n callback();\n return;\n }\n if (!inkApp) throw new Error('Expecting inkApp');\n\n // Signal exit to React component\n processStore.signalExit(() => {\n processStore.reset();\n process.stdout.write('\\x1b[?25h'); // show cursor\n callback();\n });\n\n // Wait for Ink to finish, then call the callback\n inkApp\n .waitUntilExit()\n .then(() => {\n const cb = processStore.getExitCallback();\n cb?.();\n })\n .catch(() => {\n const cb = processStore.getExitCallback();\n cb?.();\n });\n\n inkApp = null;\n },\n };\n}\n"],"names":["createApp","refCount","inkApp","retain","processStore","render","App","incrementalRendering","maxFps","DEFAULT_MAX_FPS","release","callback","Error","signalExit","reset","process","stdout","write","waitUntilExit","then","cb","getExitCallback","catch"],"mappings":";;;;+BAOA;;;eAAwBA;;;;mBAPD;4DACP;2BACgB;8BACgB;;;;;;AAIjC,SAASA;IACtB,IAAIC,WAAW;IACf,IAAIC,SAA2C;IAE/C,OAAO;QACLC,QAAAA,SAAAA;YACE,IAAI,EAAEF,WAAW,GAAG,OAAOG,4BAAY;YAEvC,8EAA8E;YAC9E,+EAA+E;YAC/EF,SAASG,IAAAA,WAAM,gBAAC,qBAACC,cAAG,OAAK;gBACvBC,sBAAsB;gBACtBC,QAAQC,4BAAe;YACzB;YACA,OAAOL,4BAAY;QACrB;QAEAM,SAAAA,SAAAA,QAAQC,QAAyB;YAC/B,IAAI,EAAEV,WAAW,GAAG;gBAClBU;gBACA;YACF;YACA,IAAI,CAACT,QAAQ,MAAM,IAAIU,MAAM;YAE7B,iCAAiC;YACjCR,4BAAY,CAACS,UAAU,CAAC;gBACtBT,4BAAY,CAACU,KAAK;gBAClBC,QAAQC,MAAM,CAACC,KAAK,CAAC,cAAc,cAAc;gBACjDN;YACF;YAEA,iDAAiD;YACjDT,OACGgB,aAAa,GACbC,IAAI,CAAC;gBACJ,IAAMC,KAAKhB,4BAAY,CAACiB,eAAe;gBACvCD,eAAAA,yBAAAA;YACF,GACCE,KAAK,CAAC;gBACL,IAAMF,KAAKhB,4BAAY,CAACiB,eAAe;gBACvCD,eAAAA,yBAAAA;YACF;YAEFlB,SAAS;QACX;IACF;AACF"}
|
package/dist/cjs/lib/addLines.js
CHANGED
|
@@ -9,22 +9,76 @@ Object.defineProperty(exports, "default", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
var _stream = require("stream");
|
|
12
|
+
var _constantsts = require("../constants.js");
|
|
13
|
+
function _array_like_to_array(arr, len) {
|
|
14
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
15
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
16
|
+
return arr2;
|
|
17
|
+
}
|
|
18
|
+
function _array_without_holes(arr) {
|
|
19
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
20
|
+
}
|
|
21
|
+
function _iterable_to_array(iter) {
|
|
22
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
23
|
+
}
|
|
24
|
+
function _non_iterable_spread() {
|
|
25
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
26
|
+
}
|
|
27
|
+
function _to_consumable_array(arr) {
|
|
28
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
29
|
+
}
|
|
30
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
31
|
+
if (!o) return;
|
|
32
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
33
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
34
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
35
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
36
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
37
|
+
}
|
|
12
38
|
var REGEX_NEW_LINE = /\r?\n|\r/g;
|
|
13
39
|
function addLines(fn) {
|
|
40
|
+
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
41
|
+
var _options_maxLines = options.maxLines, maxLines = _options_maxLines === void 0 ? _constantsts.BATCH_MAX_LINES : _options_maxLines, _options_maxWait = options.maxWait, maxWait = _options_maxWait === void 0 ? _constantsts.BATCH_MAX_WAIT_MS : _options_maxWait;
|
|
14
42
|
var last = '';
|
|
43
|
+
var lineBuffer = [];
|
|
44
|
+
var flushTimer = null;
|
|
45
|
+
var flush = function() {
|
|
46
|
+
if (flushTimer) {
|
|
47
|
+
clearTimeout(flushTimer);
|
|
48
|
+
flushTimer = null;
|
|
49
|
+
}
|
|
50
|
+
if (lineBuffer.length > 0) {
|
|
51
|
+
fn(lineBuffer);
|
|
52
|
+
lineBuffer = [];
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var scheduleFlush = function() {
|
|
56
|
+
if (!flushTimer) {
|
|
57
|
+
flushTimer = setTimeout(flush, maxWait);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
15
60
|
var stream = new _stream.Writable({
|
|
16
61
|
write: function write(chunk, _enc, callback) {
|
|
17
62
|
var more = last + chunk.toString('utf8');
|
|
18
63
|
var lines = more.split(REGEX_NEW_LINE);
|
|
19
64
|
last = lines.pop();
|
|
20
|
-
if (lines.length > 0)
|
|
65
|
+
if (lines.length > 0) {
|
|
66
|
+
var _lineBuffer;
|
|
67
|
+
(_lineBuffer = lineBuffer).push.apply(_lineBuffer, _to_consumable_array(lines));
|
|
68
|
+
// Flush immediately if buffer is large enough
|
|
69
|
+
if (lineBuffer.length >= maxLines) {
|
|
70
|
+
flush();
|
|
71
|
+
} else {
|
|
72
|
+
scheduleFlush();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
21
75
|
callback();
|
|
22
76
|
}
|
|
23
77
|
});
|
|
24
78
|
stream.on('finish', function() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
79
|
+
// Flush any remaining buffered lines
|
|
80
|
+
if (last.length) lineBuffer.push(last);
|
|
81
|
+
flush();
|
|
28
82
|
last = '';
|
|
29
83
|
});
|
|
30
84
|
return stream;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/lib/addLines.ts"],"sourcesContent":["import { Writable } from 'stream';\n\nconst REGEX_NEW_LINE = /\\r?\\n|\\r/g;\n\nexport type Callback = (lines: string[]) => undefined;\n\nexport default function addLines(fn: Callback): Writable {\n let last = '';\n\n const stream = new Writable({\n write(chunk, _enc, callback) {\n const more = last + chunk.toString('utf8');\n const lines = more.split(REGEX_NEW_LINE);\n last = lines.pop();\n if (lines.length > 0)
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/lib/addLines.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { BATCH_MAX_LINES, BATCH_MAX_WAIT_MS } from '../constants.ts';\n\nconst REGEX_NEW_LINE = /\\r?\\n|\\r/g;\n\nexport type Callback = (lines: string[]) => undefined;\n\ninterface BatchOptions {\n maxLines?: number;\n maxWait?: number;\n}\n\nexport default function addLines(fn: Callback, options: BatchOptions = {}): Writable {\n const { maxLines = BATCH_MAX_LINES, maxWait = BATCH_MAX_WAIT_MS } = options;\n\n let last = '';\n let lineBuffer: string[] = [];\n let flushTimer: NodeJS.Timeout | null = null;\n\n const flush = () => {\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n if (lineBuffer.length > 0) {\n fn(lineBuffer);\n lineBuffer = [];\n }\n };\n\n const scheduleFlush = () => {\n if (!flushTimer) {\n flushTimer = setTimeout(flush, maxWait);\n }\n };\n\n const stream = new Writable({\n write(chunk, _enc, callback) {\n const more = last + chunk.toString('utf8');\n const lines = more.split(REGEX_NEW_LINE);\n last = lines.pop();\n\n if (lines.length > 0) {\n lineBuffer.push(...lines);\n\n // Flush immediately if buffer is large enough\n if (lineBuffer.length >= maxLines) {\n flush();\n } else {\n scheduleFlush();\n }\n }\n callback();\n },\n });\n\n stream.on('finish', () => {\n // Flush any remaining buffered lines\n if (last.length) lineBuffer.push(last);\n flush();\n last = '';\n });\n\n return stream;\n}\n"],"names":["addLines","REGEX_NEW_LINE","fn","options","maxLines","BATCH_MAX_LINES","maxWait","BATCH_MAX_WAIT_MS","last","lineBuffer","flushTimer","flush","clearTimeout","length","scheduleFlush","setTimeout","stream","Writable","write","chunk","_enc","callback","more","toString","lines","split","pop","push","on"],"mappings":";;;;+BAYA;;;eAAwBA;;;sBAZC;2BAC0B;;;;;;;;;;;;;;;;;;;;;;;;;;AAEnD,IAAMC,iBAAiB;AASR,SAASD,SAASE,EAAY;QAAEC,UAAAA,iEAAwB,CAAC;IACtE,wBAAoEA,QAA5DC,UAAAA,0CAAWC,4BAAe,yCAAkCF,QAAhCG,SAAAA,wCAAUC,8BAAiB;IAE/D,IAAIC,OAAO;IACX,IAAIC,aAAuB,EAAE;IAC7B,IAAIC,aAAoC;IAExC,IAAMC,QAAQ;QACZ,IAAID,YAAY;YACdE,aAAaF;YACbA,aAAa;QACf;QACA,IAAID,WAAWI,MAAM,GAAG,GAAG;YACzBX,GAAGO;YACHA,aAAa,EAAE;QACjB;IACF;IAEA,IAAMK,gBAAgB;QACpB,IAAI,CAACJ,YAAY;YACfA,aAAaK,WAAWJ,OAAOL;QACjC;IACF;IAEA,IAAMU,SAAS,IAAIC,gBAAQ,CAAC;QAC1BC,OAAAA,SAAAA,MAAMC,KAAK,EAAEC,IAAI,EAAEC,QAAQ;YACzB,IAAMC,OAAOd,OAAOW,MAAMI,QAAQ,CAAC;YACnC,IAAMC,QAAQF,KAAKG,KAAK,CAACxB;YACzBO,OAAOgB,MAAME,GAAG;YAEhB,IAAIF,MAAMX,MAAM,GAAG,GAAG;oBACpBJ;gBAAAA,CAAAA,cAAAA,YAAWkB,IAAI,OAAflB,aAAgB,qBAAGe;gBAEnB,8CAA8C;gBAC9C,IAAIf,WAAWI,MAAM,IAAIT,UAAU;oBACjCO;gBACF,OAAO;oBACLG;gBACF;YACF;YACAO;QACF;IACF;IAEAL,OAAOY,EAAE,CAAC,UAAU;QAClB,qCAAqC;QACrC,IAAIpB,KAAKK,MAAM,EAAEJ,WAAWkB,IAAI,CAACnB;QACjCG;QACAH,OAAO;IACT;IAEA,OAAOQ;AACT"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "calculateColumnWidth", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return calculateColumnWidth;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _constantsts = require("../constants.js");
|
|
12
|
+
function calculateColumnWidth(groupWidth, terminalWidth, maxGroupLength) {
|
|
13
|
+
if (typeof groupWidth === 'number') return groupWidth;
|
|
14
|
+
if (groupWidth === 'max') return Math.min(maxGroupLength, Math.floor(terminalWidth * _constantsts.MAX_COLUMN_WIDTH_PERCENT));
|
|
15
|
+
if (typeof groupWidth === 'string' && groupWidth.endsWith('%')) {
|
|
16
|
+
var pct = parseInt(groupWidth, 10) / 100;
|
|
17
|
+
return Math.floor(terminalWidth * pct);
|
|
18
|
+
}
|
|
19
|
+
return _constantsts.FALLBACK_COLUMN_WIDTH;
|
|
20
|
+
}
|
|
21
|
+
/* 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/lib/format.ts"],"sourcesContent":["import { FALLBACK_COLUMN_WIDTH, MAX_COLUMN_WIDTH_PERCENT } from '../constants.ts';\n\nexport type GroupWidth = number | `${number}%` | 'max';\n\nexport function calculateColumnWidth(groupWidth: GroupWidth, terminalWidth: number, maxGroupLength: number): number {\n if (typeof groupWidth === 'number') return groupWidth;\n if (groupWidth === 'max') return Math.min(maxGroupLength, Math.floor(terminalWidth * MAX_COLUMN_WIDTH_PERCENT));\n if (typeof groupWidth === 'string' && groupWidth.endsWith('%')) {\n const pct = parseInt(groupWidth, 10) / 100;\n return Math.floor(terminalWidth * pct);\n }\n return FALLBACK_COLUMN_WIDTH;\n}\n"],"names":["calculateColumnWidth","groupWidth","terminalWidth","maxGroupLength","Math","min","floor","MAX_COLUMN_WIDTH_PERCENT","endsWith","pct","parseInt","FALLBACK_COLUMN_WIDTH"],"mappings":";;;;+BAIgBA;;;eAAAA;;;2BAJgD;AAIzD,SAASA,qBAAqBC,UAAsB,EAAEC,aAAqB,EAAEC,cAAsB;IACxG,IAAI,OAAOF,eAAe,UAAU,OAAOA;IAC3C,IAAIA,eAAe,OAAO,OAAOG,KAAKC,GAAG,CAACF,gBAAgBC,KAAKE,KAAK,CAACJ,gBAAgBK,qCAAwB;IAC7G,IAAI,OAAON,eAAe,YAAYA,WAAWO,QAAQ,CAAC,MAAM;QAC9D,IAAMC,MAAMC,SAAST,YAAY,MAAM;QACvC,OAAOG,KAAKE,KAAK,CAACJ,gBAAgBO;IACpC;IACA,OAAOE,kCAAqB;AAC9B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const DEFAULT_COLUMN_WIDTH = 15;
|
|
2
|
+
export declare const MAX_COLUMN_WIDTH_PERCENT = 0.4;
|
|
3
|
+
export declare const FALLBACK_COLUMN_WIDTH = 25;
|
|
4
|
+
export declare const BATCH_MAX_LINES = 20;
|
|
5
|
+
export declare const BATCH_MAX_WAIT_MS = 50;
|
|
6
|
+
export declare const DEFAULT_MAX_FPS = 20;
|
|
7
|
+
export declare const EXPANDED_MAX_VISIBLE_LINES = 10;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { Writable } from 'stream';
|
|
2
2
|
export type Callback = (lines: string[]) => undefined;
|
|
3
|
-
|
|
3
|
+
interface BatchOptions {
|
|
4
|
+
maxLines?: number;
|
|
5
|
+
maxWait?: number;
|
|
6
|
+
}
|
|
7
|
+
export default function addLines(fn: Callback, options?: BatchOptions): Writable;
|
|
8
|
+
export {};
|