| 'use strict'; |
| |
| const { |
| ArrayPrototypeMap, |
| ArrayPrototypeSort, |
| ObjectFromEntries, |
| ObjectKeys, |
| StringPrototypeReplace, |
| } = primordials; |
| |
| const { |
| getCLIOptionsValues, |
| getCLIOptionsInfo, |
| getEmbedderOptions: getEmbedderOptionsFromBinding, |
| getEnvOptionsInputType, |
| getNamespaceOptionsInputType, |
| } = internalBinding('options'); |
| |
| let warnOnAllowUnauthorized = true; |
| |
| let optionsDict; |
| let cliInfo; |
| let embedderOptions; |
| |
| // getCLIOptionsValues() would serialize the option values from C++ land. |
| // It would error if the values are queried before bootstrap is |
| // complete so that we don't accidentally include runtime-dependent |
| // states into a runtime-independent snapshot. |
| function getCLIOptionsFromBinding() { |
| return optionsDict ??= getCLIOptionsValues(); |
| } |
| |
| function getCLIOptionsInfoFromBinding() { |
| return cliInfo ??= getCLIOptionsInfo(); |
| } |
| |
| function getEmbedderOptions() { |
| return embedderOptions ??= getEmbedderOptionsFromBinding(); |
| } |
| |
| function generateConfigJsonSchema() { |
| const envOptionsMap = getEnvOptionsInputType(); |
| const namespaceOptionsMap = getNamespaceOptionsInputType(); |
| |
| function createPropertyForType(type) { |
| if (type === 'array') { |
| return { |
| __proto__: null, |
| oneOf: [ |
| { __proto__: null, type: 'string' }, |
| { __proto__: null, items: { __proto__: null, type: 'string', minItems: 1 }, type: 'array' }, |
| ], |
| }; |
| } |
| |
| return { __proto__: null, type }; |
| } |
| |
| const schema = { |
| __proto__: null, |
| $schema: 'https://json-schema.org/draft/2020-12/schema', |
| additionalProperties: false, |
| properties: { |
| $schema: { |
| __proto__: null, |
| type: 'string', |
| }, |
| nodeOptions: { |
| __proto__: null, |
| additionalProperties: false, |
| properties: { __proto__: null }, |
| type: 'object', |
| }, |
| __proto__: null, |
| }, |
| type: 'object', |
| }; |
| |
| // Get the root properties object for adding namespaces |
| const rootProperties = schema.properties; |
| const nodeOptions = rootProperties.nodeOptions.properties; |
| |
| // Add env options to nodeOptions (backward compatibility) |
| for (const { 0: key, 1: type } of envOptionsMap) { |
| const keyWithoutPrefix = StringPrototypeReplace(key, '--', ''); |
| nodeOptions[keyWithoutPrefix] = createPropertyForType(type); |
| } |
| |
| // Add namespace properties at the root level |
| for (const { 0: namespace, 1: optionsMap } of namespaceOptionsMap) { |
| // Create namespace object at the root level |
| rootProperties[namespace] = { |
| __proto__: null, |
| type: 'object', |
| additionalProperties: false, |
| properties: { __proto__: null }, |
| }; |
| |
| const namespaceProperties = rootProperties[namespace].properties; |
| |
| // Add all options for this namespace |
| for (const { 0: optionName, 1: optionType } of optionsMap) { |
| const keyWithoutPrefix = StringPrototypeReplace(optionName, '--', ''); |
| namespaceProperties[keyWithoutPrefix] = createPropertyForType(optionType); |
| } |
| |
| // Sort the namespace properties alphabetically |
| const sortedNamespaceKeys = ArrayPrototypeSort(ObjectKeys(namespaceProperties)); |
| const sortedNamespaceProperties = ObjectFromEntries( |
| ArrayPrototypeMap(sortedNamespaceKeys, (key) => [key, namespaceProperties[key]]), |
| ); |
| rootProperties[namespace].properties = sortedNamespaceProperties; |
| } |
| |
| // Sort the top-level properties by key alphabetically |
| const sortedKeys = ArrayPrototypeSort(ObjectKeys(nodeOptions)); |
| const sortedProperties = ObjectFromEntries( |
| ArrayPrototypeMap(sortedKeys, (key) => [key, nodeOptions[key]]), |
| ); |
| |
| schema.properties.nodeOptions.properties = sortedProperties; |
| |
| // Also sort the root level properties |
| const sortedRootKeys = ArrayPrototypeSort(ObjectKeys(rootProperties)); |
| const sortedRootProperties = ObjectFromEntries( |
| ArrayPrototypeMap(sortedRootKeys, (key) => [key, rootProperties[key]]), |
| ); |
| |
| schema.properties = sortedRootProperties; |
| |
| return schema; |
| } |
| |
| function refreshOptions() { |
| optionsDict = undefined; |
| } |
| |
| function getOptionValue(optionName) { |
| return getCLIOptionsFromBinding()[optionName]; |
| } |
| |
| function getAllowUnauthorized() { |
| const allowUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED === '0'; |
| |
| if (allowUnauthorized && warnOnAllowUnauthorized) { |
| warnOnAllowUnauthorized = false; |
| process.emitWarning( |
| 'Setting the NODE_TLS_REJECT_UNAUTHORIZED ' + |
| 'environment variable to \'0\' makes TLS connections ' + |
| 'and HTTPS requests insecure by disabling ' + |
| 'certificate verification.'); |
| } |
| return allowUnauthorized; |
| } |
| |
| module.exports = { |
| getCLIOptionsInfo: getCLIOptionsInfoFromBinding, |
| getOptionValue, |
| getAllowUnauthorized, |
| getEmbedderOptions, |
| generateConfigJsonSchema, |
| refreshOptions, |
| }; |