Skip to content

Instantly share code, notes, and snippets.

@jsnajdr
Last active January 4, 2021 07:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jsnajdr/1fa47dfd8f330b5f774711298f0f26ed to your computer and use it in GitHub Desktop.
Save jsnajdr/1fa47dfd8f330b5f774711298f0f26ed to your computer and use it in GitHub Desktop.
List installed @wordpress/* package in your wp-calypso repo
const globby = require( 'globby' );
const fs = require( 'fs' );
function list_dirs( glob ) {
return globby.sync( glob, { onlyDirectories: true } );
}
const dirs = [ '.', './client', ...list_dirs( './apps/*' ), ...list_dirs( './packages/*' ) ];
function pkg_name( dir ) {
const parts = dir.split( '/' );
const name = parts[ parts.length - 1 ];
const ns = parts[ parts.length - 2 ];
if ( ns.startsWith( '@' ) ) {
return ns + '/' + name;
}
return name;
}
function dir_name( dir ) {
const parts = dir.split( '/' );
return parts[ parts.length - 1 ];
}
function is_symlink( dir ) {
return fs.lstatSync( dir ).isSymbolicLink();
}
function is_wp_package( name ) {
return /^@wordpress\/.+/.test( name );
}
function* pkg_dirs( dir ) {
for ( const pkg_dir of list_dirs( dir + '/node_modules/*' ) ) {
if ( dir_name( pkg_dir ).startsWith( '@' ) ) {
for ( const ns_dir of list_dirs( pkg_dir + '/*' ) ) {
yield ns_dir;
}
} else {
yield pkg_dir;
}
}
}
const found_pkgs = new Map();
function add_pkg( name, version, dir ) {
let record = found_pkgs.get( name );
if ( ! record ) {
record = [];
found_pkgs.set( name, record );
}
record.push( { version, dir } );
}
function trav_dir( dir ) {
for ( const pkg_dir of pkg_dirs( dir ) ) {
if ( is_symlink( pkg_dir ) ) {
continue;
}
const name = pkg_name( pkg_dir );
if ( is_wp_package( name ) ) {
const pkg_json = JSON.parse( fs.readFileSync( pkg_dir + '/package.json' ) );
add_pkg( name, pkg_json.version, dir + '/node_modules' );
}
trav_dir( pkg_dir );
}
}
for ( const dir of dirs ) {
trav_dir( dir );
}
const entries = Array.from( found_pkgs.entries() );
entries.sort( ( a, b ) => b[ 1 ].length - a[ 1 ].length );
for ( const [ name, list ] of entries ) {
if ( list.length < 2 ) {
continue;
}
console.log( name );
for ( const { version, dir } of list ) {
console.log( ' ' + version + ' in ' + dir );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment