Skip to content

Commit 475247b

Browse files
committed
Add validation for --file flag to script
1 parent e1a4750 commit 475247b

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/commands/run-script.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,25 @@ import { bold, red, magenta, cyan } from 'chalk';
44
import { runScriptAPI } from '../api';
55
import { dbLogger } from '../util/logger';
66
import { loadConfig, resolveConnections } from '..';
7+
import { validateScriptFileName } from '../util/fs';
78
import { printLine, printError, printInfo } from '../util/io';
89
import OperationResult from '../domain/operation/OperationResult';
910

1011
class RunScript extends Command {
1112
static description = 'Run the provided manual scripts.';
1213

14+
1315
static flags = {
1416
'dry-run': flags.boolean({ description: 'Dry run script.', default: false }),
1517
only: flags.string({
1618
helpValue: 'CONNECTION_ID(s)',
1719
description: 'Filter provided connection(s). Comma separated ids eg: id1,id2'
1820
}),
1921
file: flags.string({
22+
required: true,
2023
helpValue: 'Script Name',
21-
description: 'Name of the manual SQL/JS/TS script'
24+
parse: validateScriptFileName,
25+
description: 'Name of the manual SQL/JS/TS script',
2226
}),
2327
'connection-resolver': flags.string({
2428
helpValue: 'PATH',
@@ -30,6 +34,8 @@ class RunScript extends Command {
3034
})
3135
};
3236

37+
38+
3339
/**
3440
* Started event handler.
3541
*/
@@ -110,3 +116,4 @@ class RunScript extends Command {
110116
}
111117

112118
export default RunScript;
119+

src/util/fs.ts

+17
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as fs from 'fs';
22
import * as os from 'os';
33
import * as path from 'path';
44
import { promisify } from 'util';
5+
import FileExtensions from '../enum/FileExtensions';
56

67
export const mkdir = promisify(fs.mkdir);
78
export const readDir = promisify(fs.readdir);
@@ -141,3 +142,19 @@ export function copy(fromPath: string, toPath: string): Promise<void> {
141142
});
142143
});
143144
}
145+
146+
/**
147+
* Validate the script filename provided from CLI.
148+
*
149+
* @param {string} filename
150+
* @returns {string}
151+
*/
152+
export function validateScriptFileName(filename: string): string {
153+
const ext = filename.split('.').pop()
154+
155+
if (!ext || ![FileExtensions.JS, FileExtensions.SQL, FileExtensions.JS].includes(ext as FileExtensions)) {
156+
throw new Error('Invalid file name or extension');
157+
}
158+
159+
return filename
160+
}

0 commit comments

Comments
 (0)