'use strict'; const semver = require('semver'); const flags = require('./flags.json'); const getDescriptors = require('object.getownpropertydescriptors'); const replaceUnderscoresRegex = /_/g; const leadingDashesRegex = /^--?/; const trailingValuesRegex = /=.*$/; const replace = Function.call.bind(String.prototype.replace); const has = Function.call.bind(Set.prototype.has); const test = Function.call.bind(RegExp.prototype.test); const [allowedNodeEnvironmentFlags, detectedSemverRange] = Object.keys( flags ).reduce( (acc, range) => acc || (semver.satisfies(process.version, range) ? [flags[range], range] : acc), null ); const trimLeadingDashes = flag => replace(flag, leadingDashesRegex, ''); class NodeEnvironmentFlagsSet extends Set { constructor(...args) { super(...args); this.add = () => this; } delete() { return false; } clear() {} has(key) { if (typeof key === 'string') { key = replace(key, replaceUnderscoresRegex, '-'); if (test(leadingDashesRegex, key)) { key = replace(key, trailingValuesRegex, ''); return has(this, key); } return has(nodeFlags, key); } return false; } } const nodeFlags = Object.defineProperties( new Set(allowedNodeEnvironmentFlags.map(trimLeadingDashes)), getDescriptors(Set.prototype) ); Object.freeze(NodeEnvironmentFlagsSet.prototype.constructor); Object.freeze(NodeEnvironmentFlagsSet.prototype); exports.allowedNodeEnvironmentFlags = Object.freeze( new NodeEnvironmentFlagsSet(allowedNodeEnvironmentFlags) ); exports.detectedSemverRange = detectedSemverRange;