tango-ui-cw
Version:
A lightweight ui library with ClayW
83 lines (71 loc) • 2.56 kB
JavaScript
/**
* tango-ui-cw postinstall peer-dependency checker
* Per NPM-Summary.md §10.3, warns if required peers are missing.
*
* Gracefully skips if the dist/ build output doesn't exist yet
* (e.g. during `npm install` in the library's own repo before first build).
*/
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
import { createRequire } from "module";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// If dist/index.js doesn't exist, we're in a pre-build state — skip silently.
const distEntry = path.resolve(__dirname, "..", "index.js");
if (!fs.existsSync(distEntry)) {
process.exit(0);
}
const require = createRequire(import.meta.url);
const REQUIRED_PEERS = [
{ name: "react", range: ">=18", hint: "React 18+ is required." },
{ name: "react-dom", range: ">=18", hint: "ReactDOM 18+ is required." },
{ name: "next", range: ">=14", hint: "Next.js 14+ is required for SSR/SSG components." },
{ name: "tailwind-merge", range: "^3.6.0", hint: "tailwind-merge ^3.6.0 is required for class merging." },
{ name: "tailwindcss", range: "^4", hint: "Tailwind CSS v4 is required for utility classes." },
];
function getVersion(name) {
try {
const resolved = require.resolve(`${name}/package.json`, { paths: [process.cwd()] });
const pkg = require(resolved);
return pkg.version;
} catch {
return null;
}
}
function satisfies(version, range) {
if (!version) return false;
const major = parseInt(version.split(".")[0], 10);
if (range.startsWith(">=")) {
const min = parseInt(range.replace(">=", ""), 10);
return major >= min;
}
if (range.startsWith("^")) {
const min = parseInt(range.replace("^", "").split(".")[0], 10);
return major >= min;
}
return true;
}
let hasMissing = false;
for (const peer of REQUIRED_PEERS) {
const version = getVersion(peer.name);
if (!version) {
console.warn(
`[tango-ui-cw] ⚠️ Peer dependency "${peer.name}" (${peer.range}) is not installed. ${peer.hint}`
);
hasMissing = true;
} else if (!satisfies(version, peer.range)) {
console.warn(
`[tango-ui-cw] ⚠️ Peer dependency "${peer.name}@${version}" does not satisfy "${peer.range}". ${peer.hint}`
);
hasMissing = true;
}
}
if (hasMissing) {
console.warn(
`[tango-ui-cw] Some peer dependencies are missing or incompatible. The library may not work correctly.`
);
} else {
console.log(`[tango-ui-cw] ✅ All peer dependencies are satisfied.`);
}