fix(core): add quotes around string to command (#23056)
<!-- Please make sure you have read the submission guidelines before posting an PR --> <!-- https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr --> <!-- Please make sure that your commit message follows our format --> <!-- Example: `fix(nx): must begin with lowercase` --> ## Current Behavior <!-- This is the behavior we have today --> ## Expected Behavior - nx run will not have quotes, but underlying command will have <!-- This is the behavior we should expect with the changes in this PR --> <img width="524" alt="Screenshot 2024-05-23 at 2 07 20 PM" src="https://github.com/nrwl/nx/assets/16211801/7c96f884-3c11-4f56-b6b4-b3fd41ac2187"> <img width="471" alt="Screenshot 2024-05-23 at 2 07 03 PM" src="https://github.com/nrwl/nx/assets/16211801/b6746a25-ebfc-4cb2-ad1d-4f8600782037"> ## Related Issue(s) <!-- Please link the issue being fixed so it gets closed when this is merged. --> Fixes #
This commit is contained in:
parent
58041e893c
commit
bccb2c5018
@ -60,6 +60,32 @@ describe('Nx Running Tests', () => {
|
||||
const output = runCLI(`echo ${proj} ${args}`);
|
||||
expect(output).toContain(`ECHO: ${args.replace(/^.*-- /, '')}`);
|
||||
});
|
||||
|
||||
it.each([
|
||||
{
|
||||
args: '--test="hello world" "abc def"',
|
||||
result: '--test="hello world" "abc def"',
|
||||
},
|
||||
{
|
||||
args: `--test="hello world" 'abc def'`,
|
||||
result: '--test="hello world" "abc def"',
|
||||
},
|
||||
{
|
||||
args: `--test="hello world" 'abcdef'`,
|
||||
result: '--test="hello world" abcdef',
|
||||
},
|
||||
{
|
||||
args: `--test='hello world' 'abcdef'`,
|
||||
result: '--test="hello world" abcdef',
|
||||
},
|
||||
{
|
||||
args: `"--test='hello world' 'abcdef'"`,
|
||||
result: `--test='hello world' 'abcdef'`,
|
||||
},
|
||||
])('should forward %args properly with quotes', ({ args, result }) => {
|
||||
const output = runCLI(`echo ${proj} ${args}`);
|
||||
expect(output).toContain(`ECHO: ${result}`);
|
||||
});
|
||||
});
|
||||
|
||||
it('should execute long running tasks', () => {
|
||||
|
||||
@ -81,10 +81,6 @@ export function rewriteTargetsAndProjects(args: string[]) {
|
||||
return newArgs;
|
||||
}
|
||||
|
||||
function wrapIntoQuotesIfNeeded(arg: string) {
|
||||
return arg.indexOf(':') > -1 ? `"${arg}"` : arg;
|
||||
}
|
||||
|
||||
function isKnownCommand(command: string) {
|
||||
const commands = [
|
||||
...Object.keys(
|
||||
|
||||
@ -323,6 +323,56 @@ describe('Run Commands', () => {
|
||||
)
|
||||
).toEqual('echo "hello world"');
|
||||
});
|
||||
|
||||
it('should interpolate provided values with spaces', () => {
|
||||
expect(
|
||||
interpolateArgsIntoCommand(
|
||||
'echo',
|
||||
{
|
||||
unknownOptions: { hello: 'test 123' },
|
||||
parsedArgs: { hello: 'test 123' },
|
||||
} as any,
|
||||
true
|
||||
)
|
||||
).toEqual('echo --hello="test 123"'); // should wrap in quotes
|
||||
|
||||
expect(
|
||||
interpolateArgsIntoCommand(
|
||||
'echo',
|
||||
{
|
||||
unknownOptions: { hello: '"test 123"' },
|
||||
parsedArgs: { hello: '"test 123"' },
|
||||
} as any,
|
||||
true
|
||||
)
|
||||
).toEqual('echo --hello="test 123"'); // should leave double quotes
|
||||
|
||||
expect(
|
||||
interpolateArgsIntoCommand(
|
||||
'echo',
|
||||
{
|
||||
unknownOptions: { hello: "'test 123'" },
|
||||
parsedArgs: { hello: "'test 123'" },
|
||||
} as any,
|
||||
true
|
||||
)
|
||||
).toEqual("echo --hello='test 123'"); // should leave single quote
|
||||
|
||||
expect(
|
||||
interpolateArgsIntoCommand(
|
||||
'echo',
|
||||
{
|
||||
__unparsed__: [
|
||||
'--hello=test 123',
|
||||
'hello world',
|
||||
'"random config"',
|
||||
'456',
|
||||
],
|
||||
} as any,
|
||||
true
|
||||
)
|
||||
).toEqual(`echo --hello="test 123" "hello world" "random config" 456`); // should wrap aroound __unparsed__ args with key value
|
||||
});
|
||||
});
|
||||
|
||||
describe('--color', () => {
|
||||
|
||||
@ -494,6 +494,7 @@ export function interpolateArgsIntoCommand(
|
||||
opts.parsedArgs[k] === opts.unknownOptions[k]
|
||||
)
|
||||
.map((k) => `--${k}=${opts.unknownOptions[k]}`)
|
||||
.map(wrapArgIntoQuotesIfNeeded)
|
||||
.join(' ');
|
||||
}
|
||||
if (opts.args) {
|
||||
@ -505,7 +506,9 @@ export function interpolateArgsIntoCommand(
|
||||
opts.unparsedCommandArgs
|
||||
);
|
||||
if (filterdParsedOptions.length > 0) {
|
||||
args += ` ${filterdParsedOptions.join(' ')}`;
|
||||
args += ` ${filterdParsedOptions
|
||||
.map(wrapArgIntoQuotesIfNeeded)
|
||||
.join(' ')}`;
|
||||
}
|
||||
}
|
||||
return `${command}${args}`;
|
||||
@ -627,3 +630,21 @@ function registerProcessListener() {
|
||||
// will store results to the cache and will terminate this process
|
||||
});
|
||||
}
|
||||
|
||||
function wrapArgIntoQuotesIfNeeded(arg: string): string {
|
||||
if (arg.includes('=')) {
|
||||
const [key, value] = arg.split('=');
|
||||
if (
|
||||
key.startsWith('--') &&
|
||||
value.includes(' ') &&
|
||||
!(value[0] === "'" || value[0] === '"')
|
||||
) {
|
||||
return `${key}="${value}"`;
|
||||
}
|
||||
return arg;
|
||||
} else if (arg.includes(' ') && !(arg[0] === "'" || arg[0] === '"')) {
|
||||
return `"${arg}"`;
|
||||
} else {
|
||||
return arg;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user