diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ba22b1230..0b8ab30a1 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -40,9 +40,26 @@ jobs:
- name: Generate plugin list
run: pnpm generatePluginJson dist/plugins.json dist/plugin-readmes.json
- - name: Clean up obsolete files
+ - name: Collect files to be released
run: |
- rm -rf dist/*-unpacked dist/monaco Vencord.user.css vencordDesktopRenderer.css vencordDesktopRenderer.css.map
+ cd dist
+ mkdir release
+
+ cp browser/browser.* release
+ cp Vencord.user.{js,js.LEGAL.txt} release
+
+ # copy the plugin data jsons, the extension zips and the desktop/vesktop asars
+ cp *.{json,zip,asar} release
+
+ # legacy un-asared files
+ # FIXME: remove at some point
+ cp desktop/* release
+ for file in vesktop/*; do
+ filename=$(basename "$file")
+ cp "$file" "release/vencordDesktop${filename^}"
+ done
+
+ rm release/package.json
- name: Get some values needed for the release
id: release_values
@@ -52,7 +69,7 @@ jobs:
- name: Upload DevBuild as release
if: github.repository == 'Vendicated/Vencord'
run: |
- gh release upload devbuild --clobber dist/*
+ gh release upload devbuild --clobber dist/release/*
gh release edit devbuild --title "DevBuild $RELEASE_TAG"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -69,7 +86,7 @@ jobs:
GLOBIGNORE=.git:.gitignore:README.md:LICENSE
rm -rf *
- cp -r ../dist/* .
+ cp -r ../dist/release/* .
git add -A
git commit -m "Builds for https://github.com/$GITHUB_REPOSITORY/commit/$GITHUB_SHA"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 19295325f..321fbacdb 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -16,6 +16,9 @@ importers:
.:
dependencies:
+ '@electron/asar':
+ specifier: ^3.2.10
+ version: 3.2.10
'@sapphi-red/web-noise-suppressor':
specifier: 0.3.3
version: 0.3.3
@@ -210,6 +213,11 @@ packages:
peerDependencies:
postcss-selector-parser: ^6.0.10
+ '@electron/asar@3.2.10':
+ resolution: {integrity: sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==}
+ engines: {node: '>=10.12.0'}
+ hasBin: true
+
'@esbuild-kit/cjs-loader@2.4.2':
resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==}
@@ -778,6 +786,10 @@ packages:
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ commander@5.1.0:
+ resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
+ engines: {node: '>= 6'}
+
component-emitter@1.3.0:
resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==}
@@ -2553,6 +2565,12 @@ snapshots:
dependencies:
postcss-selector-parser: 6.0.12
+ '@electron/asar@3.2.10':
+ dependencies:
+ commander: 5.1.0
+ glob: 7.2.3
+ minimatch: 3.1.2
+
'@esbuild-kit/cjs-loader@2.4.2':
dependencies:
'@esbuild-kit/core-utils': 3.1.0
@@ -3129,6 +3147,8 @@ snapshots:
commander@2.20.3: {}
+ commander@5.1.0: {}
+
component-emitter@1.3.0: {}
concat-map@0.0.1: {}
diff --git a/scripts/build/build.mjs b/scripts/build/build.mjs
index 817c2cec3..bce5e4eeb 100755
--- a/scripts/build/build.mjs
+++ b/scripts/build/build.mjs
@@ -17,8 +17,9 @@
* along with this program. If not, see .
*/
+import { createPackage } from "@electron/asar";
import esbuild from "esbuild";
-import { readdir } from "fs/promises";
+import { readdir, writeFile } from "fs/promises";
import { join } from "path";
import { BUILD_TIMESTAMP, commonOpts, exists, globPlugins, IS_DEV, IS_REPORTER, IS_STANDALONE, IS_UPDATER_DISABLED, resolvePluginName, VERSION, watch } from "./common.mjs";
@@ -107,7 +108,7 @@ await Promise.all([
esbuild.build({
...nodeCommonOpts,
entryPoints: ["src/main/index.ts"],
- outfile: "dist/patcher.js",
+ outfile: "dist/desktop/patcher.js",
footer: { js: "//# sourceURL=VencordPatcher\n" + sourceMapFooter("patcher") },
sourcemap,
define: {
@@ -123,7 +124,7 @@ await Promise.all([
esbuild.build({
...commonOpts,
entryPoints: ["src/Vencord.ts"],
- outfile: "dist/renderer.js",
+ outfile: "dist/desktop/renderer.js",
format: "iife",
target: ["esnext"],
footer: { js: "//# sourceURL=VencordRenderer\n" + sourceMapFooter("renderer") },
@@ -142,7 +143,7 @@ await Promise.all([
esbuild.build({
...nodeCommonOpts,
entryPoints: ["src/preload.ts"],
- outfile: "dist/preload.js",
+ outfile: "dist/desktop/preload.js",
footer: { js: "//# sourceURL=VencordPreload\n" + sourceMapFooter("preload") },
sourcemap,
define: {
@@ -156,8 +157,8 @@ await Promise.all([
esbuild.build({
...nodeCommonOpts,
entryPoints: ["src/main/index.ts"],
- outfile: "dist/vencordDesktopMain.js",
- footer: { js: "//# sourceURL=VencordDesktopMain\n" + sourceMapFooter("vencordDesktopMain") },
+ outfile: "dist/vesktop/main.js",
+ footer: { js: "//# sourceURL=VencordMain\n" + sourceMapFooter("main") },
sourcemap,
define: {
...defines,
@@ -172,10 +173,10 @@ await Promise.all([
esbuild.build({
...commonOpts,
entryPoints: ["src/Vencord.ts"],
- outfile: "dist/vencordDesktopRenderer.js",
+ outfile: "dist/vesktop/renderer.js",
format: "iife",
target: ["esnext"],
- footer: { js: "//# sourceURL=VencordDesktopRenderer\n" + sourceMapFooter("vencordDesktopRenderer") },
+ footer: { js: "//# sourceURL=VencordRenderer\n" + sourceMapFooter("renderer") },
globalName: "Vencord",
sourcemap,
plugins: [
@@ -191,8 +192,8 @@ await Promise.all([
esbuild.build({
...nodeCommonOpts,
entryPoints: ["src/preload.ts"],
- outfile: "dist/vencordDesktopPreload.js",
- footer: { js: "//# sourceURL=VencordPreload\n" + sourceMapFooter("vencordDesktopPreload") },
+ outfile: "dist/vesktop/preload.js",
+ footer: { js: "//# sourceURL=VencordPreload\n" + sourceMapFooter("preload") },
sourcemap,
define: {
...defines,
@@ -207,3 +208,19 @@ await Promise.all([
if (!commonOpts.watch)
process.exitCode = 1;
});
+
+await Promise.all([
+ writeFile("dist/desktop/package.json", JSON.stringify({
+ name: "vencord",
+ main: "patcher.js"
+ })),
+ writeFile("dist/vesktop/package.json", JSON.stringify({
+ name: "vencord",
+ main: "main.js"
+ }))
+]);
+
+await Promise.all([
+ createPackage("dist/desktop", "dist/desktop.asar"),
+ createPackage("dist/vesktop", "dist/vesktop.asar")
+]);
diff --git a/scripts/build/buildWeb.mjs b/scripts/build/buildWeb.mjs
index bc15ccced..76a62d9c5 100644
--- a/scripts/build/buildWeb.mjs
+++ b/scripts/build/buildWeb.mjs
@@ -73,26 +73,26 @@ await Promise.all(
minify: true,
format: "iife",
outbase: "node_modules/monaco-editor/esm/",
- outdir: "dist/monaco"
+ outdir: "dist/browser/monaco"
}),
esbuild.build({
entryPoints: ["browser/monaco.ts"],
bundle: true,
minify: true,
format: "iife",
- outfile: "dist/monaco/index.js",
+ outfile: "dist/browser/monaco/index.js",
loader: {
".ttf": "file"
}
}),
esbuild.build({
...commonOptions,
- outfile: "dist/browser.js",
+ outfile: "dist/browser/browser.js",
footer: { js: "//# sourceURL=VencordWeb" }
}),
esbuild.build({
...commonOptions,
- outfile: "dist/extension.js",
+ outfile: "dist/browser/extension.js",
define: {
...commonOptions?.define,
IS_EXTENSION: true,
@@ -148,9 +148,9 @@ async function loadDir(dir, basePath = "") {
*/
async function buildExtension(target, files) {
const entries = {
- "dist/Vencord.js": await readFile("dist/extension.js"),
- "dist/Vencord.css": await readFile("dist/extension.css"),
- ...await loadDir("dist/monaco"),
+ "dist/Vencord.js": await readFile("dist/browser/extension.js"),
+ "dist/Vencord.css": await readFile("dist/browser/extension.css"),
+ ...await loadDir("dist/browser/monaco"),
...Object.fromEntries(await Promise.all(RnNoiseFiles.map(async file =>
[`third-party/rnnoise/${file.replace(/^dist\//, "")}`, await readFile(`node_modules/@sapphi-red/web-noise-suppressor/${file}`)]
))),
@@ -171,13 +171,13 @@ async function buildExtension(target, files) {
await rm(target, { recursive: true, force: true });
await Promise.all(Object.entries(entries).map(async ([file, content]) => {
- const dest = join("dist", target, file);
+ const dest = join("dist/browser", target, file);
const parentDirectory = join(dest, "..");
await mkdir(parentDirectory, { recursive: true });
await writeFile(dest, content);
}));
- console.info("Unpacked Extension written to dist/" + target);
+ console.info("Unpacked Extension written to dist/browser/" + target);
}
const appendCssRuntime = readFile("dist/Vencord.user.css", "utf-8").then(content => {
@@ -200,12 +200,14 @@ if (!process.argv.includes("--skip-extension")) {
buildExtension("firefox-unpacked", ["background.js", "content.js", "manifestv2.json", "icon.png"]),
]);
- Zip.sync.zip("dist/chromium-unpacked").compress().save("dist/extension-chrome.zip");
- console.info("Packed Chromium Extension written to dist/extension-chrome.zip");
-
- Zip.sync.zip("dist/firefox-unpacked").compress().save("dist/extension-firefox.zip");
- console.info("Packed Firefox Extension written to dist/extension-firefox.zip");
-
+ Zip.zip("dist/browser/chromium-unpacked", (_err, zip) => {
+ zip.compress().save("dist/extension-chrome.zip");
+ console.info("Packed Chromium Extension written to dist/extension-chrome.zip");
+ });
+ Zip.zip("dist/browser/firefox-unpacked", (_err, zip) => {
+ zip.compress().save("dist/extension-firefox.zip");
+ console.info("Packed Firefox Extension written to dist/extension-firefox.zip");
+ });
} else {
await appendCssRuntime;
}
diff --git a/src/main/updater/common.ts b/src/main/updater/common.ts
index 41b9837c2..5cf9abc15 100644
--- a/src/main/updater/common.ts
+++ b/src/main/updater/common.ts
@@ -16,12 +16,9 @@
* along with this program. If not, see .
*/
-export const VENCORD_FILES = [
- IS_DISCORD_DESKTOP ? "patcher.js" : "vencordDesktopMain.js",
- IS_DISCORD_DESKTOP ? "preload.js" : "vencordDesktopPreload.js",
- IS_DISCORD_DESKTOP ? "renderer.js" : "vencordDesktopRenderer.js",
- IS_DISCORD_DESKTOP ? "renderer.css" : "vencordDesktopRenderer.css",
-];
+export const ASAR_FILE = IS_VESKTOP
+ ? "vesktop.asar"
+ : "desktop.asar";
export function serializeErrors(func: (...args: any[]) => any) {
return async function () {
diff --git a/src/main/updater/http.ts b/src/main/updater/http.ts
index 0738a8c24..887d8e3ef 100644
--- a/src/main/updater/http.ts
+++ b/src/main/updater/http.ts
@@ -26,10 +26,10 @@ import gitHash from "~git-hash";
import gitRemote from "~git-remote";
import { get } from "../utils/simpleGet";
-import { serializeErrors, VENCORD_FILES } from "./common";
+import { ASAR_FILE, serializeErrors } from "./common";
const API_BASE = `https://api.github.com/repos/${gitRemote}`;
-let PendingUpdates = [] as [string, string][];
+let PendingUpdate: string | null = null;
async function githubGet(endpoint: string) {
return get(API_BASE + endpoint, {
@@ -65,22 +65,28 @@ async function fetchUpdates() {
if (hash === gitHash)
return false;
- data.assets.forEach(({ name, browser_download_url }) => {
- if (VENCORD_FILES.some(s => name.startsWith(s))) {
- PendingUpdates.push([name, browser_download_url]);
- }
- });
+
+ const asset = data.assets.find(a => a.name === ASAR_FILE);
+ PendingUpdate = asset.browser_download_url;
+
return true;
}
async function applyUpdates() {
- await Promise.all(PendingUpdates.map(
- async ([name, data]) => writeFile(
- join(__dirname, name),
- await get(data)
- )
- ));
- PendingUpdates = [];
+ if (!PendingUpdate) return true;
+
+ const data = await get(PendingUpdate);
+
+ if (__dirname.endsWith(".asar")) {
+ await writeFile(__dirname, data);
+ } else { // legacy plain folder install
+ await writeFile(join(__dirname, "../vencord.asar"), data);
+
+ await writeFile(__filename, '// legacy install workaround\n\nrequire("../vencord.asar");');
+ }
+
+ PendingUpdate = null;
+
return true;
}