mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-10-05 10:20:46 +00:00
c0643fadca
Historically we've used copy-cat to provide a web-based emulator for running example code on our documentation site. However, copy-cat is often out-of-date with CC:T, which means example snippets fail when you try to run them! This commit vendors in copy-cat (or rather an updated version of it) into CC:T itself, allowing us to ensure the emulator is always in sync with the mod. While the ARCHITECTURE.md documentation goes into a little bit more detail here, the general implementation is as follows - In project/src/main we implement the core of the emulator. This includes a basic reimplementation of some of CC's classes to work on the web (mostly the HTTP API and ComputerThread), and some additional code to expose the computers to Javascript. - This is all then compiled to Javascript using [TeaVM][1] (we actually use a [personal fork of it][2] as there's a couple of changes I've not upstreamed yet). - The Javascript side then pulls in the these compiled classes (and the CC ROM) and hooks them up to [cc-web-term][3] to display the actual computer. - As we're no longer pulling in copy-cat, we can simplify our bundling system a little - we now just compile to ESM modules directly. [1]: https://github.com/konsoletyper/teavm [2]: https://github.com/SquidDev/teavm/tree/squid-patches [3]: https://github.com/squiddev-cc/cc-web-term
69 lines
1.9 KiB
JavaScript
69 lines
1.9 KiB
JavaScript
// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
|
|
//
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
import path from "path";
|
|
|
|
import terser from "@rollup/plugin-terser";
|
|
import resolve from "@rollup/plugin-node-resolve";
|
|
import typescript from "@rollup/plugin-typescript";
|
|
import url from "@rollup/plugin-url";
|
|
import postcss from "rollup-plugin-postcss";
|
|
|
|
const input = "src/frontend";
|
|
|
|
const minify = args => !args.configDebug;
|
|
|
|
/** @type import("rollup").RollupOptionsFunction */
|
|
export default args => ({
|
|
input: [`${input}/index.tsx`],
|
|
output: {
|
|
// Also defined in build.gradle.kts
|
|
dir: "build/rollup/",
|
|
|
|
format: "esm",
|
|
generatedCode: {
|
|
preset: "es2015",
|
|
constBindings: true,
|
|
},
|
|
},
|
|
context: "window",
|
|
|
|
plugins: [
|
|
typescript(),
|
|
resolve({ browser: true }),
|
|
|
|
url({
|
|
include: ["**/*.dfpwm", "**/*.worker.js", "**/*.png"],
|
|
fileName: "[name]-[hash][extname]",
|
|
publicPath: "/",
|
|
limit: 0,
|
|
}),
|
|
|
|
postcss({
|
|
namedExports: true,
|
|
minimize: minify(args),
|
|
extract: true,
|
|
}),
|
|
|
|
{
|
|
name: "cc-tweaked",
|
|
async transform(code, file) {
|
|
// Allow loading files in /mount.
|
|
const ext = path.extname(file);
|
|
return ext != ".dfpwm" && path.dirname(file) === path.resolve(`${input}/mount`)
|
|
? `export default ${JSON.stringify(code)};\n`
|
|
: null;
|
|
},
|
|
|
|
async resolveId(source) {
|
|
if (source === "cct/classes") return path.resolve("build/teaVM/classes.js");
|
|
if (source === "cct/resources") return path.resolve("build/teaVM/resources.js");
|
|
return null;
|
|
},
|
|
},
|
|
|
|
minify(args) && terser(),
|
|
],
|
|
});
|