spawn-term 2.1.1 → 3.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 +62 -46
- package/dist/cjs/components/App.js.map +1 -1
- package/dist/cjs/components/CompactProcessLine.js +3 -2
- package/dist/cjs/components/CompactProcessLine.js.map +1 -1
- package/dist/cjs/index-cjs.js +3 -3
- package/dist/cjs/index-cjs.js.map +1 -1
- package/dist/cjs/index-esm.js +4 -4
- package/dist/cjs/index-esm.js.map +1 -1
- package/dist/cjs/session.js +311 -0
- package/dist/cjs/session.js.map +1 -0
- package/dist/cjs/src/components/App.d.ts +6 -1
- package/dist/cjs/src/index-cjs.d.ts +3 -3
- package/dist/cjs/src/index-esm.d.ts +3 -3
- package/dist/cjs/src/session.d.ts +7 -0
- package/dist/cjs/src/state/StoreContext.d.ts +3 -0
- package/dist/cjs/src/state/processStore.d.ts +6 -4
- package/dist/cjs/src/types.d.ts +5 -6
- package/dist/cjs/state/StoreContext.js +28 -0
- package/dist/cjs/state/StoreContext.js.map +1 -0
- package/dist/cjs/state/processStore.js +15 -17
- package/dist/cjs/state/processStore.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/components/App.js +59 -45
- package/dist/esm/components/App.js.map +1 -1
- package/dist/esm/components/CompactProcessLine.js +3 -2
- package/dist/esm/components/CompactProcessLine.js.map +1 -1
- package/dist/esm/index-cjs.js +1 -1
- package/dist/esm/index-cjs.js.map +1 -1
- package/dist/esm/index-esm.js +2 -2
- package/dist/esm/index-esm.js.map +1 -1
- package/dist/esm/session.js +218 -0
- package/dist/esm/session.js.map +1 -0
- package/dist/esm/src/components/App.d.ts +6 -1
- package/dist/esm/src/index-cjs.d.ts +3 -3
- package/dist/esm/src/index-esm.d.ts +3 -3
- package/dist/esm/src/session.d.ts +7 -0
- package/dist/esm/src/state/StoreContext.d.ts +3 -0
- package/dist/esm/src/state/processStore.d.ts +6 -4
- package/dist/esm/src/types.d.ts +5 -6
- package/dist/esm/state/StoreContext.js +9 -0
- package/dist/esm/state/StoreContext.js.map +1 -0
- package/dist/esm/state/processStore.js +13 -13
- package/dist/esm/state/processStore.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/createApp.js +0 -58
- package/dist/cjs/createApp.js.map +0 -1
- package/dist/cjs/spawnTerminal.js +0 -75
- package/dist/cjs/spawnTerminal.js.map +0 -1
- package/dist/cjs/src/createApp.d.ts +0 -6
- package/dist/cjs/src/spawnTerminal.d.ts +0 -2
- package/dist/cjs/src/worker.d.ts +0 -2
- package/dist/cjs/worker.js +0 -236
- package/dist/cjs/worker.js.map +0 -1
- package/dist/esm/createApp.js +0 -42
- package/dist/esm/createApp.js.map +0 -1
- package/dist/esm/spawnTerminal.js +0 -19
- package/dist/esm/spawnTerminal.js.map +0 -1
- package/dist/esm/src/createApp.d.ts +0 -6
- package/dist/esm/src/spawnTerminal.d.ts +0 -2
- package/dist/esm/src/worker.d.ts +0 -2
- package/dist/esm/worker.js +0 -175
- package/dist/esm/worker.js.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProcessOptions, SessionOptions, SpawnOptions, TerminalCallback } from './types.js';
|
|
2
|
+
export interface Session {
|
|
3
|
+
spawn(command: string, args: string[], spawnOptions: SpawnOptions, options: ProcessOptions, callback: TerminalCallback): void;
|
|
4
|
+
close(): void;
|
|
5
|
+
waitAndClose(callback?: () => void): void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSession(options?: SessionOptions): Session;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { ChildProcess, Line } from '../types.js';
|
|
1
|
+
import type { ChildProcess, Line, SessionOptions } from '../types.js';
|
|
2
2
|
type Listener = () => void;
|
|
3
3
|
type Mode = 'normal' | 'interactive' | 'errorList' | 'errorDetail';
|
|
4
|
-
declare class ProcessStore {
|
|
4
|
+
export declare class ProcessStore {
|
|
5
5
|
private processes;
|
|
6
6
|
private completedIds;
|
|
7
7
|
private listeners;
|
|
@@ -13,6 +13,9 @@ declare class ProcessStore {
|
|
|
13
13
|
private expandedId;
|
|
14
14
|
private scrollOffset;
|
|
15
15
|
private header;
|
|
16
|
+
private showStatusBar;
|
|
17
|
+
private isInteractive;
|
|
18
|
+
constructor(options?: SessionOptions);
|
|
16
19
|
subscribe: (listener: Listener) => (() => void);
|
|
17
20
|
getSnapshot: () => ChildProcess[];
|
|
18
21
|
getRunningProcesses: () => ChildProcess[];
|
|
@@ -53,5 +56,4 @@ declare class ProcessStore {
|
|
|
53
56
|
reset(): void;
|
|
54
57
|
private notify;
|
|
55
58
|
}
|
|
56
|
-
export
|
|
57
|
-
export type { ProcessStore };
|
|
59
|
+
export {};
|
package/dist/esm/src/types.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export type { SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from 'cross-spawn-cb';
|
|
2
2
|
import type { SpawnError, SpawnResult } from 'cross-spawn-cb';
|
|
3
|
-
export type
|
|
4
|
-
group?: string;
|
|
5
|
-
expanded?: boolean;
|
|
3
|
+
export type SessionOptions = {
|
|
6
4
|
header?: string;
|
|
7
5
|
showStatusBar?: boolean;
|
|
8
6
|
interactive?: boolean;
|
|
9
7
|
};
|
|
8
|
+
export type ProcessOptions = {
|
|
9
|
+
group?: string;
|
|
10
|
+
expanded?: boolean;
|
|
11
|
+
};
|
|
10
12
|
export type TerminalCallback = (error?: SpawnError, result?: SpawnResult) => undefined;
|
|
11
13
|
export declare const LineType: {
|
|
12
14
|
readonly stdout: 1;
|
|
@@ -24,7 +26,4 @@ export type ChildProcess = {
|
|
|
24
26
|
state: State;
|
|
25
27
|
lines: Line[];
|
|
26
28
|
expanded?: boolean;
|
|
27
|
-
header?: string;
|
|
28
|
-
showStatusBar?: boolean;
|
|
29
|
-
interactive?: boolean;
|
|
30
29
|
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
export const StoreContext = /*#__PURE__*/ createContext(null);
|
|
3
|
+
export function useStore() {
|
|
4
|
+
const store = useContext(StoreContext);
|
|
5
|
+
if (!store) {
|
|
6
|
+
throw new Error('useStore must be used within a StoreContext.Provider');
|
|
7
|
+
}
|
|
8
|
+
return store;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/StoreContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { ProcessStore } from './processStore.ts';\n\nexport const StoreContext = createContext<ProcessStore | null>(null);\n\nexport function useStore(): ProcessStore {\n const store = useContext(StoreContext);\n if (!store) {\n throw new Error('useStore must be used within a StoreContext.Provider');\n }\n return store;\n}\n"],"names":["createContext","useContext","StoreContext","useStore","store","Error"],"mappings":"AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,QAAQ;AAGlD,OAAO,MAAMC,6BAAeF,cAAmC,MAAM;AAErE,OAAO,SAASG;IACd,MAAMC,QAAQH,WAAWC;IACzB,IAAI,CAACE,OAAO;QACV,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOD;AACT"}
|
|
@@ -28,13 +28,9 @@ function _object_spread(target) {
|
|
|
28
28
|
}
|
|
29
29
|
import { DEFAULT_COLUMN_WIDTH } from '../constants.js';
|
|
30
30
|
import { LineType } from '../types.js';
|
|
31
|
-
class ProcessStore {
|
|
31
|
+
export class ProcessStore {
|
|
32
32
|
// Mutations - Ink handles render throttling at 30 FPS
|
|
33
33
|
addProcess(process) {
|
|
34
|
-
// Set header on first process that provides one
|
|
35
|
-
if (this.header === undefined && process.header !== undefined) {
|
|
36
|
-
this.header = process.header;
|
|
37
|
-
}
|
|
38
34
|
this.processes = [
|
|
39
35
|
...this.processes,
|
|
40
36
|
process
|
|
@@ -170,7 +166,7 @@ class ProcessStore {
|
|
|
170
166
|
l();
|
|
171
167
|
});
|
|
172
168
|
}
|
|
173
|
-
constructor(){
|
|
169
|
+
constructor(options = {}){
|
|
174
170
|
this.processes = [];
|
|
175
171
|
this.completedIds = []; // Track completion order
|
|
176
172
|
this.listeners = new Set();
|
|
@@ -182,6 +178,8 @@ class ProcessStore {
|
|
|
182
178
|
this.selectedErrorIndex = 0;
|
|
183
179
|
this.expandedId = null;
|
|
184
180
|
this.scrollOffset = 0;
|
|
181
|
+
this.showStatusBar = false;
|
|
182
|
+
this.isInteractive = false;
|
|
185
183
|
// useSyncExternalStore API
|
|
186
184
|
this.subscribe = (listener)=>{
|
|
187
185
|
this.listeners.add(listener);
|
|
@@ -216,15 +214,17 @@ class ProcessStore {
|
|
|
216
214
|
this.getSelectedErrorIndex = ()=>this.selectedErrorIndex;
|
|
217
215
|
this.getExpandedId = ()=>this.expandedId;
|
|
218
216
|
this.getScrollOffset = ()=>this.scrollOffset;
|
|
219
|
-
//
|
|
217
|
+
// Session-level getters (set at session creation, immutable)
|
|
220
218
|
this.getHeader = ()=>this.header;
|
|
221
|
-
|
|
222
|
-
this.
|
|
223
|
-
// Interactive mode if any process has interactive: true
|
|
224
|
-
this.getIsInteractive = ()=>this.processes.some((p)=>p.interactive === true);
|
|
219
|
+
this.getShowStatusBar = ()=>this.showStatusBar;
|
|
220
|
+
this.getIsInteractive = ()=>this.isInteractive;
|
|
225
221
|
this.isAllComplete = ()=>this.processes.length > 0 && this.processes.every((p)=>p.state !== 'running');
|
|
226
222
|
this.getShouldExit = ()=>this.shouldExit;
|
|
227
223
|
this.getExitCallback = ()=>this.exitCallback;
|
|
224
|
+
this.header = options.header;
|
|
225
|
+
var _options_showStatusBar;
|
|
226
|
+
this.showStatusBar = (_options_showStatusBar = options.showStatusBar) !== null && _options_showStatusBar !== void 0 ? _options_showStatusBar : false;
|
|
227
|
+
var _options_interactive;
|
|
228
|
+
this.isInteractive = (_options_interactive = options.interactive) !== null && _options_interactive !== void 0 ? _options_interactive : false;
|
|
228
229
|
}
|
|
229
|
-
}
|
|
230
|
-
export const processStore = new ProcessStore();
|
|
230
|
+
} // Note: No global singleton - session creates its own store instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import { DEFAULT_COLUMN_WIDTH } from '../constants.ts';\nimport type { ChildProcess, Line } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Listener = () => void;\ntype Mode = 'normal' | 'interactive' | '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 selectedIndex = 0;\n private selectedErrorIndex = 0;\n private expandedId: string | null = null;\n private scrollOffset = 0;\n\n // App-level display settings\n private header: string | undefined;\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 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 + p.lines.filter((l) => l.type === LineType.stderr).length, 0);\n };\n\n // UI state getters\n getMode = (): Mode => this.mode;\n getSelectedIndex = (): number => this.selectedIndex;\n getSelectedErrorIndex = (): number => this.selectedErrorIndex;\n getExpandedId = (): string | null => this.expandedId;\n getScrollOffset = (): number => this.scrollOffset;\n // Get header\n getHeader = (): string | undefined => this.header;\n // Show status bar only if any process sets showStatusBar: true (default: false)\n getShowStatusBar = (): boolean => this.processes.some((p) => p.showStatusBar === true);\n // Interactive mode if any process has interactive: true\n getIsInteractive = (): boolean => this.processes.some((p) => p.interactive === true);\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 // Set header on first process that provides one\n if (this.header === undefined && process.header !== undefined) {\n this.header = process.header;\n }\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 === 'interactive') {\n this.selectedIndex = 0;\n } else if (mode === 'errorList') {\n this.selectedErrorIndex = 0;\n }\n this.notify();\n }\n\n // Interactive mode navigation\n selectNext(): void {\n if (this.processes.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.processes.length;\n this.notify();\n }\n }\n\n selectPrev(): void {\n if (this.processes.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.processes.length) % this.processes.length;\n this.notify();\n }\n }\n\n getSelectedProcess(): ChildProcess | undefined {\n return this.processes[this.selectedIndex];\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 // 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 process = this.getProcess(this.expandedId);\n if (!process) return;\n\n const maxOffset = Math.max(0, process.lines.length - 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 // 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.selectedIndex = 0;\n this.selectedErrorIndex = 0;\n this.expandedId = null;\n this.scrollOffset = 0;\n this.header = undefined;\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":["DEFAULT_COLUMN_WIDTH","LineType","ProcessStore","addProcess","process","header","undefined","processes","notify","updateProcess","id","update","oldProcess","find","p","wasRunning","state","isNowComplete","map","completedIds","includes","appendLines","newLines","lines","concat","getProcess","setMode","mode","selectedIndex","selectedErrorIndex","selectNext","length","selectPrev","getSelectedProcess","selectNextError","failed","getFailedProcesses","selectPrevError","getSelectedError","toggleExpand","selected","expandedId","scrollOffset","collapse","scrollDown","maxVisible","maxOffset","Math","max","scrollUp","signalExit","callback","shouldExit","exitCallback","reset","listeners","forEach","l","Set","subscribe","listener","add","delete","getSnapshot","getRunningProcesses","filter","getCompletedProcesses","getRunningCount","getMaxGroupLength","group","title","getDoneCount","getErrorCount","getErrorLineCount","reduce","total","type","stderr","getMode","getSelectedIndex","getSelectedErrorIndex","getExpandedId","getScrollOffset","getHeader","getShowStatusBar","some","showStatusBar","getIsInteractive","interactive","isAllComplete","every","getShouldExit","getExitCallback","processStore"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import { 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' | 'errorList' | 'errorDetail';\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 selectedErrorIndex = 0;\n private expandedId: string | null = null;\n private scrollOffset = 0;\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) => 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 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 + p.lines.filter((l) => l.type === LineType.stderr).length, 0);\n };\n\n // UI state getters\n getMode = (): Mode => this.mode;\n getSelectedIndex = (): number => this.selectedIndex;\n getSelectedErrorIndex = (): number => this.selectedErrorIndex;\n getExpandedId = (): string | null => this.expandedId;\n getScrollOffset = (): number => this.scrollOffset;\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 = 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 === 'interactive') {\n this.selectedIndex = 0;\n } else if (mode === 'errorList') {\n this.selectedErrorIndex = 0;\n }\n this.notify();\n }\n\n // Interactive mode navigation\n selectNext(): void {\n if (this.processes.length > 0) {\n this.selectedIndex = (this.selectedIndex + 1) % this.processes.length;\n this.notify();\n }\n }\n\n selectPrev(): void {\n if (this.processes.length > 0) {\n this.selectedIndex = (this.selectedIndex - 1 + this.processes.length) % this.processes.length;\n this.notify();\n }\n }\n\n getSelectedProcess(): ChildProcess | undefined {\n return this.processes[this.selectedIndex];\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 // 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 process = this.getProcess(this.expandedId);\n if (!process) return;\n\n const maxOffset = Math.max(0, process.lines.length - 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 // 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.selectedIndex = 0;\n this.selectedErrorIndex = 0;\n this.expandedId = null;\n this.scrollOffset = 0;\n this.header = undefined;\n }\n\n private notify(): void {\n this.listeners.forEach((l) => {\n l();\n });\n }\n}\n\n// Note: No global singleton - session creates its own store instance\n"],"names":["DEFAULT_COLUMN_WIDTH","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","selectedIndex","selectedErrorIndex","selectNext","length","selectPrev","getSelectedProcess","selectNextError","failed","getFailedProcesses","selectPrevError","getSelectedError","toggleExpand","selected","expandedId","scrollOffset","collapse","scrollDown","maxVisible","maxOffset","Math","max","scrollUp","signalExit","callback","shouldExit","exitCallback","reset","header","undefined","listeners","forEach","l","options","Set","showStatusBar","isInteractive","subscribe","listener","add","delete","getSnapshot","getRunningProcesses","filter","getCompletedProcesses","getRunningCount","getMaxGroupLength","group","title","getDoneCount","getErrorCount","getErrorLineCount","reduce","total","type","stderr","getMode","getSelectedIndex","getSelectedErrorIndex","getExpandedId","getScrollOffset","getHeader","getShowStatusBar","getIsInteractive","isAllComplete","every","getShouldExit","getExitCallback","interactive"],"mappings":"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"}
|
package/dist/esm/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\nexport type
|
|
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) => undefined;\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// 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 expanded?: boolean;\n};\n"],"names":["LineType","stdout","stderr"],"mappings":"AAmBA,OAAO,MAAMA,WAAW;IACtBC,QAAQ;IACRC,QAAQ;AACV,EAAW"}
|
package/package.json
CHANGED
package/dist/cjs/createApp.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
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 createApp;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _jsxruntime = require("react/jsx-runtime");
|
|
12
|
-
var _ink = require("ink");
|
|
13
|
-
var _Appts = /*#__PURE__*/ _interop_require_default(require("./components/App.js"));
|
|
14
|
-
var _constantsts = require("./constants.js");
|
|
15
|
-
var _processStorets = require("./state/processStore.js");
|
|
16
|
-
function _interop_require_default(obj) {
|
|
17
|
-
return obj && obj.__esModule ? obj : {
|
|
18
|
-
default: obj
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function createApp() {
|
|
22
|
-
var refCount = 0;
|
|
23
|
-
var inkApp = null;
|
|
24
|
-
return {
|
|
25
|
-
retain: function retain() {
|
|
26
|
-
if (++refCount > 1) return _processStorets.processStore;
|
|
27
|
-
// Render once - React handles all subsequent updates via useSyncExternalStore
|
|
28
|
-
inkApp = (0, _ink.render)(/*#__PURE__*/ (0, _jsxruntime.jsx)(_Appts.default, {}), {
|
|
29
|
-
incrementalRendering: false,
|
|
30
|
-
maxFps: _constantsts.DEFAULT_MAX_FPS
|
|
31
|
-
});
|
|
32
|
-
return _processStorets.processStore;
|
|
33
|
-
},
|
|
34
|
-
release: function release(callback) {
|
|
35
|
-
if (--refCount > 0) {
|
|
36
|
-
callback();
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
if (!inkApp) throw new Error('Expecting inkApp');
|
|
40
|
-
// Signal exit to React component
|
|
41
|
-
_processStorets.processStore.signalExit(function() {
|
|
42
|
-
_processStorets.processStore.reset();
|
|
43
|
-
process.stdout.write('\x1b[?25h'); // show cursor
|
|
44
|
-
callback();
|
|
45
|
-
});
|
|
46
|
-
// Wait for Ink to finish, then call the callback
|
|
47
|
-
inkApp.waitUntilExit().then(function() {
|
|
48
|
-
var cb = _processStorets.processStore.getExitCallback();
|
|
49
|
-
cb === null || cb === void 0 ? void 0 : cb();
|
|
50
|
-
}).catch(function() {
|
|
51
|
-
var cb = _processStorets.processStore.getExitCallback();
|
|
52
|
-
cb === null || cb === void 0 ? void 0 : cb();
|
|
53
|
-
});
|
|
54
|
-
inkApp = null;
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/* 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/createApp.tsx"],"sourcesContent":["import { render } from 'ink';\nimport App from './components/App.ts';\nimport { DEFAULT_MAX_FPS } from './constants.ts';\nimport { type ProcessStore, processStore } from './state/processStore.ts';\n\nexport type ReleaseCallback = () => void;\n\nexport default function createApp() {\n let refCount = 0;\n let inkApp: ReturnType<typeof render> | null = null;\n\n return {\n retain(): ProcessStore {\n if (++refCount > 1) return processStore;\n\n // Render once - React handles all subsequent updates via useSyncExternalStore\n inkApp = render(<App />, {\n incrementalRendering: false,\n maxFps: DEFAULT_MAX_FPS,\n });\n return processStore;\n },\n\n release(callback: ReleaseCallback): void {\n if (--refCount > 0) {\n callback();\n return;\n }\n if (!inkApp) throw new Error('Expecting inkApp');\n\n // Signal exit to React component\n processStore.signalExit(() => {\n processStore.reset();\n process.stdout.write('\\x1b[?25h'); // show cursor\n callback();\n });\n\n // Wait for Ink to finish, then call the callback\n inkApp\n .waitUntilExit()\n .then(() => {\n const cb = processStore.getExitCallback();\n cb?.();\n })\n .catch(() => {\n const cb = processStore.getExitCallback();\n cb?.();\n });\n\n inkApp = null;\n },\n };\n}\n"],"names":["createApp","refCount","inkApp","retain","processStore","render","App","incrementalRendering","maxFps","DEFAULT_MAX_FPS","release","callback","Error","signalExit","reset","process","stdout","write","waitUntilExit","then","cb","getExitCallback","catch"],"mappings":";;;;+BAOA;;;eAAwBA;;;;mBAPD;4DACP;2BACgB;8BACgB;;;;;;AAIjC,SAASA;IACtB,IAAIC,WAAW;IACf,IAAIC,SAA2C;IAE/C,OAAO;QACLC,QAAAA,SAAAA;YACE,IAAI,EAAEF,WAAW,GAAG,OAAOG,4BAAY;YAEvC,8EAA8E;YAC9EF,SAASG,IAAAA,WAAM,gBAAC,qBAACC,cAAG,OAAK;gBACvBC,sBAAsB;gBACtBC,QAAQC,4BAAe;YACzB;YACA,OAAOL,4BAAY;QACrB;QAEAM,SAAAA,SAAAA,QAAQC,QAAyB;YAC/B,IAAI,EAAEV,WAAW,GAAG;gBAClBU;gBACA;YACF;YACA,IAAI,CAACT,QAAQ,MAAM,IAAIU,MAAM;YAE7B,iCAAiC;YACjCR,4BAAY,CAACS,UAAU,CAAC;gBACtBT,4BAAY,CAACU,KAAK;gBAClBC,QAAQC,MAAM,CAACC,KAAK,CAAC,cAAc,cAAc;gBACjDN;YACF;YAEA,iDAAiD;YACjDT,OACGgB,aAAa,GACbC,IAAI,CAAC;gBACJ,IAAMC,KAAKhB,4BAAY,CAACiB,eAAe;gBACvCD,eAAAA,yBAAAA;YACF,GACCE,KAAK,CAAC;gBACL,IAAMF,KAAKhB,4BAAY,CAACiB,eAAe;gBACvCD,eAAAA,yBAAAA;YACF;YAEFlB,SAAS;QACX;IACF;AACF"}
|
|
@@ -1,75 +0,0 @@
|
|
|
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 spawnTerminal;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
12
|
-
if (typeof WeakMap !== "function") return null;
|
|
13
|
-
var cacheBabelInterop = new WeakMap();
|
|
14
|
-
var cacheNodeInterop = new WeakMap();
|
|
15
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
16
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
17
|
-
})(nodeInterop);
|
|
18
|
-
}
|
|
19
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
20
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
21
|
-
return obj;
|
|
22
|
-
}
|
|
23
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
24
|
-
return {
|
|
25
|
-
default: obj
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
29
|
-
if (cache && cache.has(obj)) {
|
|
30
|
-
return cache.get(obj);
|
|
31
|
-
}
|
|
32
|
-
var newObj = {
|
|
33
|
-
__proto__: null
|
|
34
|
-
};
|
|
35
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
36
|
-
for(var key in obj){
|
|
37
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
38
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
39
|
-
if (desc && (desc.get || desc.set)) {
|
|
40
|
-
Object.defineProperty(newObj, key, desc);
|
|
41
|
-
} else {
|
|
42
|
-
newObj[key] = obj[key];
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
newObj.default = obj;
|
|
47
|
-
if (cache) {
|
|
48
|
-
cache.set(obj, newObj);
|
|
49
|
-
}
|
|
50
|
-
return newObj;
|
|
51
|
-
}
|
|
52
|
-
function worker(command, args, spawnOptions, options, callback) {
|
|
53
|
-
Promise.resolve().then(function() {
|
|
54
|
-
return /*#__PURE__*/ _interop_require_wildcard(require("./worker.js"));
|
|
55
|
-
}).then(function(fn) {
|
|
56
|
-
fn.default(command, args, spawnOptions, options, callback);
|
|
57
|
-
}).catch(callback);
|
|
58
|
-
}
|
|
59
|
-
function spawnTerminal(command, args, spawnOptions, options, callback) {
|
|
60
|
-
if (spawnOptions.stdio === 'inherit' && spawnOptions.encoding) {
|
|
61
|
-
throw new Error("Options 'stdio: inherit' and 'encoding' are mutually exclusive. Use 'stdio: inherit' to display output, or 'encoding' to collect output.");
|
|
62
|
-
}
|
|
63
|
-
if (typeof options === 'function') {
|
|
64
|
-
callback = options;
|
|
65
|
-
options = {};
|
|
66
|
-
}
|
|
67
|
-
options = options || {};
|
|
68
|
-
if (typeof callback === 'function') return worker(command, args, spawnOptions, options, callback);
|
|
69
|
-
return new Promise(function(resolve, reject) {
|
|
70
|
-
return worker(command, args, spawnOptions, options, function(err, result) {
|
|
71
|
-
err ? reject(err) : resolve(result);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
/* 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/spawnTerminal.ts"],"sourcesContent":["import type { SpawnOptions, SpawnResult, TerminalCallback, TerminalOptions } from './types.ts';\n\nfunction worker(command: string, args: string[], spawnOptions: SpawnOptions, options: TerminalOptions, callback: TerminalCallback): undefined {\n import('./worker.js')\n .then((fn) => {\n fn.default(command, args, spawnOptions, options, callback);\n })\n .catch(callback);\n}\n\nexport default function spawnTerminal(command: string, args: string[], spawnOptions: SpawnOptions, options?: TerminalOptions | TerminalCallback, callback?: TerminalCallback): undefined | Promise<SpawnResult> {\n if (spawnOptions.stdio === 'inherit' && spawnOptions.encoding) {\n throw new Error(\"Options 'stdio: inherit' and 'encoding' are mutually exclusive. Use 'stdio: inherit' to display output, or 'encoding' to collect output.\");\n }\n\n if (typeof options === 'function') {\n callback = options as TerminalCallback;\n options = {};\n }\n options = options || {};\n\n if (typeof callback === 'function') return worker(command, args, spawnOptions, options, callback as TerminalCallback);\n return new Promise((resolve, reject) =>\n worker(command, args, spawnOptions, options, (err, result) => {\n err ? reject(err) : resolve(result);\n })\n );\n}\n"],"names":["spawnTerminal","worker","command","args","spawnOptions","options","callback","then","fn","default","catch","stdio","encoding","Error","Promise","resolve","reject","err","result"],"mappings":";;;;+BAUA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AARxB,SAASC,OAAOC,OAAe,EAAEC,IAAc,EAAEC,YAA0B,EAAEC,OAAwB,EAAEC,QAA0B;IAC/H;uDAAA,QAAO;OACJC,IAAI,CAAC,SAACC;QACLA,GAAGC,OAAO,CAACP,SAASC,MAAMC,cAAcC,SAASC;IACnD,GACCI,KAAK,CAACJ;AACX;AAEe,SAASN,cAAcE,OAAe,EAAEC,IAAc,EAAEC,YAA0B,EAAEC,OAA4C,EAAEC,QAA2B;IAC1K,IAAIF,aAAaO,KAAK,KAAK,aAAaP,aAAaQ,QAAQ,EAAE;QAC7D,MAAM,IAAIC,MAAM;IAClB;IAEA,IAAI,OAAOR,YAAY,YAAY;QACjCC,WAAWD;QACXA,UAAU,CAAC;IACb;IACAA,UAAUA,WAAW,CAAC;IAEtB,IAAI,OAAOC,aAAa,YAAY,OAAOL,OAAOC,SAASC,MAAMC,cAAcC,SAASC;IACxF,OAAO,IAAIQ,QAAQ,SAACC,SAASC;eAC3Bf,OAAOC,SAASC,MAAMC,cAAcC,SAAS,SAACY,KAAKC;YACjDD,MAAMD,OAAOC,OAAOF,QAAQG;QAC9B;;AAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import type { SpawnOptions, SpawnResult, TerminalCallback, TerminalOptions } from './types.js';
|
|
2
|
-
export default function spawnTerminal(command: string, args: string[], spawnOptions: SpawnOptions, options?: TerminalOptions | TerminalCallback, callback?: TerminalCallback): undefined | Promise<SpawnResult>;
|
package/dist/cjs/src/worker.d.ts
DELETED
package/dist/cjs/worker.js
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
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 spawnTerminal;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _crossspawncb = /*#__PURE__*/ _interop_require_wildcard(require("cross-spawn-cb"));
|
|
12
|
-
var _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
|
|
13
|
-
var _onone = /*#__PURE__*/ _interop_require_default(require("on-one"));
|
|
14
|
-
var _queuecb = /*#__PURE__*/ _interop_require_default(require("queue-cb"));
|
|
15
|
-
var _createAppts = /*#__PURE__*/ _interop_require_default(require("./createApp.js"));
|
|
16
|
-
var _addLinests = /*#__PURE__*/ _interop_require_default(require("./lib/addLines.js"));
|
|
17
|
-
var _concatWritablets = /*#__PURE__*/ _interop_require_default(require("./lib/concatWritable.js"));
|
|
18
|
-
var _formatArgumentsts = /*#__PURE__*/ _interop_require_default(require("./lib/formatArguments.js"));
|
|
19
|
-
var _typests = require("./types.js");
|
|
20
|
-
function _define_property(obj, key, value) {
|
|
21
|
-
if (key in obj) {
|
|
22
|
-
Object.defineProperty(obj, key, {
|
|
23
|
-
value: value,
|
|
24
|
-
enumerable: true,
|
|
25
|
-
configurable: true,
|
|
26
|
-
writable: true
|
|
27
|
-
});
|
|
28
|
-
} else {
|
|
29
|
-
obj[key] = value;
|
|
30
|
-
}
|
|
31
|
-
return obj;
|
|
32
|
-
}
|
|
33
|
-
function _interop_require_default(obj) {
|
|
34
|
-
return obj && obj.__esModule ? obj : {
|
|
35
|
-
default: obj
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
39
|
-
if (typeof WeakMap !== "function") return null;
|
|
40
|
-
var cacheBabelInterop = new WeakMap();
|
|
41
|
-
var cacheNodeInterop = new WeakMap();
|
|
42
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
43
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
44
|
-
})(nodeInterop);
|
|
45
|
-
}
|
|
46
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
47
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
48
|
-
return obj;
|
|
49
|
-
}
|
|
50
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
51
|
-
return {
|
|
52
|
-
default: obj
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
56
|
-
if (cache && cache.has(obj)) {
|
|
57
|
-
return cache.get(obj);
|
|
58
|
-
}
|
|
59
|
-
var newObj = {
|
|
60
|
-
__proto__: null
|
|
61
|
-
};
|
|
62
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
63
|
-
for(var key in obj){
|
|
64
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
65
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
66
|
-
if (desc && (desc.get || desc.set)) {
|
|
67
|
-
Object.defineProperty(newObj, key, desc);
|
|
68
|
-
} else {
|
|
69
|
-
newObj[key] = obj[key];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
newObj.default = obj;
|
|
74
|
-
if (cache) {
|
|
75
|
-
cache.set(obj, newObj);
|
|
76
|
-
}
|
|
77
|
-
return newObj;
|
|
78
|
-
}
|
|
79
|
-
function _object_spread(target) {
|
|
80
|
-
for(var i = 1; i < arguments.length; i++){
|
|
81
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
82
|
-
var ownKeys = Object.keys(source);
|
|
83
|
-
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
84
|
-
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
85
|
-
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
ownKeys.forEach(function(key) {
|
|
89
|
-
_define_property(target, key, source[key]);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
return target;
|
|
93
|
-
}
|
|
94
|
-
function _object_without_properties(source, excluded) {
|
|
95
|
-
if (source == null) return {};
|
|
96
|
-
var target = _object_without_properties_loose(source, excluded);
|
|
97
|
-
var key, i;
|
|
98
|
-
if (Object.getOwnPropertySymbols) {
|
|
99
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
100
|
-
for(i = 0; i < sourceSymbolKeys.length; i++){
|
|
101
|
-
key = sourceSymbolKeys[i];
|
|
102
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
103
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
104
|
-
target[key] = source[key];
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return target;
|
|
108
|
-
}
|
|
109
|
-
function _object_without_properties_loose(source, excluded) {
|
|
110
|
-
if (source == null) return {};
|
|
111
|
-
var target = {};
|
|
112
|
-
var sourceKeys = Object.keys(source);
|
|
113
|
-
var key, i;
|
|
114
|
-
for(i = 0; i < sourceKeys.length; i++){
|
|
115
|
-
key = sourceKeys[i];
|
|
116
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
117
|
-
target[key] = source[key];
|
|
118
|
-
}
|
|
119
|
-
return target;
|
|
120
|
-
}
|
|
121
|
-
var terminal = (0, _createAppts.default)();
|
|
122
|
-
function spawnTerminal(command, args, spawnOptions, options, callback) {
|
|
123
|
-
var encoding = spawnOptions.encoding, stdio = spawnOptions.stdio, csOptions = _object_without_properties(spawnOptions, [
|
|
124
|
-
"encoding",
|
|
125
|
-
"stdio"
|
|
126
|
-
]);
|
|
127
|
-
if (stdio === 'inherit') {
|
|
128
|
-
var store = terminal.retain();
|
|
129
|
-
var id = _crypto.default.randomUUID();
|
|
130
|
-
store.addProcess(_object_spread({
|
|
131
|
-
id: id,
|
|
132
|
-
title: [
|
|
133
|
-
command
|
|
134
|
-
].concat((0, _formatArgumentsts.default)(args)).join(' '),
|
|
135
|
-
state: 'running',
|
|
136
|
-
lines: []
|
|
137
|
-
}, options));
|
|
138
|
-
var cp = (0, _crossspawncb.crossSpawn)(command, args, csOptions);
|
|
139
|
-
var outputs = {
|
|
140
|
-
stdout: null,
|
|
141
|
-
stderr: null
|
|
142
|
-
};
|
|
143
|
-
var queue = new _queuecb.default();
|
|
144
|
-
if (cp.stdout) {
|
|
145
|
-
outputs.stdout = (0, _addLinests.default)(function(lines) {
|
|
146
|
-
store.appendLines(id, lines.map(function(text) {
|
|
147
|
-
return {
|
|
148
|
-
type: _typests.LineType.stdout,
|
|
149
|
-
text: text
|
|
150
|
-
};
|
|
151
|
-
}));
|
|
152
|
-
});
|
|
153
|
-
queue.defer(_onone.default.bind(null, cp.stdout.pipe(outputs.stdout), [
|
|
154
|
-
'error',
|
|
155
|
-
'end',
|
|
156
|
-
'close',
|
|
157
|
-
'finish'
|
|
158
|
-
]));
|
|
159
|
-
}
|
|
160
|
-
if (cp.stderr) {
|
|
161
|
-
outputs.stderr = (0, _addLinests.default)(function(lines) {
|
|
162
|
-
store.appendLines(id, lines.map(function(text) {
|
|
163
|
-
return {
|
|
164
|
-
type: _typests.LineType.stderr,
|
|
165
|
-
text: text
|
|
166
|
-
};
|
|
167
|
-
}));
|
|
168
|
-
});
|
|
169
|
-
queue.defer(_onone.default.bind(null, cp.stderr.pipe(outputs.stderr), [
|
|
170
|
-
'error',
|
|
171
|
-
'end',
|
|
172
|
-
'close',
|
|
173
|
-
'finish'
|
|
174
|
-
]));
|
|
175
|
-
}
|
|
176
|
-
queue.defer(_crossspawncb.default.worker.bind(null, cp, csOptions));
|
|
177
|
-
queue.await(function(err) {
|
|
178
|
-
var res = err ? err : {};
|
|
179
|
-
res.stdout = outputs.stdout ? outputs.stdout.output : null;
|
|
180
|
-
res.stderr = outputs.stderr ? outputs.stderr.output : null;
|
|
181
|
-
res.output = [
|
|
182
|
-
res.stdout,
|
|
183
|
-
res.stderr,
|
|
184
|
-
null
|
|
185
|
-
];
|
|
186
|
-
store.updateProcess(id, {
|
|
187
|
-
state: err ? 'error' : 'success'
|
|
188
|
-
});
|
|
189
|
-
terminal.release(function() {
|
|
190
|
-
err ? callback(err) : callback(null, res);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
} else {
|
|
194
|
-
var cp1 = (0, _crossspawncb.crossSpawn)(command, args, csOptions);
|
|
195
|
-
var outputs1 = {
|
|
196
|
-
stdout: null,
|
|
197
|
-
stderr: null
|
|
198
|
-
};
|
|
199
|
-
var queue1 = new _queuecb.default();
|
|
200
|
-
if (cp1.stdout) {
|
|
201
|
-
outputs1.stdout = (0, _concatWritablets.default)(function(output) {
|
|
202
|
-
outputs1.stdout.output = output.toString(encoding || 'utf8');
|
|
203
|
-
});
|
|
204
|
-
queue1.defer(_onone.default.bind(null, cp1.stdout.pipe(outputs1.stdout), [
|
|
205
|
-
'error',
|
|
206
|
-
'end',
|
|
207
|
-
'close',
|
|
208
|
-
'finish'
|
|
209
|
-
]));
|
|
210
|
-
}
|
|
211
|
-
if (cp1.stderr) {
|
|
212
|
-
outputs1.stderr = (0, _concatWritablets.default)(function(output) {
|
|
213
|
-
outputs1.stderr.output = output.toString(encoding || 'utf8');
|
|
214
|
-
});
|
|
215
|
-
queue1.defer(_onone.default.bind(null, cp1.stderr.pipe(outputs1.stderr), [
|
|
216
|
-
'error',
|
|
217
|
-
'end',
|
|
218
|
-
'close',
|
|
219
|
-
'finish'
|
|
220
|
-
]));
|
|
221
|
-
}
|
|
222
|
-
queue1.defer(_crossspawncb.default.worker.bind(null, cp1, csOptions));
|
|
223
|
-
queue1.await(function(err) {
|
|
224
|
-
var res = err ? err : {};
|
|
225
|
-
res.stdout = outputs1.stdout ? outputs1.stdout.output : null;
|
|
226
|
-
res.stderr = outputs1.stderr ? outputs1.stderr.output : null;
|
|
227
|
-
res.output = [
|
|
228
|
-
res.stdout,
|
|
229
|
-
res.stderr,
|
|
230
|
-
null
|
|
231
|
-
];
|
|
232
|
-
err ? callback(err) : callback(null, res);
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
/* 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; }
|