xweb-templating
Version:
A cli tool for converting 'tags' to regular html, php or some other format
61 lines (52 loc) • 2.56 kB
text/typescript
import { XwebConfig } from "../config/config.js";
import { error, info, status } from "../log.js";
import fs from "fs";
import path from "path";
import { Worker } from "worker_threads";
function swap_extension(file_name: string, from_extension: string, to_extension: string): string {
return file_name.slice(0, -from_extension.length) + to_extension;
}
function create_file(file_path: string, file_content: string) {
const DIRECTORY_PATH = path.dirname(file_path);
if (!fs.existsSync(DIRECTORY_PATH)) {
status("run/convert", `Created required folder called '${DIRECTORY_PATH}'`);
fs.mkdirSync(DIRECTORY_PATH, { recursive: true });
}
fs.writeFileSync(file_path, file_content);
}
export function convert(files: string[], CONFIG: XwebConfig) {
let file_counter = 0;
files.forEach(file_name => {
file_counter++;
info("run/convert", `Starting conversion of file ${file_counter}/${files.length} "${file_name}"`);
const FILE_CONTENT = fs.readFileSync(path.join(process.cwd(), CONFIG.folder.src, file_name), "utf8");
// Read CONFIG.folder.tags and import all CONFIG.tags
const TAG_DATA: string[] = [];
for (const TAG of CONFIG.tags) {
const FILE_PATH = path.join(process.cwd(), CONFIG.folder.tags, TAG + ".js");
if (!fs.existsSync(FILE_PATH)) {
error("run/convert", `Cannot read tagset ${TAG} despite it being in the config file, because it doesn't exist in the tagsets folder. Run 'xweb add ${TAG}' to attempt to fetch it from github`);
return;
}
TAG_DATA.push(fs.readFileSync(FILE_PATH, "utf8"));
}
// Send data to worker
const WORKER = new Worker("./bin/convert/worker.js", {
workerData: {
content: FILE_CONTENT,
tags: TAG_DATA,
CONFIG
}
});
WORKER.on("message", data => {
status("run/convert", `Finished conversion of file ${file_counter}/${files.length} "${file_name}"`);
const NEW_FILE_NAME = swap_extension(file_name, CONFIG.extension.src, CONFIG.extension.out);
const OUTPUT_FILE_PATH = path.join(process.cwd(), CONFIG.folder.out, NEW_FILE_NAME);
create_file(OUTPUT_FILE_PATH, data);
status("run/convert", `Created output file ${NEW_FILE_NAME}`);
});
WORKER.on("error", err => {
error("run/convert", `File '${file_name}' failed to convert, because '${err}'`);
});
});
}