build, probably gonna remove them or whatever

This commit is contained in:
Jean Ouina 2020-09-05 20:34:23 +02:00
parent 341e079c57
commit d008d04c6f
10 changed files with 308 additions and 152 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -7,14 +7,17 @@ function minify(){
console.log(`\x1b[33mMinifying...\x1b[0m`) console.log(`\x1b[33mMinifying...\x1b[0m`)
const css = fs.readFileSync(path.join(__dirname, "./src/styles/index.css"), "utf-8") const css = fs.readFileSync(path.join(__dirname, "./src/styles/index.css"), "utf-8")
fs.writeFileSync(path.join(__dirname, "./dist/style.css"), css) fs.writeFileSync(path.join(__dirname, "./dist/style.css"), css)
const output = new CleanCSS().minify(css) const output = new CleanCSS({
sourceMap: true
}).minify(css)
if(output.errors.length > 0){ if(output.errors.length > 0){
console.error("\x1b[31m"+output.errors.join("\n")+"\x1b[0m") console.error("\x1b[31m"+output.errors.join("\n")+"\x1b[0m")
} }
if(output.warnings.length > 0){ if(output.warnings.length > 0){
console.warn("\x1b[33m"+output.warnings.join("\n")+"\x1b[0m") console.warn("\x1b[33m"+output.warnings.join("\n")+"\x1b[0m")
} }
fs.writeFileSync(path.join(__dirname, "./dist/style.min.css"), output.styles) fs.writeFileSync(path.join(__dirname, "./dist/style.min.css"), output.styles+"\n/*# sourceMappingURL=style.min.css.map */")
fs.writeFileSync(path.join(__dirname, "./dist/style.min.css.map"), output.sourceMap)
console.log(`\x1b[32mMinified in ${(Date.now() - start)}ms. Minified by ${Math.floor(output.stats.efficiency*100)}%\x1b[0m`) console.log(`\x1b[32mMinified in ${(Date.now() - start)}ms. Minified by ${Math.floor(output.stats.efficiency*100)}%\x1b[0m`)
} }
module.exports.minify = minify module.exports.minify = minify

View File

@ -15,6 +15,7 @@
"./js/**", "./js/**",
"./webpack.config.js", "./webpack.config.js",
"./dist/**", "./dist/**",
"./prod.config.js" "./prod.config.js",
"./docs"
] ]
} }

View File

