Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(deps): bump eslint-plugin-compat from 4.2.0 to 6.0.0 #1329

Merged
merged 2 commits into from
Aug 1, 2024

Conversation

dependabot[bot]
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Aug 1, 2024

Bumps eslint-plugin-compat from 4.2.0 to 6.0.0.

Release notes

Sourced from eslint-plugin-compat's releases.

v6.0.0

No release notes provided.

v5.1.0-0

  • feat: eslint 9 support (#627) a2db2d6

amilajack/eslint-plugin-compat@v5.0.0...v5.1.0-0

v5.0.0

  • feat: support flat config (#609) f51dad7
  • chore: bump workflows (#612) 6ffb8ad
  • chore: bump deps eba26a7

amilajack/eslint-plugin-compat@v4.2.0...v5.0.0

v5.0.0-0

  • feat: provide type declaration 91c9327
  • chore: deprecate named export dca42fb
  • docs: add flat config example to README 92a710f
  • test: add typing tests for flat configs 9ded3f8
  • feat: support flat config 491dfa5
  • chore: babel-eslint to @​babel/eslint-parser 21b1a64
  • test: update snapshots b8a79a6
  • chore: bump deps bd2b70a
  • chore: bump deps eba26a7

amilajack/eslint-plugin-compat@v4.2.0...v5.0.0-0

Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [eslint-plugin-compat](https://github.com/amilajack/eslint-plugin-compat) from 4.2.0 to 6.0.0.
- [Release notes](https://github.com/amilajack/eslint-plugin-compat/releases)
- [Changelog](https://github.com/amilajack/eslint-plugin-compat/blob/main/CHANGELOG.md)
- [Commits](amilajack/eslint-plugin-compat@v4.2.0...v6.0.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-compat
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot bot added dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code labels Aug 1, 2024
Copy link
Contributor

github-actions bot commented Aug 1, 2024

Diff between eslint-plugin-compat 4.2.0 and 6.0.0
diff --git a/lib/providers/caniuse-provider.js b/lib/providers/caniuse-provider.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/providers/caniuse-provider.js
+++ b/lib/providers/caniuse-provider.js
@@ -1,259 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    var desc = Object.getOwnPropertyDescriptor(m, k);
-    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-      desc = { enumerable: true, get: function() { return m[k]; } };
-    }
-    Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getUnsupportedTargets = void 0;
-const lite = __importStar(require("caniuse-lite"));
-const constants_1 = require("../constants");
-/**
- * Take a target's id and return it's full name by using `targetNameMappings`
- * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
- */
-function formatTargetNames(target) {
-    const name = constants_1.STANDARD_TARGET_NAME_MAPPING[target.target] || target.target;
-    return `${name} ${target.version}`;
-}
-/**
- * Check if a browser version is in the range format
- * ex. 10.0-10.2
- */
-function versionIsRange(version) {
-    return version.includes("-");
-}
-/**
- * Parse version from caniuse and compare with parsed version from browserslist.
- */
-function areVersionsEqual(targetVersion, statsVersion) {
-    return targetVersion === parseFloat(statsVersion);
-}
-/*
- * Check the CanIUse database to see if targets are supported
- *
- * If no record could be found, return true. Rules might not
- * be found because they could belong to another provider
- */
-function isSupportedByCanIUse(node, { version, target, parsedVersion }) {
-    if (!node.caniuseId)
-        return false;
-    const data = lite.feature(lite.features[node.caniuseId]);
-    if (!data)
-        return true;
-    const { stats } = data;
-    if (!(target in stats))
-        return true;
-    const targetStats = stats[target];
-    if (typeof version === "string" && versionIsRange(version)) {
-        return Object.keys(targetStats).some((statsVersion) => versionIsRange(statsVersion) &&
-            areVersionsEqual(parsedVersion, statsVersion)
-            ? !targetStats[statsVersion].includes("y")
-            : true);
-    }
-    // @TODO: This assumes that all versions are included in the cainuse db. If this is incorrect,
-    //        this will return false negatives. To properly do this, we have to to range comparisons.
-    //        Ex. given query for 50 and only version 40 exists in db records, return true
-    if (!(version in targetStats))
-        return true;
-    if (!targetStats[version])
-        return true;
-    return targetStats[version].includes("y");
-}
-/**
- * Return an array of all unsupported targets
- */
-function getUnsupportedTargets(node, targets) {
-    return targets
-        .filter((target) => !isSupportedByCanIUse(node, target))
-        .map(formatTargetNames);
-}
-exports.getUnsupportedTargets = getUnsupportedTargets;
-const CanIUseProvider = [
-    // new ServiceWorker()
-    {
-        caniuseId: "serviceworkers",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "ServiceWorker",
-    },
-    {
-        caniuseId: "serviceworkers",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "navigator",
-        property: "serviceWorker",
-    },
-    // document.querySelector()
-    {
-        caniuseId: "queryselector",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "document",
-        property: "querySelector",
-    },
-    // IntersectionObserver
-    {
-        caniuseId: "intersectionobserver",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "IntersectionObserver",
-    },
-    // ResizeObserver
-    {
-        caniuseId: "resizeobserver",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "ResizeObserver",
-    },
-    // PaymentRequest
-    {
-        caniuseId: "payment-request",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "PaymentRequest",
-    },
-    // Promises
-    {
-        caniuseId: "promises",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Promise",
-    },
-    {
-        caniuseId: "promises",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "Promise",
-        property: "resolve",
-    },
-    {
-        caniuseId: "promises",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "Promise",
-        property: "all",
-    },
-    {
-        caniuseId: "promises",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "Promise",
-        property: "race",
-    },
-    {
-        caniuseId: "promises",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "Promise",
-        property: "reject",
-    },
-    // fetch
-    {
-        caniuseId: "fetch",
-        astNodeType: constants_1.AstNodeTypes.CallExpression,
-        object: "fetch",
-    },
-    // document.currentScript()
-    {
-        caniuseId: "document-currentscript",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "document",
-        property: "currentScript",
-    },
-    // URL
-    {
-        caniuseId: "url",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "URL",
-    },
-    // URLSearchParams
-    {
-        caniuseId: "urlsearchparams",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "URLSearchParams",
-    },
-    // performance.now()
-    {
-        caniuseId: "high-resolution-time",
-        astNodeType: constants_1.AstNodeTypes.MemberExpression,
-        object: "performance",
-        property: "now",
-    },
-    // requestIdleCallback()
-    {
-        caniuseId: "requestidlecallback",
-        astNodeType: constants_1.AstNodeTypes.CallExpression,
-        object: "requestIdleCallback",
-    },
-    // requestAnimationFrame()
-    {
-        caniuseId: "requestanimationframe",
-        astNodeType: constants_1.AstNodeTypes.CallExpression,
-        object: "requestAnimationFrame",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "TypedArray",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Int8Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Uint8Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Uint8ClampedArray",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Int16Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Uint16Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Int32Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Uint32Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Float32Array",
-    },
-    {
-        caniuseId: "typedarrays",
-        astNodeType: constants_1.AstNodeTypes.NewExpression,
-        object: "Float64Array",
-    },
-].map((rule) => ({
-    ...rule,
-    getUnsupportedTargets,
-    id: rule.property ? `${rule.object}.${rule.property}` : rule.object,
-    protoChainId: rule.property ? `${rule.object}.${rule.property}` : rule.object,
-    protoChain: rule.property ? [rule.object, rule.property] : [rule.object],
-}));
-exports.default = CanIUseProvider;
\ No newline at end of file
diff --git a/lib/rules/compat.js b/lib/rules/compat.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/rules/compat.js
+++ b/lib/rules/compat.js
@@ -1,184 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-/*
- * Step 2) Logic that handles AST traversal
- * Does not handle looking up the API
- * Handles checking what kinds of eslint nodes should be linted
- *   Tells eslint to lint certain nodes  (lintCallExpression, lintMemberExpression, lintNewExpression)
- *   Gets protochain for the ESLint nodes the plugin is interested in
- */
-const fs_1 = __importDefault(require("fs"));
-const find_up_1 = __importDefault(require("find-up"));
-const lodash_memoize_1 = __importDefault(require("lodash.memoize"));
-const helpers_1 = require("../helpers"); // will be deprecated and introduced to this file
-const providers_1 = require("../providers");
-function getName(node) {
-    switch (node.type) {
-        case "NewExpression": {
-            return node.callee.name;
-        }
-        case "MemberExpression": {
-            return node.object.name;
-        }
-        case "ExpressionStatement": {
-            return node.expression.name;
-        }
-        case "CallExpression": {
-            return node.callee.name;
-        }
-        default:
-            throw new Error("not found");
-    }
-}
-function generateErrorName(rule) {
-    if (rule.name)
-        return rule.name;
-    if (rule.property)
-        return `${rule.object}.${rule.property}()`;
-    return rule.object;
-}
-const getPolyfillSet = (0, lodash_memoize_1.default)((polyfillArrayJSON) => new Set(JSON.parse(polyfillArrayJSON)));
-function isPolyfilled(context, rule) {
-    if (!context.settings?.polyfills)
-        return false;
-    const polyfills = getPolyfillSet(JSON.stringify(context.settings.polyfills));
-    return (
-    // v2 allowed users to select polyfills based off their caniuseId. This is
-    polyfills.has(rule.id) || // no longer supported. Keeping this here to avoid breaking changes.
-        polyfills.has(rule.protoChainId) || // Check if polyfill is provided (ex. `Promise.all`)
-        polyfills.has(rule.protoChain[0]) // Check if entire API is polyfilled (ex. `Promise`)
-    );
-}
-const babelConfigs = [
-    "babel.config.json",
-    "babel.config.js",
-    "babel.config.cjs",
-    ".babelrc",
-    ".babelrc.json",
-    ".babelrc.js",
-    ".babelrc.cjs",
-];
-/**
- * Determine if a user has a babel config, which we use to infer if the linted code is polyfilled.
- */
-function isUsingTranspiler(context) {
-    const dir = context.getFilename();
-    const configPath = find_up_1.default.sync(babelConfigs, {
-        cwd: dir,
-    });
-    if (configPath)
-        return true;
-    const pkgPath = find_up_1.default.sync("package.json", {
-        cwd: dir,
-    });
-    // Check if babel property exists
-    if (pkgPath) {
-        const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath).toString());
-        return !!pkg.babel;
-    }
-    return false;
-}
-/**
- * A small optimization that only lints APIs that are not supported by targeted browsers.
- * For example, if the user is targeting chrome 50, which supports the fetch API, it is
- * wasteful to lint calls to fetch.
- */
-const getRulesForTargets = (0, lodash_memoize_1.default)((targetsJSON, lintAllEsApis) => {
-    const result = {
-        CallExpression: [],
-        NewExpression: [],
-        MemberExpression: [],
-        ExpressionStatement: [],
-    };
-    const targets = JSON.parse(targetsJSON);
-    providers_1.nodes
-        .filter((node) => (lintAllEsApis ? true : node.kind !== "es"))
-        .forEach((node) => {
-        if (!node.getUnsupportedTargets(node, targets).length)
-            return;
-        result[node.astNodeType].push(node);
-    });
-    return result;
-});
-exports.default = {
-    meta: {
-        docs: {
-            description: "Ensure cross-browser API compatibility",
-            category: "Compatibility",
-            url: "https://github.com/amilajack/eslint-plugin-compat/blob/master/docs/rules/compat.md",
-            recommended: true,
-        },
-        type: "problem",
-        schema: [{ type: "string" }],
-    },
-    create(context) {
-        // Determine lowest targets from browserslist config, which reads user's
-        // package.json config section. Use config from eslintrc for testing purposes
-        const browserslistConfig = context.settings?.browsers ||
-            context.settings?.targets ||
-            context.options[0];
-        if (!context.settings?.browserslistOpts &&
-            // @ts-expect-error Checking for accidental misspellings
-            context.settings.browsersListOpts) {
-            console.error('Please ensure you spell `browserslistOpts` with a lowercase "l"!');
-        }
-        const browserslistOpts = context.settings?.browserslistOpts;
-        const lintAllEsApis = context.settings?.lintAllEsApis === true ||
-            // Attempt to infer polyfilling of ES APIs from babel config
-            (!context.settings?.polyfills?.includes("es:all") &&
-                !isUsingTranspiler(context));
-        const browserslistTargets = (0, helpers_1.parseBrowsersListVersion)((0, helpers_1.determineTargetsFromConfig)(context.getFilename(), browserslistConfig, browserslistOpts));
-        // Stringify to support memoization; browserslistConfig is always an array of new objects.
-        const targetedRules = getRulesForTargets(JSON.stringify(browserslistTargets), lintAllEsApis);
-        const errors = [];
-        const handleFailingRule = (node, eslintNode) => {
-            if (isPolyfilled(context, node))
-                return;
-            errors.push({
-                node: eslintNode,
-                message: [
-                    generateErrorName(node),
-                    "is not supported in",
-                    node.getUnsupportedTargets(node, browserslistTargets).join(", "),
-                ].join(" "),
-            });
-        };
-        const identifiers = new Set();
-        return {
-            CallExpression: helpers_1.lintCallExpression.bind(null, context, handleFailingRule, targetedRules.CallExpression),
-            NewExpression: helpers_1.lintNewExpression.bind(null, context, handleFailingRule, targetedRules.NewExpression),
-            ExpressionStatement: helpers_1.lintExpressionStatement.bind(null, context, handleFailingRule, [...targetedRules.MemberExpression, ...targetedRules.CallExpression]),
-            MemberExpression: helpers_1.lintMemberExpression.bind(null, context, handleFailingRule, [
-                ...targetedRules.MemberExpression,
-                ...targetedRules.CallExpression,
-                ...targetedRules.NewExpression,
-            ]),
-            // Keep track of all the defined variables. Do not report errors for nodes that are not defined
-            Identifier(node) {
-                if (node.parent) {
-                    const { type } = node.parent;
-                    if (type === "Property" || // ex. const { Set } = require('immutable');
-                        type === "FunctionDeclaration" || // ex. function Set() {}
-                        type === "VariableDeclarator" || // ex. const Set = () => {}
-                        type === "ClassDeclaration" || // ex. class Set {}
-                        type === "ImportDefaultSpecifier" || // ex. import Set from 'set';
-                        type === "ImportSpecifier" || // ex. import {Set} from 'set';
-                        type === "ImportDeclaration" // ex. import {Set} from 'set';
-                    ) {
-                        identifiers.add(node.name);
-                    }
-                }
-            },
-            "Program:exit": () => {
-                // Get a map of all the variables defined in the root scope (not the global scope)
-                // const variablesMap = context.getScope().childScopes.map(e => e.set)[0];
-                errors
-                    .filter((error) => !identifiers.has(getName(error.node)))
-                    .forEach((node) => context.report(node));
-            },
-        };
-    },
-};
\ No newline at end of file
diff --git a/lib/constants.js b/lib/constants.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -1,35 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AstNodeTypes = exports.STANDARD_TARGET_NAME_MAPPING = void 0;
-// Maps an ID to the full name user will see
-// E.g. during error, user will see full name instead of ID
-exports.STANDARD_TARGET_NAME_MAPPING = {
-    chrome: "Chrome",
-    firefox: "Firefox",
-    safari: "Safari",
-    ios_saf: "iOS Safari",
-    ie: "IE",
-    ie_mob: "IE Mobile",
-    edge: "Edge",
-    baidu: "Baidu",
-    electron: "Electron",
-    blackberry_browser: "Blackberry Browser",
-    edge_mobile: "Edge Mobile",
-    and_uc: "Android UC Browser",
-    and_chrome: "Android Chrome",
-    and_firefox: "Android Firefox",
-    and_webview: "Android Webview",
-    and_samsung: "Samsung Browser",
-    and_opera: "Opera Android",
-    opera: "Opera",
-    opera_mini: "Opera Mini",
-    opera_mobile: "Opera Mobile",
-    node: "Node.js",
-    kaios: "KaiOS",
-};
-var AstNodeTypes;
-(function (AstNodeTypes) {
-    AstNodeTypes["MemberExpression"] = "MemberExpression";
-    AstNodeTypes["CallExpression"] = "CallExpression";
-    AstNodeTypes["NewExpression"] = "NewExpression";
-})(AstNodeTypes || (exports.AstNodeTypes = AstNodeTypes = {}));
\ No newline at end of file
diff --git a/lib/helpers.js b/lib/helpers.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/helpers.js
+++ b/lib/helpers.js
@@ -1,195 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.parseBrowsersListVersion = exports.determineTargetsFromConfig = exports.reverseTargetMappings = exports.lintMemberExpression = exports.lintExpressionStatement = exports.lintNewExpression = exports.lintCallExpression = void 0;
-/* eslint no-nested-ternary: off */
-const browserslist_1 = __importDefault(require("browserslist"));
-/*
-3) Figures out which browsers user is targeting
-
-- Uses browserslist config and/or targets defined eslint config to discover this
-- For every API ecnountered during traversal, gets compat record for that
-- Protochain (e.g. 'document.querySelector')
-  - All of the rules have compatibility info attached to them
-- Each API is given to versioning.ts with compatibility info
-*/
-function isInsideIfStatement(context) {
-    return context.getAncestors().some((ancestor) => {
-        return ancestor.type === "IfStatement";
-    });
-}
-function checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, node) {
-    if (!isInsideIfStatement(context)) {
-        handleFailingRule(failingRule, node);
-    }
-}
-function lintCallExpression(context, handleFailingRule, rules, node) {
-    if (!node.callee)
-        return;
-    const calleeName = node.callee.name;
-    const failingRule = rules.find((rule) => rule.object === calleeName);
-    if (failingRule)
-        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, node);
-}
-exports.lintCallExpression = lintCallExpression;
-function lintNewExpression(context, handleFailingRule, rules, node) {
-    if (!node.callee)
-        return;
-    const calleeName = node.callee.name;
-    const failingRule = rules.find((rule) => rule.object === calleeName);
-    if (failingRule)
-        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, node);
-}
-exports.lintNewExpression = lintNewExpression;
-function lintExpressionStatement(context, handleFailingRule, rules, node) {
-    if (!node?.expression?.name)
-        return;
-    const failingRule = rules.find((rule) => rule.object === node?.expression?.name);
-    if (failingRule)
-        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, node);
-}
-exports.lintExpressionStatement = lintExpressionStatement;
-function isStringLiteral(node) {
-    return node.type === "Literal" && typeof node.value === "string";
-}
-function protoChainFromMemberExpression(node) {
-    if (!node.object)
-        return [node.name];
-    const protoChain = (() => {
-        if (node.object.type === "NewExpression" ||
-            node.object.type === "CallExpression") {
-            return protoChainFromMemberExpression(node.object.callee);
-        }
-        else if (node.object.type === "ArrayExpression") {
-            return ["Array"];
-        }
-        else if (isStringLiteral(node.object)) {
-            return ["String"];
-        }
-        else {
-            return protoChainFromMemberExpression(node.object);
-        }
-    })();
-    return [...protoChain, node.property.name];
-}
-function lintMemberExpression(context, handleFailingRule, rules, node) {
-    if (!node.object || !node.property)
-        return;
-    if (!node.object.name ||
-        node.object.name === "window" ||
-        node.object.name === "globalThis") {
-        const rawProtoChain = protoChainFromMemberExpression(node);
-        const [firstObj] = rawProtoChain;
-        const protoChain = firstObj === "window" || firstObj === "globalThis"
-            ? rawProtoChain.slice(1)
-            : rawProtoChain;
-        const protoChainId = protoChain.join(".");
-        const failingRule = rules.find((rule) => rule.protoChainId === protoChainId);
-        if (failingRule) {
-            checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, node);
-        }
-    }
-    else {
-        const objectName = node.object.name;
-        const propertyName = node.property.name;
-        const failingRule = rules.find((rule) => rule.object === objectName &&
-            (rule.property == null || rule.property === propertyName));
-        if (failingRule)
-            checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, node);
-    }
-}
-exports.lintMemberExpression = lintMemberExpression;
-function reverseTargetMappings(targetMappings) {
-    const reversedEntries = Object.entries(targetMappings).map((entry) => entry.reverse());
-    return Object.fromEntries(reversedEntries);
-}
-exports.reverseTargetMappings = reverseTargetMappings;
-/**
- * Determine the targets based on the browserslist config object
- * Get the targets from the eslint config and merge them with targets in browserslist config
- * Eslint target config will be deprecated in 4.0.0
- *
- * @param configPath - The file or a directory path to look for the browserslist config file
- */
-function determineTargetsFromConfig(configPath, config, browserslistOptsFromConfig) {
-    const browserslistOpts = { path: configPath, ...browserslistOptsFromConfig };
-    const eslintTargets = (() => {
-        // Get targets from eslint settings
-        if (Array.isArray(config) || typeof config === "string") {
-            return (0, browserslist_1.default)(config, browserslistOpts);
-        }
-        if (config && typeof config === "object") {
-            return (0, browserslist_1.default)([...(config.production || []), ...(config.development || [])], browserslistOpts);
-        }
-        return [];
-    })();
-    if (browserslist_1.default.findConfig(configPath)) {
-        // If targets are defined in ESLint and browerslist configs, merge the targets together
-        if (eslintTargets.length) {
-            const browserslistTargets = (0, browserslist_1.default)(undefined, browserslistOpts);
-            return Array.from(new Set(eslintTargets.concat(browserslistTargets)));
-        }
-    }
-    else if (eslintTargets.length) {
-        return eslintTargets;
-    }
-    // Get targets fron browserslist configs
-    return (0, browserslist_1.default)(undefined, browserslistOpts);
-}
-exports.determineTargetsFromConfig = determineTargetsFromConfig;
-/**
- * Parses the versions that are given by browserslist. They're
- *
- * ```ts
- * parseBrowsersListVersion(['chrome 50'])
- *
- * {
- *   target: 'chrome',
- *   parsedVersion: 50,
- *   version: '50'
- * }
- * ```
- * @param targetslist - List of targest from browserslist api
- * @returns - The lowest version version of each target
- */
-function parseBrowsersListVersion(targetslist) {
-    return (
-    // Sort the targets by target name and then version number in ascending order
-    targetslist
-        .map((e) => {
-        const [target, version] = e.split(" ");
-        const parsedVersion = (() => {
-            if (typeof version === "number")
-                return version;
-            if (version === "all")
-                return 0;
-            return version.includes("-")
-                ? parseFloat(version.split("-")[0])
-                : parseFloat(version);
-        })();
-        return {
-            target,
-            version,
-            parsedVersion,
-        };
-    }) // Sort the targets by target name and then version number in descending order
-        // ex. [a@3, b@3, a@1] => [a@3, a@1, b@3]
-        .sort((a, b) => {
-        if (b.target === a.target) {
-            // If any version === 'all', return 0. The only version of op_mini is 'all'
-            // Otherwise, compare the versions
-            return typeof b.parsedVersion === "string" ||
-                typeof a.parsedVersion === "string"
-                ? 0
-                : b.parsedVersion - a.parsedVersion;
-        }
-        return b.target > a.target ? 1 : -1;
-    }) // First last target always has the latest version
-        .filter((e, i, items) => 
-    // Check if the current target is the last of its kind.
-    // If it is, then it's the most recent version.
-    i + 1 === items.length || e.target !== items[i + 1].target));
-}
-exports.parseBrowsersListVersion = parseBrowsersListVersion;
\ No newline at end of file
diff --git a/lib/index.js b/lib/index.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,27 +0,0 @@
-"use strict";
-/**
- * Step 1) Entry point of plugin. Exports itself for eslint to use
- * @author Amila Welihinda
- */
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.rules = exports.config = exports.configs = void 0;
-//------------------------------------------------------------------------------
-// Requirements
-//------------------------------------------------------------------------------
-const recommended_1 = __importDefault(require("./config/recommended"));
-//------------------------------------------------------------------------------
-// Plugin Definition
-//------------------------------------------------------------------------------
-// import all rules in lib/rules
-const compat_1 = __importDefault(require("./rules/compat"));
-exports.configs = {
-    recommended: recommended_1.default,
-};
-// Kept for backwards compatibility
-exports.config = exports.configs;
-exports.rules = {
-    compat: compat_1.default,
-};
\ No newline at end of file
diff --git a/lib/providers/index.js b/lib/providers/index.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/providers/index.js
+++ b/lib/providers/index.js
@@ -1,15 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.nodes = void 0;
-/*
- * Step 3) Compat use CanIUse and MDN providers to check if a target browser supports a particular API
- */
-const caniuse_provider_1 = __importDefault(require("./caniuse-provider"));
-const mdn_provider_1 = __importDefault(require("./mdn-provider"));
-exports.nodes = [
-    ...caniuse_provider_1.default,
-    ...mdn_provider_1.default,
-];
\ No newline at end of file
diff --git a/lib/providers/mdn-provider.js b/lib/providers/mdn-provider.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/providers/mdn-provider.js
+++ b/lib/providers/mdn-provider.js
@@ -1,139 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getUnsupportedTargets = exports.isSupportedByMDN = void 0;
-const ast_metadata_inferer_1 = __importDefault(require("ast-metadata-inferer"));
-const semver_1 = __importDefault(require("semver"));
-const helpers_1 = require("../helpers");
-const constants_1 = require("../constants");
-const apis = ast_metadata_inferer_1.default;
-// @TODO Import this type from ast-metadata-inferer after migrating this project to TypeScript
-const mdnRecords = new Map(apis.map((e) => [e.protoChainId, e]));
-/**
- * Map ids of mdn targets to their "common/friendly" name
- */
-const targetIdMappings = {
-    chrome: "chrome",
-    firefox: "firefox",
-    opera: "opera",
-    safari: "safari",
-    safari_ios: "ios_saf",
-    ie: "ie",
-    edge_mobile: "ie_mob",
-    edge: "edge",
-    opera_android: "and_opera",
-    chrome_android: "and_chrome",
-    firefox_android: "and_firefox",
-    webview_android: "and_webview",
-    samsunginternet_android: "and_samsung",
-    nodejs: "node",
-};
-const reversedTargetMappings = (0, helpers_1.reverseTargetMappings)(targetIdMappings);
-/**
- * Take a target's id and return it's full name by using `targetNameMappings`
- * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
- */
-function formatTargetNames(target) {
-    return `${constants_1.STANDARD_TARGET_NAME_MAPPING[target.target]} ${target.version}`;
-}
-/**
- * Convert '9' => '9.0.0'
- */
-function customCoerce(version) {
-    return version.length === 1 ? [version, 0, 0].join(".") : version;
-}
-/*
- * Return if MDN supports the API or not
- */
-function isSupportedByMDN(node, { version, target: mdnTarget }) {
-    // @ts-ignore
-    const target = reversedTargetMappings[mdnTarget];
-    // If no record could be found, return true. Rules might not
-    // be found because they could belong to another provider
-    if (!mdnRecords.has(node.protoChainId))
-        return true;
-    const record = mdnRecords.get(node.protoChainId);
-    if (!record || !record.compat.support)
-        return true;
-    const compatRecord = record.compat.support[target];
-    if (!compatRecord)
-        return true;
-    if (!Array.isArray(compatRecord) && !("version_added" in compatRecord))
-        return true;
-    const { version_added: versionAdded } = Array.isArray(compatRecord)
-        ? compatRecord.find((e) => "version_added" in e)
-        : compatRecord;
-    // If a version is true then it is supported but version is unsure
-    if (typeof versionAdded === "boolean")
-        return versionAdded;
-    if (versionAdded === null)
-        return true;
-    // Special case for Safari TP: TP is always gte than any other releases
-    if (target === "safari") {
-        if (version === "TP")
-            return true;
-        if (versionAdded === "TP")
-            return false;
-    }
-    // A browser supports an API if its version is greater than or equal
-    // to the first version of the browser that API was added in
-    const semverCurrent = semver_1.default.coerce(customCoerce(String(version)));
-    const semverAdded = semver_1.default.coerce(customCoerce(versionAdded));
-    // semver.coerce() might be null for non-semvers (other than Safari TP)
-    // Just warn and treat features as supported here for now to avoid lint from
-    // crashing
-    if (!semverCurrent) {
-        // eslint-disable-next-line no-console
-        console.warn(`eslint-plugin-compat: A non-semver target "${target} ${version}" matched for the feature ${node.protoChainId}, skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`);
-        return true;
-    }
-    if (!versionAdded) {
-        // eslint-disable-next-line no-console
-        console.warn(`eslint-plugin-compat: The feature ${node.protoChainId} is supported since a non-semver target "${target} ${versionAdded}", skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`);
-        return true;
-    }
-    if (!semverAdded)
-        return false;
-    return semver_1.default.gte(semverCurrent, semverAdded);
-}
-exports.isSupportedByMDN = isSupportedByMDN;
-/**
- * Return an array of all unsupported targets
- */
-function getUnsupportedTargets(node, targets) {
-    return targets
-        .filter((target) => !isSupportedByMDN(node, target))
-        .map(formatTargetNames);
-}
-exports.getUnsupportedTargets = getUnsupportedTargets;
-function getMetadataName(metadata) {
-    switch (metadata.protoChain.length) {
-        case 1: {
-            return metadata.protoChain[0];
-        }
-        default:
-            return `${metadata.protoChain.join(".")}()`;
-    }
-}
-const MdnProvider = apis
-    // Create entries for each ast node type
-    .map((metadata) => metadata.astNodeTypes.map((astNodeType) => ({
-    ...metadata,
-    name: getMetadataName(metadata),
-    id: metadata.protoChainId,
-    protoChainId: metadata.protoChainId,
-    astNodeType,
-    object: metadata.protoChain[0],
-    // @TODO Handle cases where 'prototype' is in protoChain
-    property: metadata.protoChain[1],
-})))
-    // Flatten the array of arrays
-    .flat()
-    // Add rule and target support logic for each entry
-    .map((rule) => ({
-    ...rule,
-    getUnsupportedTargets,
-}));
-exports.default = MdnProvider;
\ No newline at end of file
diff --git a/lib/config/recommended.js b/lib/config/recommended.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/config/recommended.js
+++ b/lib/config/recommended.js
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-// Reconmmended configs for this plugin
-exports.default = {
-    plugins: ["compat"],
-    env: {
-        browser: true,
-    },
-    rules: {
-        "compat/compat": "error",
-    },
-};
\ No newline at end of file
diff --git a/lib/types.js b/lib/types.js
deleted file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/types.js
+++ b/lib/types.js
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
\ No newline at end of file
diff --git a/package.json b/package.json
index v4.2.0..v6.0.0 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
 {
   "name": "eslint-plugin-compat",
-  "version": "4.2.0",
+  "version": "6.0.0",
   "description": "Lint browser compatibility of API used",
   "keywords": [
@@ -26,5 +26,18 @@
     "John Tran <jptran318@gmail.com> (https://github.com/jooohhn)"
   ],
-  "main": "lib/index.js",
+  "main": "./lib/cjs/src/index.js",
+  "types": "./lib/cjs/src/index.d.ts",
+  "exports": {
+    ".": {
+      "import": {
+        "types": "./lib/esm//src/index.d.mts",
+        "default": "./lib/esm/src/index.js"
+      },
+      "require": {
+        "types": "./lib/cjs/src/index.d.ts",
+        "default": "./lib/cjs/src/index.js"
+      }
+    }
+  },
   "files": [
     "lib"
@@ -32,9 +45,11 @@
   "scripts": {
     "benchmarks": "ts-node-transpile-only test/benchmarks.ts",
-    "build": "rm -rf lib && tsc --project tsconfig.build.json",
-    "lint": "eslint --ignore-path .gitignore --ext .js,.ts .",
+    "build": "rm -rf lib && tsc --project tsconfig.build.json && tsc --project tsconfig.esm.json",
+    "lint": "eslint .",
+    "prettier": "prettier --check .",
+    "prettier:write": "prettier --write .",
     "spec": "jest --testPathIgnorePatterns test/e2e-repo.spec.ts /benchmarks-tmp",
-    "spec:e2e": "jest test/e2e-repo.spec.ts",
-    "test": "npm run lint && npm run build && npm run spec",
+    "spec:e2e": "jest --detectOpenHandles test/e2e-repo.spec.ts",
+    "test": "npm run build && npm run lint && npm run spec",
     "tsc": "tsc",
     "version": "npm run build"
@@ -45,25 +60,4 @@
     "trailingComma": "es5"
   },
-  "eslintConfig": {
-    "env": {
-      "jest": true,
-      "node": true
-    },
-    "parser": "@typescript-eslint/parser",
-    "parserOptions": {
-      "project": "./tsconfig.json"
-    },
-    "extends": [
-      "airbnb-typescript/base",
-      "plugin:eslint-plugin/recommended",
-      "plugin:import/typescript",
-      "plugin:prettier/recommended"
-    ],
-    "rules": {
-      "import/extensions": "off",
-      "import/no-extraneous-dependencies": "off"
-    },
-    "root": true
-  },
   "jest": {
     "preset": "ts-jest",
@@ -74,49 +68,49 @@
   },
   "dependencies": {
-    "@mdn/browser-compat-data": "^5.3.13",
+    "@mdn/browser-compat-data": "^5.5.35",
     "ast-metadata-inferer": "^0.8.0",
-    "browserslist": "^4.21.10",
-    "caniuse-lite": "^1.0.30001524",
+    "browserslist": "^4.23.1",
+    "caniuse-lite": "^1.0.30001639",
     "find-up": "^5.0.0",
+    "globals": "^15.7.0",
     "lodash.memoize": "^4.1.2",
-    "semver": "^7.5.4"
+    "semver": "^7.6.2"
   },
   "devDependencies": {
+    "@babel/core": "^7.24.7",
+    "@babel/eslint-parser": "^7.24.7",
+    "@eslint/compat": "^1.1.0",
+    "@eslint/js": "^9.6.0",
     "@semantic-release/changelog": "^6.0.3",
     "@semantic-release/git": "^10.0.1",
-    "@tsconfig/node16": "^16.1.1",
-    "@types/benchmark": "^2.1.2",
-    "@types/browserslist": "^4.15.0",
-    "@types/caniuse-lite": "^1.0.1",
-    "@types/eslint": "^8.44.2",
-    "@types/jest": "^29.5.4",
-    "@types/lodash.memoize": "^4.1.7",
-    "@types/semver": "7.5.0",
-    "@typescript-eslint/eslint-plugin": "^6.4.1",
-    "@typescript-eslint/parser": "^6.4.1",
-    "babel-eslint": "^10.1.0",
+    "@tsconfig/node16": "^16.1.3",
+    "@types/benchmark": "^2.1.5",
+    "@types/caniuse-lite": "^1.0.5",
+    "@types/eslint": "^8.56.10",
+    "@types/jest": "^29.5.12",
+    "@types/lodash.memoize": "^4.1.9",
+    "@types/semver": "7.5.8",
     "benchmark": "^2.1.4",
     "browserslist-config-erb": "^0.0.3",
-    "electron": "^26.x.x",
-    "eslint": "^8.48.0",
-    "eslint-config-airbnb-typescript": "^17.1.0",
-    "eslint-config-bliss-typescript": "^6.0.2",
-    "eslint-config-prettier": "^9.0.0",
-    "eslint-plugin-eslint-plugin": "^5.1.1",
-    "eslint-plugin-import": "^2.28.1",
-    "eslint-plugin-prettier": "^5.0.0",
-    "jest": "^29.6.4",
-    "prettier": "^3.0.2",
-    "semantic-release": "^21.1.1",
-    "simple-git": "^3.19.1",
-    "ts-jest": "^29.1.1",
-    "ts-node": "^10.9.1",
-    "typescript": "^5.2.2"
+    "electron": "^29.x.x",
+    "eslint": "^9.6.0",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-plugin-eslint-plugin": "^6.2.0",
+    "eslint-plugin-prettier": "^5.1.3",
+    "expect-type": "^0.19.0",
+    "jest": "^29.7.0",
+    "prettier": "^3.3.2",
+    "semantic-release": "^22.0.12",
+    "simple-git": "^3.25.0",
+    "ts-jest": "^29.1.5",
+    "ts-node": "^10.9.2",
+    "typescript": "^5.4.3",
+    "typescript-eslint": "^8.0.0-alpha.36"
   },
   "peerDependencies": {
-    "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+    "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
   },
   "engines": {
-    "node": ">=14.x"
+    "node": ">=18.x"
   },
   "collective": {
diff --git a/README.md b/README.md
index v4.2.0..v6.0.0 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,14 @@
 ### 2. Update ESLint Config
 
-#### `.eslintrc.json`
+#### New Config (`eslint.config.mjs`)
 
+```js
+import compat from "eslint-plugin-compat";
+
+export default [compat.configs["flat/recommended"]];
+```
+
+#### Legacy Config (`.eslintrc.json`)
+
 ```jsonc
 {
@@ -29,6 +37,6 @@
   "extends": ["plugin:compat/recommended"],
   "env": {
-    "browser": true
-  }
+    "browser": true,
+  },
   // ...
 }
@@ -44,5 +52,5 @@
 {
   // ...
-  "browserslist": ["defaults"]
+  "browserslist": ["defaults"],
 }
 ```
@@ -68,7 +76,7 @@
       "fetch",
       // Example of instance method, must add `.prototype.`
-      "Array.prototype.push"
-    ]
-  }
+      "Array.prototype.push",
+    ],
+  },
 }
 ```
@@ -82,6 +90,6 @@
   // ...
   "settings": {
-    "lintAllEsApis": true
-  }
+    "lintAllEsApis": true,
+  },
 }
 ```
