simple_ui_elements
Version:
A simple UI components library for React with Tailwind CSS.
123 lines (110 loc) • 3.67 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
// Extract fs functions
const { existsSync, mkdirSync, copyFileSync, readdirSync, lstatSync } = fs;
// Enhanced logging
console.log('\x1b[36m=== simple_ui_elements postinstall script ===\x1b[0m');
let packageRoot;
try {
packageRoot = path.dirname(require.resolve('simple_ui_elements/package.json'));
console.log('\x1b[32m✓\x1b[0m Package root:', packageRoot);
} catch (err) {
console.error('\x1b[31m✗\x1b[0m Failed to locate package root:', err);
process.exit(1);
}
const userRoot = process.cwd();
console.log('\x1b[34m→\x1b[0m User project root:', userRoot);
// Ensure directory exists
const ensureDir = dir => {
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
};
// Recursive copy function
const copyRecursive = (src, dest) => {
const stats = lstatSync(src);
if (stats.isDirectory()) {
ensureDir(dest);
const entries = readdirSync(src);
for (const entry of entries) {
copyRecursive(path.join(src, entry), path.join(dest, entry));
}
} else {
ensureDir(path.dirname(dest));
copyFileSync(src, dest);
}
};
// Copy file/directory wrapper with logging
const copyFile = async (source, destination, description) => {
try {
if (!existsSync(source)) {
console.warn(`\x1b[33m⚠\x1b[0m ${description} not found at: ${source}`);
return false;
}
copyRecursive(source, destination);
console.log(`\x1b[32m✓\x1b[0m Copied ${description} to:\n ${destination}`);
return true;
} catch (err) {
console.error(`\x1b[31m✗\x1b[0m Failed to copy ${description}:`, err);
return false;
}
};
// Files and folders to copy
const filesToCopy = [
{
src: path.join(packageRoot, 'postcss.config.mjs'),
dest: path.join(userRoot, 'postcss.config.mjs'),
desc: 'PostCSS config'
},
{
src: path.join(packageRoot, 'dist', 'styles', 'global.css'),
dest: path.join(userRoot, 'src', 'styles', 'global.css'),
desc: 'Global CSS'
},
{
src: path.join(packageRoot, 'dist', 'utils'),
dest: path.join(userRoot, 'src', 'utils'),
desc: 'CN utility'
},
{
src: path.join(packageRoot, 'dist', 'components'),
dest: path.join(userRoot, 'src', 'components'),
desc: 'Components'
}
];
// Main async function
(async () => {
console.log('\x1b[36m\nCopying project files:\x1b[0m');
for (const file of filesToCopy) {
await copyFile(file.src, file.dest, file.desc);
}
// Check dependencies
console.log('\x1b[36m\nChecking dependencies:\x1b[0m');
const requiredDeps = ['tailwindcss', 'postcss', 'autoprefixer'];
const missingDeps = requiredDeps.filter(dep => {
try {
require.resolve(dep);
return false;
} catch {
return true;
}
});
if (missingDeps.length > 0) {
console.warn(`\x1b[33m⚠\x1b[0m Missing dependencies: ${missingDeps.join(', ')}`);
console.log('\x1b[36mAttempting to install...\x1b[0m');
try {
const packageManager = existsSync(path.join(userRoot, 'pnpm-lock.yaml')) ? 'pnpm' : 'npm';
execSync(`${packageManager} add ${missingDeps.join(' ')}`, {
stdio: 'inherit',
cwd: userRoot
});
console.log('\x1b[32m✓\x1b[0m Dependencies installed successfully');
} catch (err) {
console.error('\x1b[31m✗\x1b[0m Failed to install dependencies:', err);
console.warn('\x1b[33mPlease install these manually:\x1b[0m', missingDeps.join(' '));
}
} else {
console.log('\x1b[32m✓\x1b[0m All dependencies already installed');
}
console.log('\x1b[36m\n=== Setup complete ===\x1b[0m\n');
})();