mirror of
https://github.com/pezkuwichain/pezkuwi-dev.git
synced 2026-04-22 02:08:01 +00:00
cb6801a3cc
- Updated all copyright headers from 2025 to 2026 (system date shows 2026)
- Added build output files to eslint ignore list in packages/dev/config/eslint.js
- Added build output patterns to .gitignore
- Ignored: packages/*/*.{d.ts,js,mjs,cjs}, packages/*/cjs/**, packages/*/env/**,
packages/*/rootJs/**, packages/*/rootStatic/**
- Successfully resolved 521 lint errors by properly ignoring generated files
- Build outputs should not be linted (source files are linted instead)
- Lint and build now pass successfully
185 lines
4.4 KiB
JavaScript
185 lines
4.4 KiB
JavaScript
#!/usr/bin/env node
|
|
// Copyright 2017-2026 @pezkuwi/dev authors & contributors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
|
|
/** @typedef {{ dependencies: Record<string, string>; devDependencies: Record<string, string>; peerDependencies: Record<string, string>; optionalDependencies: Record<string, string>; resolutions: Record<string, string>; name: string; version: string; versions: { git: string; npm: string; } }} PkgJson */
|
|
|
|
// The keys to look for in package.json
|
|
const PKG_PATHS = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies', 'resolutions'];
|
|
|
|
const versions = {};
|
|
const paths = [];
|
|
let updated = 0;
|
|
|
|
/**
|
|
* Returns the path of the package.json inside the supplied directory
|
|
*
|
|
* @param {string} dir
|
|
* @returns {string}
|
|
*/
|
|
function packageJsonPath (dir) {
|
|
return path.join(dir, 'package.json');
|
|
}
|
|
|
|
/**
|
|
* Update the supplied dependency map with the latest (version map) versions
|
|
*
|
|
* @param {string} dir
|
|
* @param {boolean} hasDirLogged
|
|
* @param {string} key
|
|
* @param {Record<string, string>} dependencies
|
|
* @returns {[number, Record<string, string>]}
|
|
*/
|
|
function updateDependencies (dir, hasDirLogged, key, dependencies) {
|
|
let count = 0;
|
|
const adjusted = Object
|
|
.keys(dependencies)
|
|
.sort()
|
|
.reduce((result, name) => {
|
|
const current = dependencies[name];
|
|
const version = !current.startsWith('^') || current.endsWith('-x')
|
|
? current
|
|
: versions[name] || current;
|
|
|
|
if (version !== current) {
|
|
if (count === 0) {
|
|
if (!hasDirLogged) {
|
|
console.log('\t', dir);
|
|
}
|
|
|
|
console.log('\t\t', key);
|
|
}
|
|
|
|
console.log('\t\t\t', name.padStart(30), '\t', current.padStart(8), '->', version);
|
|
count++;
|
|
updated++;
|
|
}
|
|
|
|
result[name] = version;
|
|
|
|
return result;
|
|
}, {});
|
|
|
|
return [count, adjusted];
|
|
}
|
|
|
|
/**
|
|
* Returns a parsed package.json
|
|
*
|
|
* @param {string} dir
|
|
* @returns {PkgJson}
|
|
*/
|
|
function parsePackage (dir) {
|
|
return JSON.parse(
|
|
fs.readFileSync(packageJsonPath(dir), 'utf-8')
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Outputs the supplied package.json
|
|
*
|
|
* @param {string} dir
|
|
* @param {Record<string, unknown>} json
|
|
*/
|
|
function writePackage (dir, json) {
|
|
fs.writeFileSync(packageJsonPath(dir), `${JSON.stringify(json, null, 2)}\n`);
|
|
}
|
|
|
|
/**
|
|
* Rerite the package.json with updated dependecies
|
|
*
|
|
* @param {string} dir
|
|
*/
|
|
function updatePackage (dir) {
|
|
const json = parsePackage(dir);
|
|
let hasDirLogged = false;
|
|
|
|
writePackage(dir, Object
|
|
.keys(json)
|
|
.reduce((result, key) => {
|
|
if (PKG_PATHS.includes(key)) {
|
|
const [count, adjusted] = updateDependencies(dir, hasDirLogged, key, json[key]);
|
|
|
|
result[key] = adjusted;
|
|
|
|
if (count) {
|
|
hasDirLogged = true;
|
|
}
|
|
} else {
|
|
result[key] = json[key];
|
|
}
|
|
|
|
return result;
|
|
}, {})
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Loop through package/*, extracting the package names and their versions
|
|
*
|
|
* @param {string} dir
|
|
*/
|
|
function findPackages (dir) {
|
|
const pkgsDir = path.join(dir, 'packages');
|
|
|
|
paths.push(dir);
|
|
|
|
if (!fs.existsSync(pkgsDir)) {
|
|
return;
|
|
}
|
|
|
|
const { versions: { npm: lastVersion } } = parsePackage(dir);
|
|
|
|
fs
|
|
.readdirSync(pkgsDir)
|
|
.filter((entry) => {
|
|
const full = path.join(pkgsDir, entry);
|
|
|
|
return !['.', '..'].includes(entry) &&
|
|
fs.lstatSync(full).isDirectory() &&
|
|
fs.existsSync(path.join(full, 'package.json'));
|
|
})
|
|
.forEach((dir) => {
|
|
const full = path.join(pkgsDir, dir);
|
|
const pkgJson = parsePackage(full);
|
|
|
|
paths.push(full);
|
|
versions[pkgJson.name] = `^${lastVersion}`;
|
|
|
|
// for dev we want to pull through the additionals, i.e. we want to
|
|
// align deps found in dev/others with those in dev as master
|
|
if (pkgJson.name === '@pezkuwi/dev') {
|
|
PKG_PATHS.forEach((depPath) => {
|
|
Object
|
|
.entries(pkgJson[depPath] || {})
|
|
.filter(([, version]) => version.startsWith('^'))
|
|
.forEach(([pkg, version]) => {
|
|
versions[pkg] ??= version;
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
console.log('Extracting ...');
|
|
|
|
fs
|
|
.readdirSync('.')
|
|
.filter((name) =>
|
|
!['.', '..'].includes(name) &&
|
|
fs.existsSync(packageJsonPath(name))
|
|
)
|
|
.sort()
|
|
.forEach(findPackages);
|
|
|
|
console.log('\t', Object.keys(versions).length, 'packages found');
|
|
|
|
console.log('Updating ...');
|
|
|
|
paths.forEach(updatePackage);
|
|
|
|
console.log('\t', updated, 'versions adjusted');
|