@@ -3,15 +3,17 @@ import chalk from 'chalk';
3
3
import fs from 'node:fs' ;
4
4
import path from 'node:path' ;
5
5
import yargs from 'yargs-parser' ;
6
+ import { execa } from 'execa' ;
6
7
import { pkg } from '../../pkg.js' ;
7
- import { errorLabel , primaryLabel , printHelp } from '../../utils/messages.js' ;
8
+ import { errorLabel , primaryLabel , printHelp , warnLabel } from '../../utils/messages.js' ;
8
9
import { generateProjectName } from '../../utils/project.js' ;
9
10
import { assertNotCanceled } from '../../utils/tasks.js' ;
10
- import { installDependencies , type PackageManager } from './dependencies.js' ;
11
11
import { initGitRepo } from './git.js' ;
12
12
import { DEFAULT_VALUES , type CreateOptions } from './options.js' ;
13
13
import { setupEnterpriseConfig } from './enterprise.js' ;
14
14
import { copyTemplate } from './template.js' ;
15
+ import { selectPackageManager , type PackageManager } from './package-manager.js' ;
16
+ import { installAndStart } from './install-start.js' ;
15
17
16
18
const TUTORIALKIT_VERSION = pkg . version ;
17
19
@@ -24,6 +26,7 @@ export async function createTutorial(flags: yargs.Arguments) {
24
26
Options : [
25
27
[ '--dir, -d' , 'The folder in which the tutorial gets created' ] ,
26
28
[ '--install, --no-install' , `Install dependencies (default ${ chalk . yellow ( DEFAULT_VALUES . install ) } )` ] ,
29
+ [ '--start, --no-start' , `Start project (default ${ chalk . yellow ( DEFAULT_VALUES . start ) } )` ] ,
27
30
[ '--git, --no-git' , `Initialize a local git repository (default ${ chalk . yellow ( DEFAULT_VALUES . git ) } )` ] ,
28
31
[ '--dry-run' , `Walk through steps without executing (default ${ chalk . yellow ( DEFAULT_VALUES . dryRun ) } )` ] ,
29
32
[
@@ -46,6 +49,16 @@ export async function createTutorial(flags: yargs.Arguments) {
46
49
return 0 ;
47
50
}
48
51
52
+ applyAliases ( flags ) ;
53
+
54
+ try {
55
+ verifyFlags ( flags ) ;
56
+ } catch ( error ) {
57
+ console . error ( `${ errorLabel ( ) } ${ error . message } ` ) ;
58
+
59
+ process . exit ( 1 ) ;
60
+ }
61
+
49
62
try {
50
63
return _createTutorial ( flags ) ;
51
64
} catch ( error ) {
@@ -60,8 +73,6 @@ export async function createTutorial(flags: yargs.Arguments) {
60
73
}
61
74
62
75
async function _createTutorial ( flags : CreateOptions ) {
63
- applyAliases ( flags ) ;
64
-
65
76
prompts . intro ( primaryLabel ( pkg . name ) ) ;
66
77
67
78
let tutorialName = flags . _ [ 1 ] !== undefined ? String ( flags . _ [ 1 ] ) : undefined ;
@@ -131,21 +142,55 @@ async function _createTutorial(flags: CreateOptions) {
131
142
132
143
updatePackageJson ( resolvedDest , tutorialName , flags ) ;
133
144
134
- const { selectedPackageManager, dependenciesInstalled } = await installDependencies ( resolvedDest , flags ) ;
145
+ const selectedPackageManager = await selectPackageManager ( flags ) ;
135
146
136
147
updateReadme ( resolvedDest , selectedPackageManager , flags ) ;
137
148
138
149
await setupEnterpriseConfig ( resolvedDest , flags ) ;
139
150
140
151
await initGitRepo ( resolvedDest , flags ) ;
141
152
153
+ const { install, start } = await installAndStart ( flags ) ;
154
+
142
155
prompts . log . success ( chalk . green ( 'Tutorial successfully created!' ) ) ;
143
156
144
- printNextSteps ( dest , selectedPackageManager , dependenciesInstalled ) ;
157
+ if ( install || start ) {
158
+ let message = 'Please wait while we install the dependencies and start your project...' ;
145
159
146
- prompts . outro ( `You're all set!` ) ;
160
+ if ( install && ! start ) {
161
+ // change the message if we're only installing dependencies
162
+ message = 'Please wait while we install the dependencies...' ;
147
163
148
- console . log ( 'Until next time 👋' ) ;
164
+ // print the next steps without the install step in case we only install dependencies
165
+ printNextSteps ( dest , selectedPackageManager , true ) ;
166
+ }
167
+
168
+ prompts . outro ( message ) ;
169
+
170
+ await startProject ( resolvedDest , selectedPackageManager , flags , start ) ;
171
+ } else {
172
+ printNextSteps ( dest , selectedPackageManager , false ) ;
173
+
174
+ prompts . outro ( `You're all set!` ) ;
175
+
176
+ console . log ( 'Until next time 👋' ) ;
177
+ }
178
+ }
179
+
180
+ async function startProject ( cwd : string , packageManager : PackageManager , flags : CreateOptions , startProject : boolean ) {
181
+ if ( flags . dryRun ) {
182
+ const message = startProject
183
+ ? 'Skipped dependency installation and project start'
184
+ : 'Skipped dependency installation' ;
185
+
186
+ console . warn ( `${ warnLabel ( 'DRY RUN' ) } ${ message } ` ) ;
187
+ } else {
188
+ await execa ( packageManager , [ 'install' ] , { cwd, stdio : 'inherit' } ) ;
189
+
190
+ if ( startProject ) {
191
+ await execa ( packageManager , [ 'run' , 'dev' ] , { cwd, stdio : 'inherit' } ) ;
192
+ }
193
+ }
149
194
}
150
195
151
196
async function getTutorialDirectory ( tutorialName : string , flags : CreateOptions ) {
@@ -264,3 +309,9 @@ function applyAliases(flags: CreateOptions & Record<string, any>) {
264
309
flags . enterprise = flags . e ;
265
310
}
266
311
}
312
+
313
+ function verifyFlags ( flags : CreateOptions ) {
314
+ if ( flags . install === false && flags . start ) {
315
+ throw new Error ( 'Cannot start project without installing dependencies.' ) ;
316
+ }
317
+ }
0 commit comments