require("dotenv").config(); const { exec, execSync } = require("child_process"); const { existsSync, writeFileSync, appendFileSync } = require("fs"); const { sep, resolve } = require("path"); const getGuiEnv = (log = true) => { try { const pipGuiDir = execSync( process.platform === "win32" ? 'pip show taipy-gui | findStr "Location:"' : "pip show taipy-gui | grep Location:", { stdio: ["pipe", "pipe", "pipe"], } ) .toString() .trim(); return pipGuiDir.substring(9).trim(); } catch (e) { log && console.info("taipy-gui pip package is not installed."); const base = existsSync("package.json") ? `..${sep}..` : existsSync("frontend") ? "." : sep; if (existsSync(resolve(base, "taipy", "gui", "webapp", "package.json"))) { log && console.info(`Found npm package for taipy-gui in ${resolve(base, "taipy", "gui", "webapp")}`); return base; } else { log && console.warn(`taipy-gui npm package should be built locally in ${resolve(base, "taipy", "gui", "webapp")} first.`); } } return sep; }; let taipyEnvDir = process.env.TAIPY_DIR; if (!taipyEnvDir) { taipyEnvDir = getGuiEnv(); if (taipyEnvDir != sep) { if (existsSync(".env")) { appendFileSync(".env", `\nTAIPY_DIR=${taipyEnvDir}`); } else { writeFileSync(".env", `TAIPY_DIR=${taipyEnvDir}`); } } } const taipyWebappDir = `${taipyEnvDir}${sep}taipy${sep}gui${sep}webapp`; if (!existsSync(taipyWebappDir)) { console.error( `Cannot find the Taipy GUI (${taipyWebappDir}) webapp directory.\nMake sure TAIPY_DIR is set properly as (${getGuiEnv( false )}).` ); process.exit(1); } const spinner = "|/-\\"; let i = 0; let spinnerTimer; exec(`npm i ${taipyWebappDir}`) .on("spawn", () => { spinnerTimer = setInterval(() => { process.stdout.write("Installing the Taipy GUI library... \r" + spinner[i++]); i = i % spinner.length; }, 150); }) .on("exit", (code, signal) => { clearInterval(spinnerTimer); if (code === 0) { console.log("\nInstallation finished"); } else { console.log(`\nInstallation failed (code ${code}, signal ${signal})`); } });