104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
export type TExecutor = 'sh' | 'bash';
|
|
|
|
export interface IShellEnvContructorOptions {
|
|
executor: TExecutor;
|
|
sourceFilePaths?: string[];
|
|
pathDirectories?: string[];
|
|
}
|
|
|
|
export class ShellEnv {
|
|
executor: TExecutor;
|
|
sourceFileArray: string[] = [];
|
|
pathDirArray: string[] = [];
|
|
|
|
/**
|
|
* constructor for the shellenv
|
|
*/
|
|
constructor(optionsArg: IShellEnvContructorOptions) {
|
|
this.executor = optionsArg.executor;
|
|
|
|
// add sourcefiles
|
|
if (optionsArg.sourceFilePaths) {
|
|
this.sourceFileArray = this.sourceFileArray.concat(optionsArg.sourceFilePaths);
|
|
}
|
|
|
|
// add pathDirectories
|
|
if (optionsArg.pathDirectories) {
|
|
this.pathDirArray = this.pathDirArray.concat(optionsArg.pathDirectories);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* imports path into the shell from env if available and returns it with
|
|
*/
|
|
private _setPath(commandStringArg: string): string {
|
|
let commandResult = commandStringArg;
|
|
let commandPaths: string[] = [];
|
|
commandPaths = commandPaths.concat(process.env.PATH.split(':'));
|
|
if (process.env.SMARTSHELL_PATH) {
|
|
commandPaths = commandPaths.concat(process.env.SMARTSHELL_PATH.split(':'));
|
|
}
|
|
|
|
// lets filter for unwanted paths
|
|
// Windows WSL
|
|
commandPaths = commandPaths.filter((commandPathArg) => {
|
|
const filterResult =
|
|
!commandPathArg.startsWith('/mnt/c/') &&
|
|
!commandPathArg.startsWith('Files/1E') &&
|
|
!commandPathArg.includes(' ');
|
|
if (!filterResult) {
|
|
// console.log(`${commandPathArg} will be filtered!`);
|
|
}
|
|
return filterResult;
|
|
});
|
|
|
|
commandResult = `PATH=${commandPaths.join(':')} && ${commandStringArg}`;
|
|
return commandResult;
|
|
}
|
|
|
|
/**
|
|
* add files that are going to be sourced when running a command
|
|
* @param sourceFilePathsArray
|
|
*/
|
|
addSourceFiles(sourceFilePathsArray: string[]) {
|
|
for (let sourceFilePath of sourceFilePathsArray) {
|
|
this.sourceFileArray.push(sourceFilePath);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* cleans the source files array
|
|
*/
|
|
cleanSourceFiles() {
|
|
this.sourceFileArray = [];
|
|
}
|
|
|
|
public createEnvExecString(commandArg: string): string {
|
|
let commandResult = '';
|
|
let sourceString = '';
|
|
|
|
// deal with sourcestring
|
|
for (const sourceFilePath of this.sourceFileArray) {
|
|
sourceString = sourceString + `source ${sourceFilePath} && `;
|
|
}
|
|
|
|
// deal with available path
|
|
let pathString = 'PATH=$PATH';
|
|
for (const pathDir of this.pathDirArray) {
|
|
pathString += `:${pathDir}`;
|
|
}
|
|
pathString += ` && `;
|
|
|
|
switch (this.executor) {
|
|
case 'bash':
|
|
commandResult = `bash -c '${pathString}${sourceString}${commandArg}'`;
|
|
break;
|
|
case 'sh':
|
|
commandResult = `${pathString}${sourceString}${commandArg}`;
|
|
break;
|
|
}
|
|
commandResult = this._setPath(commandResult);
|
|
return commandResult;
|
|
}
|
|
}
|