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+ }
0 commit comments