@lorenzo.franzone/tws
Version:
Tailwind 4 Styles Generator
103 lines (102 loc) • 4.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processLayout = processLayout;
const clamp_1 = require("../../utils/clamp");
const helpers_1 = require("../../utils/helpers");
/**
* ========================================
* processLayout
* ========================================
* Transforms a layout configuration object into a normalized format
* ready to be used by the theme generator.
* It converts spacing units to rems, validates structure, and
* gracefully handles errors with helpful feedback.
*/
function processLayout(config) {
const errors = new Set();
validateLayoutConfig(config, errors);
if (errors.size > 0) {
console.error("Hmm, looks like your layout config has a few issues:");
errors.forEach(err => console.error("•", err));
return { outDir: "", data: {} };
}
const { outDir, data } = config;
const { container, gap, breakout, columnsCount, extraMargin } = data;
const processedLayout = {};
try {
// Convert container width to rems
if (container !== undefined) {
processedLayout.container = (0, helpers_1.pxToRem)(container, undefined, true);
}
// Convert breakout width to rems
if (breakout !== undefined) {
processedLayout.breakout = (0, helpers_1.pxToRem)(breakout, undefined, true);
}
// Clamp-based conversion for gaps
if (gap) {
processedLayout.gap = (0, clamp_1.clamp)(gap);
}
// Process nested column definitions
if (columnsCount) {
processedLayout.columnsCount = (0, helpers_1.processNestedObject)(columnsCount, (value) => value);
}
// Optional extra margin conversion
if (extraMargin !== undefined) {
processedLayout.extraMargin = (0, helpers_1.pxToRem)(extraMargin, undefined, true);
}
}
catch (e) {
// Friendly error message if something goes wrong during processing
console.error("Oops! Something went wrong while processing your layout settings.");
console.error(e);
return { outDir: "", data: {} };
}
return {
outDir,
data: processedLayout,
};
}
/**
* ========================================
* validateLayoutConfig
* ========================================
* Validates the structure and data types of the layout config.
* Accumulates friendly error messages for anything invalid.
*/
function validateLayoutConfig(config, errors) {
if (!config.data || typeof config.data !== 'object') {
errors.add("Missing or invalid 'data' field in layout config.");
return;
}
const { container, gap, breakout, columnsCount, extraMargin } = config.data;
if (container !== undefined && typeof container !== 'number') {
errors.add("'container' should be a number (e.g. 1280).");
}
if (breakout !== undefined && typeof breakout !== 'number') {
errors.add("'breakout' should be a number (e.g. 40).");
}
if (extraMargin !== undefined && typeof extraMargin !== 'number') {
errors.add("'extraMargin' should be a number.");
}
if (gap !== undefined && !Array.isArray(gap)) {
errors.add("'gap' must be an array using clamp format (e.g. [16, 24, 32]).");
}
if (columnsCount !== undefined) {
const validKeys = ['aside-single', 'aside-left', 'aside-right'];
for (const key of Object.keys(columnsCount)) {
if (!validKeys.includes(key)) {
errors.add(`Invalid key in 'columnsCount': "${key}". Valid keys are ${validKeys.join(', ')}.`);
continue;
}
const value = columnsCount[key];
if (!Array.isArray(value) || value.length !== 4) {
errors.add(`'${key}' must be an array of exactly 4 numbers.`);
continue;
}
const isValid = value.every(num => typeof num === 'number');
if (!isValid) {
errors.add(`'${key}' must contain only numeric values.`);
}
}
}
}