///
import Fs from "fs";
import * as Ultimake from "ultimake";
import Project from "./Project";
import * as Utils from "./Utils";
export default function(project: Project, task: Ultimake.TaskFunction, aggreg_html_deps: string[]): void {
console.log(project.toString());
const source_prefix = project.getSourceDir();
const target_prefix = project.getTargetDir();
// helper functions
const makeHTML = function (target: string): Promise {
// console.log(`makeHTML() ${this.name}, ${this.prereqs}, ${this.prereq}, ${this.source}`);
// ongoing issue: how to access prereqs inside these recipe functions?
const ejs_file = convertTargetHtmlToSourceEjs(target);
const html_file = target;
Ultimake.createDir(html_file);
return project.convertEJSFile(ejs_file)
.then(() => {});
// const require_file = ; console.log(`makeHTML() done ${require_file}`);
// } catch (e) { // promake is very reticent on logging failures in recipes...
// console.log(`makeHTML() ${ejs_file} -> ${html_file}`);
// console.error(e);
// }
};
const makeJSON = async function (targets: string, prereqs: string, name: string): Promise {
// console.log(`makeJSON() ${name}, ${targets}, ${prereqs}`);
const json_file = targets;
const parts = Utils.getPartsFromFilepath(targets);
// console.log(`makeJSON() ${parts.object_id} -> ${json_file}`);
Ultimake.createDir(json_file);
const data = project.getObjectData(parts.object_id);
Fs.writeFileSync(json_file, JSON.stringify(data, null, " "), {
encoding: "utf8",
});
// exec(`touch ${this.name}`);
};
// converters
const json_file_regexp = new RegExp(target_prefix + "([a-z\-0-9\/]+).json$");
const html_file_regexp = new RegExp(target_prefix + "([a-z\-0-9\/]+).html$");
const convertTargetJsonToSourceEjs = Ultimake.convert(json_file_regexp, source_prefix, ".ejs");
const convertTargetJsonToTargetCss = Ultimake.convert(json_file_regexp, target_prefix, ".css");
const convertTargetHtmlToSourceEjs = Ultimake.convert(html_file_regexp, source_prefix, ".ejs");
const convertTargetCssToPublicCss = Ultimake.convert(new RegExp(target_prefix + ".*(/[a-z\-0-9]+).css"), target_prefix + "/public/css", ".css");
const convertSourceEjsToTargetJson = Ultimake.convertSourceToTarget(source_prefix, target_prefix, ".ejs" , ".json");
const convertSourceEjsToTargetHtml = Ultimake.convertSourceToTarget(source_prefix, target_prefix, ".ejs" , ".html");
const convertSourceEjsToTargetScss = Ultimake.convertSourceToTarget(source_prefix, target_prefix, ".ejs" , ".scss");
const convertSourceEjsToTargetCss = Ultimake.convertSourceToTarget(source_prefix, target_prefix, ".ejs" , ".css");
const convertSourceScssToTargetCss = Ultimake.convertSourceToTarget(source_prefix, target_prefix, ".scss", ".css");
const file_list: { [key: string]: string[] } = {};
// source file lists
file_list.layout_ejs = Ultimake.glob(source_prefix + "/**/l-*.ejs");
file_list.layout_scss = Ultimake.glob(source_prefix + "/**/l-*.scss");
file_list.widget_ejs = Ultimake.glob(source_prefix + "/**/w-*.ejs");
file_list.widget_scss = Ultimake.glob(source_prefix + "/**/w-*.scss");
file_list.templt_ejs = Ultimake.glob(source_prefix + "/**/s-*.ejs");
file_list.aggreg_ejs = Ultimake.glob(source_prefix + "/**/a-*.ejs");
// intermediary and target file lists
file_list.uicomp_ejs = file_list.layout_ejs .concat(file_list.widget_ejs );
file_list.uicomp_json = file_list.uicomp_ejs .map(convertSourceEjsToTargetJson);
file_list.uicomp_html = file_list.uicomp_ejs .map(convertSourceEjsToTargetHtml);
file_list.uicomp_scss = file_list.layout_scss.concat(file_list.widget_scss);
file_list.uicomp_css = file_list.uicomp_scss.map(convertSourceScssToTargetCss);
file_list.templt_scss = file_list.templt_ejs .map(convertSourceEjsToTargetScss);
file_list.templt_json = file_list.templt_ejs .map(convertSourceEjsToTargetJson);
file_list.templt_css = file_list.templt_ejs .map(convertSourceEjsToTargetCss);
file_list.aggreg_json = file_list.aggreg_ejs .map(convertSourceEjsToTargetJson);
file_list.aggreg_scss = file_list.aggreg_ejs .map(convertSourceEjsToTargetScss);
file_list.aggreg_css = file_list.aggreg_ejs .map(convertSourceEjsToTargetCss);
file_list.aggreg_html = file_list.aggreg_ejs .map(convertSourceEjsToTargetHtml);
file_list.public_css = file_list.templt_css .map(convertTargetCssToPublicCss);
file_list.all____json = file_list.uicomp_json
.concat(file_list.templt_json)
.concat(file_list.aggreg_json);
const objects_file = target_prefix + "/ultiscss/objects.json";
const summary_file = target_prefix + "/ultiscss/summary.json";
// file_list.gallery_src = Ultimake.glob((project.isUltiscss() ? "" : "node_modules/ultiscss/") + "src/assets/gallery/*");
// file_list.gallery_tgt = file_list.gallery_src
// .map(path => path.replace(/^.*src\/assets/, target_prefix).replace(/.ejs$/, ".html"));
file_list.all = file_list.all____json
.concat(file_list.uicomp_html)
.concat(file_list.aggreg_html)
.concat(file_list.uicomp_css)
.concat(file_list.templt_css)
.concat(file_list.aggreg_css)
.concat(file_list.public_css)
.concat(file_list.gallery_tgt)
.concat([ objects_file, summary_file ]);
// uicomp - l-ayouts and w-idgets
task("build_uicomp_json", null, file_list.uicomp_json, async () => {}, {
description: "build UI Component JSON",
});
file_list.uicomp_json.forEach((json_file) => {
const ejs_file = convertTargetJsonToSourceEjs(json_file);
const css_file = convertTargetJsonToTargetCss(json_file);
// console.log(`making uicomp JSON rule ${ejs_file} -> ${json_file}`);
task(null, json_file, [ ejs_file, css_file ], makeJSON);
});
task("build_uicomp_html", null, file_list.uicomp_html, async () => {}, {
description: "build UI Component HTML",
});
file_list.uicomp_html.forEach((html_file) => {
const ejs_file = convertTargetHtmlToSourceEjs(html_file);
// console.log(`making uicomp HTML rule ${ejs_file} -> ${html_file}`);
task(null, html_file, ejs_file, makeHTML);
});
task("build_uicomp_css", file_list.uicomp_css , file_list.uicomp_scss, async () => {
const path_regex = new RegExp("(^" + target_prefix + ".*?)\/[^\/]+.css$");
file_list.uicomp_css
.map((path) => path_regex.exec(path)[1])
.forEach((path) => {
Ultimake.createDir(path);
});
await Ultimake.exec(`npx node-sass -q -r ${source_prefix} --output ${target_prefix}`);
}, {
description: "build UI Component CSS",
});
// templt - s-erver templates
task("build_templt_json", null, file_list.templt_json, async () => {}, {
description: "build template JSON",
});
file_list.templt_json.forEach((json_file) => {
const ejs_file = convertTargetJsonToSourceEjs(json_file);
// console.log(`making templt JSON rule ${ejs_file} -> ${json_file}`);
task(null, json_file, ejs_file, makeJSON);
});
task("build_templt_scss", file_list.templt_scss, file_list.all____json, async () => {
// console.log(`making template SCSS...`);
file_list.templt_scss.forEach((path) => {
const parts = Utils.getPartsFromFilepath(path);
// console.log(`creating templt SCSS for ${parts.object_id}`);
project.generateSCSSFileForObject(parts.object_id);
});
}, {
description: "build template JSON",
});
// aggreg - a-ggregate templates
task("build_aggreg_json", null, file_list.aggreg_json, async () => {}, {
description: "build aggregate JSON",
});
file_list.aggreg_json.forEach((json_file) => {
const ejs_file = convertTargetJsonToSourceEjs(json_file);
const html_file = json_file.replace(/\.json$/, ".html");
// console.log(`making aggreg HTML rule ${ejs_file} -> ${html_file}`);
task(null, json_file, [ ejs_file, html_file ], makeJSON);
});
task("build_aggreg_html", null, file_list.aggreg_html, async () => {}, {
description: "build aggregate HTML",
});
file_list.aggreg_html.forEach((html_file) => {
const ejs_file = convertTargetHtmlToSourceEjs(html_file);
const prereq = aggreg_html_deps ? aggreg_html_deps.concat([ ejs_file ] ) : ejs_file;
// console.log(`making aggreg HTML rule ${ejs_file} -> ${html_file}`);
task(null, html_file, prereq, makeHTML);
});
task("build_aggreg_scss", file_list.aggreg_scss, file_list.all____json, async () => {
file_list.aggreg_scss.forEach((path) => {
const parts = Utils.getPartsFromFilepath(path);
project.generateSCSSFileForObject(parts.object_id);
});
}, {
description: "build aggreg json",
});
// target css - s- and a- generated SCSS -> CSS
task("compile_target_scss_to_css", [ ...file_list.templt_css, ...file_list.aggreg_css ],
[ file_list.templt_scss, file_list.aggreg_scss, file_list.layout_scss, file_list.widget_scss ], async () => {
await Ultimake.exec(`npx node-sass -q -r ${target_prefix} --output ${target_prefix}`);
});
// console.log(` public_css: ${file_list.public_css}`);
// console.log(` templt_css: ${file_list.templt_css}`);
task("copy_public_css", file_list.public_css, file_list.templt_css , () => {
Ultimake.createDir(`${target_prefix}/public/css/`);
const promises = file_list.templt_css
.map(templt_css => Ultimake.basedir(templt_css))
.sort()
.filter((elem, index, array) => (index === 0) || (elem !== array[index - 1]))
.map((dir) => {
// console.log(`copying ${dir}/s-*.css to ${target_prefix}/public/css`);
return Ultimake.exec(`cp ${dir}/s-*.css ${target_prefix}/public/css`);
});
return Promise.all(promises);
});
// summary JSON
task("make_objects_file", objects_file, file_list.all____json, async () => {
Ultimake.createDir(objects_file);
const data = project.getObjects();
Fs.writeFileSync(objects_file, JSON.stringify(data, null, " "), {
encoding: "utf8",
});
});
task("make_summary_file", summary_file, file_list.all____json, async () => {
Ultimake.createDir(summary_file);
const data = project.makeSummary();
Fs.writeFileSync(summary_file, JSON.stringify(data, null, " "), {
encoding: "utf8",
});
});
/*
task("copy_gallery_files", file_list.gallery_tgt, file_list.gallery_src, async () => {
const source_dir = (project.isUltiscss() ? "" : "node_modules/ultiscss/") + "src/assets/gallery";
const target_dir = target_prefix + "/gallery/";
Ultimake.createDir(target_dir);
await Ultimake.exec(`cp ${source_dir}/*.css ${target_dir}`);
await Ultimake.exec(`cp ${source_dir}/*.js ${target_dir}`);
await Ultimake.exec(`find node_modules/ -name jquery.min.js -exec cp '{}' ${target_dir} \\;`);
await Ultimake.exec(`find node_modules/ -name bootstrap.min.js -exec cp '{}' ${target_dir} \\;`);
await Ultimake.exec(`find node_modules/ -name bootstrap.bundle.min.js -exec cp '{}' ${target_dir} \\;`);
await Ultimake.exec(`find node_modules/ -name bootstrap.min.css -exec cp '{}' ${target_dir} \\;`);
const data = {
gallery_head_include_file: project.getGalleryHeadIncludeFile(),
};
const convert = (ejs_file, html_file) => {
return new Promise((resolve, reject) => {
Ejs.renderFile(ejs_file, data, null, (err, html) => {
if (err) {
reject(err);
} else {
Fs.writeFileSync(html_file, html);
resolve();
}
});
});
}
await convert(source_dir + "/iframe.ejs", target_dir + "/iframe.html");
await convert(source_dir + "/layout.ejs", target_dir + "/layout.html");
await convert(source_dir + "/widget.ejs", target_dir + "/widget.html");
});
*/
// complete build
task("ultiscss", null, file_list.all, async () => {}, {
description: "ultiscss complete build",
});
}