tmp.mjs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { dirname, join } from 'path';
  2. import { readFileSync } from 'fs';
  3. import hasTypes from 'hastypes';
  4. import semver from 'semver';
  5. import { execSync } from 'child_process';
  6. import { createRequire } from 'module';
  7. import { pathToFileURL } from 'url';
  8. const packageJSONpath = join(process.cwd(), 'package.json');
  9. const require = createRequire(pathToFileURL(packageJSONpath));
  10. const { dependencies, devDependencies } = JSON.parse(readFileSync(packageJSONpath));
  11. const typesPackagesPresent = Object.entries(devDependencies).filter(([name]) => name.startsWith('@types/'));
  12. console.log(`Found ${typesPackagesPresent.length} \`@types/\` packages...`);
  13. const typesPackagesToRemove = Promise.all(typesPackagesPresent.filter(([x]) => x !== '@types/node').map(async ([name, version]) => {
  14. const actualName = name.replace('@types/', '');
  15. let actualVersion;
  16. try {
  17. actualVersion = JSON.parse(readFileSync(join(process.cwd(), 'node_modules', actualName, 'package.json'))).version;
  18. } catch (e) {
  19. console.error(e, join(actualName, '/package.json'));
  20. return [name, , true];
  21. }
  22. const expectedVersion = `${semver.major(actualVersion)}.${semver.minor(actualVersion)}`;
  23. const specifier = `${actualName}@${expectedVersion}`;
  24. return [name, expectedVersion, await hasTypes(specifier)];
  25. })).then((x) => x.filter(([, , hasTypes]) => hasTypes === true));// .then((x) => x.map(([name, expectedVersion]) => [name, expectedVersion]));
  26. typesPackagesToRemove.then((x) => {
  27. console.log(`Found ${x.length} \`@types/\` packages to remove...`);
  28. console.log(x);
  29. if (x.length > 0) {
  30. execSync(`npm uninstall --save ${x.map(([name, version]) => `"${name}@${version}"`).join(' ')}`, { cwd: process.cwd() });
  31. }
  32. });
  33. // const typesPackagesToAdd = Promise.all(
  34. // Object.entries(dependencies)
  35. // .filter(([name]) => !typesPackagesPresent.includes(`@types/${name}`))
  36. // .map(async ([name, version]) => {
  37. // const actualVersion = require(`${name}/package.json`).version;
  38. // const expectedVersion = `${semver.major(actualVersion)}.${semver.minor(actualVersion)}`;
  39. // console.log(specifier);
  40. // })
  41. // )