Skip to content

Commit

Permalink
Merge pull request #153 from xtremespb/core_030821
Browse files Browse the repository at this point in the history
Bugfixes
  • Loading branch information
xtremespb committed Aug 10, 2021
2 parents 09615ea + fdf2462 commit b430ed3
Show file tree
Hide file tree
Showing 80 changed files with 5,718 additions and 8,942 deletions.
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"mform",
"mnotify",
"mtable",
"npmi",
"ratelimit",
"rerr",
"rspace",
Expand Down
68 changes: 54 additions & 14 deletions dev/bin/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ console.log(colors.yellow(`Installing modules: ${modules.map(m => m.id).join(",
const {
indexesAsc,
indexesDesc,
expires
expires,
expireField,
} = moduleConfig.database.collections[c];
if (indexesAsc && indexesAsc.length) {
const indexes = {};
Expand All @@ -111,10 +112,22 @@ console.log(colors.yellow(`Installing modules: ${modules.map(m => m.id).join(",
indexes[i] = 1;
}
});
console.log(`* Dropping indexes: "${m.id}_${c}_asc"`);
try {
await db.collection(c).dropIndex(`${m.id}_${c}_asc`);
} catch (e) {
console.log(` Warning: ${e.message}`);
// Ignore
}
console.log(`* Creating indexes: "${m.id}_${c}_asc"`);
await db.collection(c).createIndex(indexes, {
name: `${m.id}_${c}_asc`
});
try {
await db.collection(c).createIndex(indexes, {
name: `${m.id}_${c}_asc`
});
} catch (e) {
console.log(` Failed: ${e.message}`);
// Ignore
}
}
if (indexesDesc && indexesDesc.length) {
const indexes = {};
Expand All @@ -128,20 +141,47 @@ console.log(colors.yellow(`Installing modules: ${modules.map(m => m.id).join(",
indexes[i] = -1;
}
});
console.log(`* Dropping indexes: "${m.id}_${c}_desc"`);
try {
await db.collection(c).dropIndex(`${m.id}_${c}_desc`);
} catch (e) {
console.log(` Warning: ${e.message}`);
// Ignore
}
console.log(`* Creating indexes: "${m.id}_${c}_desc"`);
await db.collection(c).createIndex(indexes, {
name: `${m.id}_${c}_desc`
});
try {
await db.collection(c).createIndex(indexes, {
name: `${m.id}_${c}_desc`
});
} catch (e) {
console.log(` Failed: ${e.message}`);
// Ignore
}
}
if (expires) {
console.log(`* Dropping indexes: "${m.id}_${c}_exp"`);
try {
await db.collection(c).dropIndex(`${m.id}_${c}_exp`);
} catch (e) {
console.log(` Warning: ${e.message}`);
// Ignore
}
console.log(`* Creating indexes: "${m.id}_${c}_exp"`);
await db.collection(c).createIndex({
createdAt: 1
}, {
expireAfterSeconds: parseInt(expires, 10)
}, {
name: `${m.id}_${c}_exp`
});
const expData = {};
if (expireField) {
expData[expireField] = 1;
} else {
expData.createdAt = 1;
}
try {
await db.collection(c).createIndex(expData, {
expireAfterSeconds: parseInt(expires, 10),
name: `${m.id}_${c}_exp`,
});
} catch (e) {
console.log(` Failed: ${e.message}`);
// Ignore
}
}
} catch (e) {
console.error(e);
Expand Down
91 changes: 67 additions & 24 deletions dev/build.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
/* eslint-disable no-console */
const {
exec
} = require("child_process");
const {
format,
} = require("date-fns");
const commandLineArgs = require("command-line-args");
const fs = require("fs-extra");
const path = require("path");
const NPMI = require("./npmi");

const options = commandLineArgs([{
name: "dev",
Expand Down Expand Up @@ -48,22 +43,18 @@ if (!params[command]) {
return;
}

const execCommand = cmd => new Promise((resolve, reject) => {
let exitCode;
const workerProcess = exec(cmd, (error, stdout, stderr) => {
if (exitCode === 0) {
// eslint-disable-next-line no-control-regex
fs.writeFileSync(path.resolve(`${__dirname}/../logs/build_${format(new Date(), "yyyyMMdd_HHmmss")}.log`), stdout.replace(/[^\x00-\x7F]/g, ""));
resolve(stdout);
} else {
// eslint-disable-next-line prefer-promise-reject-errors
reject(new Error(`${stdout || ""}${stderr || ""}`));
}
});
workerProcess.on("exit", code => exitCode = code);
});
const installAnimation = (module, version) => {
const h = ["|", "/", "-", "\\"];
let i = 0;
return setInterval(() => {
i = (i > 3) ? 0 : i;
const msg = `- Installing ${module}@${version}... ${h[i]}`;
process.stdout.write(`\r${msg}`);
i += 1;
}, 100);
};

const loadingAnimation = () => {
const buildAnimation = () => {
const h = ["|", "/", "-", "\\"];
let i = 0;
return setInterval(() => {
Expand All @@ -78,9 +69,11 @@ const loadingAnimation = () => {
const packageJson = require(path.resolve(`${__dirname}/../package.json`));
console.log(`ZOIA Build Script, mode: ${buildMode}, version: ${packageJson.version}\nStart time: ${new Date()}\n`);
const timestampStart = new Date().getTime() / 1000;
const loading = loadingAnimation();
const dir = command === "update" ? "update" : "zoia";
let loading;
try {
const npmi = new NPMI();
// Create backups of all files
if (fs.existsSync(path.resolve(`${__dirname}/../build/bin/zoia.js`))) {
fs.copySync(path.resolve(`${__dirname}/../build/bin/zoia.js`), path.resolve(`${__dirname}/../build/bin/zoia.js.bak`));
}
Expand All @@ -93,12 +86,60 @@ const loadingAnimation = () => {
if (fs.existsSync(path.resolve(`${__dirname}/../build/public/${dir}`))) {
fs.copySync(path.resolve(`${__dirname}/../build/public/${dir}`), path.resolve(`${__dirname}/../build/public/${dir}_bak`));
}
await execCommand(`node node_modules/webpack-cli/bin/cli ${params[command]}`);
// Get list of modules
const moduleDirs = (await fs.readdir(path.resolve(`${__dirname}/../${command === "update" ? "update" : "src"}/modules`))).filter(d => !d.match(/^\./));
// Build a list of "3rd-party" NPM modules
let extraModules = {};
for (const moduleDir of moduleDirs) {
try {
const npmData = require(path.resolve(`${__dirname}/../${command === "update" ? "update" : "src"}/modules/${moduleDir}/npm.json`));
extraModules = {
...extraModules,
...npmData
};
} catch {
// Ignore
}
}
const extraModuleNames = Object.keys(extraModules);
// Install 3rd-party modules when necessary
if (extraModuleNames.length) {
console.log(`${extraModuleNames.length} additional NPM module(s) will be installed:\n`);
for (const m of extraModuleNames) {
const moduleIsInstalled = await npmi.isInstalled(m, extraModules[m]);
if (!moduleIsInstalled) {
loading = installAnimation(m, extraModules[m]);
await npmi.execCommand(`npm i ${m}@${extraModules[m]} --loglevel=info`);
clearTimeout(loading);
process.stdout.write(`\r- Successfully installed NPM module: ${m}@${extraModules[m]}\n`);
} else {
console.log(`- Already up-to-date, skipping: ${m}@${extraModules[m]}`);
}
}
console.log("");
}
// Overwrite dependencies and devDependencies from package-core.json
const packageJsonMain = require(path.resolve(`${__dirname}/../package.json`));
const packageJsonCore = require(path.resolve(`${__dirname}/../package-core.json`));
packageJsonMain.dependencies = packageJsonCore.dependencies;
packageJsonMain.devDependencies = packageJsonCore.devDependencies;
await fs.writeJSON(path.resolve(`${__dirname}/../package-update.json`), packageJsonMain, {
spaces: "\t"
});
await fs.copy(path.resolve(`${__dirname}/../package-update.json`), path.resolve(`${__dirname}/../package.json`), {
overwrite: true,
errorOnExist: false
});
// Start building
loading = buildAnimation();
await npmi.execCommand(`node node_modules/webpack-cli/bin/cli ${params[command]}`);
// Remove backups
fs.removeSync(path.resolve(`${__dirname}/../build/bin/zoia.js.bak`));
fs.removeSync(path.resolve(`${__dirname}/../build/bin/test.js.bak`));
fs.removeSync(path.resolve(`${__dirname}/../build/bin/cli.js.bak`));
fs.removeSync(path.resolve(`${__dirname}/../build/public/${dir}`));
fs.removeSync(path.resolve(`${__dirname}/../build/public/${dir}_bak`));
fs.removeSync(path.resolve(`${__dirname}/../package-update.json`));
fs.moveSync(path.resolve(`${__dirname}/../build/public/${dir}_`), path.resolve(`${__dirname}/../build/public/${dir}`));
clearTimeout(loading);
} catch (e) {
Expand All @@ -109,7 +150,9 @@ const loadingAnimation = () => {
} catch {
// Ignore
}
clearTimeout(loading);
if (loading) {
clearTimeout(loading);
}
console.log(`Failed:\n`);
console.log(e);
process.exit(1);
Expand Down
1 change: 0 additions & 1 deletion dev/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ module.exports = (env, argv) => {
utils.cleanUpWeb(argv);
utils.ensureDirectories(config);
utils.generateModulesConfig(moduleDirs, languages, argv);
utils.installRequiredPackages(moduleDirs, argv);
utils.generateTemplatesJSON(argv);
utils.generateVariablesSCSS(argv);
utils.rebuildMarkoTemplates(argv);
Expand Down
41 changes: 41 additions & 0 deletions dev/npmi.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const path = require("path");
const fs = require("fs-extra");
const semver = require("semver");
const {
exec
} = require("child_process");
const {
format,
} = require("date-fns");

class NPMI {
async isInstalled(name, version = "latest") {
try {
const packageJSON = await fs.readJSON(path.resolve(__dirname, "..", "node_modules", name, "package.json"));
const packageJSONVersion = semver.coerce(packageJSON.version);
const needVersion = semver.coerce(version);
return semver.gte(packageJSONVersion, needVersion) ? packageJSON.version : false;
} catch (e) {
return false;
}
}

async execCommand(cmd) {
return new Promise((resolve, reject) => {
let exitCode;
const workerProcess = exec(cmd, (error, stdout, stderr) => {
if (exitCode === 0) {
// eslint-disable-next-line no-control-regex
fs.writeFileSync(path.resolve(`${__dirname}/../logs/build_${format(new Date(), "yyyyMMdd_HHmmss")}.log`), stdout.replace(/[^\x00-\x7F]/g, ""));
resolve(stdout);
} else {
// eslint-disable-next-line prefer-promise-reject-errors
reject(new Error(`${stdout || ""}${stderr || ""}`));
}
});
workerProcess.on("exit", code => exitCode = code);
});
}
}

module.exports = NPMI;
78 changes: 0 additions & 78 deletions dev/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,10 @@ const path = require("path");
const {
v4: uuidv4
} = require("uuid");
const {
format,
} = require("date-fns");
const {
exec
} = require("child_process");
const minify = require("@node-minify/core");
const htmlMinifier = require("@node-minify/html-minifier");
const packageJson = require("../package.json");

const execCommand = cmd => new Promise((resolve, reject) => {
let exitCode;
const workerProcess = exec(cmd, (error, stdout, stderr) => {
if (exitCode === 0) {
// eslint-disable-next-line no-control-regex
fs.writeFileSync(path.resolve(`${__dirname}/../logs/npm_${format(new Date(), "yyyyMMdd_HHmmss")}.log`), `${cmd}\n\n${stdout.replace(/[^\x00-\x7F]/g, "")}`);
resolve(stdout);
} else {
// eslint-disable-next-line prefer-promise-reject-errors
reject(new Error(`${stdout || ""}${stderr || ""}`));
}
});
workerProcess.on("exit", code => exitCode = code);
});

const cleanUpWeb = argv => {
[argv.update ? "build/public/update_" : "build/public/zoia_", "build/scripts"].map(d => {
console.log(`Cleaning up directory: "${d}"`);
Expand Down Expand Up @@ -197,62 +176,6 @@ const generateModulesConfig = (moduleDirs, languages, argv) => {
});
};

const installRequiredPackages = async (moduleDirs, argv) => {
const packageJsonMain = require(path.resolve(`${__dirname}/../package.json`));
const packageJsonCore = require(path.resolve(`${__dirname}/../package-core.json`));
packageJsonMain.dependencies = packageJsonCore.dependencies;
packageJsonMain.devDependencies = packageJsonCore.devDependencies;
await fs.writeJSON(path.resolve(`${__dirname}/../package-update.json`), packageJsonMain, {
spaces: "\t"
});
await fs.copy(path.resolve(`${__dirname}/../package-update.json`), path.resolve(`${__dirname}/../package.json`), {
overwrite: true,
errorOnExist: false
});
await fs.remove(path.resolve(`${__dirname}/../package-update.json`));
for (const dir of moduleDirs) {
let npmData;
try {
npmData = require(path.resolve(`${__dirname}/../${argv.update ? "update" : "src"}/modules/${dir}/npm.json`));
} catch {
// Ignore
}
if (!npmData) {
// eslint-disable-next-line no-continue
continue;
}
const cmd = Object.keys(npmData).map(m => {
if (!packageJsonCore.dependencies[m] || packageJsonCore.dependencies[m] !== npmData[m] || !packageJsonCore.devDependencies[m] || packageJsonCore.devDependencies[m] !== npmData[m]) {
try {
require(m);
const modulePackageJson = require(`${__dirname}/../node_modules/${m}/package.json`);
if (modulePackageJson.version === npmData[m].replace(/[^0-9.]/gm, "")) {
return null;
}
} catch {
// Ignore
}
return `${m}@${npmData[m]}`;
}
}).filter(i => i);
if (cmd && cmd.length) {
try {
for (const c of cmd) {
console.log(`Installing NPM package for module "${dir}": ${c}`);
try {
await execCommand(`npm i ${c} --loglevel=info${argv.mode === "production" ? " --save" : ""}`);
} catch (e) {
console.log(e.message);
}
}
} catch (e) {
console.error(e);
process.exit(1);
}
}
}
};

const ensureDirectories = (config) => {
const dirs = ["etc", config.directories.tmp, "logs", "build/etc", "build/bin", "build/public", config.directories.files, "build/mail", config.directories.publicFiles, config.directories.publicImages];
console.log(`Ensuring directories: ${dirs.join(", ")}`);
Expand Down Expand Up @@ -306,7 +229,6 @@ module.exports = {
ensureDirectories,
copyPublic,
copyMailTemplates,
installRequiredPackages,
runBuildScripts,
generateVariablesSCSS,
};
Loading

0 comments on commit b430ed3

Please sign in to comment.