'use strict'; const common = require('../common'); const { exec } = require('child_process'); const { test } = require('node:test'); const fixtures = require('../common/fixtures'); // Test both sets of arguments that check syntax const syntaxArgs = [ '-c', '--check', ]; // Match on the name of the `Error` but not the message as it is different // depending on the JavaScript engine. const syntaxErrorRE = /^SyntaxError: \b/m; // Test bad syntax with and without shebang [ 'syntax/bad_syntax.js', 'syntax/bad_syntax', 'syntax/bad_syntax_shebang.js', 'syntax/bad_syntax_shebang', ].forEach((file) => { const path = fixtures.path(file); // Loop each possible option, `-c` or `--check` syntaxArgs.forEach((flag) => { test(`Checking syntax for ${file} with ${flag}`, async (t) => { try { const { stdout, stderr } = await execNode(flag, path); // No stdout should be produced t.assert.strictEqual(stdout, ''); // Stderr should have a syntax error message t.assert.match(stderr, syntaxErrorRE); // stderr should include the filename t.assert.ok(stderr.startsWith(path)); } catch (err) { t.assert.strictEqual(err.code, 1); } }); }); }); // Helper function to promisify exec function execNode(flag, path) { const { promise, resolve, reject } = Promise.withResolvers(); exec(...common.escapePOSIXShell`"${process.execPath}" ${flag} "${path}"`, (err, stdout, stderr) => { if (err) return reject({ ...err, stdout, stderr }); resolve({ stdout, stderr }); }); return promise; }