spawn-term 1.1.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/App.js +96 -9
- package/dist/cjs/components/App.js.map +1 -1
- package/dist/cjs/components/CompactProcessLine.js +153 -0
- package/dist/cjs/components/CompactProcessLine.js.map +1 -0
- package/dist/cjs/components/Divider.js +24 -0
- package/dist/cjs/components/Divider.js.map +1 -0
- package/dist/cjs/components/ErrorDetailModal.js +115 -0
- package/dist/cjs/components/ErrorDetailModal.js.map +1 -0
- package/dist/cjs/components/ErrorListModal.js +135 -0
- package/dist/cjs/components/ErrorListModal.js.map +1 -0
- package/dist/cjs/components/StatusBar.js +104 -0
- package/dist/cjs/components/StatusBar.js.map +1 -0
- package/dist/cjs/createApp.js +10 -5
- package/dist/cjs/createApp.js.map +1 -1
- package/dist/cjs/src/components/CompactProcessLine.d.ts +6 -0
- package/dist/cjs/src/components/Divider.d.ts +2 -0
- package/dist/cjs/src/components/ErrorDetailModal.d.ts +8 -0
- package/dist/cjs/src/components/ErrorListModal.d.ts +8 -0
- package/dist/cjs/src/components/StatusBar.d.ts +8 -0
- package/dist/cjs/src/state/processStore.d.ts +17 -0
- package/dist/cjs/state/processStore.js +98 -0
- package/dist/cjs/state/processStore.js.map +1 -1
- package/dist/esm/components/App.js +94 -9
- package/dist/esm/components/App.js.map +1 -1
- package/dist/esm/components/CompactProcessLine.js +134 -0
- package/dist/esm/components/CompactProcessLine.js.map +1 -0
- package/dist/esm/components/Divider.js +13 -0
- package/dist/esm/components/Divider.js.map +1 -0
- package/dist/esm/components/ErrorDetailModal.js +99 -0
- package/dist/esm/components/ErrorDetailModal.js.map +1 -0
- package/dist/esm/components/ErrorListModal.js +116 -0
- package/dist/esm/components/ErrorListModal.js.map +1 -0
- package/dist/esm/components/StatusBar.js +87 -0
- package/dist/esm/components/StatusBar.js.map +1 -0
- package/dist/esm/createApp.js +10 -5
- package/dist/esm/createApp.js.map +1 -1
- package/dist/esm/src/components/CompactProcessLine.d.ts +6 -0
- package/dist/esm/src/components/Divider.d.ts +2 -0
- package/dist/esm/src/components/ErrorDetailModal.d.ts +8 -0
- package/dist/esm/src/components/ErrorListModal.d.ts +8 -0
- package/dist/esm/src/components/StatusBar.d.ts +8 -0
- package/dist/esm/src/state/processStore.d.ts +17 -0
- package/dist/esm/state/processStore.js +65 -0
- package/dist/esm/state/processStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -26,6 +26,7 @@ function _object_spread(target) {
|
|
|
26
26
|
}
|
|
27
27
|
return target;
|
|
28
28
|
}
|
|
29
|
+
import { LineType } from '../types.js';
|
|
29
30
|
class ProcessStore {
|
|
30
31
|
// Mutations - Ink handles render throttling at 30 FPS
|
|
31
32
|
addProcess(process) {
|
|
@@ -36,7 +37,17 @@ class ProcessStore {
|
|
|
36
37
|
this.notify();
|
|
37
38
|
}
|
|
38
39
|
updateProcess(id, update) {
|
|
40
|
+
const oldProcess = this.processes.find((p)=>p.id === id);
|
|
41
|
+
const wasRunning = (oldProcess === null || oldProcess === void 0 ? void 0 : oldProcess.state) === 'running';
|
|
42
|
+
const isNowComplete = update.state && update.state !== 'running';
|
|
39
43
|
this.processes = this.processes.map((p)=>p.id === id ? _object_spread({}, p, update) : p);
|
|
44
|
+
// Track completion order
|
|
45
|
+
if (wasRunning && isNowComplete && !this.completedIds.includes(id)) {
|
|
46
|
+
this.completedIds = [
|
|
47
|
+
...this.completedIds,
|
|
48
|
+
id
|
|
49
|
+
];
|
|
50
|
+
}
|
|
40
51
|
this.notify();
|
|
41
52
|
}
|
|
42
53
|
appendLines(id, newLines) {
|
|
@@ -50,6 +61,32 @@ class ProcessStore {
|
|
|
50
61
|
getProcess(id) {
|
|
51
62
|
return this.processes.find((p)=>p.id === id);
|
|
52
63
|
}
|
|
64
|
+
// UI state mutations
|
|
65
|
+
setMode(mode) {
|
|
66
|
+
this.mode = mode;
|
|
67
|
+
if (mode === 'errorList') {
|
|
68
|
+
this.selectedErrorIndex = 0;
|
|
69
|
+
}
|
|
70
|
+
this.notify();
|
|
71
|
+
}
|
|
72
|
+
selectNextError() {
|
|
73
|
+
const failed = this.getFailedProcesses();
|
|
74
|
+
if (failed.length > 0) {
|
|
75
|
+
this.selectedErrorIndex = (this.selectedErrorIndex + 1) % failed.length;
|
|
76
|
+
this.notify();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
selectPrevError() {
|
|
80
|
+
const failed = this.getFailedProcesses();
|
|
81
|
+
if (failed.length > 0) {
|
|
82
|
+
this.selectedErrorIndex = (this.selectedErrorIndex - 1 + failed.length) % failed.length;
|
|
83
|
+
this.notify();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
getSelectedError() {
|
|
87
|
+
const failed = this.getFailedProcesses();
|
|
88
|
+
return failed[this.selectedErrorIndex];
|
|
89
|
+
}
|
|
53
90
|
// Exit signaling
|
|
54
91
|
signalExit(callback) {
|
|
55
92
|
this.shouldExit = true;
|
|
@@ -58,8 +95,11 @@ class ProcessStore {
|
|
|
58
95
|
}
|
|
59
96
|
reset() {
|
|
60
97
|
this.processes = [];
|
|
98
|
+
this.completedIds = [];
|
|
61
99
|
this.shouldExit = false;
|
|
62
100
|
this.exitCallback = null;
|
|
101
|
+
this.mode = 'normal';
|
|
102
|
+
this.selectedErrorIndex = 0;
|
|
63
103
|
}
|
|
64
104
|
notify() {
|
|
65
105
|
this.listeners.forEach((l)=>{
|
|
@@ -68,15 +108,40 @@ class ProcessStore {
|
|
|
68
108
|
}
|
|
69
109
|
constructor(){
|
|
70
110
|
this.processes = [];
|
|
111
|
+
this.completedIds = []; // Track completion order
|
|
71
112
|
this.listeners = new Set();
|
|
72
113
|
this.shouldExit = false;
|
|
73
114
|
this.exitCallback = null;
|
|
115
|
+
// UI state
|
|
116
|
+
this.mode = 'normal';
|
|
117
|
+
this.selectedErrorIndex = 0;
|
|
74
118
|
// useSyncExternalStore API
|
|
75
119
|
this.subscribe = (listener)=>{
|
|
76
120
|
this.listeners.add(listener);
|
|
77
121
|
return ()=>this.listeners.delete(listener);
|
|
78
122
|
};
|
|
79
123
|
this.getSnapshot = ()=>this.processes;
|
|
124
|
+
// Filtered getters
|
|
125
|
+
this.getRunningProcesses = ()=>{
|
|
126
|
+
return this.processes.filter((p)=>p.state === 'running');
|
|
127
|
+
};
|
|
128
|
+
this.getCompletedProcesses = ()=>{
|
|
129
|
+
// Return in completion order
|
|
130
|
+
return this.completedIds.map((id)=>this.processes.find((p)=>p.id === id)).filter((p)=>p !== undefined);
|
|
131
|
+
};
|
|
132
|
+
this.getFailedProcesses = ()=>{
|
|
133
|
+
return this.processes.filter((p)=>p.state === 'error');
|
|
134
|
+
};
|
|
135
|
+
// Counts
|
|
136
|
+
this.getRunningCount = ()=>this.processes.filter((p)=>p.state === 'running').length;
|
|
137
|
+
this.getDoneCount = ()=>this.processes.filter((p)=>p.state !== 'running').length;
|
|
138
|
+
this.getErrorCount = ()=>this.processes.filter((p)=>p.state === 'error').length;
|
|
139
|
+
this.getErrorLineCount = ()=>{
|
|
140
|
+
return this.processes.filter((p)=>p.state === 'error').reduce((total, p)=>total + p.lines.filter((l)=>l.type === LineType.stderr).length, 0);
|
|
141
|
+
};
|
|
142
|
+
// UI state getters
|
|
143
|
+
this.getMode = ()=>this.mode;
|
|
144
|
+
this.getSelectedErrorIndex = ()=>this.selectedErrorIndex;
|
|
80
145
|
this.getShouldExit = ()=>this.shouldExit;
|
|
81
146
|
this.getExitCallback = ()=>this.exitCallback;
|
|
82
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import type { ChildProcess, Line } from '../types.ts';\n\ntype Listener = () => void;\n\nclass ProcessStore {\n private processes: ChildProcess[] = [];\n private listeners = new Set<Listener>();\n private shouldExit = false;\n private exitCallback: (() => void) | null = null;\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 // 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 this.processes = this.processes.map((p) => (p.id === id ? { ...p, ...update } : p));\n this.notify();\n }\n\n appendLines(id: string, newLines: Line[]): void {\n const process = this.processes.find((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 this.processes.find((p) => p.id === id);\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 this.processes = [];\n this.shouldExit = false;\n this.exitCallback = null;\n }\n\n private notify(): void {\n this.listeners.forEach((l) => {\n l();\n });\n }\n}\n\nexport const processStore = new ProcessStore();\nexport type { ProcessStore };\n"],"names":["ProcessStore","addProcess","process","processes","notify","updateProcess","id","update","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import type { ChildProcess, Line } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Listener = () => void;\ntype Mode = 'normal' | 'errorList' | 'errorDetail';\n\nclass 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 selectedErrorIndex = 0;\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) => this.processes.find((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 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 + p.lines.filter((l) => l.type === LineType.stderr).length, 0);\n };\n\n // UI state getters\n getMode = (): Mode => this.mode;\n getSelectedErrorIndex = (): number => this.selectedErrorIndex;\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 = this.processes.find((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 this.notify();\n }\n\n appendLines(id: string, newLines: Line[]): void {\n const process = this.processes.find((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 this.processes.find((p) => p.id === id);\n }\n\n // UI state mutations\n setMode(mode: Mode): void {\n this.mode = mode;\n if (mode === 'errorList') {\n this.selectedErrorIndex = 0;\n }\n this.notify();\n }\n\n selectNextError(): void {\n const failed = this.getFailedProcesses();\n if (failed.length > 0) {\n this.selectedErrorIndex = (this.selectedErrorIndex + 1) % failed.length;\n this.notify();\n }\n }\n\n selectPrevError(): void {\n const failed = this.getFailedProcesses();\n if (failed.length > 0) {\n this.selectedErrorIndex = (this.selectedErrorIndex - 1 + failed.length) % failed.length;\n this.notify();\n }\n }\n\n getSelectedError(): ChildProcess | undefined {\n const failed = this.getFailedProcesses();\n return failed[this.selectedErrorIndex];\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 this.processes = [];\n this.completedIds = [];\n this.shouldExit = false;\n this.exitCallback = null;\n this.mode = 'normal';\n this.selectedErrorIndex = 0;\n }\n\n private notify(): void {\n this.listeners.forEach((l) => {\n l();\n });\n }\n}\n\nexport const processStore = new ProcessStore();\nexport type { ProcessStore };\n"],"names":["LineType","ProcessStore","addProcess","process","processes","notify","updateProcess","id","update","oldProcess","find","p","wasRunning","state","isNowComplete","map","completedIds","includes","appendLines","newLines","lines","concat","getProcess","setMode","mode","selectedErrorIndex","selectNextError","failed","getFailedProcesses","length","selectPrevError","getSelectedError","signalExit","callback","shouldExit","exitCallback","reset","listeners","forEach","l","Set","subscribe","listener","add","delete","getSnapshot","getRunningProcesses","filter","getCompletedProcesses","undefined","getRunningCount","getDoneCount","getErrorCount","getErrorLineCount","reduce","total","type","stderr","getMode","getSelectedErrorIndex","getShouldExit","getExitCallback","processStore"],"mappings":"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"}
|