User: Перепиши это на использование spawn

exec("sh update.sh", { cwd: dirPath }, (error, stdout, stderr) => {
    if (error) {
      setMarkdown((prev) => `${prev}\n\n#@ Update failed!\nError: ${error}`);
      has_error = true;
    }
    if (stderr) {
      setMarkdown((prev) => `${prev}\n\n### Error log: \n${stderr}`);
    }
    if (stdout) {
      setMarkdown((prev) => `${prev}\n\n### Log:\n${stdout}`);
    }
    if (!has_error) {
      setMarkdown((prev) => `${prev}\n\n# Update successful!`);
      showToast(Toast.Style.Success, "Update successful");
      popToRoot();
    } else {
      showToast(Toast.Style.Failure, "Update failed");
    }
  });
Assistant: Вот как можно переписать этот код с использованием `spawn` из модуля `child_process` в Node.js:

```javascript
const { spawn } = require('child_process');

const updateProcess = spawn('sh', ['update.sh'], { cwd: dirPath });
let stdoutData = '';
let stderrData = '';
let hasError = false;

updateProcess.stdout.on('data', (data) => {
  stdoutData += data.toString();
});

updateProcess.stderr.on('data', (data) => {
  stderrData += data.toString();
});

updateProcess.on('error', (error) => {
  setMarkdown((prev) => `${prev}

#@ Update failed!
Error: ${error}`);
  hasError = true;
});

updateProcess.on('close', (code) => {
  if (stderrData) {
    setMarkdown((prev) => `${prev}

### Error log:
${stderrData}`);
  }
  if (stdoutData) {
    setMarkdown((prev) => `${prev}

### Log:
${stdoutData}`);
  }
  if (!hasError && code === 0) {
    setMarkdown((prev) => `${prev}

# Update successful!`);
    showToast(Toast.Style.Success, "Update successful");
    popToRoot();
  } else {
    showToast(Toast.Style.Failure, "Update failed");
  }
});
```

В этом коде мы используем `spawn`, чтобы запустить shell-скрипт `update.sh`. Вместо обратного вызова, как в `exec`, мы подписываемся на события `data`, `error` и `close`, которые предоставляют разные части данных (вывод и сообщения об ошибках) и сигнализируют о завершении процесса.
User: Можно писать import вместо const?
Assistant: Да, конечно. Если вы используете модульную систему ES6 или такой инструмент, как Babel, для трансформации кода, вы можете писать `import` вместо `const`. Вот как это будет выглядеть:

```javascript
import { spawn } from 'child_process';

const updateProcess = spawn('sh', ['update.sh'], { cwd: dirPath });
let stdoutData = '';
let stderrData = '';
let hasError = false;

updateProcess.stdout.on('data', (data) => {
  stdoutData += data.toString();
});

updateProcess.stderr.on('data', (data) => {
  stderrData += data.toString();
});

updateProcess.on('error', (error) => {
  setMarkdown((prev) => `${prev}

#@ Update failed!
Error: ${error}`);
  hasError = true;
});

updateProcess.on('close', (code) => {
  if (stderrData) {
    setMarkdown((prev) => `${prev}

### Error log:
${stderrData}`);
  }
  if (stdoutData) {
    setMarkdown((prev) => `${prev}

### Log:
${stdoutData}`);
  }
  if (!hasError && code === 0) {
    setMarkdown((prev) => `${prev}

# Update successful!`);
    showToast(Toast.Style.Success, "Update successful");
    popToRoot();
  } else {
    showToast(Toast.Style.Failure, "Update failed");
  }
});
```

Обратите внимание, что для использования синтаксиса `import` ваш проект должен быть настроен на поддержку модулей ES6. Это может включать указание `type: "module"` в вашем `package.json` или использование транспайлеров, таких как Babel.
User: Давай без отслеживания вывода и ошибок
Assistant: