40 lines
2.9 KiB
JavaScript
40 lines
2.9 KiB
JavaScript
const fs = require("node:fs");
|
|
const path = require("node:path");
|
|
const vm = require("node:vm");
|
|
const sources = require("./sources.cjs");
|
|
const vendorSources = { content: ["src/vendor/fullcalendar/index.global.min.js", "src/vendor/d3-hierarchy/d3-hierarchy.min.js"], background: [] };
|
|
|
|
const root = path.resolve(__dirname, "..");
|
|
|
|
/** Compose classic scripts at build time; never load or evaluate code at runtime. */
|
|
function composeScript(target, { bootstrap = true } = {}) {
|
|
const files = sources[target];
|
|
if (!files) throw new Error(`Unknown script target: ${target}`);
|
|
if (new Set(files).size !== files.length) throw new Error(`Duplicate source in ${target}`);
|
|
const parts = files.map(file => {
|
|
const source = fs.readFileSync(path.join(root, file), "utf8");
|
|
new vm.Script(source, { filename: file });
|
|
return `// Source: ${file}\n${source}`;
|
|
});
|
|
if (target === "content") {
|
|
const hierarchySource = fs.readFileSync(path.join(root, vendorSources.content[1]), "utf8");
|
|
const hierarchyLicense = fs.readFileSync(path.join(root, "src/vendor/d3-hierarchy/LICENSE"), "utf8");
|
|
const iconLicense = fs.readFileSync(path.join(root, "src/vendor/lucide/LICENSE"), "utf8");
|
|
parts.unshift(`/* ${iconLicense} */\nlet organizationLayout;\nfunction loadOrganizationLayout() {\nif (!organizationLayout) { const exports = {}; const module = { exports };\n/* ${hierarchyLicense} */\n${hierarchySource}\norganizationLayout = exports; }\nreturn organizationLayout;\n}`);
|
|
const calendarLibrary = fs.readFileSync(path.join(root, vendorSources.content[0]), "utf8");
|
|
const calendarLicense = fs.readFileSync(path.join(root, "src/vendor/fullcalendar/LICENSE.md"), "utf8");
|
|
parts.unshift(`function loadOpportunityCalendarLibrary() {\n/* ${calendarLicense} */\n${calendarLibrary}\nreturn FullCalendar;\n}`);
|
|
const css = ["src/content/styles/redwood.css", "src/features/debug/styles.css", "src/features/opportunities/styles.css", "src/features/install-base/styles.css", "src/features/service-requests/styles.css", "src/features/consumption/plan-detail.css", "src/features/ratecard/styles.css", "src/features/opportunities/customer-table-search.css", "src/features/opportunities/calendar.css"]
|
|
.concat("src/features/manage-time/styles.css", "src/features/products/ramp-projection.css", "src/features/org-chart/styles.css", "src/content/styles/tables.css", "src/content/styles/dialogs.css")
|
|
.map(file => fs.readFileSync(path.join(root, file), "utf8")).join("\n");
|
|
parts.unshift(`const redwoodStyles = ${JSON.stringify(css)};`);
|
|
}
|
|
const factory = { content: "createContentApplication", background: "createBackgroundApplication", "spa-page": "createSpaPage" }[target];
|
|
const ending = bootstrap ? `${factory}().start();` : `return ${factory};`;
|
|
const output = `(function () {\n "use strict";\n${parts.join("\n")}\n${ending}\n})();\n`;
|
|
new vm.Script(output, { filename: `${target}.js` });
|
|
return output;
|
|
}
|
|
|
|
module.exports = { composeScript, sources, vendorSources };
|