51 lines
2.1 KiB
JavaScript
51 lines
2.1 KiB
JavaScript
|
import { dirname, join } from 'path';
|
||
|
import { readFileSync } from 'fs';
|
||
|
import hasTypes from 'hastypes';
|
||
|
import semver from 'semver';
|
||
|
import { execSync } from 'child_process';
|
||
|
import { createRequire } from 'module';
|
||
|
import { pathToFileURL } from 'url';
|
||
|
|
||
|
const packageJSONpath = join(process.cwd(), 'package.json');
|
||
|
|
||
|
const require = createRequire(pathToFileURL(packageJSONpath));
|
||
|
|
||
|
const { dependencies, devDependencies } = JSON.parse(readFileSync(packageJSONpath));
|
||
|
|
||
|
const typesPackagesPresent = Object.entries(devDependencies).filter(([name]) => name.startsWith('@types/'));
|
||
|
|
||
|
console.log(`Found ${typesPackagesPresent.length} \`@types/\` packages...`);
|
||
|
|
||
|
const typesPackagesToRemove = Promise.all(typesPackagesPresent.filter(([x]) => x !== '@types/node').map(async ([name, version]) => {
|
||
|
const actualName = name.replace('@types/', '');
|
||
|
let actualVersion;
|
||
|
try {
|
||
|
actualVersion = JSON.parse(readFileSync(join(process.cwd(), 'node_modules', actualName, 'package.json'))).version;
|
||
|
} catch (e) {
|
||
|
console.error(e, join(actualName, '/package.json'));
|
||
|
return [name, , true];
|
||
|
}
|
||
|
const expectedVersion = `${semver.major(actualVersion)}.${semver.minor(actualVersion)}`;
|
||
|
const specifier = `${actualName}@${expectedVersion}`;
|
||
|
|
||
|
return [name, expectedVersion, await hasTypes(specifier)];
|
||
|
})).then((x) => x.filter(([, , hasTypes]) => hasTypes === true));// .then((x) => x.map(([name, expectedVersion]) => [name, expectedVersion]));
|
||
|
|
||
|
typesPackagesToRemove.then((x) => {
|
||
|
console.log(`Found ${x.length} \`@types/\` packages to remove...`);
|
||
|
console.log(x);
|
||
|
if (x.length > 0) {
|
||
|
execSync(`npm uninstall --save ${x.map(([name, version]) => `"${name}@${version}"`).join(' ')}`, { cwd: process.cwd() });
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// const typesPackagesToAdd = Promise.all(
|
||
|
// Object.entries(dependencies)
|
||
|
// .filter(([name]) => !typesPackagesPresent.includes(`@types/${name}`))
|
||
|
// .map(async ([name, version]) => {
|
||
|
// const actualVersion = require(`${name}/package.json`).version;
|
||
|
// const expectedVersion = `${semver.major(actualVersion)}.${semver.minor(actualVersion)}`;
|
||
|
// console.log(specifier);
|
||
|
// })
|
||
|
// )
|