97 lines
2.3 KiB
JavaScript
97 lines
2.3 KiB
JavaScript
import fs from "fs";
|
|
import path from "path";
|
|
|
|
function stripBOM(str) {
|
|
if (str.charCodeAt(0) === 0xFEFF) {
|
|
return str.slice(1);
|
|
}
|
|
return str;
|
|
}
|
|
|
|
const [ , , clientName, variantName ] = process.argv;
|
|
|
|
if (!clientName || !variantName) {
|
|
console.error("❌ Usage: node build-css.js <client> <variant>");
|
|
process.exit(1);
|
|
}
|
|
|
|
const ROOT = process.cwd();
|
|
|
|
const DIST_DIR = path.join(
|
|
ROOT,
|
|
"dist",
|
|
clientName,
|
|
variantName
|
|
);
|
|
|
|
const OUTPUT_FILE = path.join(DIST_DIR, "min.css");
|
|
|
|
const SOURCES = [
|
|
// 1. Tokens
|
|
"2-tokens/2-generated",
|
|
"2-tokens/overrides.css",
|
|
|
|
// 2. Framework
|
|
"3-styles/ingeli-std/1-behaviors",
|
|
"3-styles/ingeli-std/2-components",
|
|
"3-styles/ingeli-std/utilities",
|
|
|
|
"3-styles/ingeli-ils/1-behaviors",
|
|
"3-styles/ingeli-ils/2-components",
|
|
"3-styles/ingeli-ils/utilities",
|
|
|
|
"3-styles/cloud-engine/1-behaviors",
|
|
"3-styles/cloud-engine/2-components",
|
|
"3-styles/cloud-engine/utilities",
|
|
|
|
// 3. Client commons
|
|
`4-clients/${clientName}/1-commons/styles`,
|
|
|
|
// 4. Client apps
|
|
`4-clients/${clientName}/app-*/styles`,
|
|
|
|
// 5. Variant (last override)
|
|
`4-clients/${clientName}/variants/${variantName}`
|
|
];
|
|
|
|
function collectCssFiles(entry) {
|
|
const fullPath = path.join(ROOT, entry);
|
|
|
|
if (!fs.existsSync(fullPath)) return [];
|
|
|
|
const stat = fs.statSync(fullPath);
|
|
|
|
if (stat.isFile() && entry.endsWith(".css")) {
|
|
return [fullPath];
|
|
}
|
|
|
|
if (stat.isDirectory()) {
|
|
return fs.readdirSync(fullPath)
|
|
.flatMap(f => collectCssFiles(path.join(entry, f)));
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
// --- Build ---
|
|
console.log(`🔨 Building CSS`);
|
|
console.log(` Client : ${clientName}`);
|
|
console.log(` Variant : ${variantName}`);
|
|
|
|
fs.mkdirSync(DIST_DIR, { recursive: true });
|
|
|
|
const files = SOURCES.flatMap(collectCssFiles);
|
|
|
|
let output = `/* Ingeli Design System */\n`;
|
|
output += `/* Client: ${clientName} */\n`;
|
|
output += `/* Variant: ${variantName} */\n\n`;
|
|
|
|
for (const file of files) {
|
|
console.log(" +", path.relative(ROOT, file));
|
|
output += `\n/* === ${path.relative(ROOT, file)} === */\n`;
|
|
output += stripBOM(fs.readFileSync(file, "utf8"));
|
|
}
|
|
|
|
fs.writeFileSync(OUTPUT_FILE, output, "utf8");
|
|
|
|
console.log(`✅ CSS generated: ${OUTPUT_FILE}`);
|