From 52c96c6c8fd0a7cace4ccc08816c057f6876bcaf Mon Sep 17 00:00:00 2001 From: Maksim Eltyshev Date: Thu, 19 Feb 2026 20:15:28 +0100 Subject: [PATCH] fix(platform): Make app compatible with Windows --- .../api/helpers/utils/send-notifications.js | 10 +++++-- server/package.json | 2 +- server/setup-python.js | 28 +++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 server/setup-python.js diff --git a/server/api/helpers/utils/send-notifications.js b/server/api/helpers/utils/send-notifications.js index 88069f5c..9d064c52 100644 --- a/server/api/helpers/utils/send-notifications.js +++ b/server/api/helpers/utils/send-notifications.js @@ -4,8 +4,14 @@ */ const { execFile } = require('child_process'); +const path = require('path'); const util = require('util'); +const PYTHON_PATH = + process.platform === 'win32' + ? path.join(sails.config.appPath, '.venv', 'Scripts', 'python.exe') + : path.join(sails.config.appPath, '.venv', 'bin', 'python'); + const promisifyExecFile = util.promisify(execFile); module.exports = { @@ -27,9 +33,9 @@ module.exports = { async fn(inputs) { try { await promisifyExecFile( - `${sails.config.appPath}/.venv/bin/python3`, + PYTHON_PATH, [ - `${sails.config.appPath}/utils/send_notifications.py`, + path.join(sails.config.appPath, 'utils', 'send_notifications.py'), JSON.stringify(inputs.services), inputs.title, JSON.stringify(inputs.bodyByFormat), diff --git a/server/package.json b/server/package.json index 08396f3c..25a3ad8b 100644 --- a/server/package.json +++ b/server/package.json @@ -12,7 +12,7 @@ "db:upgrade": "node db/upgrade.js", "postinstall": "patch-package && npm run setup-python", "lint": "eslint . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'", - "setup-python": "python3 -m venv .venv && .venv/bin/pip3 install -r requirements.txt", + "setup-python": "node setup-python.js", "start": "nodemon", "start:prod": "cross-env NODE_ENV=production node app.js --prod", "swagger:generate": "node generate-swagger.js", diff --git a/server/setup-python.js b/server/setup-python.js new file mode 100644 index 00000000..8459afb0 --- /dev/null +++ b/server/setup-python.js @@ -0,0 +1,28 @@ +const { spawnSync } = require('child_process'); +const path = require('path'); + +const VENV_PATH = path.join(__dirname, '.venv'); +const REQUIREMENTS_PATH = path.join(__dirname, 'requirements.txt'); + +const PYTHON_PATH = + process.platform === 'win32' + ? path.join(VENV_PATH, 'Scripts', 'python.exe') + : path.join(VENV_PATH, 'bin', 'python'); + +const getSystemPythonCommand = () => { + let result = spawnSync('python3', ['--version'], { stdio: 'ignore' }); + if (result.status === 0) return 'python3'; + + result = spawnSync('python', ['--version'], { stdio: 'ignore' }); + if (result.status === 0) return 'python'; + + throw new Error('Python is not installed or not in PATH'); +}; + +const run = (command, args) => { + const result = spawnSync(command, args, { stdio: 'inherit' }); + if (result.status !== 0) process.exit(result.status); +}; + +run(getSystemPythonCommand(), ['-m', 'venv', VENV_PATH]); +run(PYTHON_PATH, ['-m', 'pip', 'install', '-r', REQUIREMENTS_PATH]);