1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4 5// Import of pure js (non-shared) deps for comparison 6const acorn = require('../../deps/acorn/acorn/package.json'); 7const cjs_module_lexer = require('../../deps/cjs-module-lexer/package.json'); 8 9const expected_keys = [ 10 'ares', 11 'brotli', 12 'modules', 13 'uv', 14 'v8', 15 'zlib', 16 'nghttp2', 17 'napi', 18 'llhttp', 19 'uvwasi', 20 'acorn', 21 'simdutf', 22 'ada', 23 'cjs_module_lexer', 24 'base64', 25]; 26 27const hasUndici = process.config.variables.node_builtin_shareable_builtins.includes('deps/undici/undici.js'); 28 29if (hasUndici) { 30 expected_keys.push('undici'); 31} 32 33if (common.hasCrypto) { 34 expected_keys.push('openssl'); 35} 36 37if (common.hasQuic) { 38 expected_keys.push('ngtcp2'); 39 expected_keys.push('nghttp3'); 40} 41 42if (common.hasIntl) { 43 expected_keys.push('icu'); 44 expected_keys.push('cldr'); 45 expected_keys.push('tz'); 46 expected_keys.push('unicode'); 47} 48 49expected_keys.sort(); 50expected_keys.unshift('node'); 51 52const actual_keys = Object.keys(process.versions); 53 54assert.deepStrictEqual(actual_keys, expected_keys); 55 56const commonTemplate = /^\d+\.\d+\.\d+(?:-.*)?$/; 57 58assert.match(process.versions.acorn, commonTemplate); 59assert.match(process.versions.ares, commonTemplate); 60assert.match(process.versions.brotli, commonTemplate); 61assert.match(process.versions.llhttp, commonTemplate); 62assert.match(process.versions.node, commonTemplate); 63assert.match(process.versions.uv, commonTemplate); 64assert.match(process.versions.zlib, /^\d+(?:\.\d+){1,3}(?:-.*)?$/); 65 66if (hasUndici) { 67 assert.match(process.versions.undici, commonTemplate); 68} 69 70assert.match( 71 process.versions.v8, 72 /^\d+\.\d+\.\d+(?:\.\d+)?-node\.\d+(?: \(candidate\))?$/ 73); 74assert.match(process.versions.modules, /^\d+$/); 75assert.match(process.versions.cjs_module_lexer, commonTemplate); 76 77if (common.hasCrypto) { 78 if (process.config.variables.node_shared_openssl) { 79 assert.ok(process.versions.openssl); 80 } else { 81 const versionRegex = common.hasOpenSSL3 ? 82 // The following also matches a development version of OpenSSL 3.x which 83 // can be in the format '3.0.0-alpha4-dev'. This can be handy when 84 // building and linking against the main development branch of OpenSSL. 85 /^\d+\.\d+\.\d+(?:[-+][a-z0-9]+)*$/ : 86 /^\d+\.\d+\.\d+[a-z]?(\+quic)?(-fips)?$/; 87 assert.match(process.versions.openssl, versionRegex); 88 } 89} 90 91for (let i = 0; i < expected_keys.length; i++) { 92 const key = expected_keys[i]; 93 const descriptor = Object.getOwnPropertyDescriptor(process.versions, key); 94 assert.strictEqual(descriptor.writable, false); 95} 96 97assert.strictEqual(process.config.variables.napi_build_version, 98 process.versions.napi); 99 100if (hasUndici) { 101 const undici = require('../../deps/undici/src/package.json'); 102 const expectedUndiciVersion = undici.version; 103 assert.strictEqual(process.versions.undici, expectedUndiciVersion); 104} 105 106const expectedAcornVersion = acorn.version; 107assert.strictEqual(process.versions.acorn, expectedAcornVersion); 108const expectedCjsModuleLexerVersion = cjs_module_lexer.version; 109assert.strictEqual(process.versions.cjs_module_lexer, expectedCjsModuleLexerVersion); 110