1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- <script>
- import { Command } from "@tauri-apps/api/shell"
- const windows = navigator.userAgent.includes('Windows')
- let cmd = windows ? 'cmd' : 'sh'
- let args = windows ? ['/C'] : ['-c']
- export let onMessage;
- let script = 'echo "hello world"'
- let cwd = null
- let env = 'SOMETHING=value ANOTHER=2'
- let stdin = ''
- let child
- function _getEnv() {
- return env.split(' ').reduce((env, clause) => {
- let [key, value] = clause.split('=')
- return {
- ...env,
- [key]: value
- }
- }, {})
- }
- function spawn() {
- child = null
- const command = new Command(cmd, [...args, script], { cwd: cwd || null, env: _getEnv() })
- command.on('close', data => {
- onMessage(`command finished with code ${data.code} and signal ${data.signal}`)
- child = null
- })
- command.on('error', error => onMessage(`command error: "${error}"`))
- command.stdout.on('data', line => onMessage(`command stdout: "${line}"`))
- command.stderr.on('data', line => onMessage(`command stderr: "${line}"`))
-
- command.spawn()
- .then(c => {
- child = c
- })
- .catch(onMessage)
- }
- function kill() {
- child.kill().then(() => onMessage('killed child process')).catch(onMessage)
- }
- function writeToStdin() {
- child.write(stdin).catch(onMessage)
- }
- </script>
- <div>
- <div>
- <input bind:value={script}>
- <button class="button" on:click={spawn}>Run</button>
- <button class="button" on:click={kill}>Kill</button>
- {#if child}
- <input placeholder="write to stdin" bind:value={stdin}>
- <button class="button" on:click={writeToStdin}>Write</button>
- {/if}
- </div>
- <div>
- <input bind:value={cwd} placeholder="Working directory">
- <input bind:value={env} placeholder="Environment variables" style="width: 300px">
- </div>
- </div>
|