node/test/parallel/test-cli-node-cli-manpage-env-vars.mjs
amir lavasani 0d128e39ef
doc: add missing environment variables to manpage
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>
2025-07-11 07:38:24 +00:00

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;
}