/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */

import js from "@eslint/js";
import prettier from "eslint-config-prettier";
import prettierPlugin from "eslint-plugin-prettier";
import globals from "globals";

export default [
  js.configs.recommended,
  prettier,
  {
    plugins: {
      prettier: prettierPlugin,
    },
    languageOptions: {
      ecmaVersion: 2022,
      sourceType: "commonjs",
      globals: {
        ...globals.node,
        ...globals.commonjs,
        ...globals.mocha,
        BigInt: "readonly",
      },
    },
    rules: {
      "prettier/prettier": ["error", { endOfLine: "auto" }],
      "linebreak-style": 0,
      quotes: ["error", "single"],
      semi: ["error", "always"],
      "no-constant-condition": ["error", { checkLoops: false }],
      strict: ["error", "global"],
      "array-callback-return": "error",
      curly: "error",
      "no-unused-vars": ["error", { args: "none" }],
      "global-require": "error",
      eqeqeq: ["error", "allow-null"],
      "guard-for-in": "error",
      "no-alert": "error",
      "no-caller": "error",
      "no-case-declarations": "error",
      "no-else-return": "error",
      "no-empty-pattern": "error",
      "no-eval": "error",
      "no-extend-native": "error",
      "no-extra-bind": "error",
      "no-extra-label": "error",
      "no-floating-decimal": "error",
      "no-global-assign": ["error", { exceptions: [] }],
      "no-implicit-coercion": [
        "off",
        {
          boolean: false,
          number: true,
          string: true,
          allow: [],
        },
      ],
      "no-implied-eval": "error",
      "no-labels": ["error", { allowLoop: false, allowSwitch: false }],
      "no-lone-blocks": "error",
      "no-loop-func": "error",
      "no-multi-spaces": "error",
      "no-new": "error",
      "no-new-func": "error",
      "no-new-wrappers": "error",
      "no-octal-escape": "error",
      "no-proto": "error",
      "no-prototype-builtins": 0,
      "no-redeclare": "error",
      "no-restricted-properties": [
        "error",
        {
          object: "arguments",
          property: "callee",
          message: "arguments.callee is deprecated",
        },
        {
          property: "__defineGetter__",
          message: "Please use Object.defineProperty instead.",
        },
        {
          property: "__defineSetter__",
          message: "Please use Object.defineProperty instead.",
        },
      ],
      "no-self-assign": "error",
      "no-self-compare": "error",
      "no-sequences": "error",
      "no-throw-literal": "error",
      "no-unmodified-loop-condition": "off",
      "no-unused-expressions": [
        "error",
        {
          allowShortCircuit: false,
          allowTernary: false,
        },
      ],
      "no-useless-call": "off",
      "no-useless-concat": "error",
      "no-useless-escape": "error",
      "no-useless-return": "error",
      "no-void": "error",
      "no-with": "error",
      "no-buffer-constructor": "error",
      radix: "error",
      "no-var": "error",
      "prefer-const": "error",
      "arrow-body-style": ["error", "as-needed"],
      "arrow-spacing": "error",
      "no-confusing-arrow": ["error", { allowParens: true }],
      yoda: "error",
      "constructor-super": "error",
      "require-await": "error",
      "require-atomic-updates": "off",
    },
  },
  {
    ignores: ["test/**/*.js", "doc/**/*.js", "node_modules/**/*", ".prettierrc.js", "eslint.config.mjs"],
  },
  {
    files: ["eslint.config.mjs"],
    languageOptions: {
      sourceType: "module",
    },
  },
];
