beathers
Version:
Beather is a lightweight SCSS library that serves as a comprehensive design system for your projects. It offers a structured and consistent approach to manage colors, fonts, and other design related variables, making it easier to maintain a cohesive visua
142 lines (141 loc) • 4.85 kB
JavaScript
/* eslint-disable no-console */
import fs from 'fs-extra';
import { fileURLToPath } from 'node:url';
import path from 'path';
import { promptSelection, promptUser } from '../commands/index.js';
import { ReadDefaultValues } from '../helpers/index.js';
async function getDefaultValues() {
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const projectRoot = path.resolve(__dirname, '..', '..');
return (await ReadDefaultValues([
path.join(projectRoot, 'scss', 'settings', '_defaults.scss'),
path.join(projectRoot, 'scss', 'settings', '_configs.scss'),
path.join(projectRoot, 'scss', 'settings', '_index.scss'),
], [
'colors',
'fonts',
'fontMainPath',
'fontFormat',
'fontWeights',
'fontStyles',
'textTruncate',
'defaultFontFamilies',
'fontSizes',
'axisDivisions',
'breakpoints',
'wrappers',
'opacities',
'blurValues',
'insetValues',
'guttersValues',
'bordersValue',
'radiuses',
'glassBlur',
'glassColor',
'glassBorderThickness',
'glassBorder1Color',
'glassBorder2Color',
'glassLightAngle',
'useMediaQueries',
'useFontFamilies',
'useFontFamiliesMediaQueries',
'useFontSizes',
'useFontSizesMediaQueries',
'useFontShapes',
'useFontShapesMediaQueries',
'useTextAligns',
'useTextAlignsMediaQueries',
'useTextTruncate',
'useTextTruncateMediaQueries',
'useColors',
'useColorsOpacities',
'useColorsLightMode',
'useColorsDarkMode',
'useCurrentColors',
'useRootColors',
'useGrid',
'useFlex',
'useGridMediaQueries',
'useWrappers',
'useShadows',
'useShadowsMediaQueries',
'useDisplays',
'useDisplaysMediaQueries',
'useOverflows',
'useOverflowsMediaQueries',
'useOpacities',
'useOpacitiesMediaQueries',
'useBlur',
'useBlurMediaQueries',
'useObjectFits',
'useObjectFitsMediaQueries',
'usePositions',
'usePositionsMediaQueries',
'useInsets',
'useInsetsMediaQueries',
'useSizes',
'useSizesMediaQueries',
'useGutters',
'useGuttersMediaQueries',
'useBorders',
'useBordersMediaQueries',
'useTextBorders',
'useTextBordersMediaQueries',
'useRadius',
'useRadiusMediaQueries',
'useGlass',
]));
}
export async function Init() {
const format = await promptSelection('\x1b[36m📁 Choose config format:\x1b[0m', ['json', 'js', 'ts']);
const formatMap = { json: 'beathers.configs.json', js: 'beathers.configs.js', ts: 'beathers.configs.ts' };
const fileName = formatMap[format];
const filePath = path.join(process.cwd(), fileName);
const outputPath = 'public/css';
if (await fs.pathExists(filePath)) {
const shouldOverride = await promptUser(`\x1b[33m⚠️ ${fileName} already exists. Do you want to override it?\x1b[0m\n\x1b[32m[Y]\x1b[0m Yes \x1b[31m[N]\x1b[0m No: `);
if (!shouldOverride) {
console.log('❌ Operation canceled.');
return;
}
}
const includeStarterValues = await promptUser('\x1b[36m📝 Would you like to include starter configuration values?\x1b[0m\n\x1b[32m[Y]\x1b[0m Yes \x1b[31m[N]\x1b[0m No: ');
const defaultValues = await getDefaultValues();
const emptyTemplate = {
colors: {},
typography: {
defaultFontFamilies: [],
fontMainPath: '',
fontFormat: '',
fontWeights: [],
fontStyles: [],
fontSizes: {},
textTruncate: 0,
fonts: {},
},
settings: {
axisDivisions: 0,
opacities: [],
blurValues: [],
insetValues: [],
bordersValue: 0,
radiuses: [],
breakpoints: {},
wrappers: {},
guttersValues: {},
},
roles: {},
};
const data = includeStarterValues ? defaultValues : emptyTemplate;
const finalData = { ...data, outputPath };
const content = JSON.stringify(finalData, null, 2);
let pageContent = content;
if (format === 'js')
pageContent = `export default ${content}`;
else if (format === 'ts')
pageContent = `import type { Theme } from 'beathers'\n\nexport default ${content} satisfies Theme`;
await fs.writeFile(filePath, pageContent);
const starterText = includeStarterValues ? ' with starter values' : '';
console.log(`✅ Successfully created \x1b[32m${fileName}\x1b[0m${starterText}`);
}