Skip to content

Commit 3573995

Browse files
committed
Fix CDS extractor args validation
1 parent fcac0f1 commit 3573995

File tree

3 files changed

+26
-23
lines changed

3 files changed

+26
-23
lines changed

extractors/cds/tools/cds-extractor.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@ import { installDependencies } from './src/packageManager';
2020
import { RunMode } from './src/runMode';
2121
import { validateArguments } from './src/utils';
2222

23-
// Validate arguments to this script.
24-
// The first argument we pass is the expected run mode, which will be extracted from process.argv[2]
25-
// This will determine the correct minimum argument count for validation
26-
const validationResult = validateArguments(process.argv, RunMode.AUTOBUILD);
23+
// Validate the first argument matches an allowed run mode and validate that
24+
// the total number of arguments is correct for the specified run mode.
25+
const validationResult = validateArguments(process.argv);
2726
if (!validationResult.isValid) {
2827
console.warn(validationResult.usageMessage);
2928
// Exit with an error code on invalid use of this script.

extractors/cds/tools/src/utils.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ export function getArg(args: string[], index: number, defaultValue = ''): string
3232
* - For 'autobuild' mode: <run-mode> <source-root>
3333
*
3434
* @param args Command line arguments to check.
35-
* @param expectedRunMode The expected run mode for validation.
3635
* @returns Object with validation result, usage message if failed, and validated
3736
* arguments if successful.
3837
*/
39-
export function validateArguments(
40-
args: string[],
41-
expectedRunMode: RunMode,
42-
): {
38+
export function validateArguments(args: string[]): {
4339
isValid: boolean;
4440
usageMessage?: string;
4541
args?: {
@@ -51,11 +47,8 @@ export function validateArguments(
5147
const scriptPath = args[1] ?? '';
5248
const scriptName = scriptPath.split(/[/\\]/).pop() ?? 'cds-extractor.js';
5349

54-
// Each run mode has a minimum required argument count.
55-
// The args array includes 'node' and the script name, so we
56-
// use "minArgCount + 2".
57-
const minArgCount = expectedRunMode === RunMode.INDEX_FILES ? 3 : 2;
58-
if (args.length < minArgCount + 2) {
50+
// Minimum arguments: node, script, run-mode, source-root (4 total)
51+
if (args.length < 4) {
5952
return {
6053
isValid: false,
6154
usageMessage: USAGE_MESSAGE,
@@ -73,14 +66,23 @@ export function validateArguments(
7366
};
7467
}
7568

76-
// For 'index-files' mode, all three args are required.
69+
// Validate argument count based on the actual run mode
70+
// For 'index-files' mode, all three args are required: run-mode, source-root, response-file
7771
if (runMode === (RunMode.INDEX_FILES as string) && args.length < 5) {
7872
return {
7973
isValid: false,
8074
usageMessage: `For '${RunMode.INDEX_FILES}' mode: node ${scriptName} ${RunMode.INDEX_FILES} <source-root> <response-file>`,
8175
};
8276
}
8377

78+
// For other modes, only run-mode and source-root are required
79+
if (runMode !== (RunMode.INDEX_FILES as string) && args.length < 4) {
80+
return {
81+
isValid: false,
82+
usageMessage: `For '${runMode}' mode: node ${scriptName} ${runMode} <source-root> [<response-file>]`,
83+
};
84+
}
85+
8486
// If we made it here, arguments are valid.
8587
const sourceRoot: string = args[3];
8688

@@ -91,6 +93,8 @@ export function validateArguments(
9193
let usageMessage = '';
9294
if (runMode === (RunMode.DEBUG_PARSER as string)) {
9395
usageMessage = `${RunMode.DEBUG_PARSER} <source-root> [<response-file>]`;
96+
} else if (runMode === (RunMode.DEBUG_COMPILER as string)) {
97+
usageMessage = `${RunMode.DEBUG_COMPILER} <source-root> [<response-file>]`;
9498
} else if (runMode === (RunMode.INDEX_FILES as string)) {
9599
usageMessage = `${RunMode.INDEX_FILES} <source-root> <response-file>`;
96100
} else if (runMode === (RunMode.AUTOBUILD as string)) {

extractors/cds/tools/test/src/utils.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe('utils', () => {
4646
'source-root',
4747
'response-file',
4848
];
49-
const result = validateArguments(args, RunMode.INDEX_FILES);
49+
const result = validateArguments(args);
5050
expect(result.isValid).toBe(true);
5151
expect(result.args).toEqual({
5252
runMode: RunMode.INDEX_FILES,
@@ -57,7 +57,7 @@ describe('utils', () => {
5757

5858
it('should invalidate index-files mode with missing response file', () => {
5959
const args = ['node', EXTRACTOR_SCRIPT_NAME, RunMode.INDEX_FILES, 'source-root'];
60-
const result = validateArguments(args, RunMode.INDEX_FILES);
60+
const result = validateArguments(args);
6161
expect(result.isValid).toBe(false);
6262
expect(result.usageMessage).toContain('<response-file>');
6363
});
@@ -71,7 +71,7 @@ describe('utils', () => {
7171
'source-root',
7272
'response-file',
7373
];
74-
const resultWithResponse = validateArguments(argsWithResponse, RunMode.DEBUG_PARSER);
74+
const resultWithResponse = validateArguments(argsWithResponse);
7575
expect(resultWithResponse.isValid).toBe(true);
7676
expect(resultWithResponse.args).toEqual({
7777
runMode: RunMode.DEBUG_PARSER,
@@ -86,7 +86,7 @@ describe('utils', () => {
8686
RunMode.DEBUG_PARSER,
8787
'source-root',
8888
];
89-
const resultWithoutResponse = validateArguments(argsWithoutResponse, RunMode.DEBUG_PARSER);
89+
const resultWithoutResponse = validateArguments(argsWithoutResponse);
9090
expect(resultWithoutResponse.isValid).toBe(true);
9191
expect(resultWithoutResponse.args).toEqual({
9292
runMode: RunMode.DEBUG_PARSER,
@@ -97,7 +97,7 @@ describe('utils', () => {
9797

9898
it(`should validate minimum required arguments for runMode=${RunMode.AUTOBUILD}`, () => {
9999
const args = ['node', EXTRACTOR_SCRIPT_NAME, RunMode.AUTOBUILD, 'source-root'];
100-
const result = validateArguments(args, RunMode.AUTOBUILD);
100+
const result = validateArguments(args);
101101
expect(result.isValid).toBe(true);
102102
expect(result.args).toEqual({
103103
runMode: RunMode.AUTOBUILD,
@@ -108,7 +108,7 @@ describe('utils', () => {
108108

109109
it(`should validate minimum required arguments for runMode=${RunMode.DEBUG_PARSER}`, () => {
110110
const args = ['node', EXTRACTOR_SCRIPT_NAME, RunMode.DEBUG_PARSER, 'source-root'];
111-
const result = validateArguments(args, RunMode.DEBUG_PARSER);
111+
const result = validateArguments(args);
112112
expect(result.isValid).toBe(true);
113113
expect(result.usageMessage).toContain(
114114
`${RunMode.DEBUG_PARSER} <source-root> [<response-file>]`,
@@ -123,7 +123,7 @@ describe('utils', () => {
123123
'source-root',
124124
'response-file',
125125
];
126-
const result = validateArguments(args, RunMode.INDEX_FILES);
126+
const result = validateArguments(args);
127127
expect(result.isValid).toBe(true);
128128
expect(result.usageMessage).toContain(`${RunMode.INDEX_FILES} <source-root> <response-file>`);
129129
expect(result.args).toEqual({
@@ -135,7 +135,7 @@ describe('utils', () => {
135135

136136
it('should invalidate when run mode is not valid', () => {
137137
const args = ['node', EXTRACTOR_SCRIPT_NAME, 'invalid-mode', 'source-root'];
138-
const result = validateArguments(args, RunMode.AUTOBUILD);
138+
const result = validateArguments(args);
139139
expect(result.isValid).toBe(false);
140140
expect(result.usageMessage).toContain('Invalid run mode');
141141
expect(result.usageMessage).toContain('Supported run modes:');

0 commit comments

Comments
 (0)