@@ -114,7 +122,7 @@
   "settings": {
     "browserslistOpts": {
-      "env": "modern"
-    }
-  }
+      "env": "modern",
+    },
+  },
 }
 ```
diff --git a/lib/cjs/src/providers/caniuse-provider.js b/lib/cjs/src/providers/caniuse-provider.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/providers/caniuse-provider.js
+++ b/lib/cjs/src/providers/caniuse-provider.js
@@ -0,0 +1,258 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getUnsupportedTargets = getUnsupportedTargets;
+const lite = __importStar(require("caniuse-lite"));
+const constants_1 = require("../constants");
+/**
+ * Take a target's id and return it's full name by using `targetNameMappings`
+ * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
+ */
+function formatTargetNames(target) {
+    const name = constants_1.STANDARD_TARGET_NAME_MAPPING[target.target] || target.target;
+    return `${name} ${target.version}`;
+}
+/**
+ * Check if a browser version is in the range format
+ * ex. 10.0-10.2
+ */
+function versionIsRange(version) {
+    return version.includes("-");
+}
+/**
+ * Parse version from caniuse and compare with parsed version from browserslist.
+ */
+function areVersionsEqual(targetVersion, statsVersion) {
+    return targetVersion === parseFloat(statsVersion);
+}
+/*
+ * Check the CanIUse database to see if targets are supported
+ *
+ * If no record could be found, return true. Rules might not
+ * be found because they could belong to another provider
+ */
+function isSupportedByCanIUse(node, { version, target, parsedVersion }) {
+    if (!node.caniuseId)
+        return false;
+    const data = lite.feature(lite.features[node.caniuseId]);
+    if (!data)
+        return true;
+    const { stats } = data;
+    if (!(target in stats))
+        return true;
+    const targetStats = stats[target];
+    if (typeof version === "string" && versionIsRange(version)) {
+        return Object.keys(targetStats).some((statsVersion) => versionIsRange(statsVersion) &&
+            areVersionsEqual(parsedVersion, statsVersion)
+            ? !targetStats[statsVersion].includes("y")
+            : true);
+    }
+    // @TODO: This assumes that all versions are included in the cainuse db. If this is incorrect,
+    //        this will return false negatives. To properly do this, we have to to range comparisons.
+    //        Ex. given query for 50 and only version 40 exists in db records, return true
+    if (!(version in targetStats))
+        return true;
+    if (!targetStats[version])
+        return true;
+    return targetStats[version].includes("y");
+}
+/**
+ * Return an array of all unsupported targets
+ */
+function getUnsupportedTargets(node, targets) {
+    return targets
+        .filter((target) => !isSupportedByCanIUse(node, target))
+        .map(formatTargetNames);
+}
+const CanIUseProvider = [
+    // new ServiceWorker()
+    {
+        caniuseId: "serviceworkers",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "ServiceWorker",
+    },
+    {
+        caniuseId: "serviceworkers",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "navigator",
+        property: "serviceWorker",
+    },
+    // document.querySelector()
+    {
+        caniuseId: "queryselector",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "document",
+        property: "querySelector",
+    },
+    // IntersectionObserver
+    {
+        caniuseId: "intersectionobserver",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "IntersectionObserver",
+    },
+    // ResizeObserver
+    {
+        caniuseId: "resizeobserver",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "ResizeObserver",
+    },
+    // PaymentRequest
+    {
+        caniuseId: "payment-request",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "PaymentRequest",
+    },
+    // Promises
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Promise",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "resolve",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "all",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "race",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "reject",
+    },
+    // fetch
+    {
+        caniuseId: "fetch",
+        astNodeType: constants_1.AstNodeTypes.CallExpression,
+        object: "fetch",
+    },
+    // document.currentScript()
+    {
+        caniuseId: "document-currentscript",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "document",
+        property: "currentScript",
+    },
+    // URL
+    {
+        caniuseId: "url",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "URL",
+    },
+    // URLSearchParams
+    {
+        caniuseId: "urlsearchparams",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "URLSearchParams",
+    },
+    // performance.now()
+    {
+        caniuseId: "high-resolution-time",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "performance",
+        property: "now",
+    },
+    // requestIdleCallback()
+    {
+        caniuseId: "requestidlecallback",
+        astNodeType: constants_1.AstNodeTypes.CallExpression,
+        object: "requestIdleCallback",
+    },
+    // requestAnimationFrame()
+    {
+        caniuseId: "requestanimationframe",
+        astNodeType: constants_1.AstNodeTypes.CallExpression,
+        object: "requestAnimationFrame",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "TypedArray",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Int8Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint8Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint8ClampedArray",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Int16Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint16Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Int32Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint32Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Float32Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Float64Array",
+    },
+].map((rule) => ({
+    ...rule,
+    getUnsupportedTargets,
+    id: rule.property ? `${rule.object}.${rule.property}` : rule.object,
+    protoChainId: rule.property ? `${rule.object}.${rule.property}` : rule.object,
+    protoChain: rule.property ? [rule.object, rule.property] : [rule.object],
+}));
+exports.default = CanIUseProvider;
diff --git a/lib/esm/src/providers/caniuse-provider.js b/lib/esm/src/providers/caniuse-provider.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/providers/caniuse-provider.js
+++ b/lib/esm/src/providers/caniuse-provider.js
@@ -0,0 +1,258 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getUnsupportedTargets = getUnsupportedTargets;
+const lite = __importStar(require("caniuse-lite"));
+const constants_1 = require("../constants");
+/**
+ * Take a target's id and return it's full name by using `targetNameMappings`
+ * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
+ */
+function formatTargetNames(target) {
+    const name = constants_1.STANDARD_TARGET_NAME_MAPPING[target.target] || target.target;
+    return `${name} ${target.version}`;
+}
+/**
+ * Check if a browser version is in the range format
+ * ex. 10.0-10.2
+ */
+function versionIsRange(version) {
+    return version.includes("-");
+}
+/**
+ * Parse version from caniuse and compare with parsed version from browserslist.
+ */
+function areVersionsEqual(targetVersion, statsVersion) {
+    return targetVersion === parseFloat(statsVersion);
+}
+/*
+ * Check the CanIUse database to see if targets are supported
+ *
+ * If no record could be found, return true. Rules might not
+ * be found because they could belong to another provider
+ */
+function isSupportedByCanIUse(node, { version, target, parsedVersion }) {
+    if (!node.caniuseId)
+        return false;
+    const data = lite.feature(lite.features[node.caniuseId]);
+    if (!data)
+        return true;
+    const { stats } = data;
+    if (!(target in stats))
+        return true;
+    const targetStats = stats[target];
+    if (typeof version === "string" && versionIsRange(version)) {
+        return Object.keys(targetStats).some((statsVersion) => versionIsRange(statsVersion) &&
+            areVersionsEqual(parsedVersion, statsVersion)
+            ? !targetStats[statsVersion].includes("y")
+            : true);
+    }
+    // @TODO: This assumes that all versions are included in the cainuse db. If this is incorrect,
+    //        this will return false negatives. To properly do this, we have to to range comparisons.
+    //        Ex. given query for 50 and only version 40 exists in db records, return true
+    if (!(version in targetStats))
+        return true;
+    if (!targetStats[version])
+        return true;
+    return targetStats[version].includes("y");
+}
+/**
+ * Return an array of all unsupported targets
+ */
+function getUnsupportedTargets(node, targets) {
+    return targets
+        .filter((target) => !isSupportedByCanIUse(node, target))
+        .map(formatTargetNames);
+}
+const CanIUseProvider = [
+    // new ServiceWorker()
+    {
+        caniuseId: "serviceworkers",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "ServiceWorker",
+    },
+    {
+        caniuseId: "serviceworkers",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "navigator",
+        property: "serviceWorker",
+    },
+    // document.querySelector()
+    {
+        caniuseId: "queryselector",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "document",
+        property: "querySelector",
+    },
+    // IntersectionObserver
+    {
+        caniuseId: "intersectionobserver",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "IntersectionObserver",
+    },
+    // ResizeObserver
+    {
+        caniuseId: "resizeobserver",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "ResizeObserver",
+    },
+    // PaymentRequest
+    {
+        caniuseId: "payment-request",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "PaymentRequest",
+    },
+    // Promises
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Promise",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "resolve",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "all",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "race",
+    },
+    {
+        caniuseId: "promises",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "Promise",
+        property: "reject",
+    },
+    // fetch
+    {
+        caniuseId: "fetch",
+        astNodeType: constants_1.AstNodeTypes.CallExpression,
+        object: "fetch",
+    },
+    // document.currentScript()
+    {
+        caniuseId: "document-currentscript",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "document",
+        property: "currentScript",
+    },
+    // URL
+    {
+        caniuseId: "url",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "URL",
+    },
+    // URLSearchParams
+    {
+        caniuseId: "urlsearchparams",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "URLSearchParams",
+    },
+    // performance.now()
+    {
+        caniuseId: "high-resolution-time",
+        astNodeType: constants_1.AstNodeTypes.MemberExpression,
+        object: "performance",
+        property: "now",
+    },
+    // requestIdleCallback()
+    {
+        caniuseId: "requestidlecallback",
+        astNodeType: constants_1.AstNodeTypes.CallExpression,
+        object: "requestIdleCallback",
+    },
+    // requestAnimationFrame()
+    {
+        caniuseId: "requestanimationframe",
+        astNodeType: constants_1.AstNodeTypes.CallExpression,
+        object: "requestAnimationFrame",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "TypedArray",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Int8Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint8Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint8ClampedArray",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Int16Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint16Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Int32Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Uint32Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Float32Array",
+    },
+    {
+        caniuseId: "typedarrays",
+        astNodeType: constants_1.AstNodeTypes.NewExpression,
+        object: "Float64Array",
+    },
+].map((rule) => ({
+    ...rule,
+    getUnsupportedTargets,
+    id: rule.property ? `${rule.object}.${rule.property}` : rule.object,
+    protoChainId: rule.property ? `${rule.object}.${rule.property}` : rule.object,
+    protoChain: rule.property ? [rule.object, rule.property] : [rule.object],
+}));
+exports.default = CanIUseProvider;
diff --git a/lib/cjs/src/rules/compat.js b/lib/cjs/src/rules/compat.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/rules/compat.js
+++ b/lib/cjs/src/rules/compat.js
@@ -0,0 +1,186 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+/*
+ * Step 2) Logic that handles AST traversal
+ * Does not handle looking up the API
+ * Handles checking what kinds of eslint nodes should be linted
+ *   Tells eslint to lint certain nodes  (lintCallExpression, lintMemberExpression, lintNewExpression)
+ *   Gets protochain for the ESLint nodes the plugin is interested in
+ */
+const fs_1 = __importDefault(require("fs"));
+const find_up_1 = __importDefault(require("find-up"));
+const lodash_memoize_1 = __importDefault(require("lodash.memoize"));
+const helpers_1 = require("../helpers"); // will be deprecated and introduced to this file
+const providers_1 = require("../providers");
+function getName(node) {
+    switch (node.type) {
+        case "NewExpression": {
+            return node.callee.name;
+        }
+        case "MemberExpression": {
+            return node.object.name;
+        }
+        case "ExpressionStatement": {
+            return node.expression.name;
+        }
+        case "CallExpression": {
+            return node.callee.name;
+        }
+        default:
+            throw new Error("not found");
+    }
+}
+function generateErrorName(rule) {
+    if (rule.name)
+        return rule.name;
+    if (rule.property)
+        return `${rule.object}.${rule.property}()`;
+    return rule.object;
+}
+const getPolyfillSet = (0, lodash_memoize_1.default)((polyfillArrayJSON) => new Set(JSON.parse(polyfillArrayJSON)));
+function isPolyfilled(context, rule) {
+    if (!context.settings?.polyfills)
+        return false;
+    const polyfills = getPolyfillSet(JSON.stringify(context.settings.polyfills));
+    return (
+    // v2 allowed users to select polyfills based off their caniuseId. This is
+    polyfills.has(rule.id) || // no longer supported. Keeping this here to avoid breaking changes.
+        polyfills.has(rule.protoChainId) || // Check if polyfill is provided (ex. `Promise.all`)
+        polyfills.has(rule.protoChain[0]) // Check if entire API is polyfilled (ex. `Promise`)
+    );
+}
+const babelConfigs = [
+    "babel.config.json",
+    "babel.config.js",
+    "babel.config.cjs",
+    ".babelrc",
+    ".babelrc.json",
+    ".babelrc.js",
+    ".babelrc.cjs",
+];
+/**
+ * Determine if a user has a babel config, which we use to infer if the linted code is polyfilled.
+ */
+function isUsingTranspiler(context) {
+    const dir = context.filename ?? context.getFilename();
+    const configPath = find_up_1.default.sync(babelConfigs, {
+        cwd: dir,
+    });
+    if (configPath)
+        return true;
+    const pkgPath = find_up_1.default.sync("package.json", {
+        cwd: dir,
+    });
+    // Check if babel property exists
+    if (pkgPath) {
+        const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath).toString());
+        return !!pkg.babel;
+    }
+    return false;
+}
+/**
+ * A small optimization that only lints APIs that are not supported by targeted browsers.
+ * For example, if the user is targeting chrome 50, which supports the fetch API, it is
+ * wasteful to lint calls to fetch.
+ */
+const getRulesForTargets = (0, lodash_memoize_1.default)((targetsJSON, lintAllEsApis) => {
+    const result = {
+        CallExpression: [],
+        NewExpression: [],
+        MemberExpression: [],
+        ExpressionStatement: [],
+    };
+    const targets = JSON.parse(targetsJSON);
+    providers_1.nodes
+        .filter((node) => (lintAllEsApis ? true : node.kind !== "es"))
+        .forEach((node) => {
+        if (!node.getUnsupportedTargets(node, targets).length)
+            return;
+        result[node.astNodeType].push(node);
+    });
+    return result;
+});
+exports.default = {
+    meta: {
+        docs: {
+            description: "Ensure cross-browser API compatibility",
+            category: "Compatibility",
+            url: "https://github.com/amilajack/eslint-plugin-compat/blob/master/docs/rules/compat.md",
+            recommended: true,
+        },
+        type: "problem",
+        schema: [{ type: "string" }],
+    },
+    create(context) {
+        const sourceCode = context.sourceCode ?? context.getSourceCode();
+        // Determine lowest targets from browserslist config, which reads user's
+        // package.json config section. Use config from eslintrc for testing purposes
+        const browserslistConfig = context.settings?.browsers ||
+            context.settings?.targets ||
+            context.options[0];
+        if (!context.settings?.browserslistOpts &&
+            // @ts-expect-error Checking for accidental misspellings
+            context.settings.browsersListOpts) {
+            // eslint-disable-next-line -- CLI
+            console.error('Please ensure you spell `browserslistOpts` with a lowercase "l"!');
+        }
+        const browserslistOpts = context.settings?.browserslistOpts;
+        const lintAllEsApis = context.settings?.lintAllEsApis === true ||
+            // Attempt to infer polyfilling of ES APIs from babel config
+            (!context.settings?.polyfills?.includes("es:all") &&
+                !isUsingTranspiler(context));
+        const browserslistTargets = (0, helpers_1.parseBrowsersListVersion)((0, helpers_1.determineTargetsFromConfig)(context.getFilename(), browserslistConfig, browserslistOpts));
+        // Stringify to support memoization; browserslistConfig is always an array of new objects.
+        const targetedRules = getRulesForTargets(JSON.stringify(browserslistTargets), lintAllEsApis);
+        const errors = [];
+        const handleFailingRule = (node, eslintNode) => {
+            if (isPolyfilled(context, node))
+                return;
+            errors.push({
+                node: eslintNode,
+                message: [
+                    generateErrorName(node),
+                    "is not supported in",
+                    node.getUnsupportedTargets(node, browserslistTargets).join(", "),
+                ].join(" "),
+            });
+        };
+        const identifiers = new Set();
+        return {
+            CallExpression: helpers_1.lintCallExpression.bind(null, context, handleFailingRule, targetedRules.CallExpression, sourceCode),
+            NewExpression: helpers_1.lintNewExpression.bind(null, context, handleFailingRule, targetedRules.NewExpression, sourceCode),
+            ExpressionStatement: helpers_1.lintExpressionStatement.bind(null, context, handleFailingRule, [...targetedRules.MemberExpression, ...targetedRules.CallExpression], sourceCode),
+            MemberExpression: helpers_1.lintMemberExpression.bind(null, context, handleFailingRule, [
+                ...targetedRules.MemberExpression,
+                ...targetedRules.CallExpression,
+                ...targetedRules.NewExpression,
+            ], sourceCode),
+            // Keep track of all the defined variables. Do not report errors for nodes that are not defined
+            Identifier(node) {
+                if (node.parent) {
+                    const { type } = node.parent;
+                    if (type === "Property" || // ex. const { Set } = require('immutable');
+                        type === "FunctionDeclaration" || // ex. function Set() {}
+                        type === "VariableDeclarator" || // ex. const Set = () => {}
+                        type === "ClassDeclaration" || // ex. class Set {}
+                        type === "ImportDefaultSpecifier" || // ex. import Set from 'set';
+                        type === "ImportSpecifier" || // ex. import {Set} from 'set';
+                        type === "ImportDeclaration" // ex. import {Set} from 'set';
+                    ) {
+                        identifiers.add(node.name);
+                    }
+                }
+            },
+            "Program:exit": () => {
+                // Get a map of all the variables defined in the root scope (not the global scope)
+                // const variablesMap = context.getScope().childScopes.map(e => e.set)[0];
+                errors
+                    .filter((error) => !identifiers.has(getName(error.node)))
+                    .forEach((node) => context.report(node));
+            },
+        };
+    },
+};
diff --git a/lib/esm/src/rules/compat.js b/lib/esm/src/rules/compat.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/rules/compat.js
+++ b/lib/esm/src/rules/compat.js
@@ -0,0 +1,186 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+/*
+ * Step 2) Logic that handles AST traversal
+ * Does not handle looking up the API
+ * Handles checking what kinds of eslint nodes should be linted
+ *   Tells eslint to lint certain nodes  (lintCallExpression, lintMemberExpression, lintNewExpression)
+ *   Gets protochain for the ESLint nodes the plugin is interested in
+ */
+const fs_1 = __importDefault(require("fs"));
+const find_up_1 = __importDefault(require("find-up"));
+const lodash_memoize_1 = __importDefault(require("lodash.memoize"));
+const helpers_1 = require("../helpers"); // will be deprecated and introduced to this file
+const providers_1 = require("../providers");
+function getName(node) {
+    switch (node.type) {
+        case "NewExpression": {
+            return node.callee.name;
+        }
+        case "MemberExpression": {
+            return node.object.name;
+        }
+        case "ExpressionStatement": {
+            return node.expression.name;
+        }
+        case "CallExpression": {
+            return node.callee.name;
+        }
+        default:
+            throw new Error("not found");
+    }
+}
+function generateErrorName(rule) {
+    if (rule.name)
+        return rule.name;
+    if (rule.property)
+        return `${rule.object}.${rule.property}()`;
+    return rule.object;
+}
+const getPolyfillSet = (0, lodash_memoize_1.default)((polyfillArrayJSON) => new Set(JSON.parse(polyfillArrayJSON)));
+function isPolyfilled(context, rule) {
+    if (!context.settings?.polyfills)
+        return false;
+    const polyfills = getPolyfillSet(JSON.stringify(context.settings.polyfills));
+    return (
+    // v2 allowed users to select polyfills based off their caniuseId. This is
+    polyfills.has(rule.id) || // no longer supported. Keeping this here to avoid breaking changes.
+        polyfills.has(rule.protoChainId) || // Check if polyfill is provided (ex. `Promise.all`)
+        polyfills.has(rule.protoChain[0]) // Check if entire API is polyfilled (ex. `Promise`)
+    );
+}
+const babelConfigs = [
+    "babel.config.json",
+    "babel.config.js",
+    "babel.config.cjs",
+    ".babelrc",
+    ".babelrc.json",
+    ".babelrc.js",
+    ".babelrc.cjs",
+];
+/**
+ * Determine if a user has a babel config, which we use to infer if the linted code is polyfilled.
+ */
+function isUsingTranspiler(context) {
+    const dir = context.filename ?? context.getFilename();
+    const configPath = find_up_1.default.sync(babelConfigs, {
+        cwd: dir,
+    });
+    if (configPath)
+        return true;
+    const pkgPath = find_up_1.default.sync("package.json", {
+        cwd: dir,
+    });
+    // Check if babel property exists
+    if (pkgPath) {
+        const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath).toString());
+        return !!pkg.babel;
+    }
+    return false;
+}
+/**
+ * A small optimization that only lints APIs that are not supported by targeted browsers.
+ * For example, if the user is targeting chrome 50, which supports the fetch API, it is
+ * wasteful to lint calls to fetch.
+ */
+const getRulesForTargets = (0, lodash_memoize_1.default)((targetsJSON, lintAllEsApis) => {
+    const result = {
+        CallExpression: [],
+        NewExpression: [],
+        MemberExpression: [],
+        ExpressionStatement: [],
+    };
+    const targets = JSON.parse(targetsJSON);
+    providers_1.nodes
+        .filter((node) => (lintAllEsApis ? true : node.kind !== "es"))
+        .forEach((node) => {
+        if (!node.getUnsupportedTargets(node, targets).length)
+            return;
+        result[node.astNodeType].push(node);
+    });
+    return result;
+});
+exports.default = {
+    meta: {
+        docs: {
+            description: "Ensure cross-browser API compatibility",
+            category: "Compatibility",
+            url: "https://github.com/amilajack/eslint-plugin-compat/blob/master/docs/rules/compat.md",
+            recommended: true,
+        },
+        type: "problem",
+        schema: [{ type: "string" }],
+    },
+    create(context) {
+        const sourceCode = context.sourceCode ?? context.getSourceCode();
+        // Determine lowest targets from browserslist config, which reads user's
+        // package.json config section. Use config from eslintrc for testing purposes
+        const browserslistConfig = context.settings?.browsers ||
+            context.settings?.targets ||
+            context.options[0];
+        if (!context.settings?.browserslistOpts &&
+            // @ts-expect-error Checking for accidental misspellings
+            context.settings.browsersListOpts) {
+            // eslint-disable-next-line -- CLI
+            console.error('Please ensure you spell `browserslistOpts` with a lowercase "l"!');
+        }
+        const browserslistOpts = context.settings?.browserslistOpts;
+        const lintAllEsApis = context.settings?.lintAllEsApis === true ||
+            // Attempt to infer polyfilling of ES APIs from babel config
+            (!context.settings?.polyfills?.includes("es:all") &&
+                !isUsingTranspiler(context));
+        const browserslistTargets = (0, helpers_1.parseBrowsersListVersion)((0, helpers_1.determineTargetsFromConfig)(context.getFilename(), browserslistConfig, browserslistOpts));
+        // Stringify to support memoization; browserslistConfig is always an array of new objects.
+        const targetedRules = getRulesForTargets(JSON.stringify(browserslistTargets), lintAllEsApis);
+        const errors = [];
+        const handleFailingRule = (node, eslintNode) => {
+            if (isPolyfilled(context, node))
+                return;
+            errors.push({
+                node: eslintNode,
+                message: [
+                    generateErrorName(node),
+                    "is not supported in",
+                    node.getUnsupportedTargets(node, browserslistTargets).join(", "),
+                ].join(" "),
+            });
+        };
+        const identifiers = new Set();
+        return {
+            CallExpression: helpers_1.lintCallExpression.bind(null, context, handleFailingRule, targetedRules.CallExpression, sourceCode),
+            NewExpression: helpers_1.lintNewExpression.bind(null, context, handleFailingRule, targetedRules.NewExpression, sourceCode),
+            ExpressionStatement: helpers_1.lintExpressionStatement.bind(null, context, handleFailingRule, [...targetedRules.MemberExpression, ...targetedRules.CallExpression], sourceCode),
+            MemberExpression: helpers_1.lintMemberExpression.bind(null, context, handleFailingRule, [
+                ...targetedRules.MemberExpression,
+                ...targetedRules.CallExpression,
+                ...targetedRules.NewExpression,
+            ], sourceCode),
+            // Keep track of all the defined variables. Do not report errors for nodes that are not defined
+            Identifier(node) {
+                if (node.parent) {
+                    const { type } = node.parent;
+                    if (type === "Property" || // ex. const { Set } = require('immutable');
+                        type === "FunctionDeclaration" || // ex. function Set() {}
+                        type === "VariableDeclarator" || // ex. const Set = () => {}
+                        type === "ClassDeclaration" || // ex. class Set {}
+                        type === "ImportDefaultSpecifier" || // ex. import Set from 'set';
+                        type === "ImportSpecifier" || // ex. import {Set} from 'set';
+                        type === "ImportDeclaration" // ex. import {Set} from 'set';
+                    ) {
+                        identifiers.add(node.name);
+                    }
+                }
+            },
+            "Program:exit": () => {
+                // Get a map of all the variables defined in the root scope (not the global scope)
+                // const variablesMap = context.getScope().childScopes.map(e => e.set)[0];
+                errors
+                    .filter((error) => !identifiers.has(getName(error.node)))
+                    .forEach((node) => context.report(node));
+            },
+        };
+    },
+};
diff --git a/lib/cjs/src/constants.js b/lib/cjs/src/constants.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/constants.js
+++ b/lib/cjs/src/constants.js
@@ -0,0 +1,35 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AstNodeTypes = exports.STANDARD_TARGET_NAME_MAPPING = void 0;
+// Maps an ID to the full name user will see
+// E.g. during error, user will see full name instead of ID
+exports.STANDARD_TARGET_NAME_MAPPING = {
+    chrome: "Chrome",
+    firefox: "Firefox",
+    safari: "Safari",
+    ios_saf: "iOS Safari",
+    ie: "IE",
+    ie_mob: "IE Mobile",
+    edge: "Edge",
+    baidu: "Baidu",
+    electron: "Electron",
+    blackberry_browser: "Blackberry Browser",
+    edge_mobile: "Edge Mobile",
+    and_uc: "Android UC Browser",
+    and_chrome: "Android Chrome",
+    and_firefox: "Android Firefox",
+    and_webview: "Android Webview",
+    and_samsung: "Samsung Browser",
+    and_opera: "Opera Android",
+    opera: "Opera",
+    opera_mini: "Opera Mini",
+    opera_mobile: "Opera Mobile",
+    node: "Node.js",
+    kaios: "KaiOS",
+};
+var AstNodeTypes;
+(function (AstNodeTypes) {
+    AstNodeTypes["MemberExpression"] = "MemberExpression";
+    AstNodeTypes["CallExpression"] = "CallExpression";
+    AstNodeTypes["NewExpression"] = "NewExpression";
+})(AstNodeTypes || (exports.AstNodeTypes = AstNodeTypes = {}));
diff --git a/lib/esm/src/constants.js b/lib/esm/src/constants.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/constants.js
+++ b/lib/esm/src/constants.js
@@ -0,0 +1,35 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.AstNodeTypes = exports.STANDARD_TARGET_NAME_MAPPING = void 0;
+// Maps an ID to the full name user will see
+// E.g. during error, user will see full name instead of ID
+exports.STANDARD_TARGET_NAME_MAPPING = {
+    chrome: "Chrome",
+    firefox: "Firefox",
+    safari: "Safari",
+    ios_saf: "iOS Safari",
+    ie: "IE",
+    ie_mob: "IE Mobile",
+    edge: "Edge",
+    baidu: "Baidu",
+    electron: "Electron",
+    blackberry_browser: "Blackberry Browser",
+    edge_mobile: "Edge Mobile",
+    and_uc: "Android UC Browser",
+    and_chrome: "Android Chrome",
+    and_firefox: "Android Firefox",
+    and_webview: "Android Webview",
+    and_samsung: "Samsung Browser",
+    and_opera: "Opera Android",
+    opera: "Opera",
+    opera_mini: "Opera Mini",
+    opera_mobile: "Opera Mobile",
+    node: "Node.js",
+    kaios: "KaiOS",
+};
+var AstNodeTypes;
+(function (AstNodeTypes) {
+    AstNodeTypes["MemberExpression"] = "MemberExpression";
+    AstNodeTypes["CallExpression"] = "CallExpression";
+    AstNodeTypes["NewExpression"] = "NewExpression";
+})(AstNodeTypes || (exports.AstNodeTypes = AstNodeTypes = {}));
diff --git a/lib/cjs/src/helpers.js b/lib/cjs/src/helpers.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/helpers.js
+++ b/lib/cjs/src/helpers.js
@@ -0,0 +1,198 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.lintCallExpression = lintCallExpression;
+exports.lintNewExpression = lintNewExpression;
+exports.lintExpressionStatement = lintExpressionStatement;
+exports.lintMemberExpression = lintMemberExpression;
+exports.reverseTargetMappings = reverseTargetMappings;
+exports.determineTargetsFromConfig = determineTargetsFromConfig;
+exports.parseBrowsersListVersion = parseBrowsersListVersion;
+/* eslint no-nested-ternary: off */
+const browserslist_1 = __importDefault(require("browserslist"));
+/*
+3) Figures out which browsers user is targeting
+
+- Uses browserslist config and/or targets defined eslint config to discover this
+- For every API ecnountered during traversal, gets compat record for that
+- Protochain (e.g. 'document.querySelector')
+  - All of the rules have compatibility info attached to them
+- Each API is given to versioning.ts with compatibility info
+*/
+function isInsideIfStatement(node, sourceCode, context) {
+    const ancestors = "getAncestors" in sourceCode
+        ? // @ts-expect-error Fits
+            sourceCode?.getAncestors?.(node)
+        : context.getAncestors();
+    return ancestors?.some((ancestor) => {
+        return ancestor.type === "IfStatement";
+    });
+}
+function checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node) {
+    if (!isInsideIfStatement(node, sourceCode, context)) {
+        handleFailingRule(failingRule, node);
+    }
+}
+function lintCallExpression(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node.callee)
+        return;
+    const calleeName = node.callee.name;
+    const failingRule = rules.find((rule) => rule.object === calleeName);
+    if (failingRule)
+        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+}
+function lintNewExpression(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node.callee)
+        return;
+    const calleeName = node.callee.name;
+    const failingRule = rules.find((rule) => rule.object === calleeName);
+    if (failingRule)
+        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+}
+function lintExpressionStatement(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node?.expression?.name)
+        return;
+    const failingRule = rules.find((rule) => rule.object === node?.expression?.name);
+    if (failingRule)
+        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+}
+function isStringLiteral(node) {
+    return node.type === "Literal" && typeof node.value === "string";
+}
+function protoChainFromMemberExpression(node) {
+    if (!node.object)
+        return [node.name];
+    const protoChain = (() => {
+        if (node.object.type === "NewExpression" ||
+            node.object.type === "CallExpression") {
+            return protoChainFromMemberExpression(node.object.callee);
+        }
+        else if (node.object.type === "ArrayExpression") {
+            return ["Array"];
+        }
+        else if (isStringLiteral(node.object)) {
+            return ["String"];
+        }
+        else {
+            return protoChainFromMemberExpression(node.object);
+        }
+    })();
+    return [...protoChain, node.property.name];
+}
+function lintMemberExpression(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node.object || !node.property)
+        return;
+    if (!node.object.name ||
+        node.object.name === "window" ||
+        node.object.name === "globalThis") {
+        const rawProtoChain = protoChainFromMemberExpression(node);
+        const [firstObj] = rawProtoChain;
+        const protoChain = firstObj === "window" || firstObj === "globalThis"
+            ? rawProtoChain.slice(1)
+            : rawProtoChain;
+        const protoChainId = protoChain.join(".");
+        const failingRule = rules.find((rule) => rule.protoChainId === protoChainId);
+        if (failingRule) {
+            checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+        }
+    }
+    else {
+        const objectName = node.object.name;
+        const propertyName = node.property.name;
+        const failingRule = rules.find((rule) => rule.object === objectName &&
+            (rule.property == null || rule.property === propertyName));
+        if (failingRule)
+            checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+    }
+}
+function reverseTargetMappings(targetMappings) {
+    const reversedEntries = Object.entries(targetMappings).map((entry) => entry.reverse());
+    return Object.fromEntries(reversedEntries);
+}
+/**
+ * Determine the targets based on the browserslist config object
+ * Get the targets from the eslint config and merge them with targets in browserslist config
+ * Eslint target config will be deprecated in 4.0.0
+ *
+ * @param configPath - The file or a directory path to look for the browserslist config file
+ */
+function determineTargetsFromConfig(configPath, config, browserslistOptsFromConfig) {
+    const browserslistOpts = { path: configPath, ...browserslistOptsFromConfig };
+    const eslintTargets = (() => {
+        // Get targets from eslint settings
+        if (Array.isArray(config) || typeof config === "string") {
+            return (0, browserslist_1.default)(config, browserslistOpts);
+        }
+        if (config && typeof config === "object") {
+            return (0, browserslist_1.default)([...(config.production || []), ...(config.development || [])], browserslistOpts);
+        }
+        return [];
+    })();
+    if (browserslist_1.default.findConfig(configPath)) {
+        // If targets are defined in ESLint and browerslist configs, merge the targets together
+        if (eslintTargets.length) {
+            const browserslistTargets = (0, browserslist_1.default)(undefined, browserslistOpts);
+            return Array.from(new Set(eslintTargets.concat(browserslistTargets)));
+        }
+    }
+    else if (eslintTargets.length) {
+        return eslintTargets;
+    }
+    // Get targets fron browserslist configs
+    return (0, browserslist_1.default)(undefined, browserslistOpts);
+}
+/**
+ * Parses the versions that are given by browserslist. They're
+ *
+ * ```ts
+ * parseBrowsersListVersion(['chrome 50'])
+ *
+ * {
+ *   target: 'chrome',
+ *   parsedVersion: 50,
+ *   version: '50'
+ * }
+ * ```
+ * @param targetslist - List of targest from browserslist api
+ * @returns - The lowest version version of each target
+ */
+function parseBrowsersListVersion(targetslist) {
+    return (
+    // Sort the targets by target name and then version number in ascending order
+    targetslist
+        .map((e) => {
+        const [target, version] = e.split(" ");
+        const parsedVersion = (() => {
+            if (typeof version === "number")
+                return version;
+            if (version === "all")
+                return 0;
+            return version.includes("-")
+                ? parseFloat(version.split("-")[0])
+                : parseFloat(version);
+        })();
+        return {
+            target,
+            version,
+            parsedVersion,
+        };
+    }) // Sort the targets by target name and then version number in descending order
+        // ex. [a@3, b@3, a@1] => [a@3, a@1, b@3]
+        .sort((a, b) => {
+        if (b.target === a.target) {
+            // If any version === 'all', return 0. The only version of op_mini is 'all'
+            // Otherwise, compare the versions
+            return typeof b.parsedVersion === "string" ||
+                typeof a.parsedVersion === "string"
+                ? 0
+                : b.parsedVersion - a.parsedVersion;
+        }
+        return b.target > a.target ? 1 : -1;
+    }) // First last target always has the latest version
+        .filter((e, i, items) => 
+    // Check if the current target is the last of its kind.
+    // If it is, then it's the most recent version.
+    i + 1 === items.length || e.target !== items[i + 1].target));
+}
diff --git a/lib/esm/src/helpers.js b/lib/esm/src/helpers.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/helpers.js
+++ b/lib/esm/src/helpers.js
@@ -0,0 +1,198 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.lintCallExpression = lintCallExpression;
+exports.lintNewExpression = lintNewExpression;
+exports.lintExpressionStatement = lintExpressionStatement;
+exports.lintMemberExpression = lintMemberExpression;
+exports.reverseTargetMappings = reverseTargetMappings;
+exports.determineTargetsFromConfig = determineTargetsFromConfig;
+exports.parseBrowsersListVersion = parseBrowsersListVersion;
+/* eslint no-nested-ternary: off */
+const browserslist_1 = __importDefault(require("browserslist"));
+/*
+3) Figures out which browsers user is targeting
+
+- Uses browserslist config and/or targets defined eslint config to discover this
+- For every API ecnountered during traversal, gets compat record for that
+- Protochain (e.g. 'document.querySelector')
+  - All of the rules have compatibility info attached to them
+- Each API is given to versioning.ts with compatibility info
+*/
+function isInsideIfStatement(node, sourceCode, context) {
+    const ancestors = "getAncestors" in sourceCode
+        ? // @ts-expect-error Fits
+            sourceCode?.getAncestors?.(node)
+        : context.getAncestors();
+    return ancestors?.some((ancestor) => {
+        return ancestor.type === "IfStatement";
+    });
+}
+function checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node) {
+    if (!isInsideIfStatement(node, sourceCode, context)) {
+        handleFailingRule(failingRule, node);
+    }
+}
+function lintCallExpression(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node.callee)
+        return;
+    const calleeName = node.callee.name;
+    const failingRule = rules.find((rule) => rule.object === calleeName);
+    if (failingRule)
+        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+}
+function lintNewExpression(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node.callee)
+        return;
+    const calleeName = node.callee.name;
+    const failingRule = rules.find((rule) => rule.object === calleeName);
+    if (failingRule)
+        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+}
+function lintExpressionStatement(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node?.expression?.name)
+        return;
+    const failingRule = rules.find((rule) => rule.object === node?.expression?.name);
+    if (failingRule)
+        checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+}
+function isStringLiteral(node) {
+    return node.type === "Literal" && typeof node.value === "string";
+}
+function protoChainFromMemberExpression(node) {
+    if (!node.object)
+        return [node.name];
+    const protoChain = (() => {
+        if (node.object.type === "NewExpression" ||
+            node.object.type === "CallExpression") {
+            return protoChainFromMemberExpression(node.object.callee);
+        }
+        else if (node.object.type === "ArrayExpression") {
+            return ["Array"];
+        }
+        else if (isStringLiteral(node.object)) {
+            return ["String"];
+        }
+        else {
+            return protoChainFromMemberExpression(node.object);
+        }
+    })();
+    return [...protoChain, node.property.name];
+}
+function lintMemberExpression(context, handleFailingRule, rules, sourceCode, node) {
+    if (!node.object || !node.property)
+        return;
+    if (!node.object.name ||
+        node.object.name === "window" ||
+        node.object.name === "globalThis") {
+        const rawProtoChain = protoChainFromMemberExpression(node);
+        const [firstObj] = rawProtoChain;
+        const protoChain = firstObj === "window" || firstObj === "globalThis"
+            ? rawProtoChain.slice(1)
+            : rawProtoChain;
+        const protoChainId = protoChain.join(".");
+        const failingRule = rules.find((rule) => rule.protoChainId === protoChainId);
+        if (failingRule) {
+            checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+        }
+    }
+    else {
+        const objectName = node.object.name;
+        const propertyName = node.property.name;
+        const failingRule = rules.find((rule) => rule.object === objectName &&
+            (rule.property == null || rule.property === propertyName));
+        if (failingRule)
+            checkNotInsideIfStatementAndReport(context, handleFailingRule, failingRule, sourceCode, node);
+    }
+}
+function reverseTargetMappings(targetMappings) {
+    const reversedEntries = Object.entries(targetMappings).map((entry) => entry.reverse());
+    return Object.fromEntries(reversedEntries);
+}
+/**
+ * Determine the targets based on the browserslist config object
+ * Get the targets from the eslint config and merge them with targets in browserslist config
+ * Eslint target config will be deprecated in 4.0.0
+ *
+ * @param configPath - The file or a directory path to look for the browserslist config file
+ */
+function determineTargetsFromConfig(configPath, config, browserslistOptsFromConfig) {
+    const browserslistOpts = { path: configPath, ...browserslistOptsFromConfig };
+    const eslintTargets = (() => {
+        // Get targets from eslint settings
+        if (Array.isArray(config) || typeof config === "string") {
+            return (0, browserslist_1.default)(config, browserslistOpts);
+        }
+        if (config && typeof config === "object") {
+            return (0, browserslist_1.default)([...(config.production || []), ...(config.development || [])], browserslistOpts);
+        }
+        return [];
+    })();
+    if (browserslist_1.default.findConfig(configPath)) {
+        // If targets are defined in ESLint and browerslist configs, merge the targets together
+        if (eslintTargets.length) {
+            const browserslistTargets = (0, browserslist_1.default)(undefined, browserslistOpts);
+            return Array.from(new Set(eslintTargets.concat(browserslistTargets)));
+        }
+    }
+    else if (eslintTargets.length) {
+        return eslintTargets;
+    }
+    // Get targets fron browserslist configs
+    return (0, browserslist_1.default)(undefined, browserslistOpts);
+}
+/**
+ * Parses the versions that are given by browserslist. They're
+ *
+ * ```ts
+ * parseBrowsersListVersion(['chrome 50'])
+ *
+ * {
+ *   target: 'chrome',
+ *   parsedVersion: 50,
+ *   version: '50'
+ * }
+ * ```
+ * @param targetslist - List of targest from browserslist api
+ * @returns - The lowest version version of each target
+ */
+function parseBrowsersListVersion(targetslist) {
+    return (
+    // Sort the targets by target name and then version number in ascending order
+    targetslist
+        .map((e) => {
+        const [target, version] = e.split(" ");
+        const parsedVersion = (() => {
+            if (typeof version === "number")
+                return version;
+            if (version === "all")
+                return 0;
+            return version.includes("-")
+                ? parseFloat(version.split("-")[0])
+                : parseFloat(version);
+        })();
+        return {
+            target,
+            version,
+            parsedVersion,
+        };
+    }) // Sort the targets by target name and then version number in descending order
+        // ex. [a@3, b@3, a@1] => [a@3, a@1, b@3]
+        .sort((a, b) => {
+        if (b.target === a.target) {
+            // If any version === 'all', return 0. The only version of op_mini is 'all'
+            // Otherwise, compare the versions
+            return typeof b.parsedVersion === "string" ||
+                typeof a.parsedVersion === "string"
+                ? 0
+                : b.parsedVersion - a.parsedVersion;
+        }
+        return b.target > a.target ? 1 : -1;
+    }) // First last target always has the latest version
+        .filter((e, i, items) => 
+    // Check if the current target is the last of its kind.
+    // If it is, then it's the most recent version.
+    i + 1 === items.length || e.target !== items[i + 1].target));
+}
diff --git a/lib/cjs/src/index.js b/lib/cjs/src/index.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/index.js
+++ b/lib/cjs/src/index.js
@@ -0,0 +1,48 @@
+"use strict";
+/**
+ * Step 1) Entry point of plugin. Exports itself for eslint to use
+ * @author Amila Welihinda
+ */
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+//------------------------------------------------------------------------------
+// Requirements
+//------------------------------------------------------------------------------
+const recommended_1 = __importDefault(require("./config/recommended"));
+const package_json_1 = __importDefault(require("../package.json"));
+//------------------------------------------------------------------------------
+// Plugin Definition
+//------------------------------------------------------------------------------
+// import all rules in lib/rules
+const compat_1 = __importDefault(require("./rules/compat"));
+const rules = {
+    compat: compat_1.default,
+};
+const plugin = {
+    meta: {
+        name: package_json_1.default.name,
+        version: package_json_1.default.version,
+    },
+    configs: {},
+    rules,
+};
+const configs = {
+    "flat/recommended": {
+        plugins: { compat: plugin },
+        ...recommended_1.default.flat,
+    },
+    recommended: {
+        plugins: ["compat"],
+        ...recommended_1.default.legacy,
+    },
+};
+plugin.configs = configs;
+module.exports = {
+    ...plugin,
+    // TODO: Remove this in next major release
+    /**
+     * @deprecated Use `.configs` instead. This will be removed in the next major release.
+     */
+    config: configs,
+};
diff --git a/lib/cjs/src/providers/index.js b/lib/cjs/src/providers/index.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/providers/index.js
+++ b/lib/cjs/src/providers/index.js
@@ -0,0 +1,15 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.nodes = void 0;
+/*
+ * Step 3) Compat use CanIUse and MDN providers to check if a target browser supports a particular API
+ */
+const caniuse_provider_1 = __importDefault(require("./caniuse-provider"));
+const mdn_provider_1 = __importDefault(require("./mdn-provider"));
+exports.nodes = [
+    ...caniuse_provider_1.default,
+    ...mdn_provider_1.default,
+];
diff --git a/lib/esm/src/index.js b/lib/esm/src/index.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/index.js
+++ b/lib/esm/src/index.js
@@ -0,0 +1,48 @@
+"use strict";
+/**
+ * Step 1) Entry point of plugin. Exports itself for eslint to use
+ * @author Amila Welihinda
+ */
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+//------------------------------------------------------------------------------
+// Requirements
+//------------------------------------------------------------------------------
+const recommended_1 = __importDefault(require("./config/recommended"));
+const package_json_1 = __importDefault(require("../package.json"));
+//------------------------------------------------------------------------------
+// Plugin Definition
+//------------------------------------------------------------------------------
+// import all rules in lib/rules
+const compat_1 = __importDefault(require("./rules/compat"));
+const rules = {
+    compat: compat_1.default,
+};
+const plugin = {
+    meta: {
+        name: package_json_1.default.name,
+        version: package_json_1.default.version,
+    },
+    configs: {},
+    rules,
+};
+const configs = {
+    "flat/recommended": {
+        plugins: { compat: plugin },
+        ...recommended_1.default.flat,
+    },
+    recommended: {
+        plugins: ["compat"],
+        ...recommended_1.default.legacy,
+    },
+};
+plugin.configs = configs;
+module.exports = {
+    ...plugin,
+    // TODO: Remove this in next major release
+    /**
+     * @deprecated Use `.configs` instead. This will be removed in the next major release.
+     */
+    config: configs,
+};
diff --git a/lib/esm/src/providers/index.js b/lib/esm/src/providers/index.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/providers/index.js
+++ b/lib/esm/src/providers/index.js
@@ -0,0 +1,15 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.nodes = void 0;
+/*
+ * Step 3) Compat use CanIUse and MDN providers to check if a target browser supports a particular API
+ */
+const caniuse_provider_1 = __importDefault(require("./caniuse-provider"));
+const mdn_provider_1 = __importDefault(require("./mdn-provider"));
+exports.nodes = [
+    ...caniuse_provider_1.default,
+    ...mdn_provider_1.default,
+];
diff --git a/lib/cjs/src/providers/mdn-provider.js b/lib/cjs/src/providers/mdn-provider.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/providers/mdn-provider.js
+++ b/lib/cjs/src/providers/mdn-provider.js
@@ -0,0 +1,138 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isSupportedByMDN = isSupportedByMDN;
+exports.getUnsupportedTargets = getUnsupportedTargets;
+const ast_metadata_inferer_1 = __importDefault(require("ast-metadata-inferer"));
+const semver_1 = __importDefault(require("semver"));
+const helpers_1 = require("../helpers");
+const constants_1 = require("../constants");
+const apis = ast_metadata_inferer_1.default;
+// @TODO Import this type from ast-metadata-inferer after migrating this project to TypeScript
+const mdnRecords = new Map(apis.map((e) => [e.protoChainId, e]));
+/**
+ * Map ids of mdn targets to their "common/friendly" name
+ */
+const targetIdMappings = {
+    chrome: "chrome",
+    firefox: "firefox",
+    opera: "opera",
+    safari: "safari",
+    safari_ios: "ios_saf",
+    ie: "ie",
+    edge_mobile: "ie_mob",
+    edge: "edge",
+    opera_android: "and_opera",
+    chrome_android: "and_chrome",
+    firefox_android: "and_firefox",
+    webview_android: "and_webview",
+    samsunginternet_android: "and_samsung",
+    nodejs: "node",
+};
+const reversedTargetMappings = (0, helpers_1.reverseTargetMappings)(targetIdMappings);
+/**
+ * Take a target's id and return it's full name by using `targetNameMappings`
+ * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
+ */
+function formatTargetNames(target) {
+    return `${constants_1.STANDARD_TARGET_NAME_MAPPING[target.target]} ${target.version}`;
+}
+/**
+ * Convert '9' => '9.0.0'
+ */
+function customCoerce(version) {
+    return version.length === 1 ? [version, 0, 0].join(".") : version;
+}
+/*
+ * Return if MDN supports the API or not
+ */
+function isSupportedByMDN(node, { version, target: mdnTarget }) {
+    // @ts-expect-error Expected
+    const target = reversedTargetMappings[mdnTarget];
+    // If no record could be found, return true. Rules might not
+    // be found because they could belong to another provider
+    if (!mdnRecords.has(node.protoChainId))
+        return true;
+    const record = mdnRecords.get(node.protoChainId);
+    if (!record || !record.compat.support)
+        return true;
+    const compatRecord = record.compat.support[target];
+    if (!compatRecord)
+        return true;
+    if (!Array.isArray(compatRecord) && !("version_added" in compatRecord))
+        return true;
+    const { version_added: versionAdded } = Array.isArray(compatRecord)
+        ? compatRecord.find((e) => "version_added" in e)
+        : compatRecord;
+    // If a version is true then it is supported but version is unsure
+    if (typeof versionAdded === "boolean")
+        return versionAdded;
+    if (versionAdded === null)
+        return true;
+    // Special case for Safari TP: TP is always gte than any other releases
+    if (target === "safari") {
+        if (version === "TP")
+            return true;
+        if (versionAdded === "TP")
+            return false;
+    }
+    // A browser supports an API if its version is greater than or equal
+    // to the first version of the browser that API was added in
+    const semverCurrent = semver_1.default.coerce(customCoerce(String(version)));
+    const semverAdded = semver_1.default.coerce(customCoerce(versionAdded));
+    // semver.coerce() might be null for non-semvers (other than Safari TP)
+    // Just warn and treat features as supported here for now to avoid lint from
+    // crashing
+    if (!semverCurrent) {
+        // eslint-disable-next-line no-console
+        console.warn(`eslint-plugin-compat: A non-semver target "${target} ${version}" matched for the feature ${node.protoChainId}, skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`);
+        return true;
+    }
+    if (!versionAdded) {
+        // eslint-disable-next-line no-console
+        console.warn(`eslint-plugin-compat: The feature ${node.protoChainId} is supported since a non-semver target "${target} ${versionAdded}", skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`);
+        return true;
+    }
+    if (!semverAdded)
+        return false;
+    return semver_1.default.gte(semverCurrent, semverAdded);
+}
+/**
+ * Return an array of all unsupported targets
+ */
+function getUnsupportedTargets(node, targets) {
+    return targets
+        .filter((target) => !isSupportedByMDN(node, target))
+        .map(formatTargetNames);
+}
+function getMetadataName(metadata) {
+    switch (metadata.protoChain.length) {
+        case 1: {
+            return metadata.protoChain[0];
+        }
+        default:
+            return `${metadata.protoChain.join(".")}()`;
+    }
+}
+const MdnProvider = apis
+    // Create entries for each ast node type
+    .map((metadata) => metadata.astNodeTypes.map((astNodeType) => ({
+    ...metadata,
+    name: getMetadataName(metadata),
+    id: metadata.protoChainId,
+    protoChainId: metadata.protoChainId,
+    astNodeType,
+    object: metadata.protoChain[0],
+    // @TODO Handle cases where 'prototype' is in protoChain
+    property: metadata.protoChain[1],
+})))
+    // Flatten the array of arrays
+    .flat()
+    // Add rule and target support logic for each entry
+    .map((rule) => ({
+    ...rule,
+    getUnsupportedTargets,
+}));
+exports.default = MdnProvider;
diff --git a/lib/esm/src/providers/mdn-provider.js b/lib/esm/src/providers/mdn-provider.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/providers/mdn-provider.js
+++ b/lib/esm/src/providers/mdn-provider.js
@@ -0,0 +1,138 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isSupportedByMDN = isSupportedByMDN;
+exports.getUnsupportedTargets = getUnsupportedTargets;
+const ast_metadata_inferer_1 = __importDefault(require("ast-metadata-inferer"));
+const semver_1 = __importDefault(require("semver"));
+const helpers_1 = require("../helpers");
+const constants_1 = require("../constants");
+const apis = ast_metadata_inferer_1.default;
+// @TODO Import this type from ast-metadata-inferer after migrating this project to TypeScript
+const mdnRecords = new Map(apis.map((e) => [e.protoChainId, e]));
+/**
+ * Map ids of mdn targets to their "common/friendly" name
+ */
+const targetIdMappings = {
+    chrome: "chrome",
+    firefox: "firefox",
+    opera: "opera",
+    safari: "safari",
+    safari_ios: "ios_saf",
+    ie: "ie",
+    edge_mobile: "ie_mob",
+    edge: "edge",
+    opera_android: "and_opera",
+    chrome_android: "and_chrome",
+    firefox_android: "and_firefox",
+    webview_android: "and_webview",
+    samsunginternet_android: "and_samsung",
+    nodejs: "node",
+};
+const reversedTargetMappings = (0, helpers_1.reverseTargetMappings)(targetIdMappings);
+/**
+ * Take a target's id and return it's full name by using `targetNameMappings`
+ * ex. {target: and_ff, version: 40} => 'Android FireFox 40'
+ */
+function formatTargetNames(target) {
+    return `${constants_1.STANDARD_TARGET_NAME_MAPPING[target.target]} ${target.version}`;
+}
+/**
+ * Convert '9' => '9.0.0'
+ */
+function customCoerce(version) {
+    return version.length === 1 ? [version, 0, 0].join(".") : version;
+}
+/*
+ * Return if MDN supports the API or not
+ */
+function isSupportedByMDN(node, { version, target: mdnTarget }) {
+    // @ts-expect-error Expected
+    const target = reversedTargetMappings[mdnTarget];
+    // If no record could be found, return true. Rules might not
+    // be found because they could belong to another provider
+    if (!mdnRecords.has(node.protoChainId))
+        return true;
+    const record = mdnRecords.get(node.protoChainId);
+    if (!record || !record.compat.support)
+        return true;
+    const compatRecord = record.compat.support[target];
+    if (!compatRecord)
+        return true;
+    if (!Array.isArray(compatRecord) && !("version_added" in compatRecord))
+        return true;
+    const { version_added: versionAdded } = Array.isArray(compatRecord)
+        ? compatRecord.find((e) => "version_added" in e)
+        : compatRecord;
+    // If a version is true then it is supported but version is unsure
+    if (typeof versionAdded === "boolean")
+        return versionAdded;
+    if (versionAdded === null)
+        return true;
+    // Special case for Safari TP: TP is always gte than any other releases
+    if (target === "safari") {
+        if (version === "TP")
+            return true;
+        if (versionAdded === "TP")
+            return false;
+    }
+    // A browser supports an API if its version is greater than or equal
+    // to the first version of the browser that API was added in
+    const semverCurrent = semver_1.default.coerce(customCoerce(String(version)));
+    const semverAdded = semver_1.default.coerce(customCoerce(versionAdded));
+    // semver.coerce() might be null for non-semvers (other than Safari TP)
+    // Just warn and treat features as supported here for now to avoid lint from
+    // crashing
+    if (!semverCurrent) {
+        // eslint-disable-next-line no-console
+        console.warn(`eslint-plugin-compat: A non-semver target "${target} ${version}" matched for the feature ${node.protoChainId}, skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`);
+        return true;
+    }
+    if (!versionAdded) {
+        // eslint-disable-next-line no-console
+        console.warn(`eslint-plugin-compat: The feature ${node.protoChainId} is supported since a non-semver target "${target} ${versionAdded}", skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`);
+        return true;
+    }
+    if (!semverAdded)
+        return false;
+    return semver_1.default.gte(semverCurrent, semverAdded);
+}
+/**
+ * Return an array of all unsupported targets
+ */
+function getUnsupportedTargets(node, targets) {
+    return targets
+        .filter((target) => !isSupportedByMDN(node, target))
+        .map(formatTargetNames);
+}
+function getMetadataName(metadata) {
+    switch (metadata.protoChain.length) {
+        case 1: {
+            return metadata.protoChain[0];
+        }
+        default:
+            return `${metadata.protoChain.join(".")}()`;
+    }
+}
+const MdnProvider = apis
+    // Create entries for each ast node type
+    .map((metadata) => metadata.astNodeTypes.map((astNodeType) => ({
+    ...metadata,
+    name: getMetadataName(metadata),
+    id: metadata.protoChainId,
+    protoChainId: metadata.protoChainId,
+    astNodeType,
+    object: metadata.protoChain[0],
+    // @TODO Handle cases where 'prototype' is in protoChain
+    property: metadata.protoChain[1],
+})))
+    // Flatten the array of arrays
+    .flat()
+    // Add rule and target support logic for each entry
+    .map((rule) => ({
+    ...rule,
+    getUnsupportedTargets,
+}));
+exports.default = MdnProvider;
diff --git a/lib/cjs/src/config/recommended.js b/lib/cjs/src/config/recommended.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/config/recommended.js
+++ b/lib/cjs/src/config/recommended.js
@@ -0,0 +1,32 @@
+"use strict";
+/**
+ * @file Recommended configs for this plugin
+ */
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const globals_1 = __importDefault(require("globals"));
+// Flat config: https://eslint.org/docs/latest/use/configure/configuration-files-new
+const flat = {
+    languageOptions: {
+        globals: {
+            ...globals_1.default.browser,
+        },
+    },
+    rules: {
+        "compat/compat": "error",
+    },
+};
+// eslintrc config: https://eslint.org/docs/latest/use/configure/configuration-files
+const legacy = {
+    env: {
+        browser: true,
+    },
+    rules: flat.rules,
+};
+const recommended = {
+    flat,
+    legacy,
+};
+exports.default = recommended;
diff --git a/lib/esm/src/config/recommended.js b/lib/esm/src/config/recommended.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/config/recommended.js
+++ b/lib/esm/src/config/recommended.js
@@ -0,0 +1,32 @@
+"use strict";
+/**
+ * @file Recommended configs for this plugin
+ */
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const globals_1 = __importDefault(require("globals"));
+// Flat config: https://eslint.org/docs/latest/use/configure/configuration-files-new
+const flat = {
+    languageOptions: {
+        globals: {
+            ...globals_1.default.browser,
+        },
+    },
+    rules: {
+        "compat/compat": "error",
+    },
+};
+// eslintrc config: https://eslint.org/docs/latest/use/configure/configuration-files
+const legacy = {
+    env: {
+        browser: true,
+    },
+    rules: flat.rules,
+};
+const recommended = {
+    flat,
+    legacy,
+};
+exports.default = recommended;
diff --git a/lib/cjs/src/types.js b/lib/cjs/src/types.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/types.js
+++ b/lib/cjs/src/types.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/lib/esm/src/types.js b/lib/esm/src/types.js
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/types.js
+++ b/lib/esm/src/types.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/lib/cjs/package.json b/lib/cjs/package.json
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/package.json
+++ b/lib/cjs/package.json
@@ -0,0 +1,121 @@
+{
+    "name": "eslint-plugin-compat",
+    "version": "6.0.0",
+    "description": "Lint browser compatibility of API used",
+    "keywords": [
+        "eslint",
+        "browser",
+        "support",
+        "api",
+        "lint",
+        "caniuse",
+        "kangax"
+    ],
+    "homepage": "https://github.com/amilajack/eslint-plugin-compat#readme",
+    "bugs": {
+        "url": "https://github.com/amilajack/eslint-plugin-compat/issues"
+    },
+    "repository": {
+        "type": "git",
+        "url": "git+https://github.com/amilajack/eslint-plugin-compat.git"
+    },
+    "license": "MIT",
+    "author": "Amila Welihinda",
+    "contributors": [
+        "Amila Welihinda <amilajack@gmail.com> (https://github.com/amilajack)",
+        "John Tran <jptran318@gmail.com> (https://github.com/jooohhn)"
+    ],
+    "main": "./lib/cjs/src/index.js",
+    "types": "./lib/cjs/src/index.d.ts",
+    "exports": {
+        ".": {
+            "import": {
+                "types": "./lib/esm//src/index.d.mts",
+                "default": "./lib/esm/src/index.js"
+            },
+            "require": {
+                "types": "./lib/cjs/src/index.d.ts",
+                "default": "./lib/cjs/src/index.js"
+            }
+        }
+    },
+    "files": [
+        "lib"
+    ],
+    "scripts": {
+        "benchmarks": "ts-node-transpile-only test/benchmarks.ts",
+        "build": "rm -rf lib && tsc --project tsconfig.build.json && tsc --project tsconfig.esm.json",
+        "lint": "eslint .",
+        "prettier": "prettier --check .",
+        "prettier:write": "prettier --write .",
+        "spec": "jest --testPathIgnorePatterns test/e2e-repo.spec.ts /benchmarks-tmp",
+        "spec:e2e": "jest --detectOpenHandles test/e2e-repo.spec.ts",
+        "test": "npm run build && npm run lint && npm run spec",
+        "tsc": "tsc",
+        "version": "npm run build"
+    },
+    "prettier": {
+        "semi": true,
+        "tabWidth": 2,
+        "trailingComma": "es5"
+    },
+    "jest": {
+        "preset": "ts-jest",
+        "testEnvironment": "node",
+        "testPathIgnorePatterns": [
+            "/benchmarks-tmp/"
+        ]
+    },
+    "dependencies": {
+        "@mdn/browser-compat-data": "^5.5.35",
+        "ast-metadata-inferer": "^0.8.0",
+        "browserslist": "^4.23.1",
+        "caniuse-lite": "^1.0.30001639",
+        "find-up": "^5.0.0",
+        "globals": "^15.7.0",
+        "lodash.memoize": "^4.1.2",
+        "semver": "^7.6.2"
+    },
+    "devDependencies": {
+        "@babel/core": "^7.24.7",
+        "@babel/eslint-parser": "^7.24.7",
+        "@eslint/compat": "^1.1.0",
+        "@eslint/js": "^9.6.0",
+        "@semantic-release/changelog": "^6.0.3",
+        "@semantic-release/git": "^10.0.1",
+        "@tsconfig/node16": "^16.1.3",
+        "@types/benchmark": "^2.1.5",
+        "@types/caniuse-lite": "^1.0.5",
+        "@types/eslint": "^8.56.10",
+        "@types/jest": "^29.5.12",
+        "@types/lodash.memoize": "^4.1.9",
+        "@types/semver": "7.5.8",
+        "benchmark": "^2.1.4",
+        "browserslist-config-erb": "^0.0.3",
+        "electron": "^29.x.x",
+        "eslint": "^9.6.0",
+        "eslint-config-prettier": "^9.1.0",
+        "eslint-plugin-eslint-plugin": "^6.2.0",
+        "eslint-plugin-prettier": "^5.1.3",
+        "expect-type": "^0.19.0",
+        "jest": "^29.7.0",
+        "prettier": "^3.3.2",
+        "semantic-release": "^22.0.12",
+        "simple-git": "^3.25.0",
+        "ts-jest": "^29.1.5",
+        "ts-node": "^10.9.2",
+        "typescript": "^5.4.3",
+        "typescript-eslint": "^8.0.0-alpha.36"
+    },
+    "peerDependencies": {
+        "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
+    },
+    "engines": {
+        "node": ">=18.x"
+    },
+    "collective": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/eslint-plugin-compat",
+        "logo": "https://opencollective.com/opencollective/logo.txt"
+    }
+}
diff --git a/lib/esm/package.json b/lib/esm/package.json
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/package.json
+++ b/lib/esm/package.json
@@ -0,0 +1,121 @@
+{
+    "name": "eslint-plugin-compat",
+    "version": "6.0.0",
+    "description": "Lint browser compatibility of API used",
+    "keywords": [
+        "eslint",
+        "browser",
+        "support",
+        "api",
+        "lint",
+        "caniuse",
+        "kangax"
+    ],
+    "homepage": "https://github.com/amilajack/eslint-plugin-compat#readme",
+    "bugs": {
+        "url": "https://github.com/amilajack/eslint-plugin-compat/issues"
+    },
+    "repository": {
+        "type": "git",
+        "url": "git+https://github.com/amilajack/eslint-plugin-compat.git"
+    },
+    "license": "MIT",
+    "author": "Amila Welihinda",
+    "contributors": [
+        "Amila Welihinda <amilajack@gmail.com> (https://github.com/amilajack)",
+        "John Tran <jptran318@gmail.com> (https://github.com/jooohhn)"
+    ],
+    "main": "./lib/cjs/src/index.js",
+    "types": "./lib/cjs/src/index.d.ts",
+    "exports": {
+        ".": {
+            "import": {
+                "types": "./lib/esm//src/index.d.mts",
+                "default": "./lib/esm/src/index.js"
+            },
+            "require": {
+                "types": "./lib/cjs/src/index.d.ts",
+                "default": "./lib/cjs/src/index.js"
+            }
+        }
+    },
+    "files": [
+        "lib"
+    ],
+    "scripts": {
+        "benchmarks": "ts-node-transpile-only test/benchmarks.ts",
+        "build": "rm -rf lib && tsc --project tsconfig.build.json && tsc --project tsconfig.esm.json",
+        "lint": "eslint .",
+        "prettier": "prettier --check .",
+        "prettier:write": "prettier --write .",
+        "spec": "jest --testPathIgnorePatterns test/e2e-repo.spec.ts /benchmarks-tmp",
+        "spec:e2e": "jest --detectOpenHandles test/e2e-repo.spec.ts",
+        "test": "npm run build && npm run lint && npm run spec",
+        "tsc": "tsc",
+        "version": "npm run build"
+    },
+    "prettier": {
+        "semi": true,
+        "tabWidth": 2,
+        "trailingComma": "es5"
+    },
+    "jest": {
+        "preset": "ts-jest",
+        "testEnvironment": "node",
+        "testPathIgnorePatterns": [
+            "/benchmarks-tmp/"
+        ]
+    },
+    "dependencies": {
+        "@mdn/browser-compat-data": "^5.5.35",
+        "ast-metadata-inferer": "^0.8.0",
+        "browserslist": "^4.23.1",
+        "caniuse-lite": "^1.0.30001639",
+        "find-up": "^5.0.0",
+        "globals": "^15.7.0",
+        "lodash.memoize": "^4.1.2",
+        "semver": "^7.6.2"
+    },
+    "devDependencies": {
+        "@babel/core": "^7.24.7",
+        "@babel/eslint-parser": "^7.24.7",
+        "@eslint/compat": "^1.1.0",
+        "@eslint/js": "^9.6.0",
+        "@semantic-release/changelog": "^6.0.3",
+        "@semantic-release/git": "^10.0.1",
+        "@tsconfig/node16": "^16.1.3",
+        "@types/benchmark": "^2.1.5",
+        "@types/caniuse-lite": "^1.0.5",
+        "@types/eslint": "^8.56.10",
+        "@types/jest": "^29.5.12",
+        "@types/lodash.memoize": "^4.1.9",
+        "@types/semver": "7.5.8",
+        "benchmark": "^2.1.4",
+        "browserslist-config-erb": "^0.0.3",
+        "electron": "^29.x.x",
+        "eslint": "^9.6.0",
+        "eslint-config-prettier": "^9.1.0",
+        "eslint-plugin-eslint-plugin": "^6.2.0",
+        "eslint-plugin-prettier": "^5.1.3",
+        "expect-type": "^0.19.0",
+        "jest": "^29.7.0",
+        "prettier": "^3.3.2",
+        "semantic-release": "^22.0.12",
+        "simple-git": "^3.25.0",
+        "ts-jest": "^29.1.5",
+        "ts-node": "^10.9.2",
+        "typescript": "^5.4.3",
+        "typescript-eslint": "^8.0.0-alpha.36"
+    },
+    "peerDependencies": {
+        "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
+    },
+    "engines": {
+        "node": ">=18.x"
+    },
+    "collective": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/eslint-plugin-compat",
+        "logo": "https://opencollective.com/opencollective/logo.txt"
+    }
+}
diff --git a/lib/cjs/src/providers/caniuse-provider.d.ts b/lib/cjs/src/providers/caniuse-provider.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/providers/caniuse-provider.d.ts
+++ b/lib/cjs/src/providers/caniuse-provider.d.ts
@@ -0,0 +1,7 @@
+import { AstMetadataApiWithTargetsResolver, Target } from "../types";
+/**
+ * Return an array of all unsupported targets
+ */
+export declare function getUnsupportedTargets(node: AstMetadataApiWithTargetsResolver, targets: Target[]): string[];
+declare const CanIUseProvider: Array<AstMetadataApiWithTargetsResolver>;
+export default CanIUseProvider;
diff --git a/lib/esm/src/providers/caniuse-provider.d.ts b/lib/esm/src/providers/caniuse-provider.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/providers/caniuse-provider.d.ts
+++ b/lib/esm/src/providers/caniuse-provider.d.ts
@@ -0,0 +1,7 @@
+import { AstMetadataApiWithTargetsResolver, Target } from "../types";
+/**
+ * Return an array of all unsupported targets
+ */
+export declare function getUnsupportedTargets(node: AstMetadataApiWithTargetsResolver, targets: Target[]): string[];
+declare const CanIUseProvider: Array<AstMetadataApiWithTargetsResolver>;
+export default CanIUseProvider;
diff --git a/lib/cjs/src/rules/compat.d.ts b/lib/cjs/src/rules/compat.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/rules/compat.d.ts
+++ b/lib/cjs/src/rules/compat.d.ts
@@ -0,0 +1,3 @@
+import { Rule } from "eslint";
+declare const _default: Rule.RuleModule;
+export default _default;
diff --git a/lib/esm/src/rules/compat.d.ts b/lib/esm/src/rules/compat.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/rules/compat.d.ts
+++ b/lib/esm/src/rules/compat.d.ts
@@ -0,0 +1,3 @@
+import { Rule } from "eslint";
+declare const _default: Rule.RuleModule;
+export default _default;
diff --git a/lib/cjs/src/constants.d.ts b/lib/cjs/src/constants.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/constants.d.ts
+++ b/lib/cjs/src/constants.d.ts
@@ -0,0 +1,30 @@
+export interface TargetNameMappings {
+    chrome: "Chrome";
+    firefox: "Firefox";
+    safari: "Safari";
+    ios_saf: "iOS Safari";
+    ie: "IE";
+    ie_mob: "IE Mobile";
+    edge: "Edge";
+    baidu: "Baidu";
+    electron: "Electron";
+    blackberry_browser: "Blackberry Browser";
+    edge_mobile: "Edge Mobile";
+    and_uc: "Android UC Browser";
+    and_chrome: "Android Chrome";
+    and_firefox: "Android Firefox";
+    and_webview: "Android Webview";
+    and_samsung: "Samsung Browser";
+    and_opera: "Opera Android";
+    opera: "Opera";
+    opera_mini: "Opera Mini";
+    opera_mobile: "Opera Mobile";
+    node: "Node.js";
+    kaios: "KaiOS";
+}
+export declare const STANDARD_TARGET_NAME_MAPPING: Readonly<TargetNameMappings>;
+export declare enum AstNodeTypes {
+    MemberExpression = "MemberExpression",
+    CallExpression = "CallExpression",
+    NewExpression = "NewExpression"
+}
diff --git a/lib/esm/src/constants.d.ts b/lib/esm/src/constants.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/constants.d.ts
+++ b/lib/esm/src/constants.d.ts
@@ -0,0 +1,30 @@
+export interface TargetNameMappings {
+    chrome: "Chrome";
+    firefox: "Firefox";
+    safari: "Safari";
+    ios_saf: "iOS Safari";
+    ie: "IE";
+    ie_mob: "IE Mobile";
+    edge: "Edge";
+    baidu: "Baidu";
+    electron: "Electron";
+    blackberry_browser: "Blackberry Browser";
+    edge_mobile: "Edge Mobile";
+    and_uc: "Android UC Browser";
+    and_chrome: "Android Chrome";
+    and_firefox: "Android Firefox";
+    and_webview: "Android Webview";
+    and_samsung: "Samsung Browser";
+    and_opera: "Opera Android";
+    opera: "Opera";
+    opera_mini: "Opera Mini";
+    opera_mobile: "Opera Mobile";
+    node: "Node.js";
+    kaios: "KaiOS";
+}
+export declare const STANDARD_TARGET_NAME_MAPPING: Readonly<TargetNameMappings>;
+export declare enum AstNodeTypes {
+    MemberExpression = "MemberExpression",
+    CallExpression = "CallExpression",
+    NewExpression = "NewExpression"
+}
diff --git a/lib/cjs/src/helpers.d.ts b/lib/cjs/src/helpers.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/helpers.d.ts
+++ b/lib/cjs/src/helpers.d.ts
@@ -0,0 +1,30 @@
+import { AstMetadataApiWithTargetsResolver, ESLintNode, SourceCode, BrowserListConfig, Target, HandleFailingRule, Context, BrowsersListOpts } from "./types";
+export declare function lintCallExpression(context: Context, handleFailingRule: HandleFailingRule, rules: AstMetadataApiWithTargetsResolver[], sourceCode: SourceCode, node: ESLintNode): void;
+export declare function lintNewExpression(context: Context, handleFailingRule: HandleFailingRule, rules: Array<AstMetadataApiWithTargetsResolver>, sourceCode: SourceCode, node: ESLintNode): void;
+export declare function lintExpressionStatement(context: Context, handleFailingRule: HandleFailingRule, rules: AstMetadataApiWithTargetsResolver[], sourceCode: SourceCode, node: ESLintNode): void;
+export declare function lintMemberExpression(context: Context, handleFailingRule: HandleFailingRule, rules: Array<AstMetadataApiWithTargetsResolver>, sourceCode: SourceCode, node: ESLintNode): void;
+export declare function reverseTargetMappings<K extends string, V extends string>(targetMappings: Record<K, V>): Record<V, K>;
+/**
+ * Determine the targets based on the browserslist config object
+ * Get the targets from the eslint config and merge them with targets in browserslist config
+ * Eslint target config will be deprecated in 4.0.0
+ *
+ * @param configPath - The file or a directory path to look for the browserslist config file
+ */
+export declare function determineTargetsFromConfig(configPath: string, config?: BrowserListConfig, browserslistOptsFromConfig?: BrowsersListOpts): Array<string>;
+/**
+ * Parses the versions that are given by browserslist. They're
+ *
+ * ```ts
+ * parseBrowsersListVersion(['chrome 50'])
+ *
+ * {
+ *   target: 'chrome',
+ *   parsedVersion: 50,
+ *   version: '50'
+ * }
+ * ```
+ * @param targetslist - List of targest from browserslist api
+ * @returns - The lowest version version of each target
+ */
+export declare function parseBrowsersListVersion(targetslist: Array<string>): Array<Target>;
diff --git a/lib/esm/src/helpers.d.ts b/lib/esm/src/helpers.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/helpers.d.ts
+++ b/lib/esm/src/helpers.d.ts
@@ -0,0 +1,30 @@
+import { AstMetadataApiWithTargetsResolver, ESLintNode, SourceCode, BrowserListConfig, Target, HandleFailingRule, Context, BrowsersListOpts } from "./types";
+export declare function lintCallExpression(context: Context, handleFailingRule: HandleFailingRule, rules: AstMetadataApiWithTargetsResolver[], sourceCode: SourceCode, node: ESLintNode): void;
+export declare function lintNewExpression(context: Context, handleFailingRule: HandleFailingRule, rules: Array<AstMetadataApiWithTargetsResolver>, sourceCode: SourceCode, node: ESLintNode): void;
+export declare function lintExpressionStatement(context: Context, handleFailingRule: HandleFailingRule, rules: AstMetadataApiWithTargetsResolver[], sourceCode: SourceCode, node: ESLintNode): void;
+export declare function lintMemberExpression(context: Context, handleFailingRule: HandleFailingRule, rules: Array<AstMetadataApiWithTargetsResolver>, sourceCode: SourceCode, node: ESLintNode): void;
+export declare function reverseTargetMappings<K extends string, V extends string>(targetMappings: Record<K, V>): Record<V, K>;
+/**
+ * Determine the targets based on the browserslist config object
+ * Get the targets from the eslint config and merge them with targets in browserslist config
+ * Eslint target config will be deprecated in 4.0.0
+ *
+ * @param configPath - The file or a directory path to look for the browserslist config file
+ */
+export declare function determineTargetsFromConfig(configPath: string, config?: BrowserListConfig, browserslistOptsFromConfig?: BrowsersListOpts): Array<string>;
+/**
+ * Parses the versions that are given by browserslist. They're
+ *
+ * ```ts
+ * parseBrowsersListVersion(['chrome 50'])
+ *
+ * {
+ *   target: 'chrome',
+ *   parsedVersion: 50,
+ *   version: '50'
+ * }
+ * ```
+ * @param targetslist - List of targest from browserslist api
+ * @returns - The lowest version version of each target
+ */
+export declare function parseBrowsersListVersion(targetslist: Array<string>): Array<Target>;
diff --git a/lib/cjs/src/index.d.ts b/lib/cjs/src/index.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/index.d.ts
+++ b/lib/cjs/src/index.d.ts
@@ -0,0 +1,27 @@
+/**
+ * Step 1) Entry point of plugin. Exports itself for eslint to use
+ * @author Amila Welihinda
+ */
+import type { Linter } from "eslint";
+declare const configs: {
+    "flat/recommended": Linter.FlatConfig;
+    recommended: Linter.Config;
+};
+declare const _default: {
+    /**
+     * @deprecated Use `.configs` instead. This will be removed in the next major release.
+     */
+    config: {
+        "flat/recommended": Linter.FlatConfig;
+        recommended: Linter.Config;
+    };
+    meta: {
+        name: string;
+        version: string;
+    };
+    configs: typeof configs;
+    rules: {
+        compat: import("eslint").Rule.RuleModule;
+    };
+};
+export = _default;
diff --git a/lib/cjs/src/providers/index.d.ts b/lib/cjs/src/providers/index.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/providers/index.d.ts
+++ b/lib/cjs/src/providers/index.d.ts
@@ -0,0 +1,2 @@
+import type { AstMetadataApiWithTargetsResolver } from "../types";
+export declare const nodes: Array<AstMetadataApiWithTargetsResolver>;
diff --git a/lib/esm/src/index.d.ts b/lib/esm/src/index.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/index.d.ts
+++ b/lib/esm/src/index.d.ts
@@ -0,0 +1,27 @@
+/**
+ * Step 1) Entry point of plugin. Exports itself for eslint to use
+ * @author Amila Welihinda
+ */
+import type { Linter } from "eslint";
+declare const configs: {
+    "flat/recommended": Linter.FlatConfig;
+    recommended: Linter.Config;
+};
+declare const _default: {
+    /**
+     * @deprecated Use `.configs` instead. This will be removed in the next major release.
+     */
+    config: {
+        "flat/recommended": Linter.FlatConfig;
+        recommended: Linter.Config;
+    };
+    meta: {
+        name: string;
+        version: string;
+    };
+    configs: typeof configs;
+    rules: {
+        compat: import("eslint").Rule.RuleModule;
+    };
+};
+export = _default;
diff --git a/lib/esm/src/providers/index.d.ts b/lib/esm/src/providers/index.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/providers/index.d.ts
+++ b/lib/esm/src/providers/index.d.ts
@@ -0,0 +1,2 @@
+import type { AstMetadataApiWithTargetsResolver } from "../types";
+export declare const nodes: Array<AstMetadataApiWithTargetsResolver>;
diff --git a/lib/cjs/src/providers/mdn-provider.d.ts b/lib/cjs/src/providers/mdn-provider.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/providers/mdn-provider.d.ts
+++ b/lib/cjs/src/providers/mdn-provider.d.ts
@@ -0,0 +1,8 @@
+import { AstMetadataApiWithTargetsResolver, Target } from "../types";
+export declare function isSupportedByMDN(node: AstMetadataApiWithTargetsResolver, { version, target: mdnTarget }: Target): boolean;
+/**
+ * Return an array of all unsupported targets
+ */
+export declare function getUnsupportedTargets(node: AstMetadataApiWithTargetsResolver, targets: Target[]): string[];
+declare const MdnProvider: Array<AstMetadataApiWithTargetsResolver>;
+export default MdnProvider;
diff --git a/lib/esm/src/providers/mdn-provider.d.ts b/lib/esm/src/providers/mdn-provider.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/providers/mdn-provider.d.ts
+++ b/lib/esm/src/providers/mdn-provider.d.ts
@@ -0,0 +1,8 @@
+import { AstMetadataApiWithTargetsResolver, Target } from "../types";
+export declare function isSupportedByMDN(node: AstMetadataApiWithTargetsResolver, { version, target: mdnTarget }: Target): boolean;
+/**
+ * Return an array of all unsupported targets
+ */
+export declare function getUnsupportedTargets(node: AstMetadataApiWithTargetsResolver, targets: Target[]): string[];
+declare const MdnProvider: Array<AstMetadataApiWithTargetsResolver>;
+export default MdnProvider;
diff --git a/lib/cjs/src/config/recommended.d.ts b/lib/cjs/src/config/recommended.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/config/recommended.d.ts
+++ b/lib/cjs/src/config/recommended.d.ts
@@ -0,0 +1,1138 @@
+/**
+ * @file Recommended configs for this plugin
+ */
+declare const recommended: {
+    flat: {
+        languageOptions: {
+            globals: {
+                AbortController: false;
+                AbortSignal: false;
+                AbsoluteOrientationSensor: false;
+                AbstractRange: false;
+                Accelerometer: false;
+                addEventListener: false;
+                alert: false;
+                AnalyserNode: false;
+                Animation: false;
+                AnimationEffect: false;
+                AnimationEvent: false;
+                AnimationPlaybackEvent: false;
+                AnimationTimeline: false;
+                atob: false;
+                Attr: false;
+                Audio: false;
+                AudioBuffer: false;
+                AudioBufferSourceNode: false;
+                AudioContext: false;
+                AudioData: false;
+                AudioDecoder: false;
+                AudioDestinationNode: false;
+                AudioEncoder: false;
+                AudioListener: false;
+                AudioNode: false;
+                AudioParam: false;
+                AudioParamMap: false;
+                AudioProcessingEvent: false;
+                AudioScheduledSourceNode: false;
+                AudioSinkInfo: false;
+                AudioWorklet: false;
+                AudioWorkletGlobalScope: false;
+                AudioWorkletNode: false;
+                AudioWorkletProcessor: false;
+                AuthenticatorAssertionResponse: false;
+                AuthenticatorAttestationResponse: false;
+                AuthenticatorResponse: false;
+                BackgroundFetchManager: false;
+                BackgroundFetchRecord: false;
+                BackgroundFetchRegistration: false;
+                BarProp: false;
+                BaseAudioContext: false;
+                BatteryManager: false;
+                BeforeUnloadEvent: false;
+                BiquadFilterNode: false;
+                Blob: false;
+                BlobEvent: false;
+                Bluetooth: false;
+                BluetoothCharacteristicProperties: false;
+                BluetoothDevice: false;
+                BluetoothRemoteGATTCharacteristic: false;
+                BluetoothRemoteGATTDescriptor: false;
+                BluetoothRemoteGATTServer: false;
+                BluetoothRemoteGATTService: false;
+                BluetoothUUID: false;
+                blur: false;
+                BroadcastChannel: false;
+                BrowserCaptureMediaStreamTrack: false;
+                btoa: false;
+                ByteLengthQueuingStrategy: false;
+                Cache: false;
+                caches: false;
+                CacheStorage: false;
+                cancelAnimationFrame: false;
+                cancelIdleCallback: false;
+                CanvasCaptureMediaStream: false;
+                CanvasCaptureMediaStreamTrack: false;
+                CanvasGradient: false;
+                CanvasPattern: false;
+                CanvasRenderingContext2D: false;
+                CaptureController: false;
+                CaretPosition: false;
+                CDATASection: false;
+                ChannelMergerNode: false;
+                ChannelSplitterNode: false;
+                CharacterBoundsUpdateEvent: false;
+                CharacterData: false;
+                clearInterval: false;
+                clearTimeout: false;
+                clientInformation: false;
+                Clipboard: false;
+                ClipboardEvent: false;
+                ClipboardItem: false;
+                close: false;
+                closed: false;
+                CloseEvent: false;
+                CloseWatcher: false;
+                Comment: false;
+                CompositionEvent: false;
+                CompressionStream: false;
+                confirm: false;
+                console: false;
+                ConstantSourceNode: false;
+                ContentVisibilityAutoStateChangeEvent: false;
+                ConvolverNode: false;
+                CookieChangeEvent: false;
+                CookieDeprecationLabel: false;
+                cookieStore: false;
+                CookieStore: false;
+                CookieStoreManager: false;
+                CountQueuingStrategy: false;
+                createImageBitmap: false;
+                Credential: false;
+                credentialless: false;
+                CredentialsContainer: false;
+                CropTarget: false;
+                crossOriginIsolated: false;
+                crypto: false;
+                Crypto: false;
+                CryptoKey: false;
+                CSS: false;
+                CSSAnimation: false;
+                CSSConditionRule: false;
+                CSSContainerRule: false;
+                CSSCounterStyleRule: false;
+                CSSFontFaceRule: false;
+                CSSFontFeatureValuesRule: false;
+                CSSFontPaletteValuesRule: false;
+                CSSGroupingRule: false;
+                CSSImageValue: false;
+                CSSImportRule: false;
+                CSSKeyframeRule: false;
+                CSSKeyframesRule: false;
+                CSSKeywordValue: false;
+                CSSLayerBlockRule: false;
+                CSSLayerStatementRule: false;
+                CSSMathClamp: false;
+                CSSMathInvert: false;
+                CSSMathMax: false;
+                CSSMathMin: false;
+                CSSMathNegate: false;
+                CSSMathProduct: false;
+                CSSMathSum: false;
+                CSSMathValue: false;
+                CSSMatrixComponent: false;
+                CSSMediaRule: false;
+                CSSNamespaceRule: false;
+                CSSNumericArray: false;
+                CSSNumericValue: false;
+                CSSPageRule: false;
+                CSSPerspective: false;
+                CSSPositionTryDescriptors: false;
+                CSSPositionTryRule: false;
+                CSSPositionValue: false;
+                CSSPropertyRule: false;
+                CSSRotate: false;
+                CSSRule: false;
+                CSSRuleList: false;
+                CSSScale: false;
+                CSSScopeRule: false;
+                CSSSkew: false;
+                CSSSkewX: false;
+                CSSSkewY: false;
+                CSSStartingStyleRule: false;
+                CSSStyleDeclaration: false;
+                CSSStyleRule: false;
+                CSSStyleSheet: false;
+                CSSStyleValue: false;
+                CSSSupportsRule: false;
+                CSSTransformComponent: false;
+                CSSTransformValue: false;
+                CSSTransition: false;
+                CSSTranslate: false;
+                CSSUnitValue: false;
+                CSSUnparsedValue: false;
+                CSSVariableReferenceValue: false;
+                CSSViewTransitionRule: false;
+                currentFrame: false;
+                currentTime: false;
+                CustomElementRegistry: false;
+                customElements: false;
+                CustomEvent: false;
+                CustomStateSet: false;
+                DataTransfer: false;
+                DataTransferItem: false;
+                DataTransferItemList: false;
+                DecompressionStream: false;
+                DelayNode: false;
+                DelegatedInkTrailPresenter: false;
+                DeviceMotionEvent: false;
+                DeviceMotionEventAcceleration: false;
+                DeviceMotionEventRotationRate: false;
+                DeviceOrientationEvent: false;
+                devicePixelRatio: false;
+                dispatchEvent: false;
+                document: false;
+                Document: false;
+                DocumentFragment: false;
+                documentPictureInPicture: false;
+                DocumentPictureInPicture: false;
+                DocumentPictureInPictureEvent: false;
+                DocumentTimeline: false;
+                DocumentType: false;
+                DOMError: false;
+                DOMException: false;
+                DOMImplementation: false;
+                DOMMatrix: false;
+                DOMMatrixReadOnly: false;
+                DOMParser: false;
+                DOMPoint: false;
+                DOMPointReadOnly: false;
+                DOMQuad: false;
+                DOMRect: false;
+                DOMRectList: false;
+                DOMRectReadOnly: false;
+                DOMStringList: false;
+                DOMStringMap: false;
+                DOMTokenList: false;
+                DragEvent: false;
+                DynamicsCompressorNode: false;
+                EditContext: false;
+                Element: false;
+                ElementInternals: false;
+                EncodedAudioChunk: false;
+                EncodedVideoChunk: false;
+                ErrorEvent: false;
+                event: false;
+                Event: false;
+                EventCounts: false;
+                EventSource: false;
+                EventTarget: false;
+                external: false;
+                External: false;
+                EyeDropper: false;
+                FeaturePolicy: false;
+                FederatedCredential: false;
+                fence: false;
+                Fence: false;
+                FencedFrameConfig: false;
+                fetch: false;
+                fetchLater: false;
+                FetchLaterResult: false;
+                File: false;
+                FileList: false;
+                FileReader: false;
+                FileSystem: false;
+                FileSystemDirectoryEntry: false;
+                FileSystemDirectoryHandle: false;
+                FileSystemDirectoryReader: false;
+                FileSystemEntry: false;
+                FileSystemFileEntry: false;
+                FileSystemFileHandle: false;
+                FileSystemHandle: false;
+                FileSystemWritableFileStream: false;
+                find: false;
+                Float16Array: false;
+                focus: false;
+                FocusEvent: false;
+                FontData: false;
+                FontFace: false;
+                FontFaceSet: false;
+                FontFaceSetLoadEvent: false;
+                FormData: false;
+                FormDataEvent: false;
+                FragmentDirective: false;
+                frameElement: false;
+                frames: false;
+                GainNode: false;
+                Gamepad: false;
+                GamepadAxisMoveEvent: false;
+                GamepadButton: false;
+                GamepadButtonEvent: false;
+                GamepadEvent: false;
+                GamepadHapticActuator: false;
+                GamepadPose: false;
+                Geolocation: false;
+                GeolocationCoordinates: false;
+                GeolocationPosition: false;
+                GeolocationPositionError: false;
+                getComputedStyle: false;
+                getScreenDetails: false;
+                getSelection: false;
+                GPU: false;
+                GPUAdapter: false;
+                GPUAdapterInfo: false;
+                GPUBindGroup: false;
+                GPUBindGroupLayout: false;
+                GPUBuffer: false;
+                GPUBufferUsage: false;
+                GPUCanvasContext: false;
+                GPUColorWrite: false;
+                GPUCommandBuffer: false;
+                GPUCommandEncoder: false;
+                GPUCompilationInfo: false;
+                GPUCompilationMessage: false;
+                GPUComputePassEncoder: false;
+                GPUComputePipeline: false;
+                GPUDevice: false;
+                GPUDeviceLostInfo: false;
+                GPUError: false;
+                GPUExternalTexture: false;
+                GPUInternalError: false;
+                GPUMapMode: false;
+                GPUOutOfMemoryError: false;
+                GPUPipelineError: false;
+                GPUPipelineLayout: false;
+                GPUQuerySet: false;
+                GPUQueue: false;
+                GPURenderBundle: false;
+                GPURenderBundleEncoder: false;
+                GPURenderPassEncoder: false;
+                GPURenderPipeline: false;
+                GPUSampler: false;
+                GPUShaderModule: false;
+                GPUShaderStage: false;
+                GPUSupportedFeatures: false;
+                GPUSupportedLimits: false;
+                GPUTexture: false;
+                GPUTextureUsage: false;
+                GPUTextureView: false;
+                GPUUncapturedErrorEvent: false;
+                GPUValidationError: false;
+                GravitySensor: false;
+                Gyroscope: false;
+                HashChangeEvent: false;
+                Headers: false;
+                HID: false;
+                HIDConnectionEvent: false;
+                HIDDevice: false;
+                HIDInputReportEvent: false;
+                Highlight: false;
+                HighlightRegistry: false;
+                history: false;
+                History: false;
+                HTMLAllCollection: false;
+                HTMLAnchorElement: false;
+                HTMLAreaElement: false;
+                HTMLAudioElement: false;
+                HTMLBaseElement: false;
+                HTMLBodyElement: false;
+                HTMLBRElement: false;
+                HTMLButtonElement: false;
+                HTMLCanvasElement: false;
+                HTMLCollection: false;
+                HTMLDataElement: false;
+                HTMLDataListElement: false;
+                HTMLDetailsElement: false;
+                HTMLDialogElement: false;
+                HTMLDirectoryElement: false;
+                HTMLDivElement: false;
+                HTMLDListElement: false;
+                HTMLDocument: false;
+                HTMLElement: false;
+                HTMLEmbedElement: false;
+                HTMLFencedFrameElement: false;
+                HTMLFieldSetElement: false;
+                HTMLFontElement: false;
+                HTMLFormControlsCollection: false;
+                HTMLFormElement: false;
+                HTMLFrameElement: false;
+                HTMLFrameSetElement: false;
+                HTMLHeadElement: false;
+                HTMLHeadingElement: false;
+                HTMLHRElement: false;
+                HTMLHtmlElement: false;
+                HTMLIFrameElement: false;
+                HTMLImageElement: false;
+                HTMLInputElement: false;
+                HTMLLabelElement: false;
+                HTMLLegendElement: false;
+                HTMLLIElement: false;
+                HTMLLinkElement: false;
+                HTMLMapElement: false;
+                HTMLMarqueeElement: false;
+                HTMLMediaElement: false;
+                HTMLMenuElement: false;
+                HTMLMetaElement: false;
+                HTMLMeterElement: false;
+                HTMLModElement: false;
+                HTMLObjectElement: false;
+                HTMLOListElement: false;
+                HTMLOptGroupElement: false;
+                HTMLOptionElement: false;
+                HTMLOptionsCollection: false;
+                HTMLOutputElement: false;
+                HTMLParagraphElement: false;
+                HTMLParamElement: false;
+                HTMLPictureElement: false;
+                HTMLPreElement: false;
+                HTMLProgressElement: false;
+                HTMLQuoteElement: false;
+                HTMLScriptElement: false;
+                HTMLSelectElement: false;
+                HTMLSlotElement: false;
+                HTMLSourceElement: false;
+                HTMLSpanElement: false;
+                HTMLStyleElement: false;
+                HTMLTableCaptionElement: false;
+                HTMLTableCellElement: false;
+                HTMLTableColElement: false;
+                HTMLTableElement: false;
+                HTMLTableRowElement: false;
+                HTMLTableSectionElement: false;
+                HTMLTemplateElement: false;
+                HTMLTextAreaElement: false;
+                HTMLTimeElement: false;
+                HTMLTitleElement: false;
+                HTMLTrackElement: false;
+                HTMLUListElement: false;
+                HTMLUnknownElement: false;
+                HTMLVideoElement: false;
+                IDBCursor: false;
+                IDBCursorWithValue: false;
+                IDBDatabase: false;
+                IDBFactory: false;
+                IDBIndex: false;
+                IDBKeyRange: false;
+                IDBObjectStore: false;
+                IDBOpenDBRequest: false;
+                IDBRequest: false;
+                IDBTransaction: false;
+                IDBVersionChangeEvent: false;
+                IdentityCredential: false;
+                IdentityCredentialError: false;
+                IdentityProvider: false;
+                IdleDeadline: false;
+                IdleDetector: false;
+                IIRFilterNode: false;
+                Image: false;
+                ImageBitmap: false;
+                ImageBitmapRenderingContext: false;
+                ImageCapture: false;
+                ImageData: false;
+                ImageDecoder: false;
+                ImageTrack: false;
+                ImageTrackList: false;
+                indexedDB: false;
+                Ink: false;
+                innerHeight: false;
+                innerWidth: false;
+                InputDeviceCapabilities: false;
+                InputDeviceInfo: false;
+                InputEvent: false;
+                IntersectionObserver: false;
+                IntersectionObserverEntry: false;
+                isSecureContext: false;
+                Iterator: false;
+                Keyboard: false;
+                KeyboardEvent: false;
+                KeyboardLayoutMap: false;
+                KeyframeEffect: false;
+                LargestContentfulPaint: false;
+                LaunchParams: false;
+                launchQueue: false;
+                LaunchQueue: false;
+                LayoutShift: false;
+                LayoutShiftAttribution: false;
+                length: false;
+                LinearAccelerationSensor: false;
+                localStorage: false;
+                location: true;
+                Location: false;
+                locationbar: false;
+                Lock: false;
+                LockManager: false;
+                matchMedia: false;
+                MathMLElement: false;
+                MediaCapabilities: false;
+                MediaCapabilitiesInfo: false;
+                MediaDeviceInfo: false;
+                MediaDevices: false;
+                MediaElementAudioSourceNode: false;
+                MediaEncryptedEvent: false;
+                MediaError: false;
+                MediaKeyError: false;
+                MediaKeyMessageEvent: false;
+                MediaKeys: false;
+                MediaKeySession: false;
+                MediaKeyStatusMap: false;
+                MediaKeySystemAccess: false;
+                MediaList: false;
+                MediaMetadata: false;
+                MediaQueryList: false;
+                MediaQueryListEvent: false;
+                MediaRecorder: false;
+                MediaRecorderErrorEvent: false;
+                MediaSession: false;
+                MediaSource: false;
+                MediaSourceHandle: false;
+                MediaStream: false;
+                MediaStreamAudioDestinationNode: false;
+                MediaStreamAudioSourceNode: false;
+                MediaStreamEvent: false;
+                MediaStreamTrack: false;
+                MediaStreamTrackAudioSourceNode: false;
+                MediaStreamTrackAudioStats: false;
+                MediaStreamTrackEvent: false;
+                MediaStreamTrackGenerator: false;
+                MediaStreamTrackProcessor: false;
+                MediaStreamTrackVideoStats: false;
+                menubar: false;
+                MessageChannel: false;
+                MessageEvent: false;
+                MessagePort: false;
+                MIDIAccess: false;
+                MIDIConnectionEvent: false;
+                MIDIInput: false;
+                MIDIInputMap: false;
+                MIDIMessageEvent: false;
+                MIDIOutput: false;
+                MIDIOutputMap: false;
+                MIDIPort: false;
+                MimeType: false;
+                MimeTypeArray: false;
+                model: false;
+                ModelGenericSession: false;
+                ModelManager: false;
+                MouseEvent: false;
+                moveBy: false;
+                moveTo: false;
+                MutationEvent: false;
+                MutationObserver: false;
+                MutationRecord: false;
+                name: false;
+                NamedNodeMap: false;
+                NavigateEvent: false;
+                navigation: false;
+                Navigation: false;
+                NavigationActivation: false;
+                NavigationCurrentEntryChangeEvent: false;
+                NavigationDestination: false;
+                NavigationHistoryEntry: false;
+                NavigationPreloadManager: false;
+                NavigationTransition: false;
+                navigator: false;
+                Navigator: false;
+                NavigatorLogin: false;
+                NavigatorManagedData: false;
+                NavigatorUAData: false;
+                NetworkInformation: false;
+                Node: false;
+                NodeFilter: false;
+                NodeIterator: false;
+                NodeList: false;
+                Notification: false;
+                NotifyPaintEvent: false;
+                NotRestoredReasonDetails: false;
+                NotRestoredReasons: false;
+                OfflineAudioCompletionEvent: false;
+                OfflineAudioContext: false;
+                offscreenBuffering: false;
+                OffscreenCanvas: false;
+                OffscreenCanvasRenderingContext2D: false;
+                onabort: true;
+                onafterprint: true;
+                onanimationcancel: true;
+                onanimationend: true;
+                onanimationiteration: true;
+                onanimationstart: true;
+                onappinstalled: true;
+                onauxclick: true;
+                onbeforeinput: true;
+                onbeforeinstallprompt: true;
+                onbeforematch: true;
+                onbeforeprint: true;
+                onbeforetoggle: true;
+                onbeforeunload: true;
+                onbeforexrselect: true;
+                onblur: true;
+                oncancel: true;
+                oncanplay: true;
+                oncanplaythrough: true;
+                onchange: true;
+                onclick: true;
+                onclose: true;
+                oncontentvisibilityautostatechange: true;
+                oncontextlost: true;
+                oncontextmenu: true;
+                oncontextrestored: true;
+                oncopy: true;
+                oncuechange: true;
+                oncut: true;
+                ondblclick: true;
+                ondevicemotion: true;
+                ondeviceorientation: true;
+                ondeviceorientationabsolute: true;
+                ondrag: true;
+                ondragend: true;
+                ondragenter: true;
+                ondragleave: true;
+                ondragover: true;
+                ondragstart: true;
+                ondrop: true;
+                ondurationchange: true;
+                onemptied: true;
+                onended: true;
+                onerror: true;
+                onfocus: true;
+                onformdata: true;
+                ongamepadconnected: true;
+                ongamepaddisconnected: true;
+                ongotpointercapture: true;
+                onhashchange: true;
+                oninput: true;
+                oninvalid: true;
+                onkeydown: true;
+                onkeypress: true;
+                onkeyup: true;
+                onlanguagechange: true;
+                onload: true;
+                onloadeddata: true;
+                onloadedmetadata: true;
+                onloadstart: true;
+                onlostpointercapture: true;
+                onmessage: true;
+                onmessageerror: true;
+                onmousedown: true;
+                onmouseenter: true;
+                onmouseleave: true;
+                onmousemove: true;
+                onmouseout: true;
+                onmouseover: true;
+                onmouseup: true;
+                onmousewheel: true;
+                onoffline: true;
+                ononline: true;
+                onpagehide: true;
+                onpagereveal: true;
+                onpageshow: true;
+                onpageswap: true;
+                onpaste: true;
+                onpause: true;
+                onplay: true;
+                onplaying: true;
+                onpointercancel: true;
+                onpointerdown: true;
+                onpointerenter: true;
+                onpointerleave: true;
+                onpointermove: true;
+                onpointerout: true;
+                onpointerover: true;
+                onpointerrawupdate: true;
+                onpointerup: true;
+                onpopstate: true;
+                onprogress: true;
+                onratechange: true;
+                onrejectionhandled: true;
+                onreset: true;
+                onresize: true;
+                onscroll: true;
+                onscrollend: true;
+                onsearch: true;
+                onsecuritypolicyviolation: true;
+                onseeked: true;
+                onseeking: true;
+                onselect: true;
+                onselectionchange: true;
+                onselectstart: true;
+                onslotchange: true;
+                onstalled: true;
+                onstorage: true;
+                onsubmit: true;
+                onsuspend: true;
+                ontimeupdate: true;
+                ontoggle: true;
+                ontransitioncancel: true;
+                ontransitionend: true;
+                ontransitionrun: true;
+                ontransitionstart: true;
+                onunhandledrejection: true;
+                onunload: true;
+                onvolumechange: true;
+                onwaiting: true;
+                onwheel: true;
+                open: false;
+                opener: false;
+                Option: false;
+                OrientationSensor: false;
+                origin: false;
+                originAgentCluster: false;
+                OscillatorNode: false;
+                OTPCredential: false;
+                outerHeight: false;
+                outerWidth: false;
+                OverconstrainedError: false;
+                PageRevealEvent: false;
+                PageSwapEvent: false;
+                PageTransitionEvent: false;
+                pageXOffset: false;
+                pageYOffset: false;
+                PannerNode: false;
+                parent: false;
+                PasswordCredential: false;
+                Path2D: false;
+                PaymentAddress: false;
+                PaymentManager: false;
+                PaymentMethodChangeEvent: false;
+                PaymentRequest: false;
+                PaymentRequestUpdateEvent: false;
+                PaymentResponse: false;
+                performance: false;
+                Performance: false;
+                PerformanceElementTiming: false;
+                PerformanceEntry: false;
+                PerformanceEventTiming: false;
+                PerformanceLongAnimationFrameTiming: false;
+                PerformanceLongTaskTiming: false;
+                PerformanceMark: false;
+                PerformanceMeasure: false;
+                PerformanceNavigation: false;
+                PerformanceNavigationTiming: false;
+                PerformanceObserver: false;
+                PerformanceObserverEntryList: false;
+                PerformancePaintTiming: false;
+                PerformanceResourceTiming: false;
+                PerformanceScriptTiming: false;
+                PerformanceServerTiming: false;
+                PerformanceTiming: false;
+                PeriodicSyncManager: false;
+                PeriodicWave: false;
+                Permissions: false;
+                PermissionStatus: false;
+                PERSISTENT: false;
+                personalbar: false;
+                PictureInPictureEvent: false;
+                PictureInPictureWindow: false;
+                Plugin: false;
+                PluginArray: false;
+                PointerEvent: false;
+                PopStateEvent: false;
+                postMessage: false;
+                Presentation: false;
+                PresentationAvailability: false;
+                PresentationConnection: false;
+                PresentationConnectionAvailableEvent: false;
+                PresentationConnectionCloseEvent: false;
+                PresentationConnectionList: false;
+                PresentationReceiver: false;
+                PresentationRequest: false;
+                PressureObserver: false;
+                PressureRecord: false;
+                print: false;
+                ProcessingInstruction: false;
+                Profiler: false;
+                ProgressEvent: false;
+                PromiseRejectionEvent: false;
+                prompt: false;
+                ProtectedAudience: false;
+                PublicKeyCredential: false;
+                PushManager: false;
+                PushSubscription: false;
+                PushSubscriptionOptions: false;
+                queryLocalFonts: false;
+                queueMicrotask: false;
+                RadioNodeList: false;
+                Range: false;
+                ReadableByteStreamController: false;
+                ReadableStream: false;
+                ReadableStreamBYOBReader: false;
+                ReadableStreamBYOBRequest: false;
+                ReadableStreamDefaultController: false;
+                ReadableStreamDefaultReader: false;
+                registerProcessor: false;
+                RelativeOrientationSensor: false;
+                RemotePlayback: false;
+                removeEventListener: false;
+                reportError: false;
+                ReportingObserver: false;
+                Request: false;
+                requestAnimationFrame: false;
+                requestIdleCallback: false;
+                resizeBy: false;
+                ResizeObserver: false;
+                ResizeObserverEntry: false;
+                ResizeObserverSize: false;
+                resizeTo: false;
+                Response: false;
+                RTCCertificate: false;
+                RTCDataChannel: false;
+                RTCDataChannelEvent: false;
+                RTCDtlsTransport: false;
+                RTCDTMFSender: false;
+                RTCDTMFToneChangeEvent: false;
+                RTCEncodedAudioFrame: false;
+                RTCEncodedVideoFrame: false;
+                RTCError: false;
+                RTCErrorEvent: false;
+                RTCIceCandidate: false;
+                RTCIceTransport: false;
+                RTCPeerConnection: false;
+                RTCPeerConnectionIceErrorEvent: false;
+                RTCPeerConnectionIceEvent: false;
+                RTCRtpReceiver: false;
+                RTCRtpScriptTransform: false;
+                RTCRtpSender: false;
+                RTCRtpTransceiver: false;
+                RTCSctpTransport: false;
+                RTCSessionDescription: false;
+                RTCStatsReport: false;
+                RTCTrackEvent: false;
+                sampleRate: false;
+                scheduler: false;
+                Scheduler: false;
+                Scheduling: false;
+                screen: false;
+                Screen: false;
+                ScreenDetailed: false;
+                ScreenDetails: false;
+                screenLeft: false;
+                ScreenOrientation: false;
+                screenTop: false;
+                screenX: false;
+                screenY: false;
+                ScriptProcessorNode: false;
+                scroll: false;
+                scrollbars: false;
+                scrollBy: false;
+                ScrollTimeline: false;
+                scrollTo: false;
+                scrollX: false;
+                scrollY: false;
+                SecurityPolicyViolationEvent: false;
+                Selection: false;
+                self: false;
+                Sensor: false;
+                SensorErrorEvent: false;
+                Serial: false;
+                SerialPort: false;
+                ServiceWorker: false;
+                ServiceWorkerContainer: false;
+                ServiceWorkerRegistration: false;
+                sessionStorage: false;
+                setInterval: false;
+                setTimeout: false;
+                ShadowRoot: false;
+                sharedStorage: false;
+                SharedStorage: false;
+                SharedStorageWorklet: false;
+                SharedWorker: false;
+                showDirectoryPicker: false;
+                showOpenFilePicker: false;
+                showSaveFilePicker: false;
+                SourceBuffer: false;
+                SourceBufferList: false;
+                speechSynthesis: false;
+                SpeechSynthesis: false;
+                SpeechSynthesisErrorEvent: false;
+                SpeechSynthesisEvent: false;
+                SpeechSynthesisUtterance: false;
+                SpeechSynthesisVoice: false;
+                StaticRange: false;
+                status: false;
+                statusbar: false;
+                StereoPannerNode: false;
+                stop: false;
+                Storage: false;
+                StorageBucket: false;
+                StorageBucketManager: false;
+                StorageEvent: false;
+                StorageManager: false;
+                structuredClone: false;
+                styleMedia: false;
+                StylePropertyMap: false;
+                StylePropertyMapReadOnly: false;
+                StyleSheet: false;
+                StyleSheetList: false;
+                SubmitEvent: false;
+                SubtleCrypto: false;
+                SVGAElement: false;
+                SVGAngle: false;
+                SVGAnimatedAngle: false;
+                SVGAnimatedBoolean: false;
+                SVGAnimatedEnumeration: false;
+                SVGAnimatedInteger: false;
+                SVGAnimatedLength: false;
+                SVGAnimatedLengthList: false;
+                SVGAnimatedNumber: false;
+                SVGAnimatedNumberList: false;
+                SVGAnimatedPreserveAspectRatio: false;
+                SVGAnimatedRect: false;
+                SVGAnimatedString: false;
+                SVGAnimatedTransformList: false;
+                SVGAnimateElement: false;
+                SVGAnimateMotionElement: false;
+                SVGAnimateTransformElement: false;
+                SVGAnimationElement: false;
+                SVGCircleElement: false;
+                SVGClipPathElement: false;
+                SVGComponentTransferFunctionElement: false;
+                SVGDefsElement: false;
+                SVGDescElement: false;
+                SVGElement: false;
+                SVGEllipseElement: false;
+                SVGFEBlendElement: false;
+                SVGFEColorMatrixElement: false;
+                SVGFEComponentTransferElement: false;
+                SVGFECompositeElement: false;
+                SVGFEConvolveMatrixElement: false;
+                SVGFEDiffuseLightingElement: false;
+                SVGFEDisplacementMapElement: false;
+                SVGFEDistantLightElement: false;
+                SVGFEDropShadowElement: false;
+                SVGFEFloodElement: false;
+                SVGFEFuncAElement: false;
+                SVGFEFuncBElement: false;
+                SVGFEFuncGElement: false;
+                SVGFEFuncRElement: false;
+                SVGFEGaussianBlurElement: false;
+                SVGFEImageElement: false;
+                SVGFEMergeElement: false;
+                SVGFEMergeNodeElement: false;
+                SVGFEMorphologyElement: false;
+                SVGFEOffsetElement: false;
+                SVGFEPointLightElement: false;
+                SVGFESpecularLightingElement: false;
+                SVGFESpotLightElement: false;
+                SVGFETileElement: false;
+                SVGFETurbulenceElement: false;
+                SVGFilterElement: false;
+                SVGForeignObjectElement: false;
+                SVGGElement: false;
+                SVGGeometryElement: false;
+                SVGGradientElement: false;
+                SVGGraphicsElement: false;
+                SVGImageElement: false;
+                SVGLength: false;
+                SVGLengthList: false;
+                SVGLinearGradientElement: false;
+                SVGLineElement: false;
+                SVGMarkerElement: false;
+                SVGMaskElement: false;
+                SVGMatrix: false;
+                SVGMetadataElement: false;
+                SVGMPathElement: false;
+                SVGNumber: false;
+                SVGNumberList: false;
+                SVGPathElement: false;
+                SVGPatternElement: false;
+                SVGPoint: false;
+                SVGPointList: false;
+                SVGPolygonElement: false;
+                SVGPolylineElement: false;
+                SVGPreserveAspectRatio: false;
+                SVGRadialGradientElement: false;
+                SVGRect: false;
+                SVGRectElement: false;
+                SVGScriptElement: false;
+                SVGSetElement: false;
+                SVGStopElement: false;
+                SVGStringList: false;
+                SVGStyleElement: false;
+                SVGSVGElement: false;
+                SVGSwitchElement: false;
+                SVGSymbolElement: false;
+                SVGTextContentElement: false;
+                SVGTextElement: false;
+                SVGTextPathElement: false;
+                SVGTextPositioningElement: false;
+                SVGTitleElement: false;
+                SVGTransform: false;
+                SVGTransformList: false;
+                SVGTSpanElement: false;
+                SVGUnitTypes: false;
+                SVGUseElement: false;
+                SVGViewElement: false;
+                SyncManager: false;
+                TaskAttributionTiming: false;
+                TaskController: false;
+                TaskPriorityChangeEvent: false;
+                TaskSignal: false;
+                TEMPORARY: false;
+                Text: false;
+                TextDecoder: false;
+                TextDecoderStream: false;
+                TextEncoder: false;
+                TextEncoderStream: false;
+                TextEvent: false;
+                TextFormat: false;
+                TextFormatUpdateEvent: false;
+                TextMetrics: false;
+                TextTrack: false;
+                TextTrackCue: false;
+                TextTrackCueList: false;
+                TextTrackList: false;
+                TextUpdateEvent: false;
+                TimeEvent: false;
+                TimeRanges: false;
+                ToggleEvent: false;
+                toolbar: false;
+                top: false;
+                Touch: false;
+                TouchEvent: false;
+                TouchList: false;
+                TrackEvent: false;
+                TransformStream: false;
+                TransformStreamDefaultController: false;
+                TransitionEvent: false;
+                TreeWalker: false;
+                TrustedHTML: false;
+                TrustedScript: false;
+                TrustedScriptURL: false;
+                TrustedTypePolicy: false;
+                TrustedTypePolicyFactory: false;
+                trustedTypes: false;
+                UIEvent: false;
+                URL: false;
+                URLPattern: false;
+                URLSearchParams: false;
+                USB: false;
+                USBAlternateInterface: false;
+                USBConfiguration: false;
+                USBConnectionEvent: false;
+                USBDevice: false;
+                USBEndpoint: false;
+                USBInterface: false;
+                USBInTransferResult: false;
+                USBIsochronousInTransferPacket: false;
+                USBIsochronousInTransferResult: false;
+                USBIsochronousOutTransferPacket: false;
+                USBIsochronousOutTransferResult: false;
+                USBOutTransferResult: false;
+                UserActivation: false;
+                ValidityState: false;
+                VideoColorSpace: false;
+                VideoDecoder: false;
+                VideoEncoder: false;
+                VideoFrame: false;
+                VideoPlaybackQuality: false;
+                ViewTimeline: false;
+                ViewTransition: false;
+                ViewTransitionTypeSet: false;
+                VirtualKeyboard: false;
+                VirtualKeyboardGeometryChangeEvent: false;
+                VisibilityStateEntry: false;
+                visualViewport: false;
+                VisualViewport: false;
+                VTTCue: false;
+                VTTRegion: false;
+                WakeLock: false;
+                WakeLockSentinel: false;
+                WaveShaperNode: false;
+                WebAssembly: false;
+                WebGL2RenderingContext: false;
+                WebGLActiveInfo: false;
+                WebGLBuffer: false;
+                WebGLContextEvent: false;
+                WebGLFramebuffer: false;
+                WebGLObject: false;
+                WebGLProgram: false;
+                WebGLQuery: false;
+                WebGLRenderbuffer: false;
+                WebGLRenderingContext: false;
+                WebGLSampler: false;
+                WebGLShader: false;
+                WebGLShaderPrecisionFormat: false;
+                WebGLSync: false;
+                WebGLTexture: false;
+                WebGLTransformFeedback: false;
+                WebGLUniformLocation: false;
+                WebGLVertexArrayObject: false;
+                WebSocket: false;
+                WebSocketError: false;
+                WebSocketStream: false;
+                WebTransport: false;
+                WebTransportBidirectionalStream: false;
+                WebTransportDatagramDuplexStream: false;
+                WebTransportError: false;
+                WebTransportReceiveStream: false;
+                WebTransportSendStream: false;
+                WGSLLanguageFeatures: false;
+                WheelEvent: false;
+                window: false;
+                Window: false;
+                WindowControlsOverlay: false;
+                WindowControlsOverlayGeometryChangeEvent: false;
+                Worker: false;
+                Worklet: false;
+                WorkletGlobalScope: false;
+                WritableStream: false;
+                WritableStreamDefaultController: false;
+                WritableStreamDefaultWriter: false;
+                XMLDocument: false;
+                XMLHttpRequest: false;
+                XMLHttpRequestEventTarget: false;
+                XMLHttpRequestUpload: false;
+                XMLSerializer: false;
+                XPathEvaluator: false;
+                XPathExpression: false;
+                XPathResult: false;
+                XRAnchor: false;
+                XRAnchorSet: false;
+                XRBoundedReferenceSpace: false;
+                XRCamera: false;
+                XRCPUDepthInformation: false;
+                XRDepthInformation: false;
+                XRDOMOverlayState: false;
+                XRFrame: false;
+                XRHitTestResult: false;
+                XRHitTestSource: false;
+                XRInputSource: false;
+                XRInputSourceArray: false;
+                XRInputSourceEvent: false;
+                XRInputSourcesChangeEvent: false;
+                XRLayer: false;
+                XRLightEstimate: false;
+                XRLightProbe: false;
+                XRPose: false;
+                XRRay: false;
+                XRReferenceSpace: false;
+                XRReferenceSpaceEvent: false;
+                XRRenderState: false;
+                XRRigidTransform: false;
+                XRSession: false;
+                XRSessionEvent: false;
+                XRSpace: false;
+                XRSystem: false;
+                XRTransientInputHitTestResult: false;
+                XRTransientInputHitTestSource: false;
+                XRView: false;
+                XRViewerPose: false;
+                XRViewport: false;
+                XRWebGLBinding: false;
+                XRWebGLDepthInformation: false;
+                XRWebGLLayer: false;
+                XSLTProcessor: false;
+            };
+        };
+        rules: {
+            "compat/compat": "error";
+        };
+    };
+    legacy: {
+        env: {
+            browser: true;
+        };
+        rules: {
+            "compat/compat": "error";
+        };
+    };
+};
+export default recommended;
diff --git a/lib/esm/src/config/recommended.d.ts b/lib/esm/src/config/recommended.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/config/recommended.d.ts
+++ b/lib/esm/src/config/recommended.d.ts
@@ -0,0 +1,1138 @@
+/**
+ * @file Recommended configs for this plugin
+ */
+declare const recommended: {
+    flat: {
+        languageOptions: {
+            globals: {
+                AbortController: false;
+                AbortSignal: false;
+                AbsoluteOrientationSensor: false;
+                AbstractRange: false;
+                Accelerometer: false;
+                addEventListener: false;
+                alert: false;
+                AnalyserNode: false;
+                Animation: false;
+                AnimationEffect: false;
+                AnimationEvent: false;
+                AnimationPlaybackEvent: false;
+                AnimationTimeline: false;
+                atob: false;
+                Attr: false;
+                Audio: false;
+                AudioBuffer: false;
+                AudioBufferSourceNode: false;
+                AudioContext: false;
+                AudioData: false;
+                AudioDecoder: false;
+                AudioDestinationNode: false;
+                AudioEncoder: false;
+                AudioListener: false;
+                AudioNode: false;
+                AudioParam: false;
+                AudioParamMap: false;
+                AudioProcessingEvent: false;
+                AudioScheduledSourceNode: false;
+                AudioSinkInfo: false;
+                AudioWorklet: false;
+                AudioWorkletGlobalScope: false;
+                AudioWorkletNode: false;
+                AudioWorkletProcessor: false;
+                AuthenticatorAssertionResponse: false;
+                AuthenticatorAttestationResponse: false;
+                AuthenticatorResponse: false;
+                BackgroundFetchManager: false;
+                BackgroundFetchRecord: false;
+                BackgroundFetchRegistration: false;
+                BarProp: false;
+                BaseAudioContext: false;
+                BatteryManager: false;
+                BeforeUnloadEvent: false;
+                BiquadFilterNode: false;
+                Blob: false;
+                BlobEvent: false;
+                Bluetooth: false;
+                BluetoothCharacteristicProperties: false;
+                BluetoothDevice: false;
+                BluetoothRemoteGATTCharacteristic: false;
+                BluetoothRemoteGATTDescriptor: false;
+                BluetoothRemoteGATTServer: false;
+                BluetoothRemoteGATTService: false;
+                BluetoothUUID: false;
+                blur: false;
+                BroadcastChannel: false;
+                BrowserCaptureMediaStreamTrack: false;
+                btoa: false;
+                ByteLengthQueuingStrategy: false;
+                Cache: false;
+                caches: false;
+                CacheStorage: false;
+                cancelAnimationFrame: false;
+                cancelIdleCallback: false;
+                CanvasCaptureMediaStream: false;
+                CanvasCaptureMediaStreamTrack: false;
+                CanvasGradient: false;
+                CanvasPattern: false;
+                CanvasRenderingContext2D: false;
+                CaptureController: false;
+                CaretPosition: false;
+                CDATASection: false;
+                ChannelMergerNode: false;
+                ChannelSplitterNode: false;
+                CharacterBoundsUpdateEvent: false;
+                CharacterData: false;
+                clearInterval: false;
+                clearTimeout: false;
+                clientInformation: false;
+                Clipboard: false;
+                ClipboardEvent: false;
+                ClipboardItem: false;
+                close: false;
+                closed: false;
+                CloseEvent: false;
+                CloseWatcher: false;
+                Comment: false;
+                CompositionEvent: false;
+                CompressionStream: false;
+                confirm: false;
+                console: false;
+                ConstantSourceNode: false;
+                ContentVisibilityAutoStateChangeEvent: false;
+                ConvolverNode: false;
+                CookieChangeEvent: false;
+                CookieDeprecationLabel: false;
+                cookieStore: false;
+                CookieStore: false;
+                CookieStoreManager: false;
+                CountQueuingStrategy: false;
+                createImageBitmap: false;
+                Credential: false;
+                credentialless: false;
+                CredentialsContainer: false;
+                CropTarget: false;
+                crossOriginIsolated: false;
+                crypto: false;
+                Crypto: false;
+                CryptoKey: false;
+                CSS: false;
+                CSSAnimation: false;
+                CSSConditionRule: false;
+                CSSContainerRule: false;
+                CSSCounterStyleRule: false;
+                CSSFontFaceRule: false;
+                CSSFontFeatureValuesRule: false;
+                CSSFontPaletteValuesRule: false;
+                CSSGroupingRule: false;
+                CSSImageValue: false;
+                CSSImportRule: false;
+                CSSKeyframeRule: false;
+                CSSKeyframesRule: false;
+                CSSKeywordValue: false;
+                CSSLayerBlockRule: false;
+                CSSLayerStatementRule: false;
+                CSSMathClamp: false;
+                CSSMathInvert: false;
+                CSSMathMax: false;
+                CSSMathMin: false;
+                CSSMathNegate: false;
+                CSSMathProduct: false;
+                CSSMathSum: false;
+                CSSMathValue: false;
+                CSSMatrixComponent: false;
+                CSSMediaRule: false;
+                CSSNamespaceRule: false;
+                CSSNumericArray: false;
+                CSSNumericValue: false;
+                CSSPageRule: false;
+                CSSPerspective: false;
+                CSSPositionTryDescriptors: false;
+                CSSPositionTryRule: false;
+                CSSPositionValue: false;
+                CSSPropertyRule: false;
+                CSSRotate: false;
+                CSSRule: false;
+                CSSRuleList: false;
+                CSSScale: false;
+                CSSScopeRule: false;
+                CSSSkew: false;
+                CSSSkewX: false;
+                CSSSkewY: false;
+                CSSStartingStyleRule: false;
+                CSSStyleDeclaration: false;
+                CSSStyleRule: false;
+                CSSStyleSheet: false;
+                CSSStyleValue: false;
+                CSSSupportsRule: false;
+                CSSTransformComponent: false;
+                CSSTransformValue: false;
+                CSSTransition: false;
+                CSSTranslate: false;
+                CSSUnitValue: false;
+                CSSUnparsedValue: false;
+                CSSVariableReferenceValue: false;
+                CSSViewTransitionRule: false;
+                currentFrame: false;
+                currentTime: false;
+                CustomElementRegistry: false;
+                customElements: false;
+                CustomEvent: false;
+                CustomStateSet: false;
+                DataTransfer: false;
+                DataTransferItem: false;
+                DataTransferItemList: false;
+                DecompressionStream: false;
+                DelayNode: false;
+                DelegatedInkTrailPresenter: false;
+                DeviceMotionEvent: false;
+                DeviceMotionEventAcceleration: false;
+                DeviceMotionEventRotationRate: false;
+                DeviceOrientationEvent: false;
+                devicePixelRatio: false;
+                dispatchEvent: false;
+                document: false;
+                Document: false;
+                DocumentFragment: false;
+                documentPictureInPicture: false;
+                DocumentPictureInPicture: false;
+                DocumentPictureInPictureEvent: false;
+                DocumentTimeline: false;
+                DocumentType: false;
+                DOMError: false;
+                DOMException: false;
+                DOMImplementation: false;
+                DOMMatrix: false;
+                DOMMatrixReadOnly: false;
+                DOMParser: false;
+                DOMPoint: false;
+                DOMPointReadOnly: false;
+                DOMQuad: false;
+                DOMRect: false;
+                DOMRectList: false;
+                DOMRectReadOnly: false;
+                DOMStringList: false;
+                DOMStringMap: false;
+                DOMTokenList: false;
+                DragEvent: false;
+                DynamicsCompressorNode: false;
+                EditContext: false;
+                Element: false;
+                ElementInternals: false;
+                EncodedAudioChunk: false;
+                EncodedVideoChunk: false;
+                ErrorEvent: false;
+                event: false;
+                Event: false;
+                EventCounts: false;
+                EventSource: false;
+                EventTarget: false;
+                external: false;
+                External: false;
+                EyeDropper: false;
+                FeaturePolicy: false;
+                FederatedCredential: false;
+                fence: false;
+                Fence: false;
+                FencedFrameConfig: false;
+                fetch: false;
+                fetchLater: false;
+                FetchLaterResult: false;
+                File: false;
+                FileList: false;
+                FileReader: false;
+                FileSystem: false;
+                FileSystemDirectoryEntry: false;
+                FileSystemDirectoryHandle: false;
+                FileSystemDirectoryReader: false;
+                FileSystemEntry: false;
+                FileSystemFileEntry: false;
+                FileSystemFileHandle: false;
+                FileSystemHandle: false;
+                FileSystemWritableFileStream: false;
+                find: false;
+                Float16Array: false;
+                focus: false;
+                FocusEvent: false;
+                FontData: false;
+                FontFace: false;
+                FontFaceSet: false;
+                FontFaceSetLoadEvent: false;
+                FormData: false;
+                FormDataEvent: false;
+                FragmentDirective: false;
+                frameElement: false;
+                frames: false;
+                GainNode: false;
+                Gamepad: false;
+                GamepadAxisMoveEvent: false;
+                GamepadButton: false;
+                GamepadButtonEvent: false;
+                GamepadEvent: false;
+                GamepadHapticActuator: false;
+                GamepadPose: false;
+                Geolocation: false;
+                GeolocationCoordinates: false;
+                GeolocationPosition: false;
+                GeolocationPositionError: false;
+                getComputedStyle: false;
+                getScreenDetails: false;
+                getSelection: false;
+                GPU: false;
+                GPUAdapter: false;
+                GPUAdapterInfo: false;
+                GPUBindGroup: false;
+                GPUBindGroupLayout: false;
+                GPUBuffer: false;
+                GPUBufferUsage: false;
+                GPUCanvasContext: false;
+                GPUColorWrite: false;
+                GPUCommandBuffer: false;
+                GPUCommandEncoder: false;
+                GPUCompilationInfo: false;
+                GPUCompilationMessage: false;
+                GPUComputePassEncoder: false;
+                GPUComputePipeline: false;
+                GPUDevice: false;
+                GPUDeviceLostInfo: false;
+                GPUError: false;
+                GPUExternalTexture: false;
+                GPUInternalError: false;
+                GPUMapMode: false;
+                GPUOutOfMemoryError: false;
+                GPUPipelineError: false;
+                GPUPipelineLayout: false;
+                GPUQuerySet: false;
+                GPUQueue: false;
+                GPURenderBundle: false;
+                GPURenderBundleEncoder: false;
+                GPURenderPassEncoder: false;
+                GPURenderPipeline: false;
+                GPUSampler: false;
+                GPUShaderModule: false;
+                GPUShaderStage: false;
+                GPUSupportedFeatures: false;
+                GPUSupportedLimits: false;
+                GPUTexture: false;
+                GPUTextureUsage: false;
+                GPUTextureView: false;
+                GPUUncapturedErrorEvent: false;
+                GPUValidationError: false;
+                GravitySensor: false;
+                Gyroscope: false;
+                HashChangeEvent: false;
+                Headers: false;
+                HID: false;
+                HIDConnectionEvent: false;
+                HIDDevice: false;
+                HIDInputReportEvent: false;
+                Highlight: false;
+                HighlightRegistry: false;
+                history: false;
+                History: false;
+                HTMLAllCollection: false;
+                HTMLAnchorElement: false;
+                HTMLAreaElement: false;
+                HTMLAudioElement: false;
+                HTMLBaseElement: false;
+                HTMLBodyElement: false;
+                HTMLBRElement: false;
+                HTMLButtonElement: false;
+                HTMLCanvasElement: false;
+                HTMLCollection: false;
+                HTMLDataElement: false;
+                HTMLDataListElement: false;
+                HTMLDetailsElement: false;
+                HTMLDialogElement: false;
+                HTMLDirectoryElement: false;
+                HTMLDivElement: false;
+                HTMLDListElement: false;
+                HTMLDocument: false;
+                HTMLElement: false;
+                HTMLEmbedElement: false;
+                HTMLFencedFrameElement: false;
+                HTMLFieldSetElement: false;
+                HTMLFontElement: false;
+                HTMLFormControlsCollection: false;
+                HTMLFormElement: false;
+                HTMLFrameElement: false;
+                HTMLFrameSetElement: false;
+                HTMLHeadElement: false;
+                HTMLHeadingElement: false;
+                HTMLHRElement: false;
+                HTMLHtmlElement: false;
+                HTMLIFrameElement: false;
+                HTMLImageElement: false;
+                HTMLInputElement: false;
+                HTMLLabelElement: false;
+                HTMLLegendElement: false;
+                HTMLLIElement: false;
+                HTMLLinkElement: false;
+                HTMLMapElement: false;
+                HTMLMarqueeElement: false;
+                HTMLMediaElement: false;
+                HTMLMenuElement: false;
+                HTMLMetaElement: false;
+                HTMLMeterElement: false;
+                HTMLModElement: false;
+                HTMLObjectElement: false;
+                HTMLOListElement: false;
+                HTMLOptGroupElement: false;
+                HTMLOptionElement: false;
+                HTMLOptionsCollection: false;
+                HTMLOutputElement: false;
+                HTMLParagraphElement: false;
+                HTMLParamElement: false;
+                HTMLPictureElement: false;
+                HTMLPreElement: false;
+                HTMLProgressElement: false;
+                HTMLQuoteElement: false;
+                HTMLScriptElement: false;
+                HTMLSelectElement: false;
+                HTMLSlotElement: false;
+                HTMLSourceElement: false;
+                HTMLSpanElement: false;
+                HTMLStyleElement: false;
+                HTMLTableCaptionElement: false;
+                HTMLTableCellElement: false;
+                HTMLTableColElement: false;
+                HTMLTableElement: false;
+                HTMLTableRowElement: false;
+                HTMLTableSectionElement: false;
+                HTMLTemplateElement: false;
+                HTMLTextAreaElement: false;
+                HTMLTimeElement: false;
+                HTMLTitleElement: false;
+                HTMLTrackElement: false;
+                HTMLUListElement: false;
+                HTMLUnknownElement: false;
+                HTMLVideoElement: false;
+                IDBCursor: false;
+                IDBCursorWithValue: false;
+                IDBDatabase: false;
+                IDBFactory: false;
+                IDBIndex: false;
+                IDBKeyRange: false;
+                IDBObjectStore: false;
+                IDBOpenDBRequest: false;
+                IDBRequest: false;
+                IDBTransaction: false;
+                IDBVersionChangeEvent: false;
+                IdentityCredential: false;
+                IdentityCredentialError: false;
+                IdentityProvider: false;
+                IdleDeadline: false;
+                IdleDetector: false;
+                IIRFilterNode: false;
+                Image: false;
+                ImageBitmap: false;
+                ImageBitmapRenderingContext: false;
+                ImageCapture: false;
+                ImageData: false;
+                ImageDecoder: false;
+                ImageTrack: false;
+                ImageTrackList: false;
+                indexedDB: false;
+                Ink: false;
+                innerHeight: false;
+                innerWidth: false;
+                InputDeviceCapabilities: false;
+                InputDeviceInfo: false;
+                InputEvent: false;
+                IntersectionObserver: false;
+                IntersectionObserverEntry: false;
+                isSecureContext: false;
+                Iterator: false;
+                Keyboard: false;
+                KeyboardEvent: false;
+                KeyboardLayoutMap: false;
+                KeyframeEffect: false;
+                LargestContentfulPaint: false;
+                LaunchParams: false;
+                launchQueue: false;
+                LaunchQueue: false;
+                LayoutShift: false;
+                LayoutShiftAttribution: false;
+                length: false;
+                LinearAccelerationSensor: false;
+                localStorage: false;
+                location: true;
+                Location: false;
+                locationbar: false;
+                Lock: false;
+                LockManager: false;
+                matchMedia: false;
+                MathMLElement: false;
+                MediaCapabilities: false;
+                MediaCapabilitiesInfo: false;
+                MediaDeviceInfo: false;
+                MediaDevices: false;
+                MediaElementAudioSourceNode: false;
+                MediaEncryptedEvent: false;
+                MediaError: false;
+                MediaKeyError: false;
+                MediaKeyMessageEvent: false;
+                MediaKeys: false;
+                MediaKeySession: false;
+                MediaKeyStatusMap: false;
+                MediaKeySystemAccess: false;
+                MediaList: false;
+                MediaMetadata: false;
+                MediaQueryList: false;
+                MediaQueryListEvent: false;
+                MediaRecorder: false;
+                MediaRecorderErrorEvent: false;
+                MediaSession: false;
+                MediaSource: false;
+                MediaSourceHandle: false;
+                MediaStream: false;
+                MediaStreamAudioDestinationNode: false;
+                MediaStreamAudioSourceNode: false;
+                MediaStreamEvent: false;
+                MediaStreamTrack: false;
+                MediaStreamTrackAudioSourceNode: false;
+                MediaStreamTrackAudioStats: false;
+                MediaStreamTrackEvent: false;
+                MediaStreamTrackGenerator: false;
+                MediaStreamTrackProcessor: false;
+                MediaStreamTrackVideoStats: false;
+                menubar: false;
+                MessageChannel: false;
+                MessageEvent: false;
+                MessagePort: false;
+                MIDIAccess: false;
+                MIDIConnectionEvent: false;
+                MIDIInput: false;
+                MIDIInputMap: false;
+                MIDIMessageEvent: false;
+                MIDIOutput: false;
+                MIDIOutputMap: false;
+                MIDIPort: false;
+                MimeType: false;
+                MimeTypeArray: false;
+                model: false;
+                ModelGenericSession: false;
+                ModelManager: false;
+                MouseEvent: false;
+                moveBy: false;
+                moveTo: false;
+                MutationEvent: false;
+                MutationObserver: false;
+                MutationRecord: false;
+                name: false;
+                NamedNodeMap: false;
+                NavigateEvent: false;
+                navigation: false;
+                Navigation: false;
+                NavigationActivation: false;
+                NavigationCurrentEntryChangeEvent: false;
+                NavigationDestination: false;
+                NavigationHistoryEntry: false;
+                NavigationPreloadManager: false;
+                NavigationTransition: false;
+                navigator: false;
+                Navigator: false;
+                NavigatorLogin: false;
+                NavigatorManagedData: false;
+                NavigatorUAData: false;
+                NetworkInformation: false;
+                Node: false;
+                NodeFilter: false;
+                NodeIterator: false;
+                NodeList: false;
+                Notification: false;
+                NotifyPaintEvent: false;
+                NotRestoredReasonDetails: false;
+                NotRestoredReasons: false;
+                OfflineAudioCompletionEvent: false;
+                OfflineAudioContext: false;
+                offscreenBuffering: false;
+                OffscreenCanvas: false;
+                OffscreenCanvasRenderingContext2D: false;
+                onabort: true;
+                onafterprint: true;
+                onanimationcancel: true;
+                onanimationend: true;
+                onanimationiteration: true;
+                onanimationstart: true;
+                onappinstalled: true;
+                onauxclick: true;
+                onbeforeinput: true;
+                onbeforeinstallprompt: true;
+                onbeforematch: true;
+                onbeforeprint: true;
+                onbeforetoggle: true;
+                onbeforeunload: true;
+                onbeforexrselect: true;
+                onblur: true;
+                oncancel: true;
+                oncanplay: true;
+                oncanplaythrough: true;
+                onchange: true;
+                onclick: true;
+                onclose: true;
+                oncontentvisibilityautostatechange: true;
+                oncontextlost: true;
+                oncontextmenu: true;
+                oncontextrestored: true;
+                oncopy: true;
+                oncuechange: true;
+                oncut: true;
+                ondblclick: true;
+                ondevicemotion: true;
+                ondeviceorientation: true;
+                ondeviceorientationabsolute: true;
+                ondrag: true;
+                ondragend: true;
+                ondragenter: true;
+                ondragleave: true;
+                ondragover: true;
+                ondragstart: true;
+                ondrop: true;
+                ondurationchange: true;
+                onemptied: true;
+                onended: true;
+                onerror: true;
+                onfocus: true;
+                onformdata: true;
+                ongamepadconnected: true;
+                ongamepaddisconnected: true;
+                ongotpointercapture: true;
+                onhashchange: true;
+                oninput: true;
+                oninvalid: true;
+                onkeydown: true;
+                onkeypress: true;
+                onkeyup: true;
+                onlanguagechange: true;
+                onload: true;
+                onloadeddata: true;
+                onloadedmetadata: true;
+                onloadstart: true;
+                onlostpointercapture: true;
+                onmessage: true;
+                onmessageerror: true;
+                onmousedown: true;
+                onmouseenter: true;
+                onmouseleave: true;
+                onmousemove: true;
+                onmouseout: true;
+                onmouseover: true;
+                onmouseup: true;
+                onmousewheel: true;
+                onoffline: true;
+                ononline: true;
+                onpagehide: true;
+                onpagereveal: true;
+                onpageshow: true;
+                onpageswap: true;
+                onpaste: true;
+                onpause: true;
+                onplay: true;
+                onplaying: true;
+                onpointercancel: true;
+                onpointerdown: true;
+                onpointerenter: true;
+                onpointerleave: true;
+                onpointermove: true;
+                onpointerout: true;
+                onpointerover: true;
+                onpointerrawupdate: true;
+                onpointerup: true;
+                onpopstate: true;
+                onprogress: true;
+                onratechange: true;
+                onrejectionhandled: true;
+                onreset: true;
+                onresize: true;
+                onscroll: true;
+                onscrollend: true;
+                onsearch: true;
+                onsecuritypolicyviolation: true;
+                onseeked: true;
+                onseeking: true;
+                onselect: true;
+                onselectionchange: true;
+                onselectstart: true;
+                onslotchange: true;
+                onstalled: true;
+                onstorage: true;
+                onsubmit: true;
+                onsuspend: true;
+                ontimeupdate: true;
+                ontoggle: true;
+                ontransitioncancel: true;
+                ontransitionend: true;
+                ontransitionrun: true;
+                ontransitionstart: true;
+                onunhandledrejection: true;
+                onunload: true;
+                onvolumechange: true;
+                onwaiting: true;
+                onwheel: true;
+                open: false;
+                opener: false;
+                Option: false;
+                OrientationSensor: false;
+                origin: false;
+                originAgentCluster: false;
+                OscillatorNode: false;
+                OTPCredential: false;
+                outerHeight: false;
+                outerWidth: false;
+                OverconstrainedError: false;
+                PageRevealEvent: false;
+                PageSwapEvent: false;
+                PageTransitionEvent: false;
+                pageXOffset: false;
+                pageYOffset: false;
+                PannerNode: false;
+                parent: false;
+                PasswordCredential: false;
+                Path2D: false;
+                PaymentAddress: false;
+                PaymentManager: false;
+                PaymentMethodChangeEvent: false;
+                PaymentRequest: false;
+                PaymentRequestUpdateEvent: false;
+                PaymentResponse: false;
+                performance: false;
+                Performance: false;
+                PerformanceElementTiming: false;
+                PerformanceEntry: false;
+                PerformanceEventTiming: false;
+                PerformanceLongAnimationFrameTiming: false;
+                PerformanceLongTaskTiming: false;
+                PerformanceMark: false;
+                PerformanceMeasure: false;
+                PerformanceNavigation: false;
+                PerformanceNavigationTiming: false;
+                PerformanceObserver: false;
+                PerformanceObserverEntryList: false;
+                PerformancePaintTiming: false;
+                PerformanceResourceTiming: false;
+                PerformanceScriptTiming: false;
+                PerformanceServerTiming: false;
+                PerformanceTiming: false;
+                PeriodicSyncManager: false;
+                PeriodicWave: false;
+                Permissions: false;
+                PermissionStatus: false;
+                PERSISTENT: false;
+                personalbar: false;
+                PictureInPictureEvent: false;
+                PictureInPictureWindow: false;
+                Plugin: false;
+                PluginArray: false;
+                PointerEvent: false;
+                PopStateEvent: false;
+                postMessage: false;
+                Presentation: false;
+                PresentationAvailability: false;
+                PresentationConnection: false;
+                PresentationConnectionAvailableEvent: false;
+                PresentationConnectionCloseEvent: false;
+                PresentationConnectionList: false;
+                PresentationReceiver: false;
+                PresentationRequest: false;
+                PressureObserver: false;
+                PressureRecord: false;
+                print: false;
+                ProcessingInstruction: false;
+                Profiler: false;
+                ProgressEvent: false;
+                PromiseRejectionEvent: false;
+                prompt: false;
+                ProtectedAudience: false;
+                PublicKeyCredential: false;
+                PushManager: false;
+                PushSubscription: false;
+                PushSubscriptionOptions: false;
+                queryLocalFonts: false;
+                queueMicrotask: false;
+                RadioNodeList: false;
+                Range: false;
+                ReadableByteStreamController: false;
+                ReadableStream: false;
+                ReadableStreamBYOBReader: false;
+                ReadableStreamBYOBRequest: false;
+                ReadableStreamDefaultController: false;
+                ReadableStreamDefaultReader: false;
+                registerProcessor: false;
+                RelativeOrientationSensor: false;
+                RemotePlayback: false;
+                removeEventListener: false;
+                reportError: false;
+                ReportingObserver: false;
+                Request: false;
+                requestAnimationFrame: false;
+                requestIdleCallback: false;
+                resizeBy: false;
+                ResizeObserver: false;
+                ResizeObserverEntry: false;
+                ResizeObserverSize: false;
+                resizeTo: false;
+                Response: false;
+                RTCCertificate: false;
+                RTCDataChannel: false;
+                RTCDataChannelEvent: false;
+                RTCDtlsTransport: false;
+                RTCDTMFSender: false;
+                RTCDTMFToneChangeEvent: false;
+                RTCEncodedAudioFrame: false;
+                RTCEncodedVideoFrame: false;
+                RTCError: false;
+                RTCErrorEvent: false;
+                RTCIceCandidate: false;
+                RTCIceTransport: false;
+                RTCPeerConnection: false;
+                RTCPeerConnectionIceErrorEvent: false;
+                RTCPeerConnectionIceEvent: false;
+                RTCRtpReceiver: false;
+                RTCRtpScriptTransform: false;
+                RTCRtpSender: false;
+                RTCRtpTransceiver: false;
+                RTCSctpTransport: false;
+                RTCSessionDescription: false;
+                RTCStatsReport: false;
+                RTCTrackEvent: false;
+                sampleRate: false;
+                scheduler: false;
+                Scheduler: false;
+                Scheduling: false;
+                screen: false;
+                Screen: false;
+                ScreenDetailed: false;
+                ScreenDetails: false;
+                screenLeft: false;
+                ScreenOrientation: false;
+                screenTop: false;
+                screenX: false;
+                screenY: false;
+                ScriptProcessorNode: false;
+                scroll: false;
+                scrollbars: false;
+                scrollBy: false;
+                ScrollTimeline: false;
+                scrollTo: false;
+                scrollX: false;
+                scrollY: false;
+                SecurityPolicyViolationEvent: false;
+                Selection: false;
+                self: false;
+                Sensor: false;
+                SensorErrorEvent: false;
+                Serial: false;
+                SerialPort: false;
+                ServiceWorker: false;
+                ServiceWorkerContainer: false;
+                ServiceWorkerRegistration: false;
+                sessionStorage: false;
+                setInterval: false;
+                setTimeout: false;
+                ShadowRoot: false;
+                sharedStorage: false;
+                SharedStorage: false;
+                SharedStorageWorklet: false;
+                SharedWorker: false;
+                showDirectoryPicker: false;
+                showOpenFilePicker: false;
+                showSaveFilePicker: false;
+                SourceBuffer: false;
+                SourceBufferList: false;
+                speechSynthesis: false;
+                SpeechSynthesis: false;
+                SpeechSynthesisErrorEvent: false;
+                SpeechSynthesisEvent: false;
+                SpeechSynthesisUtterance: false;
+                SpeechSynthesisVoice: false;
+                StaticRange: false;
+                status: false;
+                statusbar: false;
+                StereoPannerNode: false;
+                stop: false;
+                Storage: false;
+                StorageBucket: false;
+                StorageBucketManager: false;
+                StorageEvent: false;
+                StorageManager: false;
+                structuredClone: false;
+                styleMedia: false;
+                StylePropertyMap: false;
+                StylePropertyMapReadOnly: false;
+                StyleSheet: false;
+                StyleSheetList: false;
+                SubmitEvent: false;
+                SubtleCrypto: false;
+                SVGAElement: false;
+                SVGAngle: false;
+                SVGAnimatedAngle: false;
+                SVGAnimatedBoolean: false;
+                SVGAnimatedEnumeration: false;
+                SVGAnimatedInteger: false;
+                SVGAnimatedLength: false;
+                SVGAnimatedLengthList: false;
+                SVGAnimatedNumber: false;
+                SVGAnimatedNumberList: false;
+                SVGAnimatedPreserveAspectRatio: false;
+                SVGAnimatedRect: false;
+                SVGAnimatedString: false;
+                SVGAnimatedTransformList: false;
+                SVGAnimateElement: false;
+                SVGAnimateMotionElement: false;
+                SVGAnimateTransformElement: false;
+                SVGAnimationElement: false;
+                SVGCircleElement: false;
+                SVGClipPathElement: false;
+                SVGComponentTransferFunctionElement: false;
+                SVGDefsElement: false;
+                SVGDescElement: false;
+                SVGElement: false;
+                SVGEllipseElement: false;
+                SVGFEBlendElement: false;
+                SVGFEColorMatrixElement: false;
+                SVGFEComponentTransferElement: false;
+                SVGFECompositeElement: false;
+                SVGFEConvolveMatrixElement: false;
+                SVGFEDiffuseLightingElement: false;
+                SVGFEDisplacementMapElement: false;
+                SVGFEDistantLightElement: false;
+                SVGFEDropShadowElement: false;
+                SVGFEFloodElement: false;
+                SVGFEFuncAElement: false;
+                SVGFEFuncBElement: false;
+                SVGFEFuncGElement: false;
+                SVGFEFuncRElement: false;
+                SVGFEGaussianBlurElement: false;
+                SVGFEImageElement: false;
+                SVGFEMergeElement: false;
+                SVGFEMergeNodeElement: false;
+                SVGFEMorphologyElement: false;
+                SVGFEOffsetElement: false;
+                SVGFEPointLightElement: false;
+                SVGFESpecularLightingElement: false;
+                SVGFESpotLightElement: false;
+                SVGFETileElement: false;
+                SVGFETurbulenceElement: false;
+                SVGFilterElement: false;
+                SVGForeignObjectElement: false;
+                SVGGElement: false;
+                SVGGeometryElement: false;
+                SVGGradientElement: false;
+                SVGGraphicsElement: false;
+                SVGImageElement: false;
+                SVGLength: false;
+                SVGLengthList: false;
+                SVGLinearGradientElement: false;
+                SVGLineElement: false;
+                SVGMarkerElement: false;
+                SVGMaskElement: false;
+                SVGMatrix: false;
+                SVGMetadataElement: false;
+                SVGMPathElement: false;
+                SVGNumber: false;
+                SVGNumberList: false;
+                SVGPathElement: false;
+                SVGPatternElement: false;
+                SVGPoint: false;
+                SVGPointList: false;
+                SVGPolygonElement: false;
+                SVGPolylineElement: false;
+                SVGPreserveAspectRatio: false;
+                SVGRadialGradientElement: false;
+                SVGRect: false;
+                SVGRectElement: false;
+                SVGScriptElement: false;
+                SVGSetElement: false;
+                SVGStopElement: false;
+                SVGStringList: false;
+                SVGStyleElement: false;
+                SVGSVGElement: false;
+                SVGSwitchElement: false;
+                SVGSymbolElement: false;
+                SVGTextContentElement: false;
+                SVGTextElement: false;
+                SVGTextPathElement: false;
+                SVGTextPositioningElement: false;
+                SVGTitleElement: false;
+                SVGTransform: false;
+                SVGTransformList: false;
+                SVGTSpanElement: false;
+                SVGUnitTypes: false;
+                SVGUseElement: false;
+                SVGViewElement: false;
+                SyncManager: false;
+                TaskAttributionTiming: false;
+                TaskController: false;
+                TaskPriorityChangeEvent: false;
+                TaskSignal: false;
+                TEMPORARY: false;
+                Text: false;
+                TextDecoder: false;
+                TextDecoderStream: false;
+                TextEncoder: false;
+                TextEncoderStream: false;
+                TextEvent: false;
+                TextFormat: false;
+                TextFormatUpdateEvent: false;
+                TextMetrics: false;
+                TextTrack: false;
+                TextTrackCue: false;
+                TextTrackCueList: false;
+                TextTrackList: false;
+                TextUpdateEvent: false;
+                TimeEvent: false;
+                TimeRanges: false;
+                ToggleEvent: false;
+                toolbar: false;
+                top: false;
+                Touch: false;
+                TouchEvent: false;
+                TouchList: false;
+                TrackEvent: false;
+                TransformStream: false;
+                TransformStreamDefaultController: false;
+                TransitionEvent: false;
+                TreeWalker: false;
+                TrustedHTML: false;
+                TrustedScript: false;
+                TrustedScriptURL: false;
+                TrustedTypePolicy: false;
+                TrustedTypePolicyFactory: false;
+                trustedTypes: false;
+                UIEvent: false;
+                URL: false;
+                URLPattern: false;
+                URLSearchParams: false;
+                USB: false;
+                USBAlternateInterface: false;
+                USBConfiguration: false;
+                USBConnectionEvent: false;
+                USBDevice: false;
+                USBEndpoint: false;
+                USBInterface: false;
+                USBInTransferResult: false;
+                USBIsochronousInTransferPacket: false;
+                USBIsochronousInTransferResult: false;
+                USBIsochronousOutTransferPacket: false;
+                USBIsochronousOutTransferResult: false;
+                USBOutTransferResult: false;
+                UserActivation: false;
+                ValidityState: false;
+                VideoColorSpace: false;
+                VideoDecoder: false;
+                VideoEncoder: false;
+                VideoFrame: false;
+                VideoPlaybackQuality: false;
+                ViewTimeline: false;
+                ViewTransition: false;
+                ViewTransitionTypeSet: false;
+                VirtualKeyboard: false;
+                VirtualKeyboardGeometryChangeEvent: false;
+                VisibilityStateEntry: false;
+                visualViewport: false;
+                VisualViewport: false;
+                VTTCue: false;
+                VTTRegion: false;
+                WakeLock: false;
+                WakeLockSentinel: false;
+                WaveShaperNode: false;
+                WebAssembly: false;
+                WebGL2RenderingContext: false;
+                WebGLActiveInfo: false;
+                WebGLBuffer: false;
+                WebGLContextEvent: false;
+                WebGLFramebuffer: false;
+                WebGLObject: false;
+                WebGLProgram: false;
+                WebGLQuery: false;
+                WebGLRenderbuffer: false;
+                WebGLRenderingContext: false;
+                WebGLSampler: false;
+                WebGLShader: false;
+                WebGLShaderPrecisionFormat: false;
+                WebGLSync: false;
+                WebGLTexture: false;
+                WebGLTransformFeedback: false;
+                WebGLUniformLocation: false;
+                WebGLVertexArrayObject: false;
+                WebSocket: false;
+                WebSocketError: false;
+                WebSocketStream: false;
+                WebTransport: false;
+                WebTransportBidirectionalStream: false;
+                WebTransportDatagramDuplexStream: false;
+                WebTransportError: false;
+                WebTransportReceiveStream: false;
+                WebTransportSendStream: false;
+                WGSLLanguageFeatures: false;
+                WheelEvent: false;
+                window: false;
+                Window: false;
+                WindowControlsOverlay: false;
+                WindowControlsOverlayGeometryChangeEvent: false;
+                Worker: false;
+                Worklet: false;
+                WorkletGlobalScope: false;
+                WritableStream: false;
+                WritableStreamDefaultController: false;
+                WritableStreamDefaultWriter: false;
+                XMLDocument: false;
+                XMLHttpRequest: false;
+                XMLHttpRequestEventTarget: false;
+                XMLHttpRequestUpload: false;
+                XMLSerializer: false;
+                XPathEvaluator: false;
+                XPathExpression: false;
+                XPathResult: false;
+                XRAnchor: false;
+                XRAnchorSet: false;
+                XRBoundedReferenceSpace: false;
+                XRCamera: false;
+                XRCPUDepthInformation: false;
+                XRDepthInformation: false;
+                XRDOMOverlayState: false;
+                XRFrame: false;
+                XRHitTestResult: false;
+                XRHitTestSource: false;
+                XRInputSource: false;
+                XRInputSourceArray: false;
+                XRInputSourceEvent: false;
+                XRInputSourcesChangeEvent: false;
+                XRLayer: false;
+                XRLightEstimate: false;
+                XRLightProbe: false;
+                XRPose: false;
+                XRRay: false;
+                XRReferenceSpace: false;
+                XRReferenceSpaceEvent: false;
+                XRRenderState: false;
+                XRRigidTransform: false;
+                XRSession: false;
+                XRSessionEvent: false;
+                XRSpace: false;
+                XRSystem: false;
+                XRTransientInputHitTestResult: false;
+                XRTransientInputHitTestSource: false;
+                XRView: false;
+                XRViewerPose: false;
+                XRViewport: false;
+                XRWebGLBinding: false;
+                XRWebGLDepthInformation: false;
+                XRWebGLLayer: false;
+                XSLTProcessor: false;
+            };
+        };
+        rules: {
+            "compat/compat": "error";
+        };
+    };
+    legacy: {
+        env: {
+            browser: true;
+        };
+        rules: {
+            "compat/compat": "error";
+        };
+    };
+};
+export default recommended;
diff --git a/lib/cjs/src/types.d.ts b/lib/cjs/src/types.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/cjs/src/types.d.ts
+++ b/lib/cjs/src/types.d.ts
@@ -0,0 +1,56 @@
+import { APIKind } from "ast-metadata-inferer/lib/types";
+import { Rule } from "eslint";
+import { TargetNameMappings } from "./constants";
+import type { Options as DefaultBrowsersListOpts } from "browserslist";
+export type BrowserListConfig = string | Array<string> | {
+    production?: Array<string>;
+    development?: Array<string>;
+} | null;
+type AstMetadataApi = {
+    type?: string;
+    name?: string;
+    object: string;
+    astNodeType: "MemberExpression" | "CallExpression" | "NewExpression";
+    property?: string;
+    protoChainId: string;
+    protoChain: Array<string>;
+};
+export interface Target {
+    target: keyof TargetNameMappings;
+    parsedVersion: number;
+    version: number | string | "all";
+}
+export type HandleFailingRule = (node: AstMetadataApiWithTargetsResolver, eslintNode: ESLintNode) => void;
+export type TargetNames = Array<string>;
+export type ESLintNode = {
+    name: string;
+    type: string;
+    value?: unknown;
+    object?: ESLintNode;
+    parent?: ESLintNode;
+    expression?: ESLintNode;
+    property?: ESLintNode;
+    callee?: ESLintNode & {
+        name: string;
+        type?: string;
+    };
+};
+export type SourceCode = import("eslint").SourceCode;
+export interface AstMetadataApiWithTargetsResolver extends AstMetadataApi {
+    id: string;
+    caniuseId?: string;
+    kind?: APIKind;
+    getUnsupportedTargets: (node: AstMetadataApiWithTargetsResolver, targets: Target[]) => Array<string>;
+}
+export interface Context extends Rule.RuleContext {
+    settings: {
+        targets?: string[];
+        browsers?: Array<string>;
+        polyfills?: Array<string>;
+        lintAllEsApis?: boolean;
+        browserslistOpts?: BrowsersListOpts;
+    };
+}
+export interface BrowsersListOpts extends Exclude<DefaultBrowsersListOpts, "path"> {
+}
+export {};
diff --git a/lib/esm/src/types.d.ts b/lib/esm/src/types.d.ts
new file mode 100644
index v4.2.0..v6.0.0 
--- a/lib/esm/src/types.d.ts
+++ b/lib/esm/src/types.d.ts
@@ -0,0 +1,56 @@
+import { APIKind } from "ast-metadata-inferer/lib/types";
+import { Rule } from "eslint";
+import { TargetNameMappings } from "./constants";
+import type { Options as DefaultBrowsersListOpts } from "browserslist";
+export type BrowserListConfig = string | Array<string> | {
+    production?: Array<string>;
+    development?: Array<string>;
+} | null;
+type AstMetadataApi = {
+    type?: string;
+    name?: string;
+    object: string;
+    astNodeType: "MemberExpression" | "CallExpression" | "NewExpression";
+    property?: string;
+    protoChainId: string;
+    protoChain: Array<string>;
+};
+export interface Target {
+    target: keyof TargetNameMappings;
+    parsedVersion: number;
+    version: number | string | "all";
+}
+export type HandleFailingRule = (node: AstMetadataApiWithTargetsResolver, eslintNode: ESLintNode) => void;
+export type TargetNames = Array<string>;
+export type ESLintNode = {
+    name: string;
+    type: string;
+    value?: unknown;
+    object?: ESLintNode;
+    parent?: ESLintNode;
+    expression?: ESLintNode;
+    property?: ESLintNode;
+    callee?: ESLintNode & {
+        name: string;
+        type?: string;
+    };
+};
+export type SourceCode = import("eslint").SourceCode;
+export interface AstMetadataApiWithTargetsResolver extends AstMetadataApi {
+    id: string;
+    caniuseId?: string;
+    kind?: APIKind;
+    getUnsupportedTargets: (node: AstMetadataApiWithTargetsResolver, targets: Target[]) => Array<string>;
+}
+export interface Context extends Rule.RuleContext {
+    settings: {
+        targets?: string[];
+        browsers?: Array<string>;
+        polyfills?: Array<string>;
+        lintAllEsApis?: boolean;
+        browserslistOpts?: BrowsersListOpts;
+    };
+}
+export interface BrowsersListOpts extends Exclude<DefaultBrowsersListOpts, "path"> {
+}
+export {};
Size Files
43.5 KB → 185.5 KB (+142.0 KB 🟡) 12 → 41 (+29 🟡)
Command details
npm diff --diff=eslint-plugin-compat@4.2.0 --diff=eslint-plugin-compat@6.0.0 --diff-unified=2

See also the npm diff document.

Reported by ybiquitous/npm-diff-action@v1.6.0 (Node.js 22.5.1 and npm 10.8.2)

@ybiquitous ybiquitous changed the title build(deps): bump eslint-plugin-compat from 4.2.0 to 6.0.0 feat(deps): bump eslint-plugin-compat from 4.2.0 to 6.0.0 Aug 1, 2024
@ybiquitous ybiquitous merged commit e97ff04 into main Aug 1, 2024
7 checks passed
@ybiquitous ybiquitous deleted the dependabot/npm_and_yarn/eslint-plugin-compat-6.0.0 branch August 1, 2024 14:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file javascript Pull requests that update Javascript code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant