Files
aidenybai--react-scan/scripts/version-warning.mjs
2025-03-18 15:30:29 +02:00

112 lines
3.1 KiB
JavaScript
Executable File

import { readFileSync, readdirSync } from 'node:fs';
import { dirname, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import boxen from 'boxen';
import chalk from 'chalk';
const __dirname = dirname(fileURLToPath(import.meta.url));
const pEnd = 38;
// Styling constants
const styles = {
title: '#7B65D0',
header: chalk.hex('#C4B5FD').bold,
text: chalk.hex('#E4E4E7'),
arrow: chalk.hex('#C4B5FD'),
version: chalk.hex('#C4B5FD'),
border: '#503C9B',
dim: chalk.hex('#A1A1AA'),
};
const MESSAGES = {
workspace: {
header: '📦 Workspace Packages',
text: 'Make sure to bump versions if publishing',
},
package: {
text: 'Make sure to bump version if publishing',
},
};
function getWorkspacePackages() {
const packagesDir = resolve(__dirname, '../packages');
const packages = {};
try {
const dirs = readdirSync(packagesDir, { withFileTypes: true }).filter(
(dirent) => dirent.isDirectory(),
);
for (const dir of dirs) {
const pkgPath = resolve(packagesDir, dir.name, 'package.json');
try {
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
if (pkg.version) {
packages[pkg.name] = pkg.version;
}
} catch (err) {
// biome-ignore lint/suspicious/noConsole: Intended debug output
console.error(`Error reading ${dir.name}/package.json:`, err);
}
}
return packages;
} catch (err) {
// biome-ignore lint/suspicious/noConsole: Intended debug output
console.error('Error reading packages directory:', err);
process.exit(1);
}
}
function getPackageInfo() {
const cwd = process.cwd();
const isWorkspacePackage = cwd.includes('packages/');
const isRootDir = cwd === resolve(__dirname, '..');
const isDirectPackageBuild =
isWorkspacePackage && process.env.WORKSPACE_BUILD !== '1';
if (isDirectPackageBuild) {
const pkgPath = resolve(cwd, 'package.json');
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
return { name: pkg.name, version: pkg.version };
}
if (isRootDir) {
return {
name: 'Workspace Packages',
versions: getWorkspacePackages(),
};
}
process.exit(0);
}
const pkgInfo = getPackageInfo();
const message = pkgInfo.versions
? `${styles.text(MESSAGES.workspace.text)}\n\n${styles.header(MESSAGES.workspace.header)}\n${Object.entries(
pkgInfo.versions,
)
.sort(([a], [b]) => a.localeCompare(b))
.map(([pkg, version], index, array) => {
const prevPkg = index > 0 ? array[index - 1][0] : '';
const needsSpace = prevPkg.startsWith('@') && pkg === 'react-scan';
return `${needsSpace ? '\n' : ''}${styles.dim(pkg.padEnd(pEnd))}${styles.version(`v${version}`)}`;
})
.join('\n')}`
: `${styles.text(MESSAGES.package.text)}\n\n${styles.dim(pkgInfo.name.padEnd(pEnd))}${styles.version(`v${pkgInfo.version}`)}`;
// biome-ignore lint/suspicious/noConsole: Intended debug output
console.log(
boxen(message, {
padding: 1,
margin: 1,
borderStyle: 'round',
borderColor: styles.border,
title: chalk.hex(styles.title)('⚡ Version Check'),
titleAlignment: 'left',
float: 'left',
}),
);