From dd51a3662b9bacd7c19f4be889c410003b3cdaf4 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sun, 10 Oct 2021 11:02:25 +0200 Subject: :sparkles: changed and fixed compiler --- bundle/.gitignore | 2 - bundle/.vscode/launch.json | 10 ++-- bundle/scripts/build.js | 112 ++++++--------------------------------------- bundle/scripts/install.js | 14 ++++++ bundle/src/Server.ts | 2 +- bundle/src/start.ts | 16 ------- bundle/src/stats.ts | 10 +++- bundle/tsconfig.json | 30 +++++++++--- 8 files changed, 66 insertions(+), 130 deletions(-) delete mode 100644 bundle/.gitignore create mode 100644 bundle/scripts/install.js (limited to 'bundle') diff --git a/bundle/.gitignore b/bundle/.gitignore deleted file mode 100644 index cf073d9c..00000000 --- a/bundle/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -files/ -.env \ No newline at end of file diff --git a/bundle/.vscode/launch.json b/bundle/.vscode/launch.json index 917f2a93..aa4e743a 100644 --- a/bundle/.vscode/launch.json +++ b/bundle/.vscode/launch.json @@ -8,13 +8,11 @@ "sourceMaps": true, "type": "node", "request": "launch", - "name": "Launch server bundle", - "program": "${workspaceFolder}/dist/start.js", - "runtimeArgs": ["-r", "./tsconfig-paths-bootstrap.js"], + "name": "Launch Server", + "program": "${workspaceFolder}/dist/bundle/src/start.js", "preLaunchTask": "tsc: build - tsconfig.json", - "outFiles": ["${workspaceFolder}/dist/**/*.js", "${workspaceFolder}/node_modules/@fosscord/**/*.js"], - "envFile": "${workspaceFolder}/.env", - "outDir": "${workspaceFolder}/dist" + "outFiles": ["${workspaceFolder}/dist/**/*.js"], + "envFile": "${workspaceFolder}/.env" } ] } diff --git a/bundle/scripts/build.js b/bundle/scripts/build.js index 4266942f..2a82ec57 100644 --- a/bundle/scripts/build.js +++ b/bundle/scripts/build.js @@ -1,103 +1,19 @@ -const { spawn } = require("child_process"); +const { execSync } = require("child_process"); const path = require("path"); -const fs = require("fs"); -const { performance } = require("perf_hooks"); +const fse = require("fs-extra"); -let parts = "api,cdn,gateway,bundle".split(","); -const tscBin = path.join(__dirname, "..", "..", "util", "node_modules", "typescript", "bin", "tsc"); -const swcBin = path.join(__dirname, "..", "..", "util", "node_modules", "@swc", "cli", "bin", "swc"); +const api = path.join(__dirname, "..", "..", "api"); +const dist = path.join(__dirname, "..", "dist"); -// because npm run is slow we directly get the build script of the package.json script +fse.copySync(path.join(api, "assets"), path.join(dist, "api", "assets")); +fse.copySync(path.join(api, "client_test"), path.join(dist, "api", "client_test")); +fse.copySync(path.join(api, "locales"), path.join(dist, "api", "locales")); -function buildPackage(dir) { - const element = path.basename(dir); - - return require("esbuild").build({ - entryPoints: walk(path.join(dir, "src")), - bundle: false, - outdir: path.join(dir, "dist"), - target: "es2021", - // plugins don't really work because bundle is false - keepNames: false, - tsconfig: path.join(dir, "tsconfig.json"), - }); -} - -const importPart = /import (\* as )?(({[^}]+})|(\w+)) from ("[.\w-/@q]+")/g; -const importMod = /import ("[\w-/@q.]+")/g; -const exportDefault = /export default/g; -const exportAllAs = /export \* from (".+")/g; -const exportMod = /export ({[\w, ]+})/g; -const exportConst = /export (const|var|let) (\w+)/g; -const exportPart = /export ((async )?\w+) (\w+)/g; - -// resolves tsconfig paths + rewrites es6 imports/exports to require (because esbuild/swc doesn't work properly) -function transpileFiles() { - for (const part of ["gateway", "api", "cdn", "bundle"]) { - const files = walk(path.join(__dirname, "..", "..", part, "dist")); - for (const file of files) { - let content = fs.readFileSync(file, { encoding: "utf8" }); - content = content - .replace( - new RegExp(`@fosscord/${part}`), - path.relative(file, path.join(__dirname, "..", "..", part, "dist")).slice(3) - ) - .replace(importPart, `const $2 = require($5)`) - .replace(importMod, `require($1)`) - .replace(exportDefault, `module.exports =`) - .replace(exportAllAs, `module.exports = {...(module.exports)||{}, ...require($1)}`) - .replace(exportMod, "module.exports = $1") - .replace(exportConst, `let $2 = {};\nmodule.exports.$2 = $2`) - .replace(exportPart, `module.exports.$3 = $1 $3`); - fs.writeFileSync(file, content); - } - } -} - -function util() { - // const child = spawn("node", `${swcBin} src --out-dir dist --sync`.split(" "), { - const child = spawn("node", `${tscBin} -b .`.split(" "), { - cwd: path.join(__dirname, "..", "..", "util"), - env: process.env, +console.log( + execSync("node " + path.join(__dirname, "..", "node_modules", "typescript", "lib", "tsc.js") + " -p .", { + cwd: path.join(__dirname, ".."), shell: true, - }); - function log(data) { - console.log(`[util] ` + data.toString().slice(0, -1)); - } - child.stdout.on("data", log); - child.stderr.on("data", log); - child.on("error", (err) => console.error("util", err)); - return child; -} - -const start = performance.now(); - -async function main() { - console.log("[Build] starting ..."); - util(); - await Promise.all(parts.map((part) => buildPackage(path.join(__dirname, "..", "..", part)))); - transpileFiles(); -} - -main(); - -process.on("exit", () => { - console.log("[Build] took " + Math.round(performance.now() - start) + "ms"); -}); - -function walk(dir) { - var results = []; - var list = fs.readdirSync(dir); - list.forEach(function (file) { - file = path.join(dir, file); - var stat = fs.statSync(file); - if (stat && stat.isDirectory()) { - /* Recurse into a subdirectory */ - results = results.concat(walk(file)); - } else if (file.endsWith(".ts") || file.endsWith(".js")) { - /* Is a file */ - results.push(file); - } - }); - return results; -} + env: process.env, + encoding: "utf8", + }) +); diff --git a/bundle/scripts/install.js b/bundle/scripts/install.js new file mode 100644 index 00000000..3008b4c5 --- /dev/null +++ b/bundle/scripts/install.js @@ -0,0 +1,14 @@ +const path = require("path"); +const fs = require("fs"); +const parts = ["api", "util", "cdn", "gateway"]; + +const bundle = require("../package.json"); + +for (const part of parts) { + const { devDependencies, dependencies } = require(path.join("..", "..", part, "package.json")); + bundle.devDependencies = { ...bundle.devDependencies, ...devDependencies }; + bundle.dependencies = { ...bundle.dependencies, ...dependencies }; + delete bundle.dependencies["@fosscord/util"]; +} + +fs.writeFileSync(path.join(__dirname, "..", "package.json"), JSON.stringify(bundle, null, "\t"), { encoding: "utf8" }); diff --git a/bundle/src/Server.ts b/bundle/src/Server.ts index 5dda2d02..d541735f 100644 --- a/bundle/src/Server.ts +++ b/bundle/src/Server.ts @@ -4,7 +4,7 @@ process.on("uncaughtException", console.error); import http from "http"; import * as Api from "@fosscord/api"; import * as Gateway from "@fosscord/gateway"; -import { CDNServer } from "@fosscord/cdn/"; +import { CDNServer } from "@fosscord/cdn"; import express from "express"; import { green, bold } from "nanocolors"; import { Config, initDatabase } from "@fosscord/util"; diff --git a/bundle/src/start.ts b/bundle/src/start.ts index fbe5fa4c..8e7c3129 100644 --- a/bundle/src/start.ts +++ b/bundle/src/start.ts @@ -1,20 +1,4 @@ // process.env.MONGOMS_DEBUG = "true"; -const tsConfigPaths = require("tsconfig-paths"); -const path = require("path"); -const baseUrl = path.join(__dirname, ".."); -const cleanup = tsConfigPaths.register({ - baseUrl, - paths: { - "@fosscord/api": ["../api/dist/index.js"], - "@fosscord/api/*": ["../api/dist/*"], - "@fosscord/gateway": ["../gateway/dist/index.js"], - "@fosscord/gateway/*": ["../gateway/dist/*"], - "@fosscord/cdn": ["../cdn/dist/index.js"], - "@fosscord/cdn/*": ["../cdn/dist/*"], - }, -}); -console.log(require("@fosscord/gateway")); - import "reflect-metadata"; import cluster from "cluster"; import os from "os"; diff --git a/bundle/src/stats.ts b/bundle/src/stats.ts index d5ceeff7..49705424 100644 --- a/bundle/src/stats.ts +++ b/bundle/src/stats.ts @@ -1,11 +1,19 @@ import os from "os"; import osu from "node-os-utils"; +import { red } from "nanocolors"; export function initStats() { console.log(`[Path] running in ${__dirname}`); console.log(`[CPU] ${osu.cpu.model()} Cores x${osu.cpu.count()}`); console.log(`[System] ${os.platform()} ${os.arch()}`); console.log(`[Process] running with pid: ${process.pid}`); + if (process.getuid() === 0) { + console.warn( + red( + `[Process] Warning fosscord is running as root, this highly discouraged and might expose your system vulnerable to attackers. Please run fosscord as a user without root privileges.` + ) + ); + } setInterval(async () => { const [cpuUsed, memory, network] = await Promise.all([ @@ -23,5 +31,5 @@ export function initStats() { process.memoryUsage().rss / 1024 / 1024 )}mb/${memory.totalMemMb.toFixed(0)}mb ${networkUsage}` ); - }, 1000 * 5); + }, 1000 * 10); } diff --git a/bundle/tsconfig.json b/bundle/tsconfig.json index 69725244..1b2949da 100644 --- a/bundle/tsconfig.json +++ b/bundle/tsconfig.json @@ -1,22 +1,28 @@ { - "include": ["src/**/*.ts"], + "include": [ + "../api/src/**/*.ts", + "../gateway/src/**/*.ts", + "../cdn/src/**/*.ts", + "../util/src/**/*.ts", + "src/**/*.ts" + ], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ "incremental": true /* Enable incremental compilation */, - "target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "lib": ["ES2021"] /* Specify library files to be included in the compilation. */, "allowJs": true /* Allow javascript files to be compiled. */, "checkJs": true /* Report errors in .js files. */, // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true /* Generates corresponding '.d.ts' file. */, + "declaration": false /* Generates corresponding '.d.ts' file. */, "declarationMap": false /* Generates a sourcemap for each corresponding '.d.ts' file. */, - "sourceMap": true /* Generates corresponding '.map' file. */, + "sourceMap": false /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist/" /* Redirect output structure to the directory. */, - "rootDir": "./src/" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + "rootDir": "../" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ // "removeComments": true, /* Do not emit comments to output. */ @@ -66,6 +72,18 @@ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "baseUrl": "." + "resolveJsonModule": true, + "baseUrl": "..", + "paths": { + "@fosscord/api": ["api/src/index"], + "@fosscord/api/*": ["api/src/*"], + "@fosscord/gateway": ["gateway/src/index"], + "@fosscord/gateway/*": ["gateway/src/*"], + "@fosscord/cdn": ["cdn/src/index"], + "@fosscord/cdn/*": ["cdn/src/*"], + "@fosscord/util": ["util/src/index"], + "@fosscord/util/*": ["util/src/*"] + }, + "plugins": [{ "transform": "@zerollup/ts-transform-paths" }] } } -- cgit 1.4.1