cavallium-website/build.js

88 lines
3.4 KiB
JavaScript

#! /usr/bin/env node
const fs = require("fs");
const { spawn } = require('cross-spawn');
var execOptions = {
encoding: "utf8",
shell: "",
};
const argument0 = process.argv[2];
async function main(runMode) {
const angularSourceBuffer = fs.readFileSync("buildconfig.json");
const angularSource = JSON.parse(angularSourceBuffer);
const productionConfiguration = angularSource.angular.projects[angularSource.projectName].architect.build.configurations["production"];
delete angularSource.angular.projects[angularSource.projectName].architect.build.configurations["production"];
angularSource.languages.forEach((language, languageIndex) => {
const defaultIndex = angularSource.angular.projects[angularSource.projectName].architect.build.options.index;
const defaultIndexName = defaultIndex.split(".").slice(0, -1).join(".");
const defaultIndexExtension = defaultIndex.split(".").pop();
const languageSpecificIndex = defaultIndexName + "." + language + ".generated." + defaultIndexExtension;
const languageConfiguration = {
"index": languageSpecificIndex,
...angularSource.angular.projects[angularSource.projectName].architect.build.configurations[language]
};
delete angularSource.angular.projects[angularSource.projectName].architect.build.configurations[language];
angularSource.angular.projects[angularSource.projectName].architect.build.configurations["production_" + language] = {
...productionConfiguration,
...languageConfiguration
};
angularSource.angular.projects[angularSource.projectName].architect.build.configurations["serve_" + language] = {
"aot": true,
...languageConfiguration,
};
angularSource.angular.projects[angularSource.projectName].architect.serve.configurations[language] = {
"browserTarget": "cavallium-website:build:serve_"+language,
"port": 4200 + languageIndex
};
// Create index.language.html
let indexText = fs.readFileSync(defaultIndex).toString("utf8");
indexText = indexText.replace("<html>", "<html lang=\"" + language + "\">");
fs.writeFileSync(languageSpecificIndex, indexText);
});
fs.writeFileSync("angular.json", JSON.stringify(angularSource.angular, null, "\t"), "utf8");
console.log("Angular source built");
switch (runMode) {
case "build": {
await Promise.all(angularSource.languages.map((language, index) => {
console.log("Building for language " + JSON.stringify(language) + (index > 0 ? " (hidden)" : ""));
const childProcess = spawn("ng", ["build", "--configuration=production_" + language],
{ stdio: [process.stdin, index == 0 ? process.stdout : null, process.stderr] });
return onExit(childProcess);
}));
}
break;
case "serve":
await Promise.all(angularSource.languages.map((language, index) => {
console.log("Building for language " + JSON.stringify(language) + (index > 0 ? " (hidden)" : ""));
const childProcess = spawn("ng", ["serve", "--configuration=" + language, "--host=0.0.0.0"],
{ stdio: [process.stdin, index == 0 ? process.stdout : null, process.stderr] });
return onExit(childProcess);
}));
break;
default:
console.error("Error! Only Build and Serve commands are accepted!");
return;
}
}
main(argument0);
function onExit(childProcess) {
return new Promise((resolve, reject) => {
childProcess.once('exit', (code, signal) => {
if (code === 0) {
resolve(undefined);
} else {
reject(new Error('Exit with error code: ' + code));
}
});
childProcess.once('error', (err) => {
reject(err);
});
});
}