spawn-term 3.1.3 → 3.1.5
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 +58 -19
- package/dist/cjs/components/App.js.map +1 -1
- package/dist/cjs/components/ErrorFooter.js +2 -10
- package/dist/cjs/components/ErrorFooter.js.map +1 -1
- package/dist/cjs/index-cjs.js.map +1 -1
- package/dist/cjs/index-esm.js.map +1 -1
- package/dist/cjs/src/index-cjs.d.ts +1 -0
- package/dist/cjs/src/index-esm.d.ts +1 -0
- package/dist/cjs/src/state/Navigator.d.ts +27 -0
- package/dist/cjs/src/state/processStore.d.ts +28 -25
- package/dist/cjs/src/types.d.ts +3 -0
- package/dist/cjs/state/Navigator.js +127 -0
- package/dist/cjs/state/Navigator.js.map +1 -0
- package/dist/cjs/state/processStore.js +191 -105
- package/dist/cjs/state/processStore.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/components/App.js +58 -19
- package/dist/esm/components/App.js.map +1 -1
- package/dist/esm/components/ErrorFooter.js +2 -10
- package/dist/esm/components/ErrorFooter.js.map +1 -1
- package/dist/esm/index-cjs.js.map +1 -1
- package/dist/esm/index-esm.js.map +1 -1
- package/dist/esm/src/index-cjs.d.ts +1 -0
- package/dist/esm/src/index-esm.d.ts +1 -0
- package/dist/esm/src/state/Navigator.d.ts +27 -0
- package/dist/esm/src/state/processStore.d.ts +28 -25
- package/dist/esm/src/types.d.ts +3 -0
- package/dist/esm/state/Navigator.js +114 -0
- package/dist/esm/state/Navigator.js.map +1 -0
- package/dist/esm/state/processStore.js +156 -100
- package/dist/esm/state/processStore.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +4 -4
|
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "ProcessStore", {
|
|
|
11
11
|
var _compatts = require("../compat.js");
|
|
12
12
|
var _constantsts = require("../constants.js");
|
|
13
13
|
var _typests = require("../types.js");
|
|
14
|
+
var _Navigatorts = require("./Navigator.js");
|
|
14
15
|
function _array_like_to_array(arr, len) {
|
|
15
16
|
if (len == null || len > arr.length) len = arr.length;
|
|
16
17
|
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
@@ -58,6 +59,30 @@ function _object_spread(target) {
|
|
|
58
59
|
}
|
|
59
60
|
return target;
|
|
60
61
|
}
|
|
62
|
+
function ownKeys(object, enumerableOnly) {
|
|
63
|
+
var keys = Object.keys(object);
|
|
64
|
+
if (Object.getOwnPropertySymbols) {
|
|
65
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
66
|
+
if (enumerableOnly) {
|
|
67
|
+
symbols = symbols.filter(function(sym) {
|
|
68
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
keys.push.apply(keys, symbols);
|
|
72
|
+
}
|
|
73
|
+
return keys;
|
|
74
|
+
}
|
|
75
|
+
function _object_spread_props(target, source) {
|
|
76
|
+
source = source != null ? source : {};
|
|
77
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
78
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
79
|
+
} else {
|
|
80
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
81
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return target;
|
|
85
|
+
}
|
|
61
86
|
function _to_consumable_array(arr) {
|
|
62
87
|
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
63
88
|
}
|
|
@@ -75,22 +100,21 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
75
100
|
var _this = this;
|
|
76
101
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
77
102
|
_class_call_check(this, ProcessStore);
|
|
103
|
+
// === DATA: Process collection ===
|
|
78
104
|
this.processes = [];
|
|
79
105
|
this.completedIds = []; // Track completion order
|
|
80
|
-
|
|
81
|
-
this.shouldExit = false;
|
|
82
|
-
this.exitCallback = null;
|
|
83
|
-
// UI state
|
|
106
|
+
// === VIEW STATE ===
|
|
84
107
|
this.mode = 'normal';
|
|
85
|
-
this.selectedIndex = 0;
|
|
86
108
|
this.expandedId = null;
|
|
87
|
-
this.scrollOffset = 0;
|
|
88
|
-
this.listScrollOffset = 0; // Viewport offset for process list
|
|
89
109
|
this.errorFooterExpanded = false; // For non-interactive error footer
|
|
90
|
-
this.bufferVersion = 0; // Increments on every notify() to trigger re-renders
|
|
91
110
|
this.showStatusBar = false;
|
|
92
111
|
this.isInteractive = false;
|
|
93
|
-
//
|
|
112
|
+
// === INFRASTRUCTURE ===
|
|
113
|
+
this.listeners = new Set();
|
|
114
|
+
this.shouldExit = false;
|
|
115
|
+
this.exitCallback = null;
|
|
116
|
+
this.bufferVersion = 0; // Increments on every notify() to trigger re-renders
|
|
117
|
+
// === SUBSCRIPTION API (useSyncExternalStore) ===
|
|
94
118
|
this.subscribe = function(listener) {
|
|
95
119
|
_this.listeners.add(listener);
|
|
96
120
|
return function() {
|
|
@@ -100,7 +124,7 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
100
124
|
this.getSnapshot = function() {
|
|
101
125
|
return _this.processes;
|
|
102
126
|
};
|
|
103
|
-
//
|
|
127
|
+
// === DATA: Queries ===
|
|
104
128
|
this.getRunningProcesses = function() {
|
|
105
129
|
return _this.processes.filter(function(p) {
|
|
106
130
|
return p.state === 'running';
|
|
@@ -151,21 +175,18 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
151
175
|
return total + _this.getProcessLineCount(p.id);
|
|
152
176
|
}, 0);
|
|
153
177
|
};
|
|
154
|
-
//
|
|
178
|
+
// === VIEW STATE: Getters ===
|
|
155
179
|
this.getMode = function() {
|
|
156
180
|
return _this.mode;
|
|
157
181
|
};
|
|
158
182
|
this.getSelectedIndex = function() {
|
|
159
|
-
return _this.
|
|
183
|
+
return _this.listNav.position;
|
|
160
184
|
};
|
|
161
185
|
this.getExpandedId = function() {
|
|
162
186
|
return _this.expandedId;
|
|
163
187
|
};
|
|
164
|
-
this.getScrollOffset = function() {
|
|
165
|
-
return _this.scrollOffset;
|
|
166
|
-
};
|
|
167
188
|
this.getListScrollOffset = function() {
|
|
168
|
-
return _this.
|
|
189
|
+
return _this.listNav.viewportOffset;
|
|
169
190
|
};
|
|
170
191
|
this.getErrorFooterExpanded = function() {
|
|
171
192
|
return _this.errorFooterExpanded;
|
|
@@ -173,6 +194,14 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
173
194
|
this.getBufferVersion = function() {
|
|
174
195
|
return _this.bufferVersion;
|
|
175
196
|
};
|
|
197
|
+
// Get scroll offset for expanded process (or 0 if none)
|
|
198
|
+
this.getScrollOffset = function() {
|
|
199
|
+
var _process_scrollNav;
|
|
200
|
+
if (!_this.expandedId) return 0;
|
|
201
|
+
var process = _this.getProcess(_this.expandedId);
|
|
202
|
+
var _process_scrollNav_position;
|
|
203
|
+
return (_process_scrollNav_position = process === null || process === void 0 ? void 0 : (_process_scrollNav = process.scrollNav) === null || _process_scrollNav === void 0 ? void 0 : _process_scrollNav.position) !== null && _process_scrollNav_position !== void 0 ? _process_scrollNav_position : 0;
|
|
204
|
+
};
|
|
176
205
|
// Session-level getters (set at session creation, immutable)
|
|
177
206
|
this.getHeader = function() {
|
|
178
207
|
return _this.header;
|
|
@@ -199,12 +228,44 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
199
228
|
this.showStatusBar = (_options_showStatusBar = options.showStatusBar) !== null && _options_showStatusBar !== void 0 ? _options_showStatusBar : false;
|
|
200
229
|
var _options_interactive;
|
|
201
230
|
this.isInteractive = (_options_interactive = options.interactive) !== null && _options_interactive !== void 0 ? _options_interactive : false;
|
|
231
|
+
// Create list navigator with wrap-around behavior
|
|
232
|
+
this.listNav = (0, _Navigatorts.createNavigator)({
|
|
233
|
+
getLength: function() {
|
|
234
|
+
return _this.processes.length;
|
|
235
|
+
},
|
|
236
|
+
wrap: true,
|
|
237
|
+
onMove: function() {
|
|
238
|
+
return _this.notify();
|
|
239
|
+
}
|
|
240
|
+
});
|
|
202
241
|
}
|
|
203
242
|
var _proto = ProcessStore.prototype;
|
|
204
|
-
|
|
243
|
+
_proto.getErrorLines = function getErrorLines() {
|
|
244
|
+
var _this = this;
|
|
245
|
+
return this.getFailedProcesses().map(function(p) {
|
|
246
|
+
return {
|
|
247
|
+
processName: p.group || p.title,
|
|
248
|
+
lines: _this.getProcessLines(p.id)
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
};
|
|
252
|
+
// === DATA: Mutations ===
|
|
205
253
|
_proto.addProcess = function addProcess(process) {
|
|
254
|
+
var _this = this;
|
|
255
|
+
// Create scroll navigator for this process
|
|
256
|
+
var processWithNav = _object_spread_props(_object_spread({}, process), {
|
|
257
|
+
scrollNav: (0, _Navigatorts.createNavigator)({
|
|
258
|
+
getLength: function() {
|
|
259
|
+
return _this.getProcessLineCount(processWithNav.id);
|
|
260
|
+
},
|
|
261
|
+
wrap: false,
|
|
262
|
+
onMove: function() {
|
|
263
|
+
return _this.notify();
|
|
264
|
+
}
|
|
265
|
+
})
|
|
266
|
+
});
|
|
206
267
|
this.processes = _to_consumable_array(this.processes).concat([
|
|
207
|
-
|
|
268
|
+
processWithNav
|
|
208
269
|
]);
|
|
209
270
|
this.notify();
|
|
210
271
|
};
|
|
@@ -267,42 +328,16 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
267
328
|
}
|
|
268
329
|
return process.lines.length;
|
|
269
330
|
};
|
|
270
|
-
//
|
|
331
|
+
// === VIEW STATE: Mutations ===
|
|
271
332
|
_proto.setMode = function setMode(mode) {
|
|
272
333
|
this.mode = mode;
|
|
273
334
|
if (mode === 'interactive') {
|
|
274
|
-
this.
|
|
335
|
+
this.listNav.setPosition(0);
|
|
275
336
|
}
|
|
276
337
|
this.notify();
|
|
277
338
|
};
|
|
278
|
-
// Interactive mode navigation
|
|
279
|
-
_proto.selectNext = function selectNext(visibleCount) {
|
|
280
|
-
if (this.processes.length > 0) {
|
|
281
|
-
this.selectedIndex = (this.selectedIndex + 1) % this.processes.length;
|
|
282
|
-
this.adjustListScroll(visibleCount);
|
|
283
|
-
this.notify();
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
_proto.selectPrev = function selectPrev(visibleCount) {
|
|
287
|
-
if (this.processes.length > 0) {
|
|
288
|
-
this.selectedIndex = (this.selectedIndex - 1 + this.processes.length) % this.processes.length;
|
|
289
|
-
this.adjustListScroll(visibleCount);
|
|
290
|
-
this.notify();
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
_proto.adjustListScroll = function adjustListScroll(visibleCount) {
|
|
294
|
-
if (!visibleCount || visibleCount <= 0) return;
|
|
295
|
-
// Ensure selected item is visible in viewport
|
|
296
|
-
if (this.selectedIndex < this.listScrollOffset) {
|
|
297
|
-
// Selected is above viewport - scroll up
|
|
298
|
-
this.listScrollOffset = this.selectedIndex;
|
|
299
|
-
} else if (this.selectedIndex >= this.listScrollOffset + visibleCount) {
|
|
300
|
-
// Selected is below viewport - scroll down
|
|
301
|
-
this.listScrollOffset = this.selectedIndex - visibleCount + 1;
|
|
302
|
-
}
|
|
303
|
-
};
|
|
304
339
|
_proto.getSelectedProcess = function getSelectedProcess() {
|
|
305
|
-
return this.processes[this.
|
|
340
|
+
return this.processes[this.listNav.position];
|
|
306
341
|
};
|
|
307
342
|
// Error footer methods (for non-interactive mode)
|
|
308
343
|
_proto.toggleErrorFooter = function toggleErrorFooter() {
|
|
@@ -315,85 +350,138 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
315
350
|
this.notify();
|
|
316
351
|
}
|
|
317
352
|
};
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
};
|
|
325
|
-
});
|
|
353
|
+
// === NAVIGATION: List (delegates to listNav) ===
|
|
354
|
+
_proto.selectNext = function selectNext(visibleCount) {
|
|
355
|
+
this.listNav.down();
|
|
356
|
+
if (visibleCount) {
|
|
357
|
+
this.listNav.ensureVisible(visibleCount);
|
|
358
|
+
}
|
|
326
359
|
};
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
if (this.expandedId === selected.id) {
|
|
332
|
-
// Collapse
|
|
333
|
-
this.expandedId = null;
|
|
334
|
-
this.scrollOffset = 0;
|
|
335
|
-
} else {
|
|
336
|
-
// Expand
|
|
337
|
-
this.expandedId = selected.id;
|
|
338
|
-
this.scrollOffset = 0;
|
|
360
|
+
_proto.selectPrev = function selectPrev(visibleCount) {
|
|
361
|
+
this.listNav.up();
|
|
362
|
+
if (visibleCount) {
|
|
363
|
+
this.listNav.ensureVisible(visibleCount);
|
|
339
364
|
}
|
|
340
|
-
this.notify();
|
|
341
365
|
};
|
|
342
|
-
_proto.
|
|
343
|
-
this.
|
|
344
|
-
|
|
345
|
-
|
|
366
|
+
_proto.selectPageDown = function selectPageDown(pageSize, visibleCount) {
|
|
367
|
+
this.listNav.pageDown(pageSize, visibleCount);
|
|
368
|
+
};
|
|
369
|
+
_proto.selectPageUp = function selectPageUp(pageSize, visibleCount) {
|
|
370
|
+
this.listNav.pageUp(pageSize, visibleCount);
|
|
371
|
+
};
|
|
372
|
+
_proto.selectFirst = function selectFirst(visibleCount) {
|
|
373
|
+
this.listNav.toStart();
|
|
374
|
+
if (visibleCount) {
|
|
375
|
+
this.listNav.ensureVisible(visibleCount);
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
_proto.selectLast = function selectLast(visibleCount) {
|
|
379
|
+
this.listNav.toEnd();
|
|
380
|
+
if (visibleCount) {
|
|
381
|
+
this.listNav.ensureVisible(visibleCount);
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
_proto.clampListViewport = function clampListViewport(visibleCount) {
|
|
385
|
+
var changed = this.listNav.clampViewport(visibleCount);
|
|
386
|
+
if (changed) {
|
|
387
|
+
this.notify();
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
// === NAVIGATION: Expanded content (delegates to process.scrollNav) ===
|
|
391
|
+
_proto.getExpandedNav = function getExpandedNav() {
|
|
392
|
+
var _this_getProcess;
|
|
393
|
+
if (!this.expandedId) return undefined;
|
|
394
|
+
var nav = (_this_getProcess = this.getProcess(this.expandedId)) === null || _this_getProcess === void 0 ? void 0 : _this_getProcess.scrollNav;
|
|
395
|
+
if (!nav) return undefined;
|
|
396
|
+
return {
|
|
397
|
+
nav: nav,
|
|
398
|
+
id: this.expandedId
|
|
399
|
+
};
|
|
346
400
|
};
|
|
347
401
|
_proto.scrollDown = function scrollDown(maxVisible) {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
402
|
+
var expanded = this.getExpandedNav();
|
|
403
|
+
if (!expanded) return;
|
|
404
|
+
var lineCount = this.getProcessLineCount(expanded.id);
|
|
351
405
|
var maxOffset = Math.max(0, lineCount - maxVisible);
|
|
352
|
-
if
|
|
353
|
-
|
|
354
|
-
|
|
406
|
+
// Only scroll if not at bottom
|
|
407
|
+
if (expanded.nav.position < maxOffset) {
|
|
408
|
+
expanded.nav.down();
|
|
355
409
|
}
|
|
356
410
|
};
|
|
357
411
|
_proto.scrollUp = function scrollUp() {
|
|
358
|
-
|
|
359
|
-
if (
|
|
360
|
-
|
|
361
|
-
|
|
412
|
+
var expanded = this.getExpandedNav();
|
|
413
|
+
if (!expanded) return;
|
|
414
|
+
if (expanded.nav.position > 0) {
|
|
415
|
+
expanded.nav.up();
|
|
362
416
|
}
|
|
363
417
|
};
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
if (!
|
|
367
|
-
var lineCount = this.getProcessLineCount(
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
418
|
+
_proto.scrollPageDown = function scrollPageDown(pageSize) {
|
|
419
|
+
var expanded = this.getExpandedNav();
|
|
420
|
+
if (!expanded) return;
|
|
421
|
+
var lineCount = this.getProcessLineCount(expanded.id);
|
|
422
|
+
var maxOffset = Math.max(0, lineCount - pageSize);
|
|
423
|
+
// Clamp to max offset
|
|
424
|
+
var newPosition = Math.min(expanded.nav.position + pageSize, maxOffset);
|
|
425
|
+
expanded.nav.setPosition(newPosition);
|
|
371
426
|
this.notify();
|
|
372
427
|
};
|
|
373
|
-
_proto.scrollPageUp = function scrollPageUp(
|
|
374
|
-
|
|
375
|
-
|
|
428
|
+
_proto.scrollPageUp = function scrollPageUp(pageSize) {
|
|
429
|
+
var expanded = this.getExpandedNav();
|
|
430
|
+
if (!expanded) return;
|
|
431
|
+
var newPosition = Math.max(0, expanded.nav.position - pageSize);
|
|
432
|
+
expanded.nav.setPosition(newPosition);
|
|
376
433
|
this.notify();
|
|
377
434
|
};
|
|
378
|
-
// Jump to top/bottom
|
|
379
435
|
_proto.scrollToTop = function scrollToTop() {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
436
|
+
var expanded = this.getExpandedNav();
|
|
437
|
+
if (!expanded) return;
|
|
438
|
+
expanded.nav.toStart();
|
|
383
439
|
};
|
|
384
440
|
_proto.scrollToBottom = function scrollToBottom(maxVisible) {
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
441
|
+
var expanded = this.getExpandedNav();
|
|
442
|
+
if (!expanded) return;
|
|
443
|
+
var lineCount = this.getProcessLineCount(expanded.id);
|
|
444
|
+
var newPosition = Math.max(0, lineCount - maxVisible);
|
|
445
|
+
expanded.nav.setPosition(newPosition);
|
|
446
|
+
this.notify();
|
|
447
|
+
};
|
|
448
|
+
// === EXPANSION ===
|
|
449
|
+
_proto.toggleExpand = function toggleExpand(visibleCountWhenExpanded, visibleCountWhenCollapsed) {
|
|
450
|
+
var selected = this.getSelectedProcess();
|
|
451
|
+
if (!selected) return;
|
|
452
|
+
if (this.expandedId === selected.id) {
|
|
453
|
+
// Collapse (keep scroll position for later)
|
|
454
|
+
this.expandedId = null;
|
|
455
|
+
// Adjust viewport to avoid empty space at bottom
|
|
456
|
+
if (visibleCountWhenCollapsed) {
|
|
457
|
+
this.listNav.clampViewport(visibleCountWhenCollapsed);
|
|
458
|
+
}
|
|
459
|
+
} else {
|
|
460
|
+
// Expand (scroll position is preserved in process.scrollNav)
|
|
461
|
+
this.expandedId = selected.id;
|
|
462
|
+
// Adjust list scroll to keep expanded process visible
|
|
463
|
+
if (visibleCountWhenExpanded) {
|
|
464
|
+
this.listNav.ensureVisible(visibleCountWhenExpanded);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
this.notify();
|
|
468
|
+
};
|
|
469
|
+
_proto.collapse = function collapse(visibleCountWhenCollapsed) {
|
|
470
|
+
// Collapse but keep scroll position in process
|
|
471
|
+
this.expandedId = null;
|
|
472
|
+
// Adjust viewport to avoid empty space at bottom
|
|
473
|
+
if (visibleCountWhenCollapsed) {
|
|
474
|
+
this.listNav.clampViewport(visibleCountWhenCollapsed);
|
|
475
|
+
}
|
|
389
476
|
this.notify();
|
|
390
477
|
};
|
|
391
|
-
//
|
|
478
|
+
// === EXIT ===
|
|
392
479
|
_proto.signalExit = function signalExit(callback) {
|
|
393
480
|
this.shouldExit = true;
|
|
394
481
|
this.exitCallback = callback;
|
|
395
482
|
this.notify();
|
|
396
483
|
};
|
|
484
|
+
// === RESET ===
|
|
397
485
|
_proto.reset = function reset() {
|
|
398
486
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
399
487
|
try {
|
|
@@ -422,14 +510,12 @@ var ProcessStore = /*#__PURE__*/ function() {
|
|
|
422
510
|
this.shouldExit = false;
|
|
423
511
|
this.exitCallback = null;
|
|
424
512
|
this.mode = 'normal';
|
|
425
|
-
this.
|
|
513
|
+
this.listNav.reset();
|
|
426
514
|
this.expandedId = null;
|
|
427
|
-
this.scrollOffset = 0;
|
|
428
|
-
this.listScrollOffset = 0;
|
|
429
515
|
this.errorFooterExpanded = false;
|
|
430
516
|
this.header = undefined;
|
|
431
517
|
};
|
|
432
|
-
//
|
|
518
|
+
// === INFRASTRUCTURE ===
|
|
433
519
|
_proto.notify = function notify() {
|
|
434
520
|
this.bufferVersion++;
|
|
435
521
|
this.listeners.forEach(function(l) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import { arrayFind } from '../compat.ts';\nimport { DEFAULT_COLUMN_WIDTH } from '../constants.ts';\nimport type { ChildProcess, Line, SessionOptions } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Listener = () => void;\ntype Mode = 'normal' | 'interactive';\n\nexport class ProcessStore {\n private processes: ChildProcess[] = [];\n private completedIds: string[] = []; // Track completion order\n private listeners = new Set<Listener>();\n private shouldExit = false;\n private exitCallback: (() => void) | null = null;\n\n // UI state\n private mode: Mode = 'normal';\n private selectedIndex = 0;\n private expandedId: string | null = null;\n private scrollOffset = 0;\n private listScrollOffset = 0; // Viewport offset for process list\n private errorFooterExpanded = false; // For non-interactive error footer\n private bufferVersion = 0; // Increments on every notify() to trigger re-renders\n\n // Session-level display settings (set once at session creation)\n private header: string | undefined;\n private showStatusBar = false;\n private isInteractive = false;\n\n constructor(options: SessionOptions = {}) {\n this.header = options.header;\n this.showStatusBar = options.showStatusBar ?? false;\n this.isInteractive = options.interactive ?? false;\n }\n\n // useSyncExternalStore API\n subscribe = (listener: Listener): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getSnapshot = (): ChildProcess[] => this.processes;\n\n // Filtered getters\n getRunningProcesses = (): ChildProcess[] => {\n return this.processes.filter((p) => p.state === 'running');\n };\n\n getCompletedProcesses = (): ChildProcess[] => {\n // Return in completion order\n return this.completedIds.map((id) => arrayFind(this.processes, (p) => p.id === id)).filter((p): p is ChildProcess => p !== undefined);\n };\n\n getFailedProcesses = (): ChildProcess[] => {\n return this.processes.filter((p) => p.state === 'error');\n };\n\n // Counts\n getRunningCount = (): number => this.processes.filter((p) => p.state === 'running').length;\n getMaxGroupLength = (): number => {\n if (this.processes.length === 0) return DEFAULT_COLUMN_WIDTH;\n return Math.max(...this.processes.map((p) => (p.group || p.title).length));\n };\n getDoneCount = (): number => this.processes.filter((p) => p.state !== 'running').length;\n getErrorCount = (): number => this.processes.filter((p) => p.state === 'error').length;\n getErrorLineCount = (): number => {\n return this.processes.filter((p) => p.state === 'error').reduce((total, p) => total + this.getProcessLineCount(p.id), 0);\n };\n\n // UI state getters\n getMode = (): Mode => this.mode;\n getSelectedIndex = (): number => this.selectedIndex;\n getExpandedId = (): string | null => this.expandedId;\n getScrollOffset = (): number => this.scrollOffset;\n getListScrollOffset = (): number => this.listScrollOffset;\n getErrorFooterExpanded = (): boolean => this.errorFooterExpanded;\n getBufferVersion = (): number => this.bufferVersion;\n // Session-level getters (set at session creation, immutable)\n getHeader = (): string | undefined => this.header;\n getShowStatusBar = (): boolean => this.showStatusBar;\n getIsInteractive = (): boolean => this.isInteractive;\n isAllComplete = (): boolean => this.processes.length > 0 && this.processes.every((p) => p.state !== 'running');\n\n // Mutations - Ink handles render throttling at 30 FPS\n addProcess(process: ChildProcess): void {\n this.processes = [...this.processes, process];\n this.notify();\n }\n\n updateProcess(id: string, update: Partial<ChildProcess>): void {\n const oldProcess = arrayFind(this.processes, (p) => p.id === id);\n const wasRunning = oldProcess?.state === 'running';\n const isNowComplete = update.state && update.state !== 'running';\n\n this.processes = this.processes.map((p) => (p.id === id ? { ...p, ...update } : p));\n\n // Track completion order\n if (wasRunning && isNowComplete && !this.completedIds.includes(id)) {\n this.completedIds = [...this.completedIds, id];\n }\n\n // Auto-expand error footer when all complete with errors (non-interactive only)\n if (!this.isInteractive && this.isAllComplete() && this.getErrorCount() > 0) {\n this.errorFooterExpanded = true;\n }\n\n this.notify();\n }\n\n appendLines(id: string, newLines: Line[]): void {\n const process = arrayFind(this.processes, (p) => p.id === id);\n if (process) {\n this.updateProcess(id, { lines: process.lines.concat(newLines) });\n }\n }\n\n getProcess(id: string): ChildProcess | undefined {\n return arrayFind(this.processes, (p) => p.id === id);\n }\n\n // Get rendered lines from terminal buffer or fallback to lines array\n getProcessLines(id: string): Line[] {\n const process = this.getProcess(id);\n if (!process) return [];\n if (process.terminalBuffer) {\n return process.terminalBuffer.getLines().map((text) => ({\n type: LineType.stdout,\n text,\n }));\n }\n return process.lines;\n }\n\n // Get line count from terminal buffer or lines array\n getProcessLineCount(id: string): number {\n const process = this.getProcess(id);\n if (!process) return 0;\n if (process.terminalBuffer) {\n return process.terminalBuffer.lineCount;\n }\n return process.lines.length;\n }\n\n // UI state mutations\n setMode(mode: Mode): void {\n this.mode = mode;\n if (mode === 'interactive') {\n this.selectedIndex = 0;\n }\n this.notify();\n }\n\n // Interactive mode navigation\n selectNext(visibleCount?: number): void {\n if (this.processes.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.processes.length;\n this.adjustListScroll(visibleCount);\n this.notify();\n }\n }\n\n selectPrev(visibleCount?: number): void {\n if (this.processes.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.processes.length) % this.processes.length;\n this.adjustListScroll(visibleCount);\n this.notify();\n }\n }\n\n private adjustListScroll(visibleCount?: number): void {\n if (!visibleCount || visibleCount <= 0) return;\n\n // Ensure selected item is visible in viewport\n if (this.selectedIndex < this.listScrollOffset) {\n // Selected is above viewport - scroll up\n this.listScrollOffset = this.selectedIndex;\n } else if (this.selectedIndex >= this.listScrollOffset + visibleCount) {\n // Selected is below viewport - scroll down\n this.listScrollOffset = this.selectedIndex - visibleCount + 1;\n }\n }\n\n getSelectedProcess(): ChildProcess | undefined {\n return this.processes[this.selectedIndex];\n }\n\n // Error footer methods (for non-interactive mode)\n toggleErrorFooter(): void {\n this.errorFooterExpanded = !this.errorFooterExpanded;\n this.notify();\n }\n\n expandErrorFooter(): void {\n if (!this.errorFooterExpanded) {\n this.errorFooterExpanded = true;\n this.notify();\n }\n }\n\n getErrorLines(): Array<{ processName: string; lines: Line[] }> {\n return this.getFailedProcesses().map((p) => ({\n processName: p.group || p.title,\n lines: this.getProcessLines(p.id),\n }));\n }\n\n // Expansion methods\n toggleExpand(): void {\n const selected = this.getSelectedProcess();\n if (!selected) return;\n\n if (this.expandedId === selected.id) {\n // Collapse\n this.expandedId = null;\n this.scrollOffset = 0;\n } else {\n // Expand\n this.expandedId = selected.id;\n this.scrollOffset = 0;\n }\n this.notify();\n }\n\n collapse(): void {\n this.expandedId = null;\n this.scrollOffset = 0;\n this.notify();\n }\n\n scrollDown(maxVisible: number): void {\n if (!this.expandedId) return;\n const lineCount = this.getProcessLineCount(this.expandedId);\n if (lineCount === 0) return;\n\n const maxOffset = Math.max(0, lineCount - maxVisible);\n if (this.scrollOffset < maxOffset) {\n this.scrollOffset++;\n this.notify();\n }\n }\n\n scrollUp(): void {\n if (!this.expandedId) return;\n if (this.scrollOffset > 0) {\n this.scrollOffset--;\n this.notify();\n }\n }\n\n // Page scrolling (scroll by maxVisible lines at once)\n scrollPageDown(maxVisible: number): void {\n if (!this.expandedId) return;\n const lineCount = this.getProcessLineCount(this.expandedId);\n if (lineCount === 0) return;\n\n const maxOffset = Math.max(0, lineCount - maxVisible);\n this.scrollOffset = Math.min(this.scrollOffset + maxVisible, maxOffset);\n this.notify();\n }\n\n scrollPageUp(maxVisible: number): void {\n if (!this.expandedId) return;\n this.scrollOffset = Math.max(0, this.scrollOffset - maxVisible);\n this.notify();\n }\n\n // Jump to top/bottom\n scrollToTop(): void {\n if (!this.expandedId) return;\n this.scrollOffset = 0;\n this.notify();\n }\n\n scrollToBottom(maxVisible: number): void {\n if (!this.expandedId) return;\n const lineCount = this.getProcessLineCount(this.expandedId);\n if (lineCount === 0) return;\n\n this.scrollOffset = Math.max(0, lineCount - maxVisible);\n this.notify();\n }\n\n // Exit signaling\n signalExit(callback: () => void): void {\n this.shouldExit = true;\n this.exitCallback = callback;\n this.notify();\n }\n\n getShouldExit = (): boolean => this.shouldExit;\n getExitCallback = (): (() => void) | null => this.exitCallback;\n\n reset(): void {\n // Dispose terminal buffers before clearing\n for (const process of this.processes) {\n process.terminalBuffer?.dispose();\n }\n this.processes = [];\n this.completedIds = [];\n this.shouldExit = false;\n this.exitCallback = null;\n this.mode = 'normal';\n this.selectedIndex = 0;\n this.expandedId = null;\n this.scrollOffset = 0;\n this.listScrollOffset = 0;\n this.errorFooterExpanded = false;\n this.header = undefined;\n }\n\n // Public notify for session to trigger updates when terminal buffer changes\n notify(): void {\n this.bufferVersion++;\n this.listeners.forEach((l) => {\n l();\n });\n }\n}\n\n// Note: No global singleton - session creates its own store instance\n"],"names":["ProcessStore","options","processes","completedIds","listeners","Set","shouldExit","exitCallback","mode","selectedIndex","expandedId","scrollOffset","listScrollOffset","errorFooterExpanded","bufferVersion","showStatusBar","isInteractive","subscribe","listener","add","delete","getSnapshot","getRunningProcesses","filter","p","state","getCompletedProcesses","map","id","arrayFind","undefined","getFailedProcesses","getRunningCount","length","getMaxGroupLength","Math","DEFAULT_COLUMN_WIDTH","max","group","title","getDoneCount","getErrorCount","getErrorLineCount","reduce","total","getProcessLineCount","getMode","getSelectedIndex","getExpandedId","getScrollOffset","getListScrollOffset","getErrorFooterExpanded","getBufferVersion","getHeader","header","getShowStatusBar","getIsInteractive","isAllComplete","every","getShouldExit","getExitCallback","interactive","addProcess","process","notify","updateProcess","update","oldProcess","wasRunning","isNowComplete","includes","appendLines","newLines","lines","concat","getProcess","getProcessLines","terminalBuffer","getLines","text","type","LineType","stdout","lineCount","setMode","selectNext","visibleCount","adjustListScroll","selectPrev","getSelectedProcess","toggleErrorFooter","expandErrorFooter","getErrorLines","processName","toggleExpand","selected","collapse","scrollDown","maxVisible","maxOffset","scrollUp","scrollPageDown","min","scrollPageUp","scrollToTop","scrollToBottom","signalExit","callback","reset","dispose","forEach","l"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import { arrayFind } from '../compat.ts';\nimport { DEFAULT_COLUMN_WIDTH } from '../constants.ts';\nimport type { ChildProcess, Line, SessionOptions } from '../types.ts';\nimport { LineType } from '../types.ts';\nimport { createNavigator, type Navigator } from './Navigator.ts';\n\ntype Listener = () => void;\ntype Mode = 'normal' | 'interactive';\n\nexport class ProcessStore {\n // === DATA: Process collection ===\n private processes: ChildProcess[] = [];\n private completedIds: string[] = []; // Track completion order\n\n // === NAVIGATION: List cursor ===\n private listNav: Navigator;\n\n // === VIEW STATE ===\n private mode: Mode = 'normal';\n private expandedId: string | null = null;\n private errorFooterExpanded = false; // For non-interactive error footer\n\n // === SESSION CONFIG (immutable after construction) ===\n private header: string | undefined;\n private showStatusBar = false;\n private isInteractive = false;\n\n // === INFRASTRUCTURE ===\n private listeners = new Set<Listener>();\n private shouldExit = false;\n private exitCallback: (() => void) | null = null;\n private bufferVersion = 0; // Increments on every notify() to trigger re-renders\n\n constructor(options: SessionOptions = {}) {\n this.header = options.header;\n this.showStatusBar = options.showStatusBar ?? false;\n this.isInteractive = options.interactive ?? false;\n\n // Create list navigator with wrap-around behavior\n this.listNav = createNavigator({\n getLength: () => this.processes.length,\n wrap: true,\n onMove: () => this.notify(),\n });\n }\n\n // === SUBSCRIPTION API (useSyncExternalStore) ===\n\n subscribe = (listener: Listener): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getSnapshot = (): ChildProcess[] => this.processes;\n\n // === DATA: Queries ===\n\n getRunningProcesses = (): ChildProcess[] => {\n return this.processes.filter((p) => p.state === 'running');\n };\n\n getCompletedProcesses = (): ChildProcess[] => {\n // Return in completion order\n return this.completedIds.map((id) => arrayFind(this.processes, (p) => p.id === id)).filter((p): p is ChildProcess => p !== undefined);\n };\n\n getFailedProcesses = (): ChildProcess[] => {\n return this.processes.filter((p) => p.state === 'error');\n };\n\n // Counts\n getRunningCount = (): number => this.processes.filter((p) => p.state === 'running').length;\n getMaxGroupLength = (): number => {\n if (this.processes.length === 0) return DEFAULT_COLUMN_WIDTH;\n return Math.max(...this.processes.map((p) => (p.group || p.title).length));\n };\n getDoneCount = (): number => this.processes.filter((p) => p.state !== 'running').length;\n getErrorCount = (): number => this.processes.filter((p) => p.state === 'error').length;\n getErrorLineCount = (): number => {\n return this.processes.filter((p) => p.state === 'error').reduce((total, p) => total + this.getProcessLineCount(p.id), 0);\n };\n\n getErrorLines(): Array<{ processName: string; lines: Line[] }> {\n return this.getFailedProcesses().map((p) => ({\n processName: p.group || p.title,\n lines: this.getProcessLines(p.id),\n }));\n }\n\n // === DATA: Mutations ===\n\n addProcess(process: ChildProcess): void {\n // Create scroll navigator for this process\n const processWithNav: ChildProcess = {\n ...process,\n scrollNav: createNavigator({\n getLength: () => this.getProcessLineCount(processWithNav.id),\n wrap: false,\n onMove: () => this.notify(),\n }),\n };\n this.processes = [...this.processes, processWithNav];\n this.notify();\n }\n\n updateProcess(id: string, update: Partial<ChildProcess>): void {\n const oldProcess = arrayFind(this.processes, (p) => p.id === id);\n const wasRunning = oldProcess?.state === 'running';\n const isNowComplete = update.state && update.state !== 'running';\n\n this.processes = this.processes.map((p) => (p.id === id ? { ...p, ...update } : p));\n\n // Track completion order\n if (wasRunning && isNowComplete && !this.completedIds.includes(id)) {\n this.completedIds = [...this.completedIds, id];\n }\n\n // Auto-expand error footer when all complete with errors (non-interactive only)\n if (!this.isInteractive && this.isAllComplete() && this.getErrorCount() > 0) {\n this.errorFooterExpanded = true;\n }\n\n this.notify();\n }\n\n appendLines(id: string, newLines: Line[]): void {\n const process = arrayFind(this.processes, (p) => p.id === id);\n if (process) {\n this.updateProcess(id, { lines: process.lines.concat(newLines) });\n }\n }\n\n getProcess(id: string): ChildProcess | undefined {\n return arrayFind(this.processes, (p) => p.id === id);\n }\n\n // Get rendered lines from terminal buffer or fallback to lines array\n getProcessLines(id: string): Line[] {\n const process = this.getProcess(id);\n if (!process) return [];\n if (process.terminalBuffer) {\n return process.terminalBuffer.getLines().map((text) => ({\n type: LineType.stdout,\n text,\n }));\n }\n return process.lines;\n }\n\n // Get line count from terminal buffer or lines array\n getProcessLineCount(id: string): number {\n const process = this.getProcess(id);\n if (!process) return 0;\n if (process.terminalBuffer) {\n return process.terminalBuffer.lineCount;\n }\n return process.lines.length;\n }\n\n // === VIEW STATE: Getters ===\n\n getMode = (): Mode => this.mode;\n getSelectedIndex = (): number => this.listNav.position;\n getExpandedId = (): string | null => this.expandedId;\n getListScrollOffset = (): number => this.listNav.viewportOffset;\n getErrorFooterExpanded = (): boolean => this.errorFooterExpanded;\n getBufferVersion = (): number => this.bufferVersion;\n\n // Get scroll offset for expanded process (or 0 if none)\n getScrollOffset = (): number => {\n if (!this.expandedId) return 0;\n const process = this.getProcess(this.expandedId);\n return process?.scrollNav?.position ?? 0;\n };\n\n // Session-level getters (set at session creation, immutable)\n getHeader = (): string | undefined => this.header;\n getShowStatusBar = (): boolean => this.showStatusBar;\n getIsInteractive = (): boolean => this.isInteractive;\n isAllComplete = (): boolean => this.processes.length > 0 && this.processes.every((p) => p.state !== 'running');\n\n // === VIEW STATE: Mutations ===\n\n setMode(mode: Mode): void {\n this.mode = mode;\n if (mode === 'interactive') {\n this.listNav.setPosition(0);\n }\n this.notify();\n }\n\n getSelectedProcess(): ChildProcess | undefined {\n return this.processes[this.listNav.position];\n }\n\n // Error footer methods (for non-interactive mode)\n toggleErrorFooter(): void {\n this.errorFooterExpanded = !this.errorFooterExpanded;\n this.notify();\n }\n\n expandErrorFooter(): void {\n if (!this.errorFooterExpanded) {\n this.errorFooterExpanded = true;\n this.notify();\n }\n }\n\n // === NAVIGATION: List (delegates to listNav) ===\n\n selectNext(visibleCount?: number): void {\n this.listNav.down();\n if (visibleCount) {\n this.listNav.ensureVisible(visibleCount);\n }\n }\n\n selectPrev(visibleCount?: number): void {\n this.listNav.up();\n if (visibleCount) {\n this.listNav.ensureVisible(visibleCount);\n }\n }\n\n selectPageDown(pageSize: number, visibleCount?: number): void {\n this.listNav.pageDown(pageSize, visibleCount);\n }\n\n selectPageUp(pageSize: number, visibleCount?: number): void {\n this.listNav.pageUp(pageSize, visibleCount);\n }\n\n selectFirst(visibleCount?: number): void {\n this.listNav.toStart();\n if (visibleCount) {\n this.listNav.ensureVisible(visibleCount);\n }\n }\n\n selectLast(visibleCount?: number): void {\n this.listNav.toEnd();\n if (visibleCount) {\n this.listNav.ensureVisible(visibleCount);\n }\n }\n\n clampListViewport(visibleCount: number): void {\n const changed = this.listNav.clampViewport(visibleCount);\n if (changed) {\n this.notify();\n }\n }\n\n // === NAVIGATION: Expanded content (delegates to process.scrollNav) ===\n\n private getExpandedNav(): { nav: Navigator; id: string } | undefined {\n if (!this.expandedId) return undefined;\n const nav = this.getProcess(this.expandedId)?.scrollNav;\n if (!nav) return undefined;\n return { nav, id: this.expandedId };\n }\n\n scrollDown(maxVisible: number): void {\n const expanded = this.getExpandedNav();\n if (!expanded) return;\n\n const lineCount = this.getProcessLineCount(expanded.id);\n const maxOffset = Math.max(0, lineCount - maxVisible);\n\n // Only scroll if not at bottom\n if (expanded.nav.position < maxOffset) {\n expanded.nav.down();\n }\n }\n\n scrollUp(): void {\n const expanded = this.getExpandedNav();\n if (!expanded) return;\n\n if (expanded.nav.position > 0) {\n expanded.nav.up();\n }\n }\n\n scrollPageDown(pageSize: number): void {\n const expanded = this.getExpandedNav();\n if (!expanded) return;\n\n const lineCount = this.getProcessLineCount(expanded.id);\n const maxOffset = Math.max(0, lineCount - pageSize);\n\n // Clamp to max offset\n const newPosition = Math.min(expanded.nav.position + pageSize, maxOffset);\n expanded.nav.setPosition(newPosition);\n this.notify();\n }\n\n scrollPageUp(pageSize: number): void {\n const expanded = this.getExpandedNav();\n if (!expanded) return;\n\n const newPosition = Math.max(0, expanded.nav.position - pageSize);\n expanded.nav.setPosition(newPosition);\n this.notify();\n }\n\n scrollToTop(): void {\n const expanded = this.getExpandedNav();\n if (!expanded) return;\n expanded.nav.toStart();\n }\n\n scrollToBottom(maxVisible: number): void {\n const expanded = this.getExpandedNav();\n if (!expanded) return;\n\n const lineCount = this.getProcessLineCount(expanded.id);\n const newPosition = Math.max(0, lineCount - maxVisible);\n expanded.nav.setPosition(newPosition);\n this.notify();\n }\n\n // === EXPANSION ===\n\n toggleExpand(visibleCountWhenExpanded?: number, visibleCountWhenCollapsed?: number): void {\n const selected = this.getSelectedProcess();\n if (!selected) return;\n\n if (this.expandedId === selected.id) {\n // Collapse (keep scroll position for later)\n this.expandedId = null;\n // Adjust viewport to avoid empty space at bottom\n if (visibleCountWhenCollapsed) {\n this.listNav.clampViewport(visibleCountWhenCollapsed);\n }\n } else {\n // Expand (scroll position is preserved in process.scrollNav)\n this.expandedId = selected.id;\n // Adjust list scroll to keep expanded process visible\n if (visibleCountWhenExpanded) {\n this.listNav.ensureVisible(visibleCountWhenExpanded);\n }\n }\n this.notify();\n }\n\n collapse(visibleCountWhenCollapsed?: number): void {\n // Collapse but keep scroll position in process\n this.expandedId = null;\n // Adjust viewport to avoid empty space at bottom\n if (visibleCountWhenCollapsed) {\n this.listNav.clampViewport(visibleCountWhenCollapsed);\n }\n this.notify();\n }\n\n // === EXIT ===\n\n signalExit(callback: () => void): void {\n this.shouldExit = true;\n this.exitCallback = callback;\n this.notify();\n }\n\n getShouldExit = (): boolean => this.shouldExit;\n getExitCallback = (): (() => void) | null => this.exitCallback;\n\n // === RESET ===\n\n reset(): void {\n // Dispose terminal buffers before clearing\n for (const process of this.processes) {\n process.terminalBuffer?.dispose();\n }\n this.processes = [];\n this.completedIds = [];\n this.shouldExit = false;\n this.exitCallback = null;\n this.mode = 'normal';\n this.listNav.reset();\n this.expandedId = null;\n this.errorFooterExpanded = false;\n this.header = undefined;\n }\n\n // === INFRASTRUCTURE ===\n\n notify(): void {\n this.bufferVersion++;\n this.listeners.forEach((l) => {\n l();\n });\n }\n}\n\n// Note: No global singleton - session creates its own store instance\n"],"names":["ProcessStore","options","processes","completedIds","mode","expandedId","errorFooterExpanded","showStatusBar","isInteractive","listeners","Set","shouldExit","exitCallback","bufferVersion","subscribe","listener","add","delete","getSnapshot","getRunningProcesses","filter","p","state","getCompletedProcesses","map","id","arrayFind","undefined","getFailedProcesses","getRunningCount","length","getMaxGroupLength","Math","DEFAULT_COLUMN_WIDTH","max","group","title","getDoneCount","getErrorCount","getErrorLineCount","reduce","total","getProcessLineCount","getMode","getSelectedIndex","listNav","position","getExpandedId","getListScrollOffset","viewportOffset","getErrorFooterExpanded","getBufferVersion","getScrollOffset","process","getProcess","scrollNav","getHeader","header","getShowStatusBar","getIsInteractive","isAllComplete","every","getShouldExit","getExitCallback","interactive","createNavigator","getLength","wrap","onMove","notify","getErrorLines","processName","lines","getProcessLines","addProcess","processWithNav","updateProcess","update","oldProcess","wasRunning","isNowComplete","includes","appendLines","newLines","concat","terminalBuffer","getLines","text","type","LineType","stdout","lineCount","setMode","setPosition","getSelectedProcess","toggleErrorFooter","expandErrorFooter","selectNext","visibleCount","down","ensureVisible","selectPrev","up","selectPageDown","pageSize","pageDown","selectPageUp","pageUp","selectFirst","toStart","selectLast","toEnd","clampListViewport","changed","clampViewport","getExpandedNav","nav","scrollDown","maxVisible","expanded","maxOffset","scrollUp","scrollPageDown","newPosition","min","scrollPageUp","scrollToTop","scrollToBottom","toggleExpand","visibleCountWhenExpanded","visibleCountWhenCollapsed","selected","collapse","signalExit","callback","reset","dispose","forEach","l"],"mappings":"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"}
|
package/dist/cjs/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/types.ts"],"sourcesContent":["export type { SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from 'cross-spawn-cb';\n\nimport type { SpawnError, SpawnResult } from 'cross-spawn-cb';\n\n// Session-level options (set at session creation, immutable)\nexport type SessionOptions = {\n header?: string;\n showStatusBar?: boolean;\n interactive?: boolean;\n};\n\n// Per-process options (set when spawning each process)\nexport type ProcessOptions = {\n group?: string;\n expanded?: boolean;\n};\n\nexport type TerminalCallback = (error?: SpawnError, result?: SpawnResult) => void;\n\nexport const LineType = {\n stdout: 1,\n stderr: 2,\n} as const;\n\nexport type Line = {\n type: (typeof LineType)[keyof typeof LineType];\n text: string;\n};\n\nexport type State = 'running' | 'error' | 'success';\n\n// Import type for TerminalBuffer (avoid circular dependency)\nimport type { TerminalBuffer } from './lib/TerminalBuffer.ts';\n\n// Internal representation of a child process\nexport type ChildProcess = {\n id: string;\n group?: string;\n title: string;\n state: State;\n lines: Line[];\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/types.ts"],"sourcesContent":["export type { SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from 'cross-spawn-cb';\n\nimport type { SpawnError, SpawnResult } from 'cross-spawn-cb';\n\n// Session-level options (set at session creation, immutable)\nexport type SessionOptions = {\n header?: string;\n showStatusBar?: boolean;\n interactive?: boolean;\n};\n\n// Per-process options (set when spawning each process)\nexport type ProcessOptions = {\n group?: string;\n expanded?: boolean;\n};\n\nexport type TerminalCallback = (error?: SpawnError, result?: SpawnResult) => void;\n\nexport const LineType = {\n stdout: 1,\n stderr: 2,\n} as const;\n\nexport type Line = {\n type: (typeof LineType)[keyof typeof LineType];\n text: string;\n};\n\nexport type State = 'running' | 'error' | 'success';\n\n// Import type for TerminalBuffer (avoid circular dependency)\nimport type { TerminalBuffer } from './lib/TerminalBuffer.ts';\n\n// Internal representation of a child process\nexport type ChildProcess = {\n id: string;\n group?: string;\n title: string;\n state: State;\n lines: Line[];\n /** @internal Virtual terminal for ANSI interpretation */\n terminalBuffer?: TerminalBuffer;\n expanded?: boolean;\n /** @internal Per-process scroll navigation state */\n scrollNav?: import('./state/Navigator.ts').Navigator;\n};\n"],"names":["LineType","stdout","stderr"],"mappings":";;;;+BAmBaA;;;eAAAA;;;AAAN,IAAMA,WAAW;IACtBC,QAAQ;IACRC,QAAQ;AACV"}
|