Skip to content

Commit 88d7b71

Browse files
Mykhailo BodnarchukMykhailo Bodnarchuk
authored andcommitted
draft installation script
1 parent 08504be commit 88d7b71

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed

index.js

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
const chalk = require('chalk');
2+
const commander = require('commander');
3+
const dns = require('dns');
4+
const { existsSync } = require('fs');
5+
const envinfo = require('envinfo');
6+
const execSync = require('child_process').execSync;
7+
const fsExtra = require('fs-extra');
8+
const hyperquest = require('hyperquest');
9+
const inquirer = require('inquirer');
10+
const os = require('os');
11+
const path = require('path');
12+
const semver = require('semver');
13+
const spawn = require('cross-spawn');
14+
const tmp = require('tmp');
15+
const unpack = require('tar-pack').unpack;
16+
const url = require('url');
17+
const validateProjectName = require('validate-npm-package-name');
18+
19+
const enginePackages = {
20+
puppeteer: ['puppeteer@4'],
21+
playwright: ['playwright@1'],
22+
testcafe: ['testcafe@1'],
23+
webdriverio: ['webdriverio@6'],
24+
};
25+
26+
const codeceptPackages = [
27+
'@codeceptjs/ui',
28+
'@codeceptjs/examples',
29+
'@codeceptjs/configure'
30+
];
31+
32+
let projectName;
33+
34+
const program = new commander.Command('Create CodeceptJS')
35+
.version(packageJson.version)
36+
.arguments('<project-directory>')
37+
.usage(`${chalk.green('<project-directory>')} [options]`)
38+
.action(name => {
39+
projectName = name;
40+
})
41+
.option('--verbose', 'print additional logs')
42+
.option('--info', 'print environment debug info')
43+
44+
.option('--dev', 'Install all packages as into devDependencies')
45+
.option('--template <template>', 'Install template')
46+
47+
// engines select
48+
.option('--playwright', 'Install playwright packages')
49+
.option('--puppeteer', 'Install puppeteer packages')
50+
.option('--webdriverio', 'Install webdriverio packages')
51+
.option('--testcafe', 'Install testcafe packages')
52+
53+
.allowUnknownOption()
54+
.on('--help', () => {
55+
console.log(` Only ${chalk.green('<project-directory>')} is required.`);
56+
console.log();
57+
})
58+
.parse(process.argv);
59+
60+
if (typeof projectName === 'undefined') {
61+
console.error('Please specify the project directory:');
62+
console.log(
63+
` ${chalk.cyan(program.name())} ${chalk.green('<project-directory>')}`
64+
);
65+
console.log();
66+
console.log('For example:');
67+
console.log(` ${chalk.cyan(program.name())} ${chalk.green('codeceptjs-tests')}`);
68+
console.log();
69+
console.log(
70+
`Run ${chalk.cyan(`${program.name()} --help`)} to see all options.`
71+
);
72+
process.exit(1);
73+
}
74+
75+
// npx create-codeceptjs --template typescript --playwright codecept-tests
76+
77+
function createCodecept(opts) {
78+
const unsupportedNodeVersion = !semver.satisfies(process.version, '>=12');
79+
if (unsupportedNodeVersion) {
80+
console.log(
81+
chalk.yellow(
82+
`You are using Node ${process.version} so the project will be bootstrapped with an old unsupported version of tools.\n\n` +
83+
`Please update to Node 12 or higher for a better, fully supported experience.\n`
84+
)
85+
);
86+
}
87+
88+
const root = path.resolve(name);
89+
const appName = path.basename(root);
90+
fs.ensureDirSync(name);
91+
92+
if (!isSafeToCreateProjectIn(root, name)) {
93+
process.exit(1);
94+
}
95+
console.log();
96+
97+
console.log(`Creating a new CodeceptJS project`);
98+
console.log();
99+
100+
if (!existsSync('package.json')) {
101+
console.log('package.json file does not exist in current dir, creating it...');
102+
103+
const packageJson = {
104+
name: 'codeceptjs-tests',
105+
version: '0.1.0',
106+
private: true,
107+
};
108+
fs.writeJsonSync('package.json', packageJson);
109+
}
110+
111+
let packageJson = fs.readJsonSync('package.json');
112+
113+
if (!packageJson.scripts) packageJson.scripts = {};
114+
115+
packageJson.scripts['e2e'] = 'codeceptjs run --steps';
116+
packageJson.scripts['e2e:app'] = 'codecept-ui --app';
117+
packageJson.scripts['e2e:server'] = 'codecept-ui';
118+
119+
packageJson.scripts['e2e:example'] = 'codeceptjs run --steps -c node_modules/@codeceptjs/examples';
120+
packageJson.scripts['e2e:example:app'] = 'codecept-ui --app -c node_modules/@codeceptjs/examples';
121+
packageJson.scripts['e2e:example:server'] = 'codecept-ui -c node_modules/@codeceptjs/examples';
122+
123+
fs.writeJsonSync('package.json', packageJson);
124+
125+
let initDeps = false;
126+
127+
if (opts)
128+
// npx create-codeceptjs <> --playwright
129+
// npx create-codeceptjs <> --puppeteer
130+
// npx create-codeceptjs <> --testcafe
131+
// npx create-codeceptjs <>
132+
}
133+
134+
// npx create-codeceptjs codecept-tests --playwright && cd codecept-tests && npx codeceptjs init
135+
136+
137+
function install(dependencies, verbose) {
138+
return new Promise((resolve, reject) => {
139+
let command;
140+
let args;
141+
command = 'npm';
142+
args = [
143+
'install',
144+
'--save-dev',
145+
'--loglevel',
146+
'error',
147+
].concat(dependencies);
148+
149+
if (verbose) {
150+
args.push('--verbose');
151+
}
152+
153+
const child = spawn(command, args, { stdio: 'inherit' });
154+
child.on('close', code => {
155+
if (code !== 0) {
156+
reject({
157+
command: `${command} ${args.join(' ')}`,
158+
});
159+
return;
160+
}
161+
resolve();
162+
});
163+
});
164+
}

package.json

Whitespace-only changes.

0 commit comments

Comments
 (0)