ntts
Version:
A CLI tool for refactoring an existing NodeJs application to a fully functional TypeScript application.
37 lines (30 loc) • 1.56 kB
text/typescript
import { existsSync, readFileSync } from 'fs';
import { join } from 'path';
import ScriptRunner from '../../helpers/script-runner/script-runner';
import { PackageListModel, PackageVersionModel } from '../../models/package.model';
class DependencyHandler {
static installedPackages = async (): Promise<PackageListModel> => {
const packageVersion = await ScriptRunner.runParsed<PackageVersionModel>('npm ls --json');
return packageVersion.dependencies || {};
};
static packageHasTypes = async (packageName: string): Promise<boolean> => {
const pathToPackage = await ScriptRunner.runPipe(`npm ls ${packageName} --parseable --depth=0`);
if (existsSync(join(pathToPackage, 'index.d.ts'))) {
return true;
}
const fullPath = join(pathToPackage, 'package.json');
const packageJSON = JSON.parse(readFileSync(fullPath, { encoding: 'utf-8' })) as { [key: string]: unknown };
return Object.prototype.hasOwnProperty.call(packageJSON, 'types')
|| Object.prototype.hasOwnProperty.call(packageJSON, 'typings');
};
static packageToTypesFormat = (packageName: string): string => {
if (DependencyHandler.isScoped(packageName)) {
const formattedName = packageName.substring(1).replace('/', '__');
return `@types/${formattedName}`;
}
return `@types/${packageName}`;
};
static isTypeDefinition = (packageName: string): boolean => /^@types\/.+$/.test(packageName);
private static isScoped = (packageName: string): boolean => /^@.+\/.+$/.test(packageName);
}
export default DependencyHandler;