install.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. require("dotenv").config();
  2. const { exec, execSync } = require("child_process");
  3. const { existsSync, writeFileSync, appendFileSync } = require("fs");
  4. const { sep, resolve } = require("path");
  5. const getGuiEnv = (log = true) => {
  6. try {
  7. const pipGuiDir = execSync(
  8. process.platform === "win32"
  9. ? 'pip show taipy-gui | findStr "Location:"'
  10. : "pip show taipy-gui | grep Location:",
  11. {
  12. stdio: ["pipe", "pipe", "pipe"],
  13. }
  14. )
  15. .toString()
  16. .trim();
  17. return pipGuiDir.substring(9).trim();
  18. } catch (e) {
  19. log && console.info("taipy-gui pip package is not installed.");
  20. const base = existsSync("package.json") ? `..${sep}..` : existsSync("frontend") ? "." : sep;
  21. if (existsSync(resolve(base, "taipy", "gui", "webapp", "package.json"))) {
  22. log && console.info(`Found npm package for taipy-gui in ${resolve(base, "taipy", "gui", "webapp")}`);
  23. return base;
  24. } else {
  25. log && console.warn(`taipy-gui npm package should be built locally in ${resolve(base, "taipy", "gui", "webapp")} first.`);
  26. }
  27. }
  28. return sep;
  29. };
  30. let taipyEnvDir = process.env.TAIPY_DIR;
  31. if (!taipyEnvDir) {
  32. taipyEnvDir = getGuiEnv();
  33. if (taipyEnvDir != sep) {
  34. if (existsSync(".env")) {
  35. appendFileSync(".env", `\nTAIPY_DIR=${taipyEnvDir}`);
  36. } else {
  37. writeFileSync(".env", `TAIPY_DIR=${taipyEnvDir}`);
  38. }
  39. }
  40. }
  41. const taipyWebappDir = `${taipyEnvDir}${sep}taipy${sep}gui${sep}webapp`;
  42. if (!existsSync(taipyWebappDir)) {
  43. console.error(
  44. `Cannot find the Taipy GUI (${taipyWebappDir}) webapp directory.\nMake sure TAIPY_DIR is set properly as (${getGuiEnv(
  45. false
  46. )}).`
  47. );
  48. process.exit(1);
  49. }
  50. const spinner = "|/-\\";
  51. let i = 0;
  52. let spinnerTimer;
  53. exec(`npm i ${taipyWebappDir}`)
  54. .on("spawn", () => {
  55. spinnerTimer = setInterval(() => {
  56. process.stdout.write("Installing the Taipy GUI library... \r" + spinner[i++]);
  57. i = i % spinner.length;
  58. }, 150);
  59. })
  60. .on("exit", (code, signal) => {
  61. clearInterval(spinnerTimer);
  62. if (code === 0) {
  63. console.log("\nInstallation finished");
  64. } else {
  65. console.log(`\nInstallation failed (code ${code}, signal ${signal})`);
  66. }
  67. });