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 |
|
9 | const packageJSONpath = join(process.cwd(), 'package.json');
|
10 |
|
11 | const require = createRequire(pathToFileURL(packageJSONpath));
|
12 |
|
13 | const { dependencies, devDependencies } = JSON.parse(readFileSync(packageJSONpath));
|
14 |
|
15 | const typesPackagesPresent = Object.entries(devDependencies).filter(([name]) => name.startsWith('@types/'));
|
16 |
|
17 | console.log(`Found ${typesPackagesPresent.length} \`@types/\` packages...`);
|
18 |
|
19 | const typesPackagesToRemove = Promise.all(typesPackagesPresent.filter(([x]) => x !== '@types/node').map(async ([name, version]) => {
|
20 | const actualName = name.replace('@types/', '');
|
21 | let actualVersion;
|
22 | try {
|
23 | actualVersion = JSON.parse(readFileSync(join(process.cwd(), 'node_modules', actualName, 'package.json'))).version;
|
24 | } catch (e) {
|
25 | console.error(e, join(actualName, '/package.json'));
|
26 | return [name, , true];
|
27 | }
|
28 | const expectedVersion = `${semver.major(actualVersion)}.${semver.minor(actualVersion)}`;
|
29 | const specifier = `${actualName}@${expectedVersion}`;
|
30 |
|
31 | return [name, expectedVersion, await hasTypes(specifier)];
|
32 | })).then((x) => x.filter(([, , hasTypes]) => hasTypes === true));
|
33 |
|
34 | typesPackagesToRemove.then((x) => {
|
35 | console.log(`Found ${x.length} \`@types/\` packages to remove...`);
|
36 | console.log(x);
|
37 | if (x.length > 0) {
|
38 | execSync(`npm uninstall --save ${x.map(([name, version]) => `"${name}@${version}"`).join(' ')}`, { cwd: process.cwd() });
|
39 | }
|
40 | });
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|