#! /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("", ""); 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); }); }); }