@push.rocks/smartshell 3.0.6 → 3.2.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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.shellenv.d.ts +29 -0
- package/dist_ts/classes.shellenv.js +82 -0
- package/dist_ts/classes.shelllog.d.ts +18 -0
- package/dist_ts/classes.shelllog.js +37 -0
- package/dist_ts/classes.smartexecution.d.ts +20 -0
- package/dist_ts/classes.smartexecution.js +42 -0
- package/dist_ts/classes.smartshell.d.ts +36 -0
- package/dist_ts/classes.smartshell.js +138 -0
- package/dist_ts/index.d.ts +3 -2
- package/dist_ts/index.js +4 -3
- package/dist_ts/plugins.d.ts +5 -0
- package/dist_ts/plugins.js +6 -0
- package/package.json +7 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/{smartshell.classes.shelllog.ts → classes.shelllog.ts} +1 -1
- package/ts/classes.smartexecution.ts +55 -0
- package/ts/{smartshell.classes.smartshell.ts → classes.smartshell.ts} +4 -4
- package/ts/index.ts +3 -2
- /package/ts/{smartshell.classes.shellenv.ts → classes.shellenv.ts} +0 -0
- /package/ts/{smartshell.plugins.ts → plugins.ts} +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartshell',
|
|
6
|
-
version: '3.0
|
|
6
|
+
version: '3.2.0',
|
|
7
7
|
description: 'A library for executing shell commands using promises.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHdEQUF3RDtDQUN0RSxDQUFBIn0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type TExecutor = 'sh' | 'bash';
|
|
2
|
+
export interface IShellEnvContructorOptions {
|
|
3
|
+
executor: TExecutor;
|
|
4
|
+
sourceFilePaths?: string[];
|
|
5
|
+
pathDirectories?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class ShellEnv {
|
|
8
|
+
executor: TExecutor;
|
|
9
|
+
sourceFileArray: string[];
|
|
10
|
+
pathDirArray: string[];
|
|
11
|
+
/**
|
|
12
|
+
* constructor for the shellenv
|
|
13
|
+
*/
|
|
14
|
+
constructor(optionsArg: IShellEnvContructorOptions);
|
|
15
|
+
/**
|
|
16
|
+
* imports path into the shell from env if available and returns it with
|
|
17
|
+
*/
|
|
18
|
+
private _setPath;
|
|
19
|
+
/**
|
|
20
|
+
* add files that are going to be sourced when running a command
|
|
21
|
+
* @param sourceFilePathsArray
|
|
22
|
+
*/
|
|
23
|
+
addSourceFiles(sourceFilePathsArray: string[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* cleans the source files array
|
|
26
|
+
*/
|
|
27
|
+
cleanSourceFiles(): void;
|
|
28
|
+
createEnvExecString(commandArg: string): string;
|
|
29
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export class ShellEnv {
|
|
2
|
+
/**
|
|
3
|
+
* constructor for the shellenv
|
|
4
|
+
*/
|
|
5
|
+
constructor(optionsArg) {
|
|
6
|
+
this.sourceFileArray = [];
|
|
7
|
+
this.pathDirArray = [];
|
|
8
|
+
this.executor = optionsArg.executor;
|
|
9
|
+
// add sourcefiles
|
|
10
|
+
if (optionsArg.sourceFilePaths) {
|
|
11
|
+
this.sourceFileArray = this.sourceFileArray.concat(optionsArg.sourceFilePaths);
|
|
12
|
+
}
|
|
13
|
+
// add pathDirectories
|
|
14
|
+
if (optionsArg.pathDirectories) {
|
|
15
|
+
this.pathDirArray = this.pathDirArray.concat(optionsArg.pathDirectories);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* imports path into the shell from env if available and returns it with
|
|
20
|
+
*/
|
|
21
|
+
_setPath(commandStringArg) {
|
|
22
|
+
let commandResult = commandStringArg;
|
|
23
|
+
let commandPaths = [];
|
|
24
|
+
commandPaths = commandPaths.concat(process.env.PATH.split(':'));
|
|
25
|
+
if (process.env.SMARTSHELL_PATH) {
|
|
26
|
+
commandPaths = commandPaths.concat(process.env.SMARTSHELL_PATH.split(':'));
|
|
27
|
+
}
|
|
28
|
+
// lets filter for unwanted paths
|
|
29
|
+
// Windows WSL
|
|
30
|
+
commandPaths = commandPaths.filter((commandPathArg) => {
|
|
31
|
+
const filterResult = !commandPathArg.startsWith('/mnt/c/') &&
|
|
32
|
+
!commandPathArg.startsWith('Files/1E') &&
|
|
33
|
+
!commandPathArg.includes(' ');
|
|
34
|
+
if (!filterResult) {
|
|
35
|
+
// console.log(`${commandPathArg} will be filtered!`);
|
|
36
|
+
}
|
|
37
|
+
return filterResult;
|
|
38
|
+
});
|
|
39
|
+
commandResult = `PATH=${commandPaths.join(':')} && ${commandStringArg}`;
|
|
40
|
+
return commandResult;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* add files that are going to be sourced when running a command
|
|
44
|
+
* @param sourceFilePathsArray
|
|
45
|
+
*/
|
|
46
|
+
addSourceFiles(sourceFilePathsArray) {
|
|
47
|
+
for (let sourceFilePath of sourceFilePathsArray) {
|
|
48
|
+
this.sourceFileArray.push(sourceFilePath);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* cleans the source files array
|
|
53
|
+
*/
|
|
54
|
+
cleanSourceFiles() {
|
|
55
|
+
this.sourceFileArray = [];
|
|
56
|
+
}
|
|
57
|
+
createEnvExecString(commandArg) {
|
|
58
|
+
let commandResult = '';
|
|
59
|
+
let sourceString = '';
|
|
60
|
+
// deal with sourcestring
|
|
61
|
+
for (const sourceFilePath of this.sourceFileArray) {
|
|
62
|
+
sourceString = sourceString + `source ${sourceFilePath} && `;
|
|
63
|
+
}
|
|
64
|
+
// deal with available path
|
|
65
|
+
let pathString = 'PATH=$PATH';
|
|
66
|
+
for (const pathDir of this.pathDirArray) {
|
|
67
|
+
pathString += `:${pathDir}`;
|
|
68
|
+
}
|
|
69
|
+
pathString += ` && `;
|
|
70
|
+
switch (this.executor) {
|
|
71
|
+
case 'bash':
|
|
72
|
+
commandResult = `bash -c '${pathString}${sourceString}${commandArg}'`;
|
|
73
|
+
break;
|
|
74
|
+
case 'sh':
|
|
75
|
+
commandResult = `${pathString}${sourceString}${commandArg}`;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
commandResult = this._setPath(commandResult);
|
|
79
|
+
return commandResult;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zaGVsbGVudi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc2hlbGxlbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxPQUFPLFFBQVE7SUFLbkI7O09BRUc7SUFDSCxZQUFZLFVBQXNDO1FBTmxELG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBQy9CLGlCQUFZLEdBQWEsRUFBRSxDQUFDO1FBTTFCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUVwQyxrQkFBa0I7UUFDbEIsSUFBSSxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssUUFBUSxDQUFDLGdCQUF3QjtRQUN2QyxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztRQUNyQyxJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7UUFDaEMsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsY0FBYztRQUNkLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxZQUFZLEdBQ2hCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3JDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQ3RDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xCLHNEQUFzRDtZQUN4RCxDQUFDO1lBQ0QsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxhQUFhLEdBQUcsUUFBUSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLGdCQUFnQixFQUFFLENBQUM7UUFDeEUsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxvQkFBOEI7UUFDM0MsS0FBSyxJQUFJLGNBQWMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sbUJBQW1CLENBQUMsVUFBa0I7UUFDM0MsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUV0Qix5QkFBeUI7UUFDekIsS0FBSyxNQUFNLGNBQWMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEQsWUFBWSxHQUFHLFlBQVksR0FBRyxVQUFVLGNBQWMsTUFBTSxDQUFDO1FBQy9ELENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDO1FBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLFVBQVUsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCxVQUFVLElBQUksTUFBTSxDQUFDO1FBRXJCLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLEtBQUssTUFBTTtnQkFDVCxhQUFhLEdBQUcsWUFBWSxVQUFVLEdBQUcsWUFBWSxHQUFHLFVBQVUsR0FBRyxDQUFDO2dCQUN0RSxNQUFNO1lBQ1IsS0FBSyxJQUFJO2dCQUNQLGFBQWEsR0FBRyxHQUFHLFVBQVUsR0FBRyxZQUFZLEdBQUcsVUFBVSxFQUFFLENBQUM7Z0JBQzVELE1BQU07UUFDVixDQUFDO1FBQ0QsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* a log handler for spawned logs
|
|
3
|
+
* making sure the process doesn't run out of memory
|
|
4
|
+
*/
|
|
5
|
+
export declare class ShellLog {
|
|
6
|
+
logStore: Buffer;
|
|
7
|
+
/**
|
|
8
|
+
* log data to console
|
|
9
|
+
* @param dataArg
|
|
10
|
+
*/
|
|
11
|
+
writeToConsole(dataArg: string | Buffer): void;
|
|
12
|
+
/**
|
|
13
|
+
* add data to Buffer for later consumption
|
|
14
|
+
* @param dataArg
|
|
15
|
+
*/
|
|
16
|
+
addToBuffer(dataArg: string | Buffer): void;
|
|
17
|
+
logAndAdd(dataArg: string | Buffer): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* a log handler for spawned logs
|
|
4
|
+
* making sure the process doesn't run out of memory
|
|
5
|
+
*/
|
|
6
|
+
export class ShellLog {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.logStore = Buffer.from('');
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* log data to console
|
|
12
|
+
* @param dataArg
|
|
13
|
+
*/
|
|
14
|
+
writeToConsole(dataArg) {
|
|
15
|
+
// make sure we have the data as string
|
|
16
|
+
process.stdout.write(dataArg);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* add data to Buffer for later consumption
|
|
20
|
+
* @param dataArg
|
|
21
|
+
*/
|
|
22
|
+
addToBuffer(dataArg) {
|
|
23
|
+
// make sure we have the data as Buffer
|
|
24
|
+
const dataBuffer = (() => {
|
|
25
|
+
if (!Buffer.isBuffer(dataArg)) {
|
|
26
|
+
return Buffer.from(dataArg);
|
|
27
|
+
}
|
|
28
|
+
return dataArg;
|
|
29
|
+
})();
|
|
30
|
+
this.logStore = Buffer.concat([this.logStore, dataBuffer]);
|
|
31
|
+
}
|
|
32
|
+
logAndAdd(dataArg) {
|
|
33
|
+
this.writeToConsole(dataArg);
|
|
34
|
+
this.addToBuffer(dataArg);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zaGVsbGxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc2hlbGxsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFBckI7UUFDUyxhQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQThCcEMsQ0FBQztJQTVCQzs7O09BR0c7SUFDSSxjQUFjLENBQUMsT0FBd0I7UUFDNUMsdUNBQXVDO1FBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxXQUFXLENBQUMsT0FBd0I7UUFDekMsdUNBQXVDO1FBQ3ZDLE1BQU0sVUFBVSxHQUFXLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sU0FBUyxDQUFDLE9BQXdCO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Smartshell, type IExecResultStreaming } from './classes.smartshell.js';
|
|
2
|
+
export interface IDeferred<T> {
|
|
3
|
+
resolve: (value?: T | PromiseLike<T>) => void;
|
|
4
|
+
reject: (reason?: any) => void;
|
|
5
|
+
promise: Promise<T>;
|
|
6
|
+
}
|
|
7
|
+
export declare class SmartExecution {
|
|
8
|
+
smartshell: Smartshell;
|
|
9
|
+
currentStreamingExecution: IExecResultStreaming;
|
|
10
|
+
commandString: string;
|
|
11
|
+
private isRestartInProgress;
|
|
12
|
+
private isAnotherRestartRequested;
|
|
13
|
+
constructor(commandStringArg: string);
|
|
14
|
+
/**
|
|
15
|
+
* Schedules a restart. If a restart is currently in progress, any additional calls
|
|
16
|
+
* to restart will merge into a single additional restart request, which will only execute
|
|
17
|
+
* once the current restart completes.
|
|
18
|
+
*/
|
|
19
|
+
restart(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { Smartshell } from './classes.smartshell.js';
|
|
3
|
+
export class SmartExecution {
|
|
4
|
+
constructor(commandStringArg) {
|
|
5
|
+
this.isRestartInProgress = false;
|
|
6
|
+
this.isAnotherRestartRequested = false;
|
|
7
|
+
this.commandString = commandStringArg;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Schedules a restart. If a restart is currently in progress, any additional calls
|
|
11
|
+
* to restart will merge into a single additional restart request, which will only execute
|
|
12
|
+
* once the current restart completes.
|
|
13
|
+
*/
|
|
14
|
+
async restart() {
|
|
15
|
+
if (this.isRestartInProgress) {
|
|
16
|
+
// If there's already a restart in progress, just mark that another restart was requested
|
|
17
|
+
this.isAnotherRestartRequested = true;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.isRestartInProgress = true;
|
|
21
|
+
try {
|
|
22
|
+
if (!this.smartshell) {
|
|
23
|
+
this.smartshell = new Smartshell({
|
|
24
|
+
executor: 'bash',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (this.currentStreamingExecution) {
|
|
28
|
+
await this.currentStreamingExecution.kill();
|
|
29
|
+
}
|
|
30
|
+
this.currentStreamingExecution = await this.smartshell.execStreaming(this.commandString);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
this.isRestartInProgress = false;
|
|
34
|
+
}
|
|
35
|
+
// If another restart was requested while we were busy, we handle it now
|
|
36
|
+
if (this.isAnotherRestartRequested) {
|
|
37
|
+
this.isAnotherRestartRequested = false;
|
|
38
|
+
await this.restart();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGV4ZWN1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc21hcnRleGVjdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBNkIsTUFBTSx5QkFBeUIsQ0FBQztBQVFoRixNQUFNLE9BQU8sY0FBYztJQVF6QixZQUFZLGdCQUF3QjtRQUg1Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO1FBR3hDLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsT0FBTztRQUNsQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLHlGQUF5RjtZQUN6RixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDO29CQUMvQixRQUFRLEVBQUUsTUFBTTtpQkFDakIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlDLENBQUM7WUFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0YsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNuQyxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztZQUN2QyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { ShellEnv } from './classes.shellenv.js';
|
|
3
|
+
import type { IShellEnvContructorOptions } from './classes.shellenv.js';
|
|
4
|
+
import * as cp from 'child_process';
|
|
5
|
+
export interface IExecResult {
|
|
6
|
+
exitCode: number;
|
|
7
|
+
stdout: string;
|
|
8
|
+
}
|
|
9
|
+
export interface IExecResultStreaming {
|
|
10
|
+
childProcess: cp.ChildProcess;
|
|
11
|
+
finalPromise: Promise<IExecResult>;
|
|
12
|
+
kill: () => Promise<void>;
|
|
13
|
+
terminate: () => Promise<void>;
|
|
14
|
+
keyboardInterrupt: () => Promise<void>;
|
|
15
|
+
customSignal: (signalArg: plugins.smartexit.TProcessSignal) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare class Smartshell {
|
|
18
|
+
shellEnv: ShellEnv;
|
|
19
|
+
smartexit: plugins.smartexit.SmartExit;
|
|
20
|
+
constructor(optionsArg: IShellEnvContructorOptions);
|
|
21
|
+
/**
|
|
22
|
+
* executes a given command async
|
|
23
|
+
*/
|
|
24
|
+
private _exec;
|
|
25
|
+
private _execInteractive;
|
|
26
|
+
private _execCommand;
|
|
27
|
+
exec(commandString: string): Promise<IExecResult>;
|
|
28
|
+
execSilent(commandString: string): Promise<IExecResult>;
|
|
29
|
+
execStrict(commandString: string): Promise<IExecResult>;
|
|
30
|
+
execStrictSilent(commandString: string): Promise<IExecResult>;
|
|
31
|
+
execStreaming(commandString: string, silent?: boolean): Promise<IExecResultStreaming>;
|
|
32
|
+
execStreamingSilent(commandString: string): Promise<IExecResultStreaming>;
|
|
33
|
+
execInteractive(commandString: string): Promise<void>;
|
|
34
|
+
execAndWaitForLine(commandString: string, regexArg: RegExp, silentArg?: boolean): Promise<unknown>;
|
|
35
|
+
execAndWaitForLineSilent(commandString: string, regexArg: RegExp): Promise<unknown>;
|
|
36
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { ShellEnv } from './classes.shellenv.js';
|
|
3
|
+
import { ShellLog } from './classes.shelllog.js';
|
|
4
|
+
import * as cp from 'child_process';
|
|
5
|
+
export class Smartshell {
|
|
6
|
+
constructor(optionsArg) {
|
|
7
|
+
this.smartexit = new plugins.smartexit.SmartExit();
|
|
8
|
+
this.shellEnv = new ShellEnv(optionsArg);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* executes a given command async
|
|
12
|
+
*/
|
|
13
|
+
async _exec(options) {
|
|
14
|
+
if (options.interactive) {
|
|
15
|
+
return await this._execInteractive(options);
|
|
16
|
+
}
|
|
17
|
+
return await this._execCommand(options);
|
|
18
|
+
}
|
|
19
|
+
async _execInteractive(options) {
|
|
20
|
+
if (process.env.CI) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const done = plugins.smartpromise.defer();
|
|
24
|
+
const shell = cp.spawn(options.commandString, {
|
|
25
|
+
stdio: 'inherit',
|
|
26
|
+
shell: true,
|
|
27
|
+
detached: true
|
|
28
|
+
});
|
|
29
|
+
this.smartexit.addProcess(shell);
|
|
30
|
+
shell.on('close', (code) => {
|
|
31
|
+
console.log(`interactive shell terminated with code ${code}`);
|
|
32
|
+
this.smartexit.removeProcess(shell);
|
|
33
|
+
done.resolve();
|
|
34
|
+
});
|
|
35
|
+
await done.promise;
|
|
36
|
+
}
|
|
37
|
+
async _execCommand(options) {
|
|
38
|
+
const done = plugins.smartpromise.defer();
|
|
39
|
+
const childProcessEnded = plugins.smartpromise.defer();
|
|
40
|
+
const commandToExecute = this.shellEnv.createEnvExecString(options.commandString);
|
|
41
|
+
const shellLogInstance = new ShellLog();
|
|
42
|
+
const execChildProcess = cp.spawn(commandToExecute, [], {
|
|
43
|
+
shell: true,
|
|
44
|
+
cwd: process.cwd(),
|
|
45
|
+
env: process.env,
|
|
46
|
+
detached: false,
|
|
47
|
+
});
|
|
48
|
+
this.smartexit.addProcess(execChildProcess);
|
|
49
|
+
execChildProcess.stdout.on('data', (data) => {
|
|
50
|
+
if (!options.silent) {
|
|
51
|
+
shellLogInstance.writeToConsole(data);
|
|
52
|
+
}
|
|
53
|
+
shellLogInstance.addToBuffer(data);
|
|
54
|
+
});
|
|
55
|
+
execChildProcess.stderr.on('data', (data) => {
|
|
56
|
+
if (!options.silent) {
|
|
57
|
+
shellLogInstance.writeToConsole(data);
|
|
58
|
+
}
|
|
59
|
+
shellLogInstance.addToBuffer(data);
|
|
60
|
+
});
|
|
61
|
+
execChildProcess.on('exit', (code, signal) => {
|
|
62
|
+
this.smartexit.removeProcess(execChildProcess);
|
|
63
|
+
if (options.strict && code === 1) {
|
|
64
|
+
done.reject();
|
|
65
|
+
}
|
|
66
|
+
const execResult = {
|
|
67
|
+
exitCode: code,
|
|
68
|
+
stdout: shellLogInstance.logStore.toString(),
|
|
69
|
+
};
|
|
70
|
+
if (!options.streaming) {
|
|
71
|
+
done.resolve(execResult);
|
|
72
|
+
}
|
|
73
|
+
childProcessEnded.resolve(execResult);
|
|
74
|
+
});
|
|
75
|
+
if (options.streaming) {
|
|
76
|
+
done.resolve({
|
|
77
|
+
childProcess: execChildProcess,
|
|
78
|
+
finalPromise: childProcessEnded.promise,
|
|
79
|
+
kill: async () => {
|
|
80
|
+
console.log(`running tree kill with SIGKILL on process ${execChildProcess.pid}`);
|
|
81
|
+
await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGKILL');
|
|
82
|
+
},
|
|
83
|
+
terminate: async () => {
|
|
84
|
+
console.log(`running tree kill with SIGTERM on process ${execChildProcess.pid}`);
|
|
85
|
+
await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGTERM');
|
|
86
|
+
},
|
|
87
|
+
keyboardInterrupt: async () => {
|
|
88
|
+
console.log(`running tree kill with SIGINT on process ${execChildProcess.pid}`);
|
|
89
|
+
await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGINT');
|
|
90
|
+
},
|
|
91
|
+
customSignal: async (signalArg) => {
|
|
92
|
+
console.log(`running tree kill with custom signal ${signalArg} on process ${execChildProcess.pid}`);
|
|
93
|
+
await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, signalArg);
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return await done.promise;
|
|
98
|
+
}
|
|
99
|
+
async exec(commandString) {
|
|
100
|
+
return (await this._exec({ commandString }));
|
|
101
|
+
}
|
|
102
|
+
async execSilent(commandString) {
|
|
103
|
+
return (await this._exec({ commandString, silent: true }));
|
|
104
|
+
}
|
|
105
|
+
async execStrict(commandString) {
|
|
106
|
+
return (await this._exec({ commandString, strict: true }));
|
|
107
|
+
}
|
|
108
|
+
async execStrictSilent(commandString) {
|
|
109
|
+
return (await this._exec({ commandString, silent: true, strict: true }));
|
|
110
|
+
}
|
|
111
|
+
async execStreaming(commandString, silent = false) {
|
|
112
|
+
return (await this._exec({ commandString, silent, streaming: true }));
|
|
113
|
+
}
|
|
114
|
+
async execStreamingSilent(commandString) {
|
|
115
|
+
return (await this._exec({
|
|
116
|
+
commandString,
|
|
117
|
+
silent: true,
|
|
118
|
+
streaming: true,
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
async execInteractive(commandString) {
|
|
122
|
+
await this._exec({ commandString, interactive: true });
|
|
123
|
+
}
|
|
124
|
+
async execAndWaitForLine(commandString, regexArg, silentArg = false) {
|
|
125
|
+
let done = plugins.smartpromise.defer();
|
|
126
|
+
let execStreamingResult = await this.execStreaming(commandString, silentArg);
|
|
127
|
+
execStreamingResult.childProcess.stdout.on('data', (stdOutChunk) => {
|
|
128
|
+
if (regexArg.test(stdOutChunk)) {
|
|
129
|
+
done.resolve();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return done.promise;
|
|
133
|
+
}
|
|
134
|
+
async execAndWaitForLineSilent(commandString, regexArg) {
|
|
135
|
+
return this.execAndWaitForLine(commandString, regexArg, true);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydHNoZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydHNoZWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFpQnBDLE1BQU0sT0FBTyxVQUFVO0lBSXJCLFlBQVksVUFBc0M7UUFGM0MsY0FBUyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUduRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FNbkI7UUFDQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BRzlCO1FBQ0MsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDNUMsS0FBSyxFQUFFLFNBQVM7WUFDaEIsS0FBSyxFQUFFLElB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
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export
|
|
1
|
+
export * from './classes.smartshell.js';
|
|
2
|
+
export * from './classes.smartexecution.js';
|
|
3
|
+
export { which } from './plugins.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export
|
|
3
|
-
|
|
1
|
+
export * from './classes.smartshell.js';
|
|
2
|
+
export * from './classes.smartexecution.js';
|
|
3
|
+
export { which } from './plugins.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQyJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as smartdelay from '@push.rocks/smartdelay';
|
|
2
|
+
import * as smartexit from '@push.rocks/smartexit';
|
|
3
|
+
import * as smartpromise from '@push.rocks/smartpromise';
|
|
4
|
+
import which from 'which';
|
|
5
|
+
export { smartdelay, smartexit, smartpromise, which };
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartshell",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "3.0
|
|
4
|
+
"version": "3.2.0",
|
|
5
5
|
"description": "A library for executing shell commands using promises.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
7
7
|
"typings": "dist_ts/index.d.ts",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://code.foss.global/push.rocks/smartshell",
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@git.zone/tsbuild": "^2.
|
|
32
|
-
"@git.zone/tsrun": "^1.
|
|
31
|
+
"@git.zone/tsbuild": "^2.2.0",
|
|
32
|
+
"@git.zone/tsrun": "^1.3.3",
|
|
33
33
|
"@git.zone/tstest": "^1.0.90",
|
|
34
|
-
"@push.rocks/tapbundle": "^5.
|
|
35
|
-
"@types/node": "^22.
|
|
34
|
+
"@push.rocks/tapbundle": "^5.5.3",
|
|
35
|
+
"@types/node": "^22.10.1"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@push.rocks/smartdelay": "^3.0.1",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"@push.rocks/smartpromise": "^4.0.4",
|
|
41
41
|
"@types/which": "^3.0.4",
|
|
42
42
|
"tree-kill": "^1.2.2",
|
|
43
|
-
"which": "^
|
|
43
|
+
"which": "^5.0.0"
|
|
44
44
|
},
|
|
45
45
|
"files": [
|
|
46
46
|
"ts/**/*",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
],
|
|
60
60
|
"scripts": {
|
|
61
61
|
"test": "(tstest test/)",
|
|
62
|
-
"build": "(tsbuild --web)",
|
|
62
|
+
"build": "(tsbuild tsfolders --web)",
|
|
63
63
|
"buildDocs": "tsdoc"
|
|
64
64
|
}
|
|
65
65
|
}
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { Smartshell, type IExecResultStreaming } from './classes.smartshell.js';
|
|
3
|
+
|
|
4
|
+
export interface IDeferred<T> {
|
|
5
|
+
resolve: (value?: T | PromiseLike<T>) => void;
|
|
6
|
+
reject: (reason?: any) => void;
|
|
7
|
+
promise: Promise<T>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class SmartExecution {
|
|
11
|
+
public smartshell: Smartshell;
|
|
12
|
+
public currentStreamingExecution: IExecResultStreaming;
|
|
13
|
+
public commandString: string;
|
|
14
|
+
|
|
15
|
+
private isRestartInProgress = false;
|
|
16
|
+
private isAnotherRestartRequested = false;
|
|
17
|
+
|
|
18
|
+
constructor(commandStringArg: string) {
|
|
19
|
+
this.commandString = commandStringArg;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Schedules a restart. If a restart is currently in progress, any additional calls
|
|
24
|
+
* to restart will merge into a single additional restart request, which will only execute
|
|
25
|
+
* once the current restart completes.
|
|
26
|
+
*/
|
|
27
|
+
public async restart(): Promise<void> {
|
|
28
|
+
if (this.isRestartInProgress) {
|
|
29
|
+
// If there's already a restart in progress, just mark that another restart was requested
|
|
30
|
+
this.isAnotherRestartRequested = true;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
this.isRestartInProgress = true;
|
|
35
|
+
try {
|
|
36
|
+
if (!this.smartshell) {
|
|
37
|
+
this.smartshell = new Smartshell({
|
|
38
|
+
executor: 'bash',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (this.currentStreamingExecution) {
|
|
42
|
+
await this.currentStreamingExecution.kill();
|
|
43
|
+
}
|
|
44
|
+
this.currentStreamingExecution = await this.smartshell.execStreaming(this.commandString);
|
|
45
|
+
} finally {
|
|
46
|
+
this.isRestartInProgress = false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// If another restart was requested while we were busy, we handle it now
|
|
50
|
+
if (this.isAnotherRestartRequested) {
|
|
51
|
+
this.isAnotherRestartRequested = false;
|
|
52
|
+
await this.restart();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as plugins from './
|
|
2
|
-
import { ShellEnv } from './
|
|
3
|
-
import type { IShellEnvContructorOptions, TExecutor } from './
|
|
4
|
-
import { ShellLog } from './
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { ShellEnv } from './classes.shellenv.js';
|
|
3
|
+
import type { IShellEnvContructorOptions, TExecutor } from './classes.shellenv.js';
|
|
4
|
+
import { ShellLog } from './classes.shelllog.js';
|
|
5
5
|
|
|
6
6
|
import * as cp from 'child_process';
|
|
7
7
|
|
package/ts/index.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export
|
|
1
|
+
export * from './classes.smartshell.js';
|
|
2
|
+
export * from './classes.smartexecution.js';
|
|
3
|
+
export { which } from './plugins.js';
|
|
File without changes
|
|
File without changes
|