Merge pull request #817 from fosscord/dev/new-scripts

Add utility scripts
This commit is contained in:
TheArcaneBrony
2022-08-06 22:28:15 +02:00
committed by GitHub
6 changed files with 228 additions and 31 deletions
+3
View File
@@ -13,3 +13,6 @@ api/assets/plugins/*.js
.idea/
*.code-workspace
*.log
*.log.ansi
+3 -1
View File
@@ -4,7 +4,9 @@
"description": "",
"main": "src/start.js",
"scripts": {
"setup": "node scripts/install.js && npm install --no-optional && npx ts-patch install -s && npx patch-package --patch-dir ../api/patches/ && npm run build",
"setup": "node scripts/install.js && npm install --omit optional && ts-patch install -s && patch-package --patch-dir ../api/patches/ && npm run build",
"depclean": "node scripts/depclean.js",
"depcheck": "node scripts/depcheck.js",
"build": "node scripts/build.js",
"start": "node scripts/build.js && node dist/bundle/src/start.js",
"start:bundle": "node dist/bundle/src/start.js",
+50 -30
View File
@@ -2,39 +2,36 @@ const { execSync } = require("child_process");
const path = require("path");
const fs = require("fs");
const { getSystemErrorMap } = require("util");
const { argv } = require("process");
const { argv, stdout, exit } = require("process");
const { copyRecursiveSync, execIn, parts } = require('./utils');
var steps = 2, i = 0;
if(argv.includes("help")) {
console.log(`Fosscord build script help:
Arguments:
clean Cleans up previous builds
copyonly Only copy source files, don't build (useful for updating assets)
verbose Enable verbose logging
logerrors Log build errors to console
pretty-errors Pretty-print build errors
silent No output to console or files.`);
exit(0);
}
let steps = 3, i = 0;
if (argv.includes("clean")) steps++;
if (argv.includes("copyonly")) steps--;
const dirs = ["api", "util", "cdn", "gateway", "bundle"];
const verbose = argv.includes("verbose") || argv.includes("v");
const logerr = argv.includes("logerrors");
const pretty = argv.includes("pretty-errors");
const silent = argv.includes("silent");
var copyRecursiveSync = function(src, dest) {
if(verbose) console.log(`cpsync: ${src} -> ${dest}`);
var exists = fs.existsSync(src);
if(!exists){
console.log(src + " doesn't exist, not copying!");
return;
}
var stats = exists && fs.statSync(src);
var isDirectory = exists && stats.isDirectory();
if (isDirectory) {
fs.mkdirSync(dest, {recursive: true});
fs.readdirSync(src).forEach(function(childItemName) {
copyRecursiveSync(path.join(src, childItemName),
path.join(dest, childItemName));
});
} else {
fs.copyFileSync(src, dest);
}
};
if(silent) console.error = console.log = function(){}
if (argv.includes("clean")) {
console.log(`[${++i}/${steps}] Cleaning...`);
dirs.forEach((a) => {
var d = "../" + a + "/dist";
parts.forEach((a) => {
let d = "../" + a + "/dist";
if (fs.existsSync(d)) {
fs.rmSync(d, { recursive: true });
if (verbose) console.log(`Deleted ${d}!`);
@@ -42,11 +39,16 @@ if (argv.includes("clean")) {
});
}
console.log(`[${++i}/${steps}] Checking if dependencies were installed correctly...`);
//exif-be-gone v1.3.0 doesnt build js, known bug
if(!fs.existsSync(path.join(__dirname, "..", "node_modules", "exif-be-gone", "index.js")))
execIn("npm run build", path.join(__dirname, "..", "node_modules", "exif-be-gone"));
console.log(`[${++i}/${steps}] Copying src files...`);
copyRecursiveSync(path.join(__dirname, "..", "..", "api", "assets"), path.join(__dirname, "..", "dist", "api", "assets"));
copyRecursiveSync(path.join(__dirname, "..", "..", "api", "client_test"), path.join(__dirname, "..", "dist", "api", "client_test"));
copyRecursiveSync(path.join(__dirname, "..", "..", "api", "locales"), path.join(__dirname, "..", "dist", "api", "locales"));
dirs.forEach((a) => {
parts.forEach((a) => {
copyRecursiveSync("../" + a + "/src", "dist/" + a + "/src");
if (verbose) console.log(`Copied ${"../" + a + "/dist"} -> ${"dist/" + a + "/src"}!`);
});
@@ -54,13 +56,16 @@ dirs.forEach((a) => {
if (!argv.includes("copyonly")) {
console.log(`[${++i}/${steps}] Compiling src files ...`);
console.log(
let buildFlags = ''
if(pretty) buildFlags += '--pretty '
try {
execSync(
'node "' +
path.join(__dirname, "..", "node_modules", "typescript", "lib", "tsc.js") +
'" -p "' +
path.join(__dirname, "..") +
'"',
'" ' + buildFlags,
{
cwd: path.join(__dirname, ".."),
shell: true,
@@ -68,6 +73,21 @@ if (!argv.includes("copyonly")) {
encoding: "utf8"
}
)
);
}
} catch (error) {
if(verbose || logerr) {
error.stdout.split(/\r?\n/).forEach((line) => {
let _line = line.replace('dist/','',1);
if(!pretty && _line.includes('.ts(')) {
//reformat file path for easy jumping
_line = _line.replace('(',':',1).replace(',',':',1).replace(')','',1)
}
console.error(_line);
})
}
console.error(`Build failed! Please check build.log for info!`);
if(!silent){
if(pretty) fs.writeFileSync("build.log.ansi", error.stdout);
fs.writeFileSync("build.log", error.stdout.replaceAll(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''));
}
}
}
+56
View File
@@ -0,0 +1,56 @@
const path = require("path");
const fs = require("fs");
const { env } = require("process");
const { execSync } = require("child_process");
const { argv, stdout, exit } = require("process");
const { execIn, getLines, parts } = require("./utils");
let npmi_extra_flags = "";
const resolveminor = argv.includes("resolveminor");
if(argv.includes("nobuild")) npmi_extra_flags += "--ignore-scripts ";
parts.forEach((part) => {
let partDir = path.join(__dirname, "..", "..", part);
let distDir = path.join(partDir, "dist");
console.log(`Checking updates for ${part} (${partDir})`);
if(part == "bundle") {
execIn(`npm run syncdeps`, partDir)
}
if(resolveminor) {
fs.rmSync(path.join(partDir, "node_modules"), {
recursive: true,
force: true,
});
execIn(`npm i --save --no-fund --no-audit --no-package-lock ${npmi_extra_flags}`, partDir)
}
let x = [
[
"pkg",
{
current: "1.0",
wanted: "2.0",
latest: "2.0",
dependent: "cdn",
location: "/usr/src/fosscord/bundle/node_packages/pkg",
},
],
];
x = Object.entries(
JSON.parse(execIn("npm outdated --json", partDir))
);
x.forEach((a) => {
let pkgname = a[0];
let pkginfo = a[1];
if(!pkginfo.current)
console.log(`MISSING ${pkgname}: ${pkginfo.current} -> ${pkginfo.wanted} (latest: ${pkginfo.latest})`);
else if(pkginfo.latest != pkginfo.wanted){
if(pkginfo.current != pkginfo.wanted)
console.log(`MINOR ${pkgname}: ${pkginfo.current} -> ${pkginfo.wanted}`);
console.log(`MAJOR ${pkgname}: ${pkginfo.current} -> ${pkginfo.latest}`);
}
else
console.log(`MINOR ${pkgname}: ${pkginfo.current} -> ${pkginfo.wanted}`);
});
});
+63
View File
@@ -0,0 +1,63 @@
const path = require("path");
const fs = require("fs");
const { env } = require("process");
const { execSync } = require("child_process");
const { argv, stdout, exit } = require("process");
const { execIn, getLines, parts } = require('./utils');
const bundleRequired = ["@ovos-media/ts-transform-paths"];
const removeModules = argv.includes("cleanup");
parts.forEach((part) => {
console.log(`Installing all packages for ${part}...`);
execIn("npm i", path.join(__dirname, "..", "..", part));
});
parts.forEach((part) => {
let partDir = path.join(__dirname, "..", "..", part);
let distDir = path.join(partDir, "dist");
let start = 0;
start = getLines(
execIn("npm ls --parseable --package-lock-only -a", partDir)
);
if (fs.existsSync(distDir))
fs.rmSync(distDir, {
recursive: true,
force: true,
});
let x = {
dependencies: [],
devDependencies: [],
invalidDirs: [],
invalidFiles: [],
missing: [],
using: [],
};
x = JSON.parse(execIn("npx depcheck --json", partDir).stdout);
fs.writeFileSync(
path.join(__dirname, "..", `depclean.out.${part}.json`),
JSON.stringify(x, null, "\t"),
{ encoding: "utf8" }
);
let depsToRemove = x.dependencies.join(" ");
if (depsToRemove) execIn(`npm r --save ${depsToRemove}`, partDir);
depsToRemove = x.devDependencies.join(" ");
if (depsToRemove) execIn(`npm r --save --dev ${depsToRemove}`, partDir);
if (removeModules && fs.existsSync(path.join(partDir, "node_modules")))
fs.rmSync(path.join(partDir, "node_modules"), {
recursive: true,
force: true,
});
let end = getLines(
execIn("npm ls --parseable --package-lock-only -a", partDir)
);
console.log(`${part}: ${start} -> ${end} (diff: ${start - end})`);
});
console.log("Installing required packages for bundle...");
execIn(`npm i --save ${bundleRequired.join(" ")}`, path.join(__dirname, ".."));
+53
View File
@@ -0,0 +1,53 @@
const path = require("path");
const fs = require("fs");
const { env } = require("process");
const { execSync } = require("child_process");
const { argv, stdout, exit } = require("process");
const parts = ["api", "util", "cdn", "gateway", "bundle"];
function copyRecursiveSync(src, dest) {
//if (verbose) console.log(`cpsync: ${src} -> ${dest}`);
let exists = fs.existsSync(src);
if (!exists) {
console.log(src + " doesn't exist, not copying!");
return;
}
let stats = exists && fs.statSync(src);
let isDirectory = exists && stats.isDirectory();
if (isDirectory) {
fs.mkdirSync(dest, { recursive: true });
fs.readdirSync(src).forEach(function (childItemName) {
copyRecursiveSync(
path.join(src, childItemName),
path.join(dest, childItemName)
);
});
} else {
fs.copyFileSync(src, dest);
}
}
function execIn(cmd, workdir) {
try {
return execSync(cmd, {
cwd: workdir,
shell: true,
env: process.env,
encoding: "utf-8",
});
} catch (error) {
return error.stdout;
}
}
function getLines(output) {
return output.split("\n").length;
}
module.exports = {
//consts
parts,
//functions
copyRecursiveSync, execIn, getLines
};