You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
5.7 KiB
193 lines
5.7 KiB
const fs = require('fs/promises');
|
|
const path = require('path');
|
|
|
|
const copyright_disclaimer = `
|
|
/**
|
|
* This file is part of the jps-like-websites lib
|
|
* URL: https://git.labos.goip.de/chris/jpc-like-websites
|
|
* @copyright by its creator
|
|
*/
|
|
|
|
`;
|
|
|
|
/**
|
|
* Kept for future reference, might be that we will return to the dependency resolvement approach.
|
|
* @param {OAO} oao
|
|
* @returns {OAO}
|
|
*/
|
|
function resolveDependencyOrder(oao) {
|
|
let roots = oao.keys.filter(k => oao.objects[k].dependencies.length === 0);
|
|
|
|
let folderList = [...new Set(oao.keys.map(k => oao.objects[k].folder))];
|
|
|
|
console.log("Folders", folderList);
|
|
|
|
/**
|
|
*
|
|
* @param {OAO} oao
|
|
* @param {Array<Array<string>>} dealt
|
|
*/
|
|
function recursiveResolvement(oao, dealtLvls, dealt) {
|
|
const arrsEqualSize = (arr1, arr2) => arr1.length === arr2.length;
|
|
const arrHasAll = (arr1, arr2) => arr2.every(k => arr1.includes(k))
|
|
|
|
if (oao.keys.length === dealt.length) {
|
|
return [...dealt, ...current];
|
|
} else {
|
|
console.log(`Received ${dealt.length} dealt of ${oao.keys.length}`);
|
|
}
|
|
|
|
let remaining = oao.keys
|
|
.filter(k => !dealt.includes(k));
|
|
|
|
if (remaining.length < 2) {
|
|
return [...dealt, ...remaining];
|
|
}
|
|
|
|
let current = remaining
|
|
.filter(k => oao.objects[k].dependencies.every(sk => dealt.includes(sk)));
|
|
|
|
if (current.length === 0) {
|
|
console.log("Couldn't resolve", remaining);
|
|
return remaining;
|
|
}
|
|
|
|
dealtLvls.push(current);
|
|
|
|
if (arrsEqualSize(remaining, current)) {
|
|
return [...dealt, ...current];
|
|
}
|
|
|
|
return recursiveResolvement(oao, dealtLvls, [...dealt, ...current]);
|
|
}
|
|
|
|
let recursiveResolved = recursiveResolvement(oao, [roots], roots);
|
|
|
|
recursiveResolved
|
|
.forEach((k, i) => {
|
|
oao.objects[k].orderNr = i;
|
|
});
|
|
|
|
oao.isOrdered = recursiveResolved.slice(-1).length <= 2;
|
|
if (oao.isOrdered) {
|
|
oao.keys = recursiveResolved;
|
|
}
|
|
return oao;
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param {string} srcFile path to src file
|
|
* @param {string} targetFile path of target file that will contain all scripts
|
|
*/
|
|
async function appendContent(srcFile, targetFile, contentModifications = [], lineModifications = []) {
|
|
try {
|
|
let content = await fs.readFile(srcFile, 'utf8');
|
|
console.log(`Processing '${srcFile}'`);
|
|
console.log(` READ: successfully!`, `Attepting to append file`);
|
|
|
|
/* Apply modifications */
|
|
content = contentModifications
|
|
.reduce((a, c) => c(a), content.split('\r\n'))
|
|
.map(line => lineModifications.reduce((a, c) => c(a), line))
|
|
.join('\r\n');
|
|
|
|
await fs.appendFile(targetFile, content);
|
|
|
|
console.log(` Append/Write: successfully!`);
|
|
} catch (error) {
|
|
console.error(`Error reading/writing files: ${error.message}`);
|
|
console.error(srcFile);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
*
|
|
* @param {string} srcFile path to src file
|
|
* @param {string} targetFile path of target file that will contain all scripts
|
|
*/
|
|
async function bundleWithSpecifiedMode(targetFile, fileList, modulize = true) {
|
|
let contentModifications = [
|
|
function (content) {
|
|
return [
|
|
...copyright_disclaimer.split('\r\n'),
|
|
...content
|
|
];
|
|
}
|
|
];
|
|
|
|
let lineModifications = [
|
|
function (line) {
|
|
|
|
let starters = ["function", "const", "let", "class"];
|
|
if (starters.some(s => line.startsWith(s))) {
|
|
return "export " + line;
|
|
}
|
|
return line;
|
|
}
|
|
];
|
|
|
|
|
|
fileList
|
|
.reduce((prevPromise, filePath) => prevPromise
|
|
.then(
|
|
() => appendContent(filePath, targetFile, contentModifications)
|
|
), Promise.resolve()
|
|
)
|
|
|
|
if (modulize) {
|
|
let targetModule = path.basename(targetFile).split('.', 1)[0] + '.mjs';
|
|
fileList
|
|
.reduce((prevPromise, filePath) => prevPromise
|
|
.then(
|
|
() => appendContent(filePath, targetModule, contentModifications, lineModifications)
|
|
), Promise.resolve()
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @deprecated Currently this function takles the task of successfully bundling the jpc-framework.
|
|
* A custom bundler will replace this function/file.
|
|
* Some logic might be copied/used from here.
|
|
*
|
|
* Takes the given order from the jpclw-bundle.json and bundles the scripts accordingly.
|
|
*
|
|
* @param {string|path} targetFile path to the targetfile (without file extension)
|
|
* @param {boolean} modulize flag to decide to generate a mjs module as well
|
|
* @param {string|path} bundleFile path to the bundleFile if there is some
|
|
* - preparation for jpclw-bundler
|
|
*/
|
|
function bundle(modulize = false, targetFile = "./jpc-like-websites.js", bundleFile = './jpclw-bundle.json') {
|
|
let fileOrder = require(bundleFile);
|
|
|
|
console.log("(Re-) Creating target file: '" + targetFile + "'");
|
|
/* EMPTY (create?) TARGET FILE */
|
|
fs.writeFile(targetFile, "", err => { });
|
|
|
|
if (modulize) {
|
|
let targetModule = path.basename(targetFile).split('.', 1)[0] + '.mjs';
|
|
fs.writeFile(targetModule, "", err => { });
|
|
}
|
|
|
|
let fileList = Object.keys(fileOrder.orderedGroups)
|
|
.flatMap(groupName => fileOrder.orderedGroups[groupName])
|
|
.map(fileName => {
|
|
let f = fileOrder.objects[fileName];
|
|
/* The Path build by name and folder */
|
|
return `${f.folder}/${f.name}`;
|
|
});
|
|
|
|
|
|
bundleWithSpecifiedMode(targetFile, fileList, modulize);
|
|
|
|
}
|
|
|
|
let args = process.argv.slice(2);
|
|
bundle(Boolean(args[0]), args[1], args[2]);
|
|
|
|
|