diff --git a/tests/hooks/pre-bash-dev-server-block.test.js b/tests/hooks/pre-bash-dev-server-block.test.js index c8409f0b..4f075ddb 100644 --- a/tests/hooks/pre-bash-dev-server-block.test.js +++ b/tests/hooks/pre-bash-dev-server-block.test.js @@ -144,6 +144,55 @@ function runTests() { }) ? passed++ : failed++); } + // --- Round 1 review fixes (Greptile + CodeRabbit on PR #1889) --- + + if (!isWindows) { + (test('blocks $(echo ")"; (npm run dev)) — quoted ) does not terminate $() early', () => { + const result = runScript('$(echo ")"; (npm run dev))'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + + (test('blocks (echo ")"; npm run dev) — quoted ) does not terminate (...) early', () => { + const result = runScript('(echo ")"; npm run dev)'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + + (test('allows $(echo "(npm run dev)") — () inside double-quoted substitution body is literal', () => { + const result = runScript('$(echo "(npm run dev)")'); + assert.strictEqual(result.code, 0, `Expected exit code 0, got ${result.code}`); + }) ? passed++ : failed++); + + (test('blocks { npm run dev; } — brace group runs in current shell', () => { + const result = runScript('{ npm run dev; }'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + + (test('blocks echo hi && { npm run dev; } — brace group after &&', () => { + const result = runScript('echo hi && { npm run dev; }'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + + (test('allows {npm run dev} — bash requires space after { to form a group', () => { + const result = runScript('{npm run dev}'); + assert.strictEqual(result.code, 0, `Expected exit code 0, got ${result.code}`); + }) ? passed++ : failed++); + + (test('blocks yarn run dev — yarn 1.x convention', () => { + const result = runScript('yarn run dev'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + + (test('blocks bun dev — bun bare form', () => { + const result = runScript('bun dev'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + + (test('blocks "$(npm run dev)" — double-quoted substitution still substitutes', () => { + const result = runScript('echo "$(npm run dev)"'); + assert.strictEqual(result.code, 2, `Expected exit code 2, got ${result.code}`); + }) ? passed++ : failed++); + } + // --- Edge cases --- (test('empty/invalid input passes through (exit code 0)', () => {