@@ -5,7 +5,14 @@ import { sync as globSync } from 'glob';
5
5
import { orchestrateCompilation } from './src/cds/compiler' ;
6
6
import { buildCdsProjectDependencyGraph } from './src/cds/parser' ;
7
7
import { runJavaScriptExtractor } from './src/codeql' ;
8
- import { addCompilationDiagnostic } from './src/diagnostics' ;
8
+ import {
9
+ addCompilationDiagnostic ,
10
+ addDependencyGraphDiagnostic ,
11
+ addDependencyInstallationDiagnostic ,
12
+ addEnvironmentSetupDiagnostic ,
13
+ addJavaScriptExtractorDiagnostic ,
14
+ addNoCdsProjectsDiagnostic ,
15
+ } from './src/diagnostics' ;
9
16
import { configureLgtmIndexFilters , setupAndValidateEnvironment } from './src/environment' ;
10
17
import {
11
18
cdsExtractorLog ,
@@ -24,8 +31,13 @@ import { validateArguments } from './src/utils';
24
31
const validationResult = validateArguments ( process . argv ) ;
25
32
if ( ! validationResult . isValid ) {
26
33
console . warn ( validationResult . usageMessage ) ;
27
- // Exit with an error code on invalid use of this script.
28
- process . exit ( 1 ) ;
34
+ // For invalid arguments, we can't proceed but we also can't add diagnostics since we don't have
35
+ // the necessary context (sourceRoot, codeqlExePath). Log the issue and exit gracefully.
36
+ console . log (
37
+ `CDS extractor terminated due to invalid arguments: ${ validationResult . usageMessage } ` ,
38
+ ) ;
39
+ console . log ( `Completed run of the cds-extractor.js script for the CDS extractor.` ) ;
40
+ process . exit ( 0 ) ; // Use exit code 0 to not fail the overall JavaScript extractor
29
41
}
30
42
31
43
// Get the validated and sanitized arguments.
@@ -52,21 +64,28 @@ logPerformanceTrackingStop('Environment Setup');
52
64
53
65
if ( ! envSetupSuccess ) {
54
66
const codeqlExe = platformInfo . isWindows ? 'codeql.exe' : 'codeql' ;
55
- cdsExtractorLog (
56
- 'warn' ,
57
- `'${ codeqlExe } database index-files --language cds' terminated early due to: ${ errorMessages . join (
58
- ', ' ,
59
- ) } .`,
67
+ const errorMessage = `'${ codeqlExe } database index-files --language cds' terminated early due to: ${ errorMessages . join (
68
+ ', ' ,
69
+ ) } .`;
70
+
71
+ cdsExtractorLog ( 'warn' , errorMessage ) ;
72
+
73
+ // Add diagnostic for environment setup failure if we have a codeqlExePath
74
+ if ( codeqlExePath ) {
75
+ addEnvironmentSetupDiagnostic ( sourceRoot , errorMessage , codeqlExePath ) ;
76
+ }
77
+
78
+ // Continue with a warning instead of exiting - let JavaScript extractor proceed
79
+ logExtractorStop (
80
+ false ,
81
+ 'Warning: Environment setup failed, continuing with limited functionality' ,
60
82
) ;
61
- // Exit with an error code when environment setup fails.
62
- logExtractorStop ( false , 'Terminated: Environment setup failed' ) ;
63
- process . exit ( 1 ) ;
83
+ } else {
84
+ // Force this script, and any process it spawns, to use the project (source) root
85
+ // directory as the current working directory.
86
+ process . chdir ( sourceRoot ) ;
64
87
}
65
88
66
- // Force this script, and any process it spawns, to use the project (source) root
67
- // directory as the current working directory.
68
- process . chdir ( sourceRoot ) ;
69
-
70
89
cdsExtractorLog (
71
90
'info' ,
72
91
`CodeQL CDS extractor using autobuild mode for scan of project source root directory '${ sourceRoot } '.` ,
@@ -139,15 +158,80 @@ try {
139
158
cdsExtractorLog ( 'warn' , `Could not perform direct CDS file search: ${ String ( globError ) } ` ) ;
140
159
}
141
160
142
- // Exit early since we have no CDS projects to process
143
- logExtractorStop ( false , 'Terminated: No CDS projects detected' ) ;
144
- process . exit ( 1 ) ;
161
+ // Add diagnostic warning for no CDS projects detected
162
+ const warningMessage =
163
+ 'No CDS projects were detected. This may be expected if the source does not contain CAP/CDS projects.' ;
164
+ if ( codeqlExePath ) {
165
+ addNoCdsProjectsDiagnostic ( sourceRoot , warningMessage , codeqlExePath ) ;
166
+ }
167
+
168
+ // Continue instead of exiting - let JavaScript extractor proceed with non-CDS files
169
+ logExtractorStop ( false , 'Warning: No CDS projects detected, skipping CDS-specific processing' ) ;
170
+
171
+ // Skip the rest of CDS processing and go directly to JavaScript extraction
172
+ configureLgtmIndexFilters ( ) ;
173
+
174
+ // Run CodeQL's JavaScript extractor to process any remaining files
175
+ logPerformanceTrackingStart ( 'JavaScript Extraction' ) ;
176
+ const extractorResult = runJavaScriptExtractor (
177
+ sourceRoot ,
178
+ autobuildScriptPath || '' , // Use empty string if autobuildScriptPath is undefined
179
+ codeqlExePath ,
180
+ ) ;
181
+ logPerformanceTrackingStop ( 'JavaScript Extraction' ) ;
182
+
183
+ if ( ! extractorResult . success && extractorResult . error ) {
184
+ cdsExtractorLog ( 'error' , `Error running JavaScript extractor: ${ extractorResult . error } ` ) ;
185
+ if ( codeqlExePath ) {
186
+ addJavaScriptExtractorDiagnostic ( sourceRoot , extractorResult . error , codeqlExePath ) ;
187
+ }
188
+ logExtractorStop ( false , 'JavaScript extractor failed' ) ;
189
+ } else {
190
+ logExtractorStop ( true , 'JavaScript extraction completed (CDS processing was skipped)' ) ;
191
+ }
192
+
193
+ console . log ( `Completed run of the cds-extractor.js script for the CDS extractor.` ) ;
194
+ process . exit ( 0 ) ; // Graceful exit to skip the rest of the processing
145
195
}
146
196
} catch ( error ) {
147
- cdsExtractorLog ( 'error' , `Failed to build CDS dependency graph: ${ String ( error ) } ` ) ;
148
- // Exit with error since we can't continue without a proper dependency graph
149
- logExtractorStop ( false , 'Terminated: Dependency graph build failed' ) ;
150
- process . exit ( 1 ) ;
197
+ const errorMessage = `Failed to build CDS dependency graph: ${ String ( error ) } ` ;
198
+ cdsExtractorLog ( 'error' , errorMessage ) ;
199
+
200
+ // Add diagnostic for dependency graph build failure
201
+ if ( codeqlExePath ) {
202
+ addDependencyGraphDiagnostic ( sourceRoot , errorMessage , codeqlExePath ) ;
203
+ }
204
+
205
+ // Continue with a warning instead of exiting - let JavaScript extractor proceed with non-CDS files
206
+ logExtractorStop (
207
+ false ,
208
+ 'Warning: Dependency graph build failed, skipping CDS-specific processing' ,
209
+ ) ;
210
+
211
+ // Skip the rest of CDS processing and go directly to JavaScript extraction
212
+ configureLgtmIndexFilters ( ) ;
213
+
214
+ // Run CodeQL's JavaScript extractor to process any remaining files
215
+ logPerformanceTrackingStart ( 'JavaScript Extraction' ) ;
216
+ const extractorResult = runJavaScriptExtractor (
217
+ sourceRoot ,
218
+ autobuildScriptPath || '' , // Use empty string if autobuildScriptPath is undefined
219
+ codeqlExePath ,
220
+ ) ;
221
+ logPerformanceTrackingStop ( 'JavaScript Extraction' ) ;
222
+
223
+ if ( ! extractorResult . success && extractorResult . error ) {
224
+ cdsExtractorLog ( 'error' , `Error running JavaScript extractor: ${ extractorResult . error } ` ) ;
225
+ if ( codeqlExePath ) {
226
+ addJavaScriptExtractorDiagnostic ( sourceRoot , extractorResult . error , codeqlExePath ) ;
227
+ }
228
+ logExtractorStop ( false , 'JavaScript extractor failed' ) ;
229
+ } else {
230
+ logExtractorStop ( true , 'JavaScript extraction completed (CDS processing was skipped)' ) ;
231
+ }
232
+
233
+ console . log ( `Completed run of the cds-extractor.js script for the CDS extractor.` ) ;
234
+ process . exit ( 0 ) ; // Graceful exit to skip the rest of the processing
151
235
}
152
236
153
237
logPerformanceTrackingStart ( 'Dependency Installation' ) ;
@@ -163,12 +247,19 @@ if (projectCacheDirMap.size === 0) {
163
247
164
248
// This is a critical error if we have projects but no cache mappings
165
249
if ( dependencyGraph . projects . size > 0 ) {
166
- cdsExtractorLog (
167
- 'error' ,
168
- `Found ${ dependencyGraph . projects . size } CDS projects but failed to install dependencies for any of them. Cannot proceed with compilation.` ,
250
+ const errorMessage = `Found ${ dependencyGraph . projects . size } CDS projects but failed to install dependencies for any of them. Cannot proceed with compilation.` ;
251
+ cdsExtractorLog ( 'error' , errorMessage ) ;
252
+
253
+ // Add diagnostic for dependency installation failure
254
+ if ( codeqlExePath ) {
255
+ addDependencyInstallationDiagnostic ( sourceRoot , errorMessage , codeqlExePath ) ;
256
+ }
257
+
258
+ // Continue with a warning instead of exiting - let JavaScript extractor proceed
259
+ logExtractorStop (
260
+ false ,
261
+ 'Warning: Dependency installation failed for all projects, continuing with limited functionality' ,
169
262
) ;
170
- logExtractorStop ( false , 'Terminated: Dependency installation failed for all projects' ) ;
171
- process . exit ( 1 ) ;
172
263
}
173
264
174
265
// If we have no projects and no cache mappings, this should have been caught earlier
@@ -253,6 +344,15 @@ dependencyGraph.statusSummary.performance.totalDurationMs = totalDuration;
253
344
254
345
if ( ! extractorResult . success && extractorResult . error ) {
255
346
cdsExtractorLog ( 'error' , `Error running JavaScript extractor: ${ extractorResult . error } ` ) ;
347
+
348
+ // Add diagnostic for JavaScript extractor failure
349
+ if ( codeqlExePath && dependencyGraph . projects . size > 0 ) {
350
+ // Use the first CDS file as a representative file for the diagnostic
351
+ const firstProject = Array . from ( dependencyGraph . projects . values ( ) ) [ 0 ] ;
352
+ const representativeFile = firstProject . cdsFiles [ 0 ] || sourceRoot ;
353
+ addJavaScriptExtractorDiagnostic ( representativeFile , extractorResult . error , codeqlExePath ) ;
354
+ }
355
+
256
356
logExtractorStop ( false , 'JavaScript extractor failed' ) ;
257
357
} else {
258
358
logExtractorStop ( true , 'CDS extraction completed successfully' ) ;
0 commit comments