| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | /** * @author Toru Nagashima * See LICENSE file in root directory for full license. */"use strict"const { Range, lt, major } = require("semver") //eslint-disable-line no-unused-varsconst { ReferenceTracker } = require("eslint-utils")const getConfiguredNodeVersion = require("./get-configured-node-version")const getSemverRange = require("./get-semver-range")/** * @typedef {Object} SupportInfo * @property {string | null} supported The stably supported version. If `null` is present, it hasn't been supported yet. * @property {string[]} [backported] The backported versions. * @property {string} [experimental] The added version as experimental. *//** * Parses the options. * @param {RuleContext} context The rule context. * @returns {{version:Range,ignores:Set<string>}} Parsed value. */function parseOptions(context) {    const raw = context.options[0] || {}    const filePath = context.getFilename()    const version = getConfiguredNodeVersion(raw.version, filePath)    const ignores = new Set(raw.ignores || [])    return Object.freeze({ version, ignores })}/** * Check if it has been supported. * @param {SupportInfo} info The support info. * @param {Range} configured The configured version range. */function isSupported({ backported, supported }, configured) {    if (        backported &&        backported.length >= 2 &&        !backported.every((v, i) => i === 0 || lt(backported[i - 1], v))    ) {        throw new Error("Invalid BackportConfiguration")    }    if (supported == null) {        return false    }    if (backported == null || backported.length === 0) {        return !configured.intersects(getSemverRange(`<${supported}`))    }    return !configured.intersects(        getSemverRange(            [...backported, supported]                .map((v, i) => (i === 0 ? `<${v}` : `>=${major(v)}.0.0 <${v}`))                .join(" || ")        )    )}/** * Get the formatted text of a given supported version. * @param {SupportInfo} info The support info. */function supportedVersionToString({ backported, supported }) {    if (supported == null) {        return "(none yet)"    }    if (backported == null || backported.length === 0) {        return supported    }    return `${supported} (backported: ^${backported.join(", ^")})`}/** * Verify the code to report unsupported APIs. * @param {RuleContext} context The rule context. * @param {{modules:object,globals:object}} trackMap The map for APIs to report. * @returns {void} */module.exports = function checkUnsupportedBuiltins(context, trackMap) {    const options = parseOptions(context)    const tracker = new ReferenceTracker(context.getScope(), { mode: "legacy" })    const references = [        ...tracker.iterateCjsReferences(trackMap.modules || {}),        ...tracker.iterateEsmReferences(trackMap.modules || {}),        ...tracker.iterateGlobalReferences(trackMap.globals || {}),    ]    for (const { node, path, info } of references) {        const name = path.join(".")        const supported = isSupported(info, options.version)        if (!supported && !options.ignores.has(name)) {            context.report({                node,                messageId: "unsupported",                data: {                    name,                    supported: supportedVersionToString(info),                    version: options.version.raw,                },            })        }    }}
 |