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 (?[^ ]*)/); 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 = /^### `(?[^`]*?)(?:=[^`]+)?`$/; 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; }