From 74c9bfb597889f38dca74a964b1084809264cef1 Mon Sep 17 00:00:00 2001 From: aiek Date: Fri, 26 Jul 2024 19:08:04 +0300 Subject: [PATCH] Upload files to 'scripts/build' --- scripts/build/build.mts | 98 +++++++++++++++++++++++++++++++++++ scripts/build/injectReact.mjs | 9 ++++ scripts/build/sandboxFix.js | 74 ++++++++++++++++++++++++++ scripts/build/vencordDep.mts | 38 ++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 scripts/build/build.mts create mode 100644 scripts/build/injectReact.mjs create mode 100644 scripts/build/sandboxFix.js create mode 100644 scripts/build/vencordDep.mts diff --git a/scripts/build/build.mts b/scripts/build/build.mts new file mode 100644 index 0000000..8f4e445 --- /dev/null +++ b/scripts/build/build.mts @@ -0,0 +1,98 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + */ + +import { BuildContext, BuildOptions, context } from "esbuild"; +import { copyFile } from "fs/promises"; + +import vencordDep from "./vencordDep.mjs"; + +const isDev = process.argv.includes("--dev"); + +const CommonOpts: BuildOptions = { + minify: !isDev, + bundle: true, + sourcemap: "linked", + logLevel: "info" +}; + +const NodeCommonOpts: BuildOptions = { + ...CommonOpts, + format: "cjs", + platform: "node", + external: ["electron"], + target: ["esnext"], + define: { + IS_DEV: JSON.stringify(isDev) + } +}; + +const contexts = [] as BuildContext[]; +async function createContext(options: BuildOptions) { + contexts.push(await context(options)); +} + +async function copyVenmic() { + if (process.platform !== "linux") return; + + return Promise.all([ + copyFile( + "./node_modules/@vencord/venmic/prebuilds/venmic-addon-linux-x64/node-napi-v7.node", + "./static/dist/venmic-x64.node" + ), + copyFile( + "./node_modules/@vencord/venmic/prebuilds/venmic-addon-linux-arm64/node-napi-v7.node", + "./static/dist/venmic-arm64.node" + ) + ]).catch(() => console.warn("Failed to copy venmic. Building without venmic support")); +} + +await Promise.all([ + copyVenmic(), + createContext({ + ...NodeCommonOpts, + entryPoints: ["src/main/index.ts"], + outfile: "dist/js/main.js", + footer: { js: "//# sourceURL=VCDMain" } + }), + createContext({ + ...NodeCommonOpts, + entryPoints: ["src/preload/index.ts"], + outfile: "dist/js/preload.js", + footer: { js: "//# sourceURL=VCDPreload" } + }), + createContext({ + ...NodeCommonOpts, + entryPoints: ["src/updater/preload.ts"], + outfile: "dist/js/updaterPreload.js", + footer: { js: "//# sourceURL=VCDUpdaterPreload" } + }), + createContext({ + ...CommonOpts, + globalName: "Vesktop", + entryPoints: ["src/renderer/index.ts"], + outfile: "dist/js/renderer.js", + format: "iife", + inject: ["./scripts/build/injectReact.mjs"], + jsxFactory: "VencordCreateElement", + jsxFragment: "VencordFragment", + external: ["@vencord/types/*"], + plugins: [vencordDep], + footer: { js: "//# sourceURL=VCDRenderer" } + }) +]); + +const watch = process.argv.includes("--watch"); + +if (watch) { + await Promise.all(contexts.map(ctx => ctx.watch())); +} else { + await Promise.all( + contexts.map(async ctx => { + await ctx.rebuild(); + await ctx.dispose(); + }) + ); +} diff --git a/scripts/build/injectReact.mjs b/scripts/build/injectReact.mjs new file mode 100644 index 0000000..03160b4 --- /dev/null +++ b/scripts/build/injectReact.mjs @@ -0,0 +1,9 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + */ + +export const VencordFragment = /* #__PURE__*/ Symbol.for("react.fragment"); +export let VencordCreateElement = (...args) => + (VencordCreateElement = Vencord.Webpack.Common.React.createElement)(...args); diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js new file mode 100644 index 0000000..6bd2c97 --- /dev/null +++ b/scripts/build/sandboxFix.js @@ -0,0 +1,74 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + */ + +// Based on https://github.com/gergof/electron-builder-sandbox-fix/blob/master/lib/index.js + +const fs = require("fs/promises"); +const path = require("path"); +let isApplied = false; + +const hook = async () => { + if (isApplied) return; + isApplied = true; + if (process.platform !== "linux") { + // this fix is only required on linux + return; + } + const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget"); + const oldBuildMethod = AppImageTarget.default.prototype.build; + AppImageTarget.default.prototype.build = async function (...args) { + console.log("Running AppImage builder hook", args); + const oldPath = args[0]; + const newPath = oldPath + "-appimage-sandbox-fix"; + // just in case + try { + await fs.rm(newPath, { + recursive: true + }); + } catch {} + + console.log("Copying to apply appimage fix", oldPath, newPath); + await fs.cp(oldPath, newPath, { + recursive: true + }); + args[0] = newPath; + + const executable = path.join(newPath, this.packager.executableName); + + const loaderScript = ` +#!/usr/bin/env bash + +SCRIPT_DIR="$( cd "$( dirname "\${BASH_SOURCE[0]}" )" && pwd )" +IS_STEAMOS=0 + +if [[ "$SteamOS" == "1" && "$SteamGamepadUI" == "1" ]]; then + echo "Running Vesktop on SteamOS, disabling sandbox" + IS_STEAMOS=1 +fi + +exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] && echo '--no-sandbox')" "$@" + `.trim(); + + try { + await fs.rename(executable, executable + ".bin"); + await fs.writeFile(executable, loaderScript); + await fs.chmod(executable, 0o755); + } catch (e) { + console.error("failed to create loder for sandbox fix: " + e.message); + throw new Error("Failed to create loader for sandbox fix"); + } + + const ret = await oldBuildMethod.apply(this, args); + + await fs.rm(newPath, { + recursive: true + }); + + return ret; + }; +}; + +module.exports = hook; diff --git a/scripts/build/vencordDep.mts b/scripts/build/vencordDep.mts new file mode 100644 index 0000000..21029c8 --- /dev/null +++ b/scripts/build/vencordDep.mts @@ -0,0 +1,38 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + */ + +import { globalExternalsWithRegExp } from "@fal-works/esbuild-plugin-global-externals"; + +const names = { + webpack: "Vencord.Webpack", + "webpack/common": "Vencord.Webpack.Common", + utils: "Vencord.Util", + api: "Vencord.Api", + "api/settings": "Vencord", + components: "Vencord.Components" +}; + +export default globalExternalsWithRegExp({ + getModuleInfo(modulePath) { + const path = modulePath.replace("@vencord/types/", ""); + let varName = names[path]; + if (!varName) { + const altMapping = names[path.split("/")[0]]; + if (!altMapping) throw new Error("Unknown module path: " + modulePath); + + varName = + altMapping + + "." + + // @ts-ignore + path.split("/")[1].replaceAll("/", "."); + } + return { + varName, + type: "cjs" + }; + }, + modulePathFilter: /^@vencord\/types.+$/ +});