Created
April 3, 2024 23:04
-
-
Save Ambushfall/354c586a93af7cc1d6931ac8ef5c954a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Name: Run .bat/.ps1/.sh | |
// Description: Process Output to Kit via stream | |
import '@johnlindquist/kit' | |
// @ts-expect-error | |
import { backToMainShortcut, highlightJavaScript } from '@johnlindquist/kit' | |
// --- Create a shell script to run ----------------- | |
// `tmpPath` will store the file here: | |
// ~/.kenv/tmp/process-shell-script-output/example.* | |
// Note: linux shell will only work with WSL or you can provide the Args for ps1 using the .sh extension if you have gitbash | |
const fileName = 'example' | |
const selectedLang = { | |
name: '', | |
args: '', | |
ext: '', | |
echo: '', | |
set setVal (keyValueList: string[]) { | |
this[keyValueList[0]] = keyValueList[1] | |
} | |
} | |
const objGen = (_lang: string, _ext: string, _args?: string) => { | |
_args = _args ? _args : '' | |
return { | |
name: _lang, | |
description: `Run Script using ${_lang}`, | |
value: _lang, | |
id: _ext, | |
arguments: _args, | |
preview: () => highlightJavaScript(tmpPath(`${fileName}.${_ext}`)) | |
} | |
} | |
const LangOptions = [ | |
objGen( | |
'PowerShell', | |
'ps1', | |
'powershell -NoProfile -NonInteractive –ExecutionPolicy Bypass -File ' | |
), | |
objGen('Batch', 'bat'), | |
objGen('Bash', 'sh') | |
] | |
const promptEditor = ['yes', 'no'] | |
const selectedValue = await arg('Use editor?', promptEditor) | |
const useEditor = selectedValue === 'yes' ? true : false | |
// define select options | |
await arg( | |
{ | |
placeholder: 'Select Scripting Language...', | |
enter: 'Select', | |
shortcuts: [backToMainShortcut], | |
onChoiceFocus: async (input, { focused }) => { | |
selectedLang.setVal = ['args', focused['arguments']] | |
selectedLang.setVal = ['ext', focused.id] | |
selectedLang.setVal = ['name', focused.name] | |
selectedLang.setVal = [ | |
'echo', | |
selectedLang.ext == 'bat' ? '@echo off' : '' | |
] | |
} | |
}, | |
LangOptions | |
) | |
const shellScriptPath = kenvTmpPath(`${fileName}.${selectedLang.ext}`) | |
const editorConfig = { | |
hint: `Write code for ${selectedLang.ext} file.`, | |
description: 'Save to Run', | |
onInputSubmit: async (input: any) => { | |
selectedLang.ext == 'sh' | |
? await submit(`${input} | |
exit`) | |
: await submit(input) | |
} | |
} | |
// Using ping to simulate waiting for a long process and because it's natively supported across PS and Bat files | |
// Note: If you use a code that would natively not run in bat like "ls" it will | |
let scriptContents = useEditor | |
? await editor(editorConfig) | |
: `${selectedLang.echo} | |
echo "hello" | |
echo "Done" | |
${selectedLang.ext == 'sh' ? 'exit' : ''} | |
` | |
await writeFile(shellScriptPath, scriptContents) | |
// Just a wrapper to highlight with code in PS style | |
const codeWrapper = (string: string, extension: any) => ` | |
\`\`\`${extension} | |
${string} | |
\`\`\` | |
` | |
let output = `` | |
// This is used to avoid kit window closing on process exit | |
let divPromise = div() | |
const outHandler = async (out: string) => { | |
output += `${out}\n` | |
setDiv(await highlight(`${codeWrapper(output, selectedLang.ext)}`)) | |
} | |
// Note: We have to use this janky way of executing PS as it would launch in Notepad or fail entirely. | |
const execArgs = | |
selectedLang.ext == 'sh' | |
? `cd ${tmpPath()} && bash ${fileName}.sh` | |
: `${selectedLang.args}${shellScriptPath}` | |
// inspect(execArgs) | |
let { stdout } = execLog(execArgs, outHandler) | |
setAlwaysOnTop(true) | |
setIgnoreBlur(true) | |
await divPromise |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment