mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00

PR-URL: https://github.com/nodejs/node/pull/58963 Fixes: https://github.com/nodejs/node/issues/58894 Reviewed-By: Dario Piotrowicz <dario.piotrowicz@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
96 lines
2.9 KiB
JavaScript
96 lines
2.9 KiB
JavaScript
import '../common/index.mjs';
|
|
import assert from 'node:assert';
|
|
import { createReadStream } from 'node:fs';
|
|
import { createInterface } from 'node:readline';
|
|
import { resolve, join } from 'node:path';
|
|
|
|
// This test checks that all the environment variables defined in the public CLI documentation (doc/api/cli.md)
|
|
// are also documented in the manpage file (doc/node.1) and vice-versa (that all the environment variables
|
|
// in the manpage are present in the CLI documentation)
|
|
|
|
const rootDir = resolve(import.meta.dirname, '..', '..');
|
|
|
|
const cliMdEnvVarNames = await collectCliMdEnvVarNames();
|
|
const manpageEnvVarNames = await collectManPageEnvVarNames();
|
|
|
|
assert(cliMdEnvVarNames.size > 0,
|
|
'Unexpectedly not even a single env variable was detected when scanning the `doc/api/cli.md` file'
|
|
);
|
|
|
|
assert(manpageEnvVarNames.size > 0,
|
|
'Unexpectedly not even a single env variable was detected when scanning the `doc/node.1` file'
|
|
);
|
|
|
|
for (const envVarName of cliMdEnvVarNames) {
|
|
if (!manpageEnvVarNames.has(envVarName)) {
|
|
assert.fail(`The "${envVarName}" environment variable (present in \`doc/api/cli.md\`) is missing from the \`doc/node.1\` file`);
|
|
}
|
|
manpageEnvVarNames.delete(envVarName);
|
|
}
|
|
|
|
if (manpageEnvVarNames.size > 0) {
|
|
assert.fail(`The following env variables are present in the \`doc/node.1\` file but not in the \`doc/api/cli.md\` file: ${
|
|
[...manpageEnvVarNames].map((name) => `"${name}"`).join(', ')
|
|
}`);
|
|
}
|
|
|
|
async function collectManPageEnvVarNames() {
|
|
const manPagePath = join(rootDir, 'doc', 'node.1');
|
|
const fileStream = createReadStream(manPagePath);
|
|
|
|
const rl = createInterface({
|
|
input: fileStream,
|
|
});
|
|
|
|
const envVarNames = new Set();
|
|
|
|
for await (const line of rl) {
|
|
const match = line.match(/^\.It Ev (?<envName>[^ ]*)/);
|
|
if (match) {
|
|
envVarNames.add(match.groups.envName);
|
|
}
|
|
}
|
|
|
|
return envVarNames;
|
|
}
|
|
|
|
async function collectCliMdEnvVarNames() {
|
|
const cliMdPath = join(rootDir, 'doc', 'api', 'cli.md');
|
|
const fileStream = createReadStream(cliMdPath);
|
|
|
|
let insideEnvVariablesSection = false;
|
|
|
|
const rl = createInterface({
|
|
input: fileStream,
|
|
});
|
|
|
|
const envVariableRE = /^### `(?<varName>[^`]*?)(?:=[^`]+)?`$/;
|
|
|
|
const envVarNames = new Set();
|
|
|
|
for await (const line of rl) {
|
|
if (line.startsWith('## ')) {
|
|
if (insideEnvVariablesSection) {
|
|
// We were in the environment variables section and we're now exiting it,
|
|
// so there is no need to keep checking the remaining lines,
|
|
// we might as well close the stream and return
|
|
fileStream.close();
|
|
return envVarNames;
|
|
}
|
|
|
|
// We've just entered the options section
|
|
insideEnvVariablesSection = line === '## Environment variables';
|
|
continue;
|
|
}
|
|
|
|
if (insideEnvVariablesSection) {
|
|
const match = line.match(envVariableRE);
|
|
if (match) {
|
|
const { varName } = match.groups;
|
|
envVarNames.add(varName);
|
|
}
|
|
}
|
|
}
|
|
|
|
return envVarNames;
|
|
}
|