170 lines
9.2 KiB
JavaScript
170 lines
9.2 KiB
JavaScript
const child_process = require("child_process")
|
|
const path = require("path")
|
|
const terser = require("terser")
|
|
const util = require("util")
|
|
|
|
const production = true
|
|
|
|
let fs = require("fs")
|
|
|
|
console.log = (...args) => {
|
|
process.stdout.write(Buffer.from(util.formatWithOptions({colors: true}, ...args)+"\n", "binary").toString("utf8"))
|
|
}
|
|
console.info = (...args) => {
|
|
console.log(`\x1b[34m[INFO]\x1b[0m`, ...args)
|
|
}
|
|
|
|
async function main(){
|
|
console.log(__dirname, process.cwd())
|
|
|
|
console.info("Reseting existent directory...")
|
|
await fs.promises.rmdir("./distApp", {"recursive": true})
|
|
await fs.promises.mkdir(__dirname+"/distApp/dist", {"recursive": true})
|
|
|
|
console.info("Executing command `npm run compile`")
|
|
console.log(child_process.execSync("npm run compile", {encoding: "binary"}))
|
|
|
|
let startDir = path.join(__dirname, "./dist")
|
|
let newDir = path.join(__dirname, "./distApp/dist")
|
|
console.info("No error detected. Copying files from "+startDir+".")
|
|
await fs.promises.mkdir(startDir, {recursive: true})
|
|
|
|
async function processNextDir(folder, folders, predicate, compile, ignoreModules){
|
|
if(typeof ignoreModules === "undefined")ignoreModules = false
|
|
for(let file of fs.readdirSync(folder, {withFileTypes: true})){
|
|
if(file.isFile()){
|
|
let filepath = path.join(folder, file.name)
|
|
if(predicate(filepath) && filepath.split(/[\\/]+/).reverse()[1] !== "js"){
|
|
await compile(filepath, path.join(filepath.replace(folders.startDir, folders.newDir)), "..")
|
|
}else{
|
|
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
|
|
}
|
|
}else if(file.isDirectory()){
|
|
if(ignoreModules && file.name === "node_modules")continue
|
|
await fs.promises.mkdir(path.join(folder, file.name).replace(folders.startDir, folders.newDir), {recursive: true})
|
|
await processNextDir(path.join(folder, file.name), ...Array.from(arguments).slice(1))
|
|
}
|
|
}
|
|
}
|
|
await processNextDir(startDir, {
|
|
startDir,
|
|
newDir
|
|
}, ((filepath) => filepath.endsWith(".js") && (!production ? !filepath.includes("node_modules") : true)), async (filepath, newpath) => {
|
|
console.info(`Minifying ${filepath} to ${newpath}`)
|
|
|
|
if(filepath.endsWith("git.js")){
|
|
let commit = child_process.execSync("git rev-parse HEAD").toString().split("\n")[0].trim()
|
|
console.info(`Obtained commit ${commit} for the build`)
|
|
await fs.promises.writeFile(newpath, terser.minify(fs.readFileSync(filepath, "utf8").replace(/"{commit}"/g, `"${commit}"`)).code, "utf8")
|
|
}else{
|
|
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
|
|
}
|
|
}).then(() => {
|
|
console.info(`Copied files and minified them from ${startDir}.`)
|
|
}).catch(console.error)
|
|
|
|
await processNextDir(path.join(__dirname, "modules"), {
|
|
startDir: path.join(__dirname, "modules"),
|
|
newDir: path.join(__dirname, "distApp", "modules")
|
|
}, ((filepath) => filepath.endsWith(".js") && (!production ? !filepath.includes("node_modules") : true)), async (filepath, newpath) => {
|
|
if(filepath.includes("node_modules"))return // don't minify node_modules, and don't include them at all. Installing later
|
|
console.info(`Minifying ${filepath} to ${newpath}`)
|
|
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
|
|
}, true).then(() => {
|
|
console.info(`Copied files and minified them from ${path.join(__dirname, "modules")}.`)
|
|
})
|
|
|
|
await Promise.all((await fs.promises.readdir(path.join(__dirname, "distApp", "modules"))).map(async mdl => {
|
|
let dir = path.join(__dirname, "distApp", "modules", mdl)
|
|
|
|
if(!fs.existsSync(path.join(dir, "package.json"))){
|
|
if(mdl === "discord_desktop_core"){
|
|
dir = path.join(dir, "core")
|
|
}else{
|
|
return
|
|
}
|
|
}
|
|
|
|
console.info(`Installing modules for ${mdl}`)
|
|
console.log(child_process.execSync("npm install --only=prod", {
|
|
encoding: "binary",
|
|
cwd: dir
|
|
}))
|
|
}))
|
|
|
|
await processNextDir(path.join(__dirname, "LightcordApi"), {
|
|
startDir: path.join(__dirname, "LightcordApi"),
|
|
newDir: path.join(__dirname, "distApp", "LightcordApi")
|
|
}, ((filepath) => filepath.endsWith(".js") && (!production ? !filepath.includes("node_modules") : true)), async (filepath, newpath) => {
|
|
if(filepath.includes("node_modules"))return // don't minify node_modules, and don't include them at all. Installing later
|
|
console.info(`Minifying ${filepath} to ${newpath}`)
|
|
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
|
|
}).then(() => {
|
|
console.info(`Copied files and minified them from ${path.join(__dirname, "LightcordApi")}.`)
|
|
})
|
|
|
|
await fs.promises.rmdir(path.join(__dirname, "distApp", "LightcordApi", "src"), {"recursive": true})
|
|
await fs.promises.rmdir(path.join(__dirname, "distApp", "LightcordApi", "dist"), {"recursive": true})
|
|
await fs.promises.unlink(path.join(__dirname, "distApp", "LightcordApi", "webpack.config.js"))
|
|
await fs.promises.unlink(path.join(__dirname, "distApp", "LightcordApi", "tsconfig.json"))
|
|
|
|
console.log(child_process.execSync("npm install --only=prod", {
|
|
encoding: "binary",
|
|
cwd: path.join(__dirname, "distApp", "LightcordApi")
|
|
}))
|
|
|
|
await processNextDir(path.join(__dirname, "DiscordJS"), {
|
|
startDir: path.join(__dirname, "DiscordJS"),
|
|
newDir: path.join(__dirname, "distApp", "DiscordJS")
|
|
}, ((filepath) => filepath.endsWith(".js") && (!production ? !filepath.includes("node_modules") : true)), async (filepath, newpath) => {
|
|
if(filepath.includes("node_modules"))return // don't minify node_modules, and don't include them at all
|
|
console.info(`Minifying ${filepath} to ${newpath}`)
|
|
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
|
|
}).then(() => {
|
|
console.info(`Copied files and minified them from ${path.join(__dirname, "DiscordJS")}.`)
|
|
})
|
|
|
|
await fs.promises.rmdir(path.join(__dirname, "distApp", "DiscordJS", "src"), {"recursive": true})
|
|
await fs.promises.unlink(path.join(__dirname, "distApp", "DiscordJS", "webpack.config.js"))
|
|
await fs.promises.unlink(path.join(__dirname, "distApp", "DiscordJS", "tsconfig.json"))
|
|
|
|
console.log(child_process.execSync("npm install --only=prod", {
|
|
encoding: "binary",
|
|
cwd: path.join(__dirname, "distApp", "LightcordApi")
|
|
}))
|
|
|
|
fs.mkdirSync(path.join(__dirname, "distApp", "BetterDiscordApp", "js"), {recursive: true})
|
|
fs.mkdirSync(path.join(__dirname, "distApp", "BetterDiscordApp", "css"), {recursive: true})
|
|
const BDPackageJSON = require("./BetterDiscordApp/package.json")
|
|
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "package.json"), JSON.stringify(BDPackageJSON), "utf8")
|
|
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "css", "main.css"), fs.readFileSync(path.join(__dirname, "BetterDiscordApp", "css", "main.css")))
|
|
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "css", "main.min.css"), fs.readFileSync(path.join(__dirname, "BetterDiscordApp", "css", "main.min.css")))
|
|
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "js", "main.js"), fs.readFileSync(path.join(__dirname, "BetterDiscordApp", "js", "main.js")))
|
|
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "js", "main.min.js"), fs.readFileSync(path.join(__dirname, "BetterDiscordApp", "js", "main.min.js")))
|
|
|
|
await fs.promises.mkdir(path.join(__dirname, "distApp", "splash", "videos"), {recursive: true})
|
|
await processNextDir(path.join(__dirname, "splash"), {
|
|
startDir: path.join(__dirname, "splash"),
|
|
newDir: path.join(__dirname, "distApp", "splash")
|
|
}, (filepath) => {
|
|
if(filepath.endsWith(".js"))return true
|
|
return false
|
|
}, async (filepath, newpath) => {
|
|
console.info(`Minifying ${filepath} to ${newpath}`)
|
|
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
|
|
}).then(() => {
|
|
console.info(`Copied files and minified them from ${path.join(__dirname, "splash")}.`)
|
|
})
|
|
|
|
let packageJSON = require("./package.json")
|
|
packageJSON.scripts.build = packageJSON.scripts.build.replace("./distApp", ".")
|
|
|
|
fs.writeFileSync(path.join(__dirname, "distApp", "package.json"), JSON.stringify(packageJSON), "utf8")
|
|
|
|
console.info(`Installing ${Object.keys(packageJSON.dependencies).length} packages...`)
|
|
console.log(child_process.execSync("npm install --only=prod", {
|
|
encoding: "binary",
|
|
cwd: path.join(__dirname, "distApp")
|
|
}))
|
|
}
|
|
main() |