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"], 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 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"] .map(file => fs.readFileSync(path.join(root, file), "utf8")).join("\n"); parts.unshift(`const redwoodStyles = ${JSON.stringify(css)};`); } const factory = target === "content" ? "createContentApplication" : "createBackgroundApplication"; 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 };