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