'use strict'; // Flags: --expose-internals // This verifies that // 1. We do not leak internal modules unless the --require-internals option // is on. // 2. We do not accidentally leak any modules to the public global scope. // 3. Deprecated modules are properly deprecated. const common = require('../common'); if (!common.isMainThread) { common.skip('Cannot test the existence of --expose-internals from worker'); } const assert = require('assert'); const fork = require('child_process').fork; const expectedPublicModules = new Set([ '_http_agent', '_http_client', '_http_common', '_http_incoming', '_http_outgoing', '_http_server', '_stream_duplex', '_stream_passthrough', '_stream_readable', '_stream_transform', '_stream_wrap', '_stream_writable', '_tls_common', '_tls_wrap', 'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'console', 'constants', 'crypto', 'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'http2', 'https', 'inspector', 'module', 'net', 'os', 'path', 'perf_hooks', 'process', 'punycode', 'querystring', 'readline', 'repl', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'trace_events', 'tty', 'url', 'util', 'v8', 'vm', 'worker_threads', 'zlib' ]); if (process.argv[2] === 'child') { assert(!process.execArgv.includes('--expose-internals')); process.once('message', ({ allBuiltins }) => { const publicModules = new Set(); for (const id of allBuiltins) { if (id.startsWith('internal/')) { common.expectsError(() => { require(id); }, { code: 'MODULE_NOT_FOUND', message: `Cannot find module '${id}'` }); } else { require(id); publicModules.add(id); } } assert(allBuiltins.length > publicModules.size); // Make sure all the public modules are available through // require('module').builtinModules assert.deepStrictEqual( publicModules, new Set(require('module').builtinModules) ); assert.deepStrictEqual(publicModules, expectedPublicModules); }); } else { assert(process.execArgv.includes('--expose-internals')); const child = fork(__filename, ['child'], { execArgv: [] }); const { builtinModules } = require('module'); // When --expose-internals is on, require('module').builtinModules // contains internal modules. const message = { allBuiltins: builtinModules }; child.send(message); }