-
Notifications
You must be signed in to change notification settings - Fork 133
/
packageJson.ts
81 lines (65 loc) 路 2.43 KB
/
packageJson.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { execSync } from 'child_process';
import Debug from 'debug';
import { promises as fs } from 'fs';
import { join } from 'path';
import { Packages, PackageJson } from './types';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const selfPkg = require('../package.json');
const debug = Debug('create-qawolf:packageJson');
const defaultPackages: Packages = {
jest: selfPkg.devDependencies['jest'],
playwright: selfPkg.createDevDependencies['playwright'],
qawolf: selfPkg.createDevDependencies['qawolf'],
};
const typeScriptPackages: Packages = {
...defaultPackages,
'@types/debug': selfPkg.devDependencies['@types/debug'],
'@types/jest': selfPkg.devDependencies['@types/jest'],
'@types/node': selfPkg.devDependencies['@types/node'],
'ts-jest': selfPkg.devDependencies['ts-jest'],
'ts-node': selfPkg.devDependencies['ts-node'],
};
export const getPackageJsonPath = (): string =>
join(process.cwd(), 'package.json');
export const readPackageJson = async (): Promise<PackageJson> => {
try {
const path = getPackageJsonPath();
const packageJson = await fs.readFile(path, 'utf8');
return JSON.parse(packageJson) as PackageJson;
} catch (error) {
debug('cannot read package.json %s', error.message);
throw new Error('cannot read package.json');
}
};
export const addDevDependencies = async (
useTypeScript: boolean,
): Promise<Packages> => {
const packageJson = await readPackageJson();
const devDependencies = packageJson.devDependencies || {};
const packages = useTypeScript ? typeScriptPackages : defaultPackages;
Object.keys(packages).forEach(name => {
const version = packages[name];
devDependencies[name] = version;
});
const sortedDevDependencies = {};
Object.keys(devDependencies)
.sort((k1, k2) => {
if (k1 < k2) return -1;
if (k1 > k2) return +1;
return 0;
})
.forEach(key => (sortedDevDependencies[key] = devDependencies[key]));
packageJson.devDependencies = sortedDevDependencies;
const path = getPackageJsonPath();
debug('write updated package.json to %s', path);
await fs.writeFile(
path,
// https://github.com/npm/init-package-json/blob/2b5d21ea3e3434f8e0d6050cd2733d5062b830c6/init-package-json.js#L106
JSON.stringify(packageJson, null, 2) + '\n',
'utf8',
);
return packages;
};
export const installDependencies = (useYarn = false): void => {
execSync(useYarn ? 'yarn' : 'npm install', { stdio: 'inherit' });
};