@lorenzo.franzone/tws
Version:
Tailwind 4 Styles Generator
207 lines (206 loc) • 9.86 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cssCommand = cssCommand;
const chalk_1 = __importDefault(require("chalk"));
const fs = __importStar(require("fs-extra"));
const globby_1 = require("globby");
const path_1 = require("path");
const prompts_1 = require("@clack/prompts");
const consts_1 = require("../../data/consts");
const css_1 = require("../../utils/css");
const logger_1 = require("../../utils/logger");
// Main command to generate CSS files from JSON configurations
async function cssCommand(options) {
console.clear();
(0, prompts_1.intro)(chalk_1.default.bgBlue(chalk_1.default.white(` Generating CSS from configs `)));
// Controlla se la cartella di configurazione esiste
const exists = await fs.pathExists(consts_1.CONFIG_DIR);
if (!exists) {
(0, logger_1.logError)(`Hmm, couldn't find the "${consts_1.CONFIG_DIR}" folder. Run 'tws init' first.`);
return;
}
// Trova tutti i file .config.json nella cartella di configurazione
const configFiles = await (0, globby_1.globby)('*.config.json', { cwd: consts_1.CONFIG_DIR });
if (configFiles.length === 0) {
(0, logger_1.logError)(`No configuration files found. You can create some using 'tws config'.`);
return;
}
// Estrai i nomi dei moduli dai file
const availableModules = configFiles.map((f) => f.replace('.config.json', ''));
let selectedModules = [];
// Se --all è passato, seleziona tutti i moduli
if (options.all) {
selectedModules = availableModules; // Seleziona tutti i moduli disponibili
}
else {
// Controlla se ci sono moduli richiesti senza configurazione
const missingConfigs = Object.entries(options).filter(([key, value]) => value === true && !availableModules.includes(key) && key !== 'force');
if (missingConfigs.length > 0) {
const missingModuleNames = missingConfigs.map(([key]) => key);
// Mostra errore dinamico per i moduli mancanti
(0, logger_1.logError)(`The following modules are not configured: ${missingModuleNames.join(', ')}. Run 'tws config --<module>' to create them.`);
return;
}
// Se ci sono moduli esplicitamente selezionati, bypassa il multiselect e procedi direttamente
if (Object.keys(options).some(key => options[key])) {
selectedModules = Object.keys(options).filter(key => options[key] && key !== 'force'); // Escludi "force" dalla selezione dei moduli
}
}
// Se nessun modulo è stato selezionato esplicitamente e --all non è abilitato, chiedi all'utente di scegliere tramite multiselect
if (selectedModules.length === 0) {
const result = await (0, prompts_1.multiselect)({
message: 'Choose which modules you want to generate CSS for:',
options: availableModules.map((mod) => ({ value: mod, label: mod })),
});
if ((0, prompts_1.isCancel)(result)) {
(0, prompts_1.cancel)('No worries. CSS generation was cancelled.');
return;
}
selectedModules = result;
}
// Verifica per i moduli richiesti che non hanno file di configurazione
const requestedModules = Object.entries(options)
.filter(([k, v]) => availableModules.includes(k) && v === true)
.map(([k]) => k);
const missingRequestedConfigs = requestedModules.filter((mod) => !availableModules.includes(mod));
if (missingRequestedConfigs.length > 0) {
for (const mod of missingRequestedConfigs) {
(0, logger_1.logError)(`Configuration is missing for the "${mod}" module. Run 'tws config --${mod}' to create it.`);
}
return;
}
// Gestisci la sovrascrittura (se l'opzione force non è abilitata)
let modulesToOverwrite = [];
const isForceEnabled = options.force ?? false;
if (!isForceEnabled) {
const existingOutputModules = [];
for (const mod of selectedModules) {
const configPath = (0, path_1.join)(consts_1.CONFIG_DIR, `${mod}.config.json`);
if (!(await fs.pathExists(configPath))) {
(0, logger_1.logError)(`Missing config file for "${mod}". Skipping this one.`);
continue;
}
const config = await fs.readJSON(configPath);
const outDir = (0, path_1.resolve)(config.outDir);
if (await fs.pathExists(outDir)) {
existingOutputModules.push({ mod, outDir });
}
}
// Gestisci i prompt di sovrascrittura per un singolo o più moduli
if (existingOutputModules.length === 1) {
const { mod, outDir } = existingOutputModules[0];
const confirmOverwrite = await (0, prompts_1.confirm)({
message: `The output folder "${outDir}" for "${mod}" already exists. Should we replace it?`,
});
if ((0, prompts_1.isCancel)(confirmOverwrite) || !confirmOverwrite) {
(0, prompts_1.cancel)(`Skipping "${mod}" as requested.`);
selectedModules = selectedModules.filter((m) => m !== mod);
}
else {
modulesToOverwrite.push(mod);
}
}
else if (existingOutputModules.length > 1) {
const overwriteResult = await (0, prompts_1.multiselect)({
message: 'Some output folders already exist. Select the ones you want to replace:',
options: existingOutputModules.map(({ mod }) => ({
value: mod,
label: mod,
})),
});
if ((0, prompts_1.isCancel)(overwriteResult)) {
(0, prompts_1.cancel)('CSS generation cancelled.');
return;
}
modulesToOverwrite = overwriteResult;
// Rimuovi dalla lista quelli che non sono selezionati per la sovrascrittura
selectedModules = selectedModules.filter((mod) => {
const hasOutput = existingOutputModules.some((m) => m.mod === mod);
if (hasOutput) {
return modulesToOverwrite.includes(mod);
}
return true;
});
}
}
else {
// Se --force è abilitato, sovrascrivi tutto
modulesToOverwrite = selectedModules;
}
const s = (0, prompts_1.spinner)();
s.start('Processing your styles...');
// Cicla attraverso tutti i moduli selezionati e genera i CSS
for (const mod of selectedModules) {
const configPath = (0, path_1.join)(consts_1.CONFIG_DIR, `${mod}.config.json`);
const config = await fs.readJSON(configPath);
const outDir = (0, path_1.resolve)(config.outDir);
// Pulisce l'output esistente se necessario
if (await fs.pathExists(outDir)) {
if (isForceEnabled || modulesToOverwrite.includes(mod)) {
await fs.remove(outDir);
}
else {
s.stop(`Skipped "${mod}" since output already exists.`);
continue;
}
}
await fs.ensureDir(outDir);
try {
// Import dinamico del processore di configurazione del modulo
const { [`${capitalize(mod)}ConfigProcessor`]: ProcessorClass, } = await Promise.resolve(`${`../../modules/${mod}/${capitalize(mod)}ConfigProcessor`}`).then(s => __importStar(require(s)));
const processor = new ProcessorClass();
// Genera i file CSS dalla configurazione
const files = await processor.processConfig(config, isForceEnabled);
for (const file of files) {
const contentWithHeader = css_1.cssHeaderFile + file.content;
await fs.outputFile(file.path, contentWithHeader);
}
s.stop(chalk_1.default.green(`CSS for "${mod}" has been successfully generated.`));
}
catch (err) {
s.stop(`Something went wrong while processing "${mod}".`);
console.error(err);
}
}
(0, prompts_1.outro)(chalk_1.default.blue.bold.underline(`CSS generation complete. You're good to go.`));
}
// Funzione di utilità per capitalizzare la prima lettera di una stringa
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}