UNPKG

@lorenzo.franzone/tws

Version:

Tailwind 4 Styles Generator

207 lines (206 loc) 9.86 kB
"use strict"; 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); }