build: inject createElement alias (#176)

main
Ven 2 years ago committed by GitHub
parent 37105ac416
commit 93859883c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,7 +17,6 @@
*/
import { exec, execSync } from "child_process";
import esbuild from "esbuild";
import { existsSync } from "fs";
import { readdir, readFile } from "fs/promises";
import { join } from "path";
@ -142,7 +141,7 @@ export const fileIncludePlugin = {
};
/**
* @type {esbuild.BuildOptions}
* @type {import("esbuild").BuildOptions}
*/
export const commonOpts = {
logLevel: "info",
@ -152,5 +151,10 @@ export const commonOpts = {
sourcemap: watch ? "inline" : "",
legalComments: "linked",
plugins: [fileIncludePlugin, gitHashPlugin, gitRemotePlugin],
external: ["~plugins", "~git-hash", "~git-remote"]
external: ["~plugins", "~git-hash", "~git-remote"],
inject: ["./scripts/build/inject/react.mjs"],
jsxFactory: "VencordCreateElement",
jsxFragment: "VencordFragment",
// Work around https://github.com/evanw/esbuild/issues/2460
tsconfig: "./scripts/build/tsconfig.esbuild.json"
};

@ -0,0 +1,21 @@
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export const VencordFragment = Symbol.for("react.fragment");
export let VencordCreateElement =
(...args) => (VencordCreateElement = Vencord.Webpack.Common.React.createElement)(...args);

@ -0,0 +1,7 @@
// Work around https://github.com/evanw/esbuild/issues/2460
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"jsx": "react"
}
}

@ -23,7 +23,6 @@ import { useAwaiter } from "../utils/misc";
import { Alerts, Button, Forms, Margins, Parser, React, Switch } from "../webpack/common";
import ErrorBoundary from "./ErrorBoundary";
import { Flex } from "./Flex";
import { launchMonacoEditor } from "./Monaco";
export default ErrorBoundary.wrap(function Settings() {
const [settingsDir, , settingsDirPending] = useAwaiter(() => VencordNative.ipc.invoke<string>(IpcEvents.GET_SETTINGS_DIR), "Loading...");
@ -85,7 +84,7 @@ export default ErrorBoundary.wrap(function Settings() {
</Flex>}
{IS_WEB && <Button
onClick={launchMonacoEditor}
onClick={() => require("./Monaco").launchMonacoEditor()}
size={Button.Sizes.SMALL}
disabled={settingsDir === "Loading..."}
>

9
src/globals.d.ts vendored

@ -16,7 +16,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import React from "react";
declare global {
/**
@ -49,12 +48,6 @@ declare global {
*/
export var DiscordNative: any;
// jsFactory, here to make ts happy
/** Shorter alias for React.createElement to reduce bundle size, don't use this. */
export var _Ve$: typeof React["createElement"];
/** Shorter alias for React.Fragment to reduce bundle size, don't use this. */
export var _VF$: typeof React["Fragment"];
interface Window {
webpackChunkdiscord_app: {
push(chunk: any): any;
@ -63,3 +56,5 @@ declare global {
[k: string]: any;
}
}
export { };

@ -115,11 +115,7 @@ export const Clipboard = mapMangledModuleLazy('document.queryCommandEnabled("cop
SUPPORTS_COPY: x => typeof x === "boolean",
});
waitFor("useState", m => {
window._Ve$ = m.createElement;
window._VF$ = m.Fragment;
React = m;
});
waitFor("useState", m => React = m);
waitFor(["dispatch", "subscribe"], m => {
FluxDispatcher = m;

@ -14,11 +14,7 @@
"strict": true,
"noImplicitAny": false,
"target": "ESNEXT",
// https://esbuild.github.io/api/#jsx-factory
// these short window aliases make the bundle ~10% smaller
"jsxFactory": "_Ve$",
"jsxFragmentFactory": "_VF$",
"jsx": "react"
"jsx": "preserve"
},
"include": ["src/**/*"]
}

Loading…
Cancel
Save