From 9da99f6955131d609985593e680487451fdb023f Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Mon, 10 Apr 2023 23:32:04 -0400 Subject: [PATCH] chore: Parallelize build (#5182 * Parallelize build * Update package.json --- build.js | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ build.sh | 23 ---------------- package.json | 2 +- 3 files changed, 78 insertions(+), 24 deletions(-) create mode 100755 build.js delete mode 100755 build.sh diff --git a/build.js b/build.js new file mode 100755 index 000000000..3c2e4b88d --- /dev/null +++ b/build.js @@ -0,0 +1,77 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +/* eslint-disable no-undef */ +const { exec } = require("child_process"); +const { readdirSync } = require("fs"); + +const getDirectories = (source) => + readdirSync(source, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + +/** + * Executes a shell command and return it as a Promise. + * @param cmd {string} + * @return {Promise} + */ +function execAsync(cmd) { + return new Promise((resolve) => { + exec(cmd, (error, stdout, stderr) => { + if (error) { + console.warn(error); + } + resolve(stdout ? stdout : stderr); + }); + }); +} + +async function build() { + // Clean previous build + console.log("Clean previous build…"); + + await Promise.all([ + execAsync("rm -rf ./build/server"), + execAsync("rm -rf ./build/plugins"), + ]); + + const d = getDirectories("./plugins"); + + // Compile server and shared + console.log("Compiling…"); + await Promise.all([ + execAsync( + "yarn babel --extensions .ts,.tsx --quiet -d ./build/server ./server" + ), + execAsync( + "yarn babel --extensions .ts,.tsx --quiet -d ./build/shared ./shared" + ), + ...d.map(async (plugin) => + execAsync( + `yarn babel --extensions .ts,.tsx --quiet -d "./build/plugins/${plugin}/server" "./plugins/${plugin}/server"` + ) + ), + ]); + + // Copy static files + console.log("Copying static files…"); + await Promise.all([ + execAsync( + "cp ./server/collaboration/Procfile ./build/server/collaboration/Procfile" + ), + execAsync( + "cp ./server/static/error.dev.html ./build/server/error.dev.html" + ), + execAsync( + "cp ./server/static/error.prod.html ./build/server/error.prod.html" + ), + execAsync("cp package.json ./build"), + ...d.map(async (plugin) => + execAsync( + `cp ./plugins/${plugin}/plugin.json ./build/plugins/${plugin}/plugin.json` + ) + ), + ]); + + console.log("Done!"); +} + +build(); diff --git a/build.sh b/build.sh deleted file mode 100755 index 97626a736..000000000 --- a/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# Clean previous build -rm -rf ./build/server -rm -rf ./build/plugins - -# Compile server and shared -yarn concurrently "yarn babel --extensions .ts,.tsx --quiet -d ./build/server ./server" \ - "yarn babel --extensions .ts,.tsx --quiet -d ./build/shared ./shared" - -# Compile code in plugins -for d in ./plugins/*; do - # Get the name of the folder - package=$(basename "$d") - yarn babel --extensions .ts,.tsx --quiet -d "./build/plugins/$package/server" "./plugins/$package/server" - cp ./plugins/$package/plugin.json ./build/plugins/$package/plugin.json -done - -# Copy static files -cp ./server/collaboration/Procfile ./build/server/collaboration/Procfile -cp package.json ./build -cp ./server/static/error.dev.html ./build/server/error.dev.html -cp ./server/static/error.prod.html ./build/server/error.prod.html diff --git a/package.json b/package.json index fec24743d..a23e66fc1 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "clean": "rimraf build", "copy:i18n": "mkdir -p ./build/shared/i18n && cp -R ./shared/i18n/locales ./build/shared/i18n", "build:i18n": "i18next --silent '{shared,app,server,plugins}/**/*.{ts,tsx}' && yarn copy:i18n", - "build:server": "./build.sh", + "build:server": "node ./build.js", "build": "yarn clean && yarn vite:build && yarn build:i18n && yarn build:server", "start": "node ./build/server/index.js", "dev": "NODE_ENV=development yarn concurrently -n api,collaboration -c \"blue,magenta\" \"node --inspect=0.0.0.0 build/server/index.js --services=collaboration,websockets,admin,web,worker\"",