@@ -16,10 +16,19 @@ import { Command, Flags, ux } from '@oclif/core';
16
16
import { APP_MANIFEST_PATH_VARIABLE , AppManifest } from '../../modules/app-manifest' ;
17
17
import { ComponentContext , ExecSpec } from '../../modules/component' ;
18
18
import { ExecExitError , runExecSpec } from '../../modules/exec' ;
19
+ import { PackageConfig } from '../../modules/package' ;
19
20
import { ProjectConfig , ProjectConfigLock } from '../../modules/project-config' ;
20
21
import { resolveVersionIdentifier } from '../../modules/semver' ;
21
22
import { createEnvVars } from '../../modules/variables' ;
22
23
24
+ interface InitFlags {
25
+ verbose : boolean ;
26
+ force : boolean ;
27
+ [ 'no-hooks' ] : boolean ;
28
+ package : string ;
29
+ specifier : string ;
30
+ }
31
+
23
32
export default class Init extends Command {
24
33
static description = 'Initializes Velocitas Vehicle App' ;
25
34
@@ -31,6 +40,16 @@ export default class Init extends Command {
31
40
... Downloading package: 'devenv-runtimes:vx.x.x'
32
41
... Downloading package: 'devenv-github-templates:vx.x.x'
33
42
... Downloading package: 'devenv-github-workflows:vx.x.x'` ,
43
+ `$ velocitas init -p devenv-runtimes
44
+ Initializing Velocitas packages ...
45
+ ... Package 'devenv-runtimes:vx.x.x' added to .velocitas.json
46
+ ... Downloading package: 'devenv-runtimes:vx.x.x'
47
+ ... > Running post init hook for ...'` ,
48
+ `$ velocitas init -p devenv-runtimes -s v3.0.0
49
+ Initializing Velocitas packages ...
50
+ ... Package 'devenv-runtimes:v3.0.0' added to .velocitas.json
51
+ ... Downloading package: 'devenv-runtimes:v3.0.0'
52
+ ... > Running post init hook for ...` ,
34
53
] ;
35
54
36
55
static flags = {
@@ -47,26 +66,87 @@ export default class Init extends Command {
47
66
required : false ,
48
67
default : false ,
49
68
} ) ,
69
+ package : Flags . string ( {
70
+ char : 'p' ,
71
+ aliases : [ 'package' ] ,
72
+ description : `Package to initialize` ,
73
+ required : false ,
74
+ default : '' ,
75
+ } ) ,
76
+ specifier : Flags . string ( {
77
+ char : 's' ,
78
+ aliases : [ 'specifier' ] ,
79
+ description : `Version specifier for the specified package` ,
80
+ required : false ,
81
+ default : '' ,
82
+ dependsOn : [ 'package' ] ,
83
+ } ) ,
50
84
} ;
51
85
52
86
async run ( ) : Promise < void > {
53
- const { flags } = await this . parse ( Init ) ;
87
+ const { flags } : { flags : InitFlags } = await this . parse ( Init ) ;
54
88
this . log ( `Initializing Velocitas packages ...` ) ;
55
- const projectConfig = this . initializeOrReadProject ( ) ;
89
+ const projectConfig = this . _initializeOrReadProject ( ) ;
90
+
91
+ if ( flags . package ) {
92
+ await this . _handleSinglePackageInit ( projectConfig , flags ) ;
93
+ } else {
94
+ await this . _handleCompletePackageInit ( projectConfig , flags ) ;
95
+ }
56
96
57
- const appManifestData = AppManifest . read ( projectConfig . getVariableMappings ( ) . get ( APP_MANIFEST_PATH_VARIABLE ) ) ;
97
+ this . _createProjectLockFile ( projectConfig , flags . verbose ) ;
98
+ }
58
99
59
- await this . ensurePackagesAreDownloaded ( projectConfig , flags . force , flags . verbose ) ;
100
+ private async _handleCompletePackageInit ( projectConfig : ProjectConfig , flags : InitFlags ) {
101
+ await this . _ensurePackagesAreDownloaded ( projectConfig . getPackages ( ) , flags ) ;
60
102
projectConfig . validateUsedComponents ( ) ;
61
103
62
104
if ( ! flags [ 'no-hooks' ] ) {
63
- await this . runPostInitHooks ( projectConfig , appManifestData , flags . verbose ) ;
105
+ await this . _runPostInitHooks ( projectConfig . getComponents ( ) , projectConfig , flags . verbose ) ;
106
+ }
107
+ }
108
+
109
+ private async _handleSinglePackageInit ( projectConfig : ProjectConfig , flags : InitFlags ) : Promise < void > {
110
+ const requestedPackageConfig = new PackageConfig ( { repo : flags . package , version : flags . specifier } ) ;
111
+ await this . _resolveVersion ( requestedPackageConfig , flags . verbose ) ;
112
+
113
+ const packageUpdated = projectConfig . updatePackageConfig ( requestedPackageConfig ) ;
114
+ if ( packageUpdated ) {
115
+ this . log (
116
+ `... Updating '${ requestedPackageConfig . getPackageName ( ) } ' to version '${ requestedPackageConfig . version } ' in .velocitas.json` ,
117
+ ) ;
118
+ } else {
119
+ const isAdded = projectConfig . addPackageConfig ( requestedPackageConfig ) ;
120
+ if ( isAdded ) {
121
+ this . log (
122
+ `... Package '${ requestedPackageConfig . getPackageName ( ) } :${ requestedPackageConfig . version } ' added to .velocitas.json` ,
123
+ ) ;
124
+ }
125
+ }
126
+
127
+ await this . _ensurePackagesAreDownloaded ( [ requestedPackageConfig ] , flags ) ;
128
+ this . _finalizeSinglePackageInit ( requestedPackageConfig , projectConfig ) ;
129
+
130
+ if ( ! flags [ 'no-hooks' ] ) {
131
+ await this . _runPostInitHooks ( projectConfig . getComponentsForPackageConfig ( requestedPackageConfig ) , projectConfig , flags . verbose ) ;
132
+ }
133
+ }
134
+
135
+ private _finalizeSinglePackageInit ( requestedPackageConfig : PackageConfig , projectConfig : ProjectConfig ) : void {
136
+ const providedComponents = requestedPackageConfig . readPackageManifest ( ) . components ;
137
+ const enabledComponentIds = projectConfig . getComponents ( undefined , true ) . map ( ( comp ) => comp . config . id ) ;
138
+ const areComponentsExisting = providedComponents . some ( ( comp ) => enabledComponentIds . includes ( comp . id ) ) ;
139
+
140
+ if ( ! areComponentsExisting ) {
141
+ providedComponents . forEach ( ( providedComponent ) => {
142
+ projectConfig . addComponent ( providedComponent . id ) ;
143
+ } ) ;
64
144
}
65
145
66
- this . createProjectLockFile ( projectConfig , flags . verbose ) ;
146
+ projectConfig . write ( ) ;
67
147
}
68
148
69
- initializeOrReadProject ( ) : ProjectConfig {
149
+ private _initializeOrReadProject ( ) : ProjectConfig {
70
150
let projectConfig : ProjectConfig ;
71
151
72
152
if ( ! ProjectConfig . isAvailable ( ) ) {
@@ -79,30 +159,34 @@ export default class Init extends Command {
79
159
return projectConfig ;
80
160
}
81
161
82
- async ensurePackagesAreDownloaded ( projectConfig : ProjectConfig , force : boolean , verbose : boolean ) {
83
- for ( const packageConfig of projectConfig . getPackages ( ) ) {
84
- const packageVersions = await packageConfig . getPackageVersions ( ) ;
85
- const packageVersion = resolveVersionIdentifier ( packageVersions , packageConfig . version ) ;
162
+ private async _resolveVersion ( packageConfig : PackageConfig , verbose : boolean ) : Promise < void > {
163
+ const packageVersions = await packageConfig . getPackageVersions ( ) ;
164
+ const packageVersion = resolveVersionIdentifier ( packageVersions , packageConfig . version ) ;
86
165
87
- if ( verbose ) {
88
- this . log ( `... Resolved '${ packageConfig . getPackageName ( ) } :${ packageConfig . version } ' to version: '${ packageVersion } '` ) ;
89
- }
166
+ if ( verbose ) {
167
+ this . log ( `... Resolved '${ packageConfig . getPackageName ( ) } :${ packageConfig . version } ' to version: '${ packageVersion } '` ) ;
168
+ }
169
+
170
+ packageConfig . setPackageVersion ( packageVersion ) ;
171
+ }
90
172
91
- packageConfig . setPackageVersion ( packageVersion ) ;
173
+ private async _ensurePackagesAreDownloaded ( packageConfigs : PackageConfig [ ] , flags : InitFlags ) {
174
+ for ( const packageConfig of packageConfigs ) {
175
+ await this . _resolveVersion ( packageConfig , flags . verbose ) ;
92
176
93
- if ( ! force && packageConfig . isPackageInstalled ( ) ) {
177
+ if ( ! flags . force && packageConfig . isPackageInstalled ( ) ) {
94
178
this . log ( `... '${ packageConfig . getPackageName ( ) } :${ packageConfig . version } ' already installed.` ) ;
95
179
continue ;
96
180
}
97
181
98
182
this . log ( `... Downloading package: '${ packageConfig . getPackageName ( ) } :${ packageConfig . version } '` ) ;
99
- await packageConfig . downloadPackageVersion ( verbose ) ;
183
+ await packageConfig . downloadPackageVersion ( flags . verbose ) ;
100
184
}
101
185
}
102
186
103
- async runSinglePostInitHook (
187
+ private async _runSinglePostInitHook (
104
188
execSpec : ExecSpec ,
105
- componentContext : ComponentContext ,
189
+ currentComponentContext : ComponentContext ,
106
190
projectConfig : ProjectConfig ,
107
191
appManifest : any ,
108
192
verbose : boolean ,
@@ -114,11 +198,11 @@ export default class Init extends Command {
114
198
this . log ( message ) ;
115
199
}
116
200
const envVars = createEnvVars (
117
- componentContext . packageConfig . getPackageDirectoryWithVersion ( ) ,
118
- projectConfig . getVariableCollection ( componentContext ) ,
201
+ currentComponentContext . packageConfig . getPackageDirectoryWithVersion ( ) ,
202
+ projectConfig . getVariableCollection ( currentComponentContext ) ,
119
203
appManifest ,
120
204
) ;
121
- await runExecSpec ( execSpec , componentContext . manifest . id , projectConfig , envVars , {
205
+ await runExecSpec ( execSpec , currentComponentContext . manifest . id , projectConfig , envVars , {
122
206
writeStdout : verbose ,
123
207
verbose : verbose ,
124
208
} ) ;
@@ -127,8 +211,10 @@ export default class Init extends Command {
127
211
}
128
212
}
129
213
130
- async runPostInitHooks ( projectConfig : ProjectConfig , appManifest : any , verbose : boolean ) {
131
- for ( const componentContext of projectConfig . getComponents ( ) ) {
214
+ private async _runPostInitHooks ( components : ComponentContext [ ] , projectConfig : ProjectConfig , verbose : boolean ) : Promise < void > {
215
+ const appManifest = AppManifest . read ( projectConfig . getVariableMappings ( ) . get ( APP_MANIFEST_PATH_VARIABLE ) ) ;
216
+
217
+ for ( const componentContext of components ) {
132
218
if ( ! componentContext . manifest . onPostInit || componentContext . manifest . onPostInit . length === 0 ) {
133
219
continue ;
134
220
}
@@ -137,7 +223,7 @@ export default class Init extends Command {
137
223
138
224
for ( const execSpec of componentContext . manifest . onPostInit ) {
139
225
try {
140
- await this . runSinglePostInitHook ( execSpec , componentContext , projectConfig , appManifest , verbose ) ;
226
+ await this . _runSinglePostInitHook ( execSpec , componentContext , projectConfig , appManifest , verbose ) ;
141
227
} catch ( e ) {
142
228
if ( e instanceof ExecExitError ) {
143
229
throw e ;
@@ -151,7 +237,7 @@ export default class Init extends Command {
151
237
}
152
238
}
153
239
154
- createProjectLockFile ( projectConfig : ProjectConfig , verbose : boolean ) : void {
240
+ private _createProjectLockFile ( projectConfig : ProjectConfig , verbose : boolean ) : void {
155
241
if ( verbose && ! ProjectConfigLock . isAvailable ( ) ) {
156
242
this . log ( '... No .velocitas-lock.json found. Creating it at the root of your repository.' ) ;
157
243
}
0 commit comments