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.
Files changed (73) hide show
  1. package/dist/cjs/components/App.js +159 -9
  2. package/dist/cjs/components/App.js.map +1 -1
  3. package/dist/cjs/components/CompactProcessLine.js +162 -0
  4. package/dist/cjs/components/CompactProcessLine.js.map +1 -0
  5. package/dist/cjs/components/Divider.js +24 -0
  6. package/dist/cjs/components/Divider.js.map +1 -0
  7. package/dist/cjs/components/ErrorDetailModal.js +115 -0
  8. package/dist/cjs/components/ErrorDetailModal.js.map +1 -0
  9. package/dist/cjs/components/ErrorListModal.js +135 -0
  10. package/dist/cjs/components/ErrorListModal.js.map +1 -0
  11. package/dist/cjs/components/ExpandedOutput.js +55 -0
  12. package/dist/cjs/components/ExpandedOutput.js.map +1 -0
  13. package/dist/cjs/components/StatusBar.js +104 -0
  14. package/dist/cjs/components/StatusBar.js.map +1 -0
  15. package/dist/cjs/constants.js +42 -0
  16. package/dist/cjs/constants.js.map +1 -0
  17. package/dist/cjs/createApp.js +7 -2
  18. package/dist/cjs/createApp.js.map +1 -1
  19. package/dist/cjs/lib/addLines.js +58 -4
  20. package/dist/cjs/lib/addLines.js.map +1 -1
  21. package/dist/cjs/lib/format.js +21 -0
  22. package/dist/cjs/lib/format.js.map +1 -0
  23. package/dist/cjs/src/components/CompactProcessLine.d.ts +7 -0
  24. package/dist/cjs/src/components/Divider.d.ts +2 -0
  25. package/dist/cjs/src/components/ErrorDetailModal.d.ts +8 -0
  26. package/dist/cjs/src/components/ErrorListModal.d.ts +8 -0
  27. package/dist/cjs/src/components/ExpandedOutput.d.ts +8 -0
  28. package/dist/cjs/src/components/StatusBar.d.ts +8 -0
  29. package/dist/cjs/src/constants.d.ts +7 -0
  30. package/dist/cjs/src/lib/addLines.d.ts +6 -1
  31. package/dist/cjs/src/lib/format.d.ts +2 -0
  32. package/dist/cjs/src/state/processStore.d.ts +36 -0
  33. package/dist/cjs/src/types.d.ts +6 -0
  34. package/dist/cjs/state/processStore.js +202 -0
  35. package/dist/cjs/state/processStore.js.map +1 -1
  36. package/dist/cjs/types.js.map +1 -1
  37. package/dist/esm/components/App.js +159 -9
  38. package/dist/esm/components/App.js.map +1 -1
  39. package/dist/esm/components/CompactProcessLine.js +143 -0
  40. package/dist/esm/components/CompactProcessLine.js.map +1 -0
  41. package/dist/esm/components/Divider.js +13 -0
  42. package/dist/esm/components/Divider.js.map +1 -0
  43. package/dist/esm/components/ErrorDetailModal.js +99 -0
  44. package/dist/esm/components/ErrorDetailModal.js.map +1 -0
  45. package/dist/esm/components/ErrorListModal.js +116 -0
  46. package/dist/esm/components/ErrorListModal.js.map +1 -0
  47. package/dist/esm/components/ExpandedOutput.js +41 -0
  48. package/dist/esm/components/ExpandedOutput.js.map +1 -0
  49. package/dist/esm/components/StatusBar.js +87 -0
  50. package/dist/esm/components/StatusBar.js.map +1 -0
  51. package/dist/esm/constants.js +11 -0
  52. package/dist/esm/constants.js.map +1 -0
  53. package/dist/esm/createApp.js +7 -2
  54. package/dist/esm/createApp.js.map +1 -1
  55. package/dist/esm/lib/addLines.js +32 -5
  56. package/dist/esm/lib/addLines.js.map +1 -1
  57. package/dist/esm/lib/format.js +10 -0
  58. package/dist/esm/lib/format.js.map +1 -0
  59. package/dist/esm/src/components/CompactProcessLine.d.ts +7 -0
  60. package/dist/esm/src/components/Divider.d.ts +2 -0
  61. package/dist/esm/src/components/ErrorDetailModal.d.ts +8 -0
  62. package/dist/esm/src/components/ErrorListModal.d.ts +8 -0
  63. package/dist/esm/src/components/ExpandedOutput.d.ts +8 -0
  64. package/dist/esm/src/components/StatusBar.d.ts +8 -0
  65. package/dist/esm/src/constants.d.ts +7 -0
  66. package/dist/esm/src/lib/addLines.d.ts +6 -1
  67. package/dist/esm/src/lib/format.d.ts +2 -0
  68. package/dist/esm/src/state/processStore.d.ts +36 -0
  69. package/dist/esm/src/types.d.ts +6 -0
  70. package/dist/esm/state/processStore.js +146 -0
  71. package/dist/esm/state/processStore.js.map +1 -1
  72. package/dist/esm/types.js.map +1 -1
  73. 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 _ChildProcessts = /*#__PURE__*/ _interop_require_default(require("./ChildProcess.js"));
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
- // Subscribe to process state
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
- return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
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: processes.map(function(item) {
38
- return /*#__PURE__*/ (0, _jsxruntime.jsx)(_ChildProcessts.default, {
39
- item: item
40
- }, item.id);
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":"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"}
@@ -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"}