@ -3,43 +3,57 @@ const fsAsync = fs.promises
const yazl = require("yazl") const yazl = require("yazl")
const __path = require("path") const __path = require("path")
fs.unlinkSync(__path.join(__dirname, "builds", "lightcord-win32-ia32.zip")) const buildsPaths = __path.join(__dirname, "builds")
fs.unlinkSync(__path.join(__dirname, "builds", "lightcord-linux-x64.zip")) const folders = [
"lightcord-win32-ia32",
"lightcord-linux-x64",
"lightcord-darwin-x64"
]
folders.forEach(folder => {
const path = __path.join(buildsPaths, folder)
if(!fs.existsSync(path))return console.warn(`\x1b[33mCan't pack build ${folder} because it doesn't exist.\x1b[0m`)
const zipPath = __path.join(buildsPaths, folder+".zip")
if(fs.existsSync(zipPath)){
console.warn(`Deleting ${zipPath}.`)
fs.unlinkSync(zipPath)
}
const zip = new yazl.ZipFile()
zip.outputStream.pipe(fs.createWriteStream(zipPath))
const winZip = new yazl.ZipFile() const platform = folder.split("-")[1]
winZip.outputStream.pipe(fs.createWriteStream(__path.join(__dirname, "builds", "lightcord-win32-ia32.zip"))) processNextDir(path, zip, platform)
.then(() => {
console.log(`Zipped ${platform}.`)
zip.end()
})
})
const linuxZip = new yazl.ZipFile() async function processNextDir(dir, zip, platform, bpath = dir){
linuxZip.outputStream.pipe(fs.createWriteStream(__path.join(__dirname, "builds", "lightcord-linux-x64.zip")))
const darwinZip = new yazl.ZipFile()
darwinZip.outputStream.pipe(fs.createWriteStream(__path.join(__dirname, "builds", "lightcord-darwin-x64.zip")))
async function processNextDir(dir, zip, bpath, platform){
if(!bpath)bpath = dir
if(dir.replace(bpath, ""))zip.addEmptyDirectory(dir.replace(bpath, "").slice(1)) if(dir.replace(bpath, ""))zip.addEmptyDirectory(dir.replace(bpath, "").slice(1))
await Promise.all(fs.readdirSync(dir, {withFileTypes: true}) await Promise.all(fs.readdirSync(dir, {withFileTypes: true})
.map(async file => { .map(async file => {
let path = __path.join(dir, file.name) let path = __path.join(dir, file.name)
if(file.isDirectory()){ if(file.isDirectory()){
return await processNextDir(path, zip, bpath, platform) return await processNextDir(path, zip, platform, bpath)
}else if(file.isFile()){ }else if(file.isFile()){
if(!path.includes("node_modules")){ if(!path.includes("node_modules")){
if(platform === "win"){ if(platform === "win32"){
if(file.name.endsWith("_linux.node"))return if(file.name.endsWith("_linux.node"))return
if(file.name.endsWith("_darwin.node"))return if(file.name.endsWith("_darwin.node"))return
}else if(platform === "lin"){ if(file.name.endsWith(".dylib"))return
if(file.name.endsWith(".node")){ if(file.name.endsWith(".so.4"))return
if(!file.name.endsWith("_linux.node"))return }else if(platform === "linux"){
}else if(platform === "dar"){ if(file.name.endsWith("_win32.node"))return
if(file.name.endsWith(".node")){ if(file.name.endsWith("_darwin.node"))return
if(!file.name.endsWith("_darwin.node"))return if(file.name.endsWith(".dylib"))return
}
}
if(file.name.endsWith(".dll"))return if(file.name.endsWith(".dll"))return
}else if(platform === "darwin"){
if(file.name.endsWith("_linux.node"))return
if(file.name.endsWith("_win32.node"))return
if(file.name.endsWith(".dll"))return
if(file.name.endsWith(".so.4"))return
} }
} }
console.log("Adding "+file.name+" to "+platform)
let stat = fs.statSync(path) let stat = fs.statSync(path)
zip.addBuffer(await fsAsync.readFile(path), __path.relative(bpath, path), { zip.addBuffer(await fsAsync.readFile(path), __path.relative(bpath, path), {
mode: stat.mode, mode: stat.mode,
@ -47,22 +61,4 @@ async function processNextDir(dir, zip, bpath, platform){
}) })
} }
})) }))
} }
processNextDir(__path.join(__dirname, "builds", "lightcord-win32-ia32"), winZip, undefined, "win")
.then(() => {
console.log(`Zipped win32.`)
winZip.end()
})
processNextDir(__path.join(__dirname, "builds", "lightcord-linux-x64"), linuxZip, undefined, "lin")
.then(() => {
console.log(`Zipped linux.`)
linuxZip.end()
})
processNextDir(__path.join(__dirname, "builds", "lightcord-darwin-x64", darwinZip, undefined, "dar"))
.then(()=> {
console.log('Zipped Darwin')
darwinZip.end()
})

240
build.js
View File

@ -4,6 +4,7 @@ const terser = require("terser")
const util = require("util") const util = require("util")
const production = true const production = true
const includeSourcesMaps = true
let fs = require("fs") let fs = require("fs")
@ -15,6 +16,87 @@ console.info = (...args) => {
} }
let commit = child_process.execSync("git rev-parse HEAD").toString().split("\n")[0].trim() let commit = child_process.execSync("git rev-parse HEAD").toString().split("\n")[0].trim()
console.info(`Obtained commit ${commit} for the build`) console.info(`Obtained commit ${commit} for the build`)
async function processNextDir(folder, folders, predicate, compile, ignoreModules){
if(typeof ignoreModules === "undefined")ignoreModules = false
let files = fs.readdirSync(folder, {withFileTypes: true})
for(let file of files){
if(file.isFile()){
let isMinified = file.name.endsWith(".min.js") || file.name.endsWith(".min.css")
let filepath = path.join(folder, file.name)
let type = file.name.split(".").pop().toLowerCase()
if(type === file.name)type = ""
if([
"ts",
"md",
"gitignore",
"map"
].includes(type)){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because of type ${type}\x1b[0m`)
continue
}
if([
"tsconfig.json",
"webpack.config.js"
].includes(file.name)){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because of name ${file.name}\x1b[0m`)
continue
}
if(folders.exclude && folders.exclude.test(filepath)){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because regex\x1b[0m`)
continue
}
let hasMinifiedVersion = (type === "js" || type === "css") && !isMinified && files.find(f => {
return f.name === file.name.split(".").slice(0, -1).join(".")+".min."+type
})
if(hasMinifiedVersion){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because it has a minified version.\x1b[0m`)
continue
}
if(!isMinified && predicate(filepath) && filepath.split(/[\\/]+/).reverse()[1] !== "js"){
await compile(filepath, path.join(filepath.replace(folders.startDir, folders.newDir)), "..")
}else{
if(["js", "css"].includes(type)){
if(!includeSourcesMaps){
console.log(`We don't include sourcemap for this build. Skipping ${file.name}.`)
return await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
}
let fileContent = (await fs.promises.readFile(filepath, "utf8"))
let sourceMap = fileContent.split(/[\n\r]+/g).pop()
if(!sourceMap || !sourceMap.startsWith("//# sourceMappingURL=")){
console.log(`This file doesn't have sourcemap. ${file.name}.`)
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
continue
}
let sourceMapContent
if(sourceMap.slice(21).startsWith("data:")){
console.log(`Extracting sourcemap from data uri. From file ${file.name}.`)
sourceMapContent = Buffer.from(sourceMap.split("=").slice(1).join("="), "base64").toString("utf-8")
}else{
console.log(`Extracting sourcemap from file ${file.name}.map.`)
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
sourceMapContent = await fs.promises.readFile(path.join(folder, sourceMap.slice(21)), "utf8")
}
sourceMapContent = JSON.parse(sourceMapContent)
sourceMapContent.sourcesContent = []
let sourceMapPath = filepath + ".map"
fileContent = fileContent
// source map
.replace(sourceMap, "//# sourceMappingURL="+filepath.split(/[\\\/]+/g).pop()+".map")
await fs.promises.writeFile(filepath.replace(folders.startDir, folders.newDir), fileContent)
await fs.promises.writeFile(filepath.replace(folders.startDir, folders.newDir)+".map", JSON.stringify(sourceMapContent))
}else{
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
}
}
}else if(file.isDirectory()){
if(ignoreModules && file.name === "node_modules")continue
if(folders.exclude && folders.exclude.test(path.join(folder, file.name)))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))
}
}
}
async function main(){ async function main(){
let startTimestamp = Date.now() let startTimestamp = Date.now()
@ -25,91 +107,19 @@ async function main(){
await fs.promises.mkdir(__dirname+"/distApp/dist", {"recursive": true}) await fs.promises.mkdir(__dirname+"/distApp/dist", {"recursive": true})
console.info("Executing command `npm run compile`") console.info("Executing command `npm run compile`")
console.log(child_process.execSync("npm run compile", {encoding: "binary"})) child_process.execSync("npm run compile", {
encoding: "binary",
stdio: "inherit"
})
let startDir = path.join(__dirname, "./dist") let startDir = path.join(__dirname, "./dist")
let newDir = path.join(__dirname, "./distApp/dist") let newDir = path.join(__dirname, "./distApp/dist")
console.info("No error detected. Copying files from "+startDir+".") console.info("No error detected. Copying files from "+startDir+".")
await fs.promises.mkdir(startDir, {recursive: true}) await fs.promises.mkdir(startDir, {recursive: true})
async function processNextDir(folder, folders, predicate, compile, ignoreModules){
if(typeof ignoreModules === "undefined")ignoreModules = false
let files = fs.readdirSync(folder, {withFileTypes: true})
for(let file of files){
if(file.isFile()){
let isMinified = file.name.endsWith(".min.js") || file.name.endsWith(".min.css")
let filepath = path.join(folder, file.name)
let type = file.name.split(".").pop().toLowerCase()
if(type === file.name)type = ""
if([
"ts",
"md",
"gitignore",
"map"
].includes(type)){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because of type ${type}\x1b[0m`)
continue
}
if([
"tsconfig.json",
"webpack.config.js"
].includes(file.name)){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because of name ${file.name}\x1b[0m`)
continue
}
if(folders.exclude && folders.exclude.test(filepath)){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because regex\x1b[0m`)
continue
}
let hasMinifiedVersion = (type === "js" || type === "css") && !isMinified && files.find(f => {
return f.name === file.name.split(".").slice(0, -1).join(".")+".min."+type
})
if(hasMinifiedVersion){
console.warn(`\x1b[33mIgnored file ${path.relative(folders.startDir, filepath)} because it has a minified version.\x1b[0m`)
continue
}
if(!isMinified && predicate(filepath) && filepath.split(/[\\/]+/).reverse()[1] !== "js"){
await compile(filepath, path.join(filepath.replace(folders.startDir, folders.newDir)), "..")
}else{
if(["js", "css"].includes(type)){
let fileContent = (await fs.promises.readFile(filepath, "utf8"))
let sourceMap = fileContent.split(/[\n\r]+/g).pop()
if(!sourceMap.startsWith("//# sourceMappingURL=")){
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
continue
}
let sourceMapContent
if(sourceMap.slice(21).startsWith("data:")){
sourceMapContent= Buffer.from(sourceMap.split("=").slice(1).join("="), "base64")
}else{
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
continue
//let file = path.dirname(filepath)+"/"+sourceMap.slice(21)
//sourceMapContent = fs.readFileSync(file)
}
let sourceMapPath = filepath + ".map"
let pth = path.posix.resolve(sourceMapPath.replace(__dirname, "").replace(/\\/g, "/"))
fileContent = fileContent
// source map
.replace(sourceMap, "//# sourceMappingURL=https://rawcdn.githack.com/Lightcord/Lightcord/"+commit+pth)
await fs.promises.writeFile(filepath.replace(folders.startDir, folders.newDir), fileContent)
await fs.promises.writeFile(sourceMapPath, sourceMapContent)
}else{
await fs.promises.copyFile(filepath, filepath.replace(folders.startDir, folders.newDir))
}
}
}else if(file.isDirectory()){
if(ignoreModules && file.name === "node_modules")continue
if(folders.exclude && folders.exclude.test(path.join(folder, file.name)))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, { await processNextDir(startDir, {
startDir, startDir,
newDir, newDir
exclude: /node_modules/g
}, ((filepath) => filepath.endsWith(".js")), async (filepath, newpath) => { }, ((filepath) => filepath.endsWith(".js")), async (filepath, newpath) => {
console.info(`Minifying ${filepath} to ${newpath}`) console.info(`Minifying ${filepath} to ${newpath}`)
@ -118,14 +128,14 @@ async function main(){
}else{ }else{
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8") await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
} }
}).then(() => { }, true).then(() => {
console.info(`Copied files and minified them from ${startDir}.`) console.info(`Copied files and minified them from ${startDir}.`)
}) })
await processNextDir(path.join(__dirname, "modules"), { await processNextDir(path.join(__dirname, "modules"), {
startDir: path.join(__dirname, "modules"), startDir: path.join(__dirname, "modules"),
newDir: path.join(__dirname, "distApp", "modules"), newDir: path.join(__dirname, "distApp", "modules"),
exclude: /node_modules/g exclude: /discord_spellcheck/g
}, ((filepath) => filepath.endsWith(".js")), async (filepath, newpath) => { }, ((filepath) => filepath.endsWith(".js")), async (filepath, newpath) => {
console.info(`Minifying ${filepath} to ${newpath}`) console.info(`Minifying ${filepath} to ${newpath}`)
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8") await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
@ -145,31 +155,39 @@ async function main(){
} }
console.info(`Installing modules for ${mdl}`) console.info(`Installing modules for ${mdl}`)
console.log(child_process.execSync("npm install --only=prod", { child_process.execSync("npm install --only=prod", {
encoding: "binary", encoding: "binary",
cwd: dir cwd: dir,
})) stdio: "inherit"
})
})) }))
await fs.promises.mkdir(path.join(__dirname, "distApp", "modules", "discord_spellcheck"), {recursive: true})
await processNextDir(path.join(__dirname, "modules", "discord_spellcheck"), {
startDir: path.join(__dirname, "modules", "discord_spellcheck"),
newDir: path.join(__dirname, "distApp", "modules", "discord_spellcheck")
}, ((filepath) => filepath.endsWith(".js")), async (filepath, newpath) => {
console.info(`Minifying ${filepath} to ${newpath}`)
await fs.promises.writeFile(newpath, terser.minify(await fs.promises.readFile(filepath, "utf8")).code, "utf8")
}, false).then(() => {
console.info(`Copied files and minified them from ${path.join(__dirname, "modules")}.`)
})
await processNextDir(path.join(__dirname, "LightcordApi"), { await processNextDir(path.join(__dirname, "LightcordApi"), {
startDir: path.join(__dirname, "LightcordApi"), startDir: path.join(__dirname, "LightcordApi"),
newDir: path.join(__dirname, "distApp", "LightcordApi"), newDir: path.join(__dirname, "distApp", "LightcordApi"),
exclude: /(src|webpack\.config\.js|tsconfig\.json|dist)/g exclude: /(src|webpack\.config\.js|tsconfig\.json|dist|docs)/g
}, ((filepath) => filepath.endsWith(".js") && (!production ? !filepath.includes("node_modules") : true)), async (filepath, newpath) => { }, ((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 await fs.promises.copyFile(filepath, newpath)
console.info(`Minifying ${filepath} to ${newpath}`)
let fileContent = (await fs.promises.readFile(filepath, "utf8"))
// source map
.replace(/\/\/# sourceMappingURL=/, "//# sourceMappingURL=https://raw.githubusercontent.com/Lightcord/Lightcord/"+commit+"/LightcordApi/js/")
await fs.promises.writeFile(newpath, fileContent, "utf8")
}, true).then(() => { }, true).then(() => {
console.info(`Copied files and minified them from ${path.join(__dirname, "LightcordApi")}.`) console.info(`Copied files and minified them from ${path.join(__dirname, "LightcordApi")}.`)
}) })
console.log(child_process.execSync("npm install --only=prod", { child_process.execSync("npm install --only=prod", {
encoding: "binary", encoding: "binary",
cwd: path.join(__dirname, "distApp", "LightcordApi") cwd: path.join(__dirname, "distApp", "LightcordApi"),
})) stdio: "inherit"
})
function processDJS(dir){ function processDJS(dir){
fs.mkdirSync(path.join(__dirname, "distApp", "DiscordJS", dir), {recursive: true}) fs.mkdirSync(path.join(__dirname, "distApp", "DiscordJS", dir), {recursive: true})
@ -191,17 +209,34 @@ async function main(){
await processDJS("dist") await processDJS("dist")
await copyFileDJS("package.json") await copyFileDJS("package.json")
console.log(child_process.execSync("npm install --only=prod", { child_process.execSync("npm install --only=prod", {
encoding: "binary", encoding: "binary",
cwd: path.join(__dirname, "distApp", "DiscordJS") cwd: path.join(__dirname, "distApp", "DiscordJS"),
})) stdio: "inherit"
})
fs.mkdirSync(path.join(__dirname, "distApp", "BetterDiscordApp", "dist"), {recursive: true}) fs.mkdirSync(path.join(__dirname, "distApp", "BetterDiscordApp", "dist"), {recursive: true})
const BDPackageJSON = require("./BetterDiscordApp/package.json") 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", "package.json"), JSON.stringify(BDPackageJSON), "utf8")
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "dist", "style.min.css"), fs.readFileSync(path.join(__dirname, "BetterDiscordApp", "dist", "style.min.css"))) const files = [
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "dist", "index.min.js"), fs.readFileSync(path.join(__dirname, "BetterDiscordApp", "dist", "index.min.js"))) "index.min.js",
"style.min.css"
]
files.forEach(e => {
files.push(e + ".map")
})
files.forEach(e => {
const pth = path.join(__dirname, "BetterDiscordApp", "dist", e)
if(!fs.existsSync(pth))return console.error(`\x1b[31mFile ${pth} from betterdiscord does not exist.\x1b[0m`)
if(e.endsWith(".map")){
const data = JSON.parse(fs.readFileSync(pth, "utf8"))
data.sourcesContent = []
fs.writeFileSync(path.join(__dirname, "distApp", "BetterDiscordApp", "dist", e), JSON.stringify(data))
}else{
fs.copyFileSync(pth, path.join(__dirname, "distApp", "BetterDiscordApp", "dist", e))
}
})
await fs.promises.mkdir(path.join(__dirname, "distApp", "splash", "videos"), {recursive: true}) await fs.promises.mkdir(path.join(__dirname, "distApp", "splash", "videos"), {recursive: true})
await processNextDir(path.join(__dirname, "splash"), { await processNextDir(path.join(__dirname, "splash"), {
startDir: path.join(__dirname, "splash"), startDir: path.join(__dirname, "splash"),
@ -226,10 +261,11 @@ async function main(){
fs.writeFileSync(path.join(__dirname, "distApp", "package.json"), JSON.stringify(packageJSON), "utf8") fs.writeFileSync(path.join(__dirname, "distApp", "package.json"), JSON.stringify(packageJSON), "utf8")
console.info(`Installing ${Object.keys(packageJSON.dependencies).length} packages...`) console.info(`Installing ${Object.keys(packageJSON.dependencies).length} packages...`)
console.log(child_process.execSync("npm install --only=prod", { child_process.execSync("npm install --only=prod", {
encoding: "binary", encoding: "binary",
cwd: path.join(__dirname, "distApp") cwd: path.join(__dirname, "distApp"),
})) stdio: "inherit"
})
console.info("Build took "+(Date.now() - startTimestamp) +"ms.") console.info("Build took "+(Date.now() - startTimestamp) +"ms.")
} }
main() main()

119
build_electron.js Normal file
View File

@ -0,0 +1,119 @@
const spawn = require("cross-spawn")
const path = require("path")
const { existsSync, promises: fsPromises } = require("fs")
const supportedPlatforms = []
const Platforms = {
linux: {
name: "linux",
run: () => {
return awaitExec("npm", ["run", "build:electron_linux"])
}
},
win: {
name: "win",
run: () => {
return awaitExec("npm", ["run", "build:electron_win"])
}
},
mac: {
name: "mac",
run: () => {
return awaitExec("npm", ["run", "build:electron_darwin"])
}
},
mac_experimental: {
name: "mac",
experimental: true,
run: async () => {
const basePath = path.join(__dirname, "..", "lightcord-darwin-x64")
const nextPath = path.join(__dirname, "builds", "lightcord-darwin-x64")
if(existsSync(nextPath)){
console.log(`Cleaning ${nextPath}.`)
await fsPromises.rmdir(nextPath, {recursive: true})
}
console.log(`Copying files from ${basePath}.`)
let nextDir = async (pth) => {
const newPath = pth.replace(basePath, nextPath)
await fsPromises.mkdir(newPath)
for(let file of await fsPromises.readdir(pth, {withFileTypes: true})){
const filePath = path.join(pth, file.name)
const newFilePath = path.join(newPath, file.name)
if(file.isFile()){
await fsPromises.copyFile(filePath, newFilePath)
}else if(file.isDirectory()){
await nextDir(filePath)
}
}
}
await nextDir(basePath)
console.log(`Files are copied. Erasing current bundle if existing.`)
const asarPath = path.join(nextPath, "lightcord.app", "Contents", "Resources", "app.asar")
if(existsSync(asarPath))await fsPromises.unlink(asarPath)
const asarUnpackPath = path.join(nextPath, "lightcord.app", "Contents", "Resources", "app.asar.unpacked")
if(existsSync(asarUnpackPath))await fsPromises.rmdir(asarUnpackPath, {recursive: true})
const asar = require("asar")
await asar.createPackageWithOptions(path.join(__dirname, "distApp"), asarPath, {
unpack: "*.{node,dylib,so.4,dll}",
unpackDir: asarUnpackPath
})
const iconPath = path.join(__dirname, "app_icon_darwin.icns")
if(existsSync(iconPath)){
console.log(`Setting icon.`)
const newIconPath = path.join(nextPath, "lightcord.app", "Contents", "Resources", "electron.icns")
await fsPromises.copyFile(iconPath, newIconPath)
}
}
}
}
switch(process.platform){
case "win32":
supportedPlatforms.push(Platforms.win)
supportedPlatforms.push(Platforms.linux)
if(existsSync(path.join(__dirname, "..", "lightcord-darwin-x64"))){
supportedPlatforms.push(Platforms.mac_experimental)
}
break
case "linux":
supportedPlatforms.push(Platforms.linux)
if(existsSync(path.join(__dirname, "..", "lightcord-darwin-x64"))){
supportedPlatforms.push(Platforms.mac_experimental)
}
break
case "darwin":
supportedPlatforms.push(Platforms.mac)
supportedPlatforms.push(Platforms.linux)
break
}
(async function(){
console.log(`[\x1b[33mINFO\x1b[0m] Will build platforms \x1b[34m${supportedPlatforms.map(e => e.name).join("\x1b[0m, \x1b[34m")}\x1b[0m`)
for(let platform of supportedPlatforms){
console.log(`[\x1b[33mINFO\x1b[0m] Building platform ${platform.name}`)
if(platform.experimental)console.warn(`[\x1b[33mWARN\x1b[0m] This platform is experimental`)
await platform.run()
}
})().catch(err => {
console.error(`Couldn't package app for electrons. Error: ${err}`)
})
function awaitExec(command, args = []){
return new Promise((resolve, reject) => {
const child = spawn.spawn(command, args, {
env: process.env,
cwd: process.cwd(),
stdio: "inherit"
})
child.on("close", (code) => {
console.log()
console.log()
console.log(`Command ${command}${args.length > 0 ? " " + args.join(" ") : ""} ended with code ${code}.`)
if(code !== 0){
console.error("\x1b[31mFAILURE\x1b[0m Command failed. See logs above.")
return reject(code)
}
resolve()
})
})
}

View File

@ -17,4 +17,4 @@ discord links are on [Lightcord's support server](https://discord.gg/7eFff2A)
- [ ] Fixing #21 - [ ] Fixing #21
- [ ] Update electron version to fix spellchecker problems. - [ ] Update electron version to fix spellchecker problems.
- [ ] fix all the shit with folders structure (native addons, building, etc) - [ ] fix all the shit with folders structure (native addons, building, etc)
- [ ] update glasstron to the latest version. - [x] update glasstron to the latest version.