Ctrl K
ComunidadGuías…

eslint.config.mjs

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import globals from "globals"
import babelParser from "@babel/eslint-parser"
import svelteParser from "svelte-eslint-parser"
import tsParser from "@typescript-eslint/parser"

import eslintPluginJest from "eslint-plugin-jest"
import eslintPluginSvelte from "eslint-plugin-svelte"
import eslintPluginLocalRules from "eslint-plugin-local-rules"
import eslintPluginVitest from "@vitest/eslint-plugin"

import eslint from "@eslint/js"
import tseslint from "typescript-eslint"

export default [
  eslint.configs.recommended,
  {
    ignores: [
      "**/node_modules",
      "**/dist",
      "**/.svelte-check/**",
      "**/public",
      "**/bundle.js",
      "**/coverage",
      "packages/server/builder",
      "packages/server/client",
      "packages/builder/.routify",
      "packages/sdk/sdk",
      "**/*.ivm.bundle.js",
    ],
  },
  {
    plugins: {
      "local-rules": eslintPluginLocalRules,
    },

    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.jest,
        ...globals.node,
        GeolocationPositionError: true,
        RequestInit: true,
      },

      parser: babelParser,
      ecmaVersion: 2020,
      sourceType: "module",

      parserOptions: {
        allowImportExportEverywhere: true,
        svelteFeatures: {
          experimentalGenerics: true,
        },
      },
    },

    rules: {
      "no-eval": "error",
      "no-new-func": "error",
      "no-self-compare": "error",
      "no-template-curly-in-string": "error",
      "no-unmodified-loop-condition": "error",
      "no-unreachable-loop": "error",
      "no-implied-eval": "error",
      "no-extend-native": "error",
      "no-labels": "error",
      "no-lone-blocks": "error",
      "no-new-wrappers": "error",
      "no-octal-escape": "error",
      "no-return-assign": "error",
      "no-useless-concat": "error",
      "no-useless-constructor": "error",
      "no-useless-rename": "error",
      "no-var": "error",
      "no-void": "error",

      "no-unused-vars": [
        "error",
        {
          varsIgnorePattern: "^_",
          argsIgnorePattern: "^_",
          destructuredArrayIgnorePattern: "^_",
          ignoreRestSiblings: true,
          caughtErrors: "none",
        },
      ],
    },
  },
  ...eslintPluginSvelte.configs["flat/recommended"].map(config => ({
    ...config,
    files: ["**/*.svelte"],

    languageOptions: {
      parser: svelteParser,
      ecmaVersion: 2019,
      sourceType: "script",

      parserOptions: {
        parser: "@typescript-eslint/parser",
        allowImportExportEverywhere: true,
      },
    },

    plugins: {
      ...config.plugins,
      "@typescript-eslint": tseslint.plugin,
    },
    rules: {
      ...config.rules,
      "@typescript-eslint/consistent-type-imports": "error",
      "no-unused-vars": "off",
      "@typescript-eslint/no-unused-vars": [
        "error",
        {
          varsIgnorePattern: "^_",
          argsIgnorePattern: "^_",
          destructuredArrayIgnorePattern: "^_",
          ignoreRestSiblings: true,
          caughtErrors: "none",
        },
      ],

      "local-rules/require-svelte-ts": "warn",

      // Temporarily disabled during Svelte 5 migration - re-enable incrementally
      "svelte/require-each-key": "off", // 316 errors - add keys to {#each} blocks
      "svelte/no-reactive-reassign": "off", // 35 errors - fix reactive value reassignments
      "svelte/no-reactive-functions": "off",
      "svelte/no-dupe-on-directives": "off",
      "svelte/infinite-reactive-loop": "off",
      "svelte/no-immutable-reactive-statements": "off",
      "svelte/prefer-svelte-reactivity": "off",
      "svelte/no-reactive-literals": "off",
      "svelte/no-dom-manipulating": "off",
      "svelte/no-unused-svelte-ignore": "off",
      "svelte/no-useless-mustaches": "off",
    },
  })),
  ...tseslint.configs.strict.map(config => ({
    ...config,
    files: ["**/*.ts"],

    languageOptions: {
      globals: {
        NodeJS: true,
      },

      parser: tsParser,
    },

    rules: {
      "local-rules/no-barrel-imports": "error",
      "local-rules/no-budibase-imports": "error",
      "local-rules/no-console-error": "error",
      "no-restricted-imports": [
        "error",
        {
          paths: [
            {
              name: "vm",
              message: "Use isolated-vm or an approved wrapper instead.",
            },
            {
              name: "node:vm",
              message: "Use isolated-vm or an approved wrapper instead.",
            },
          ],
        },
      ],

      "@typescript-eslint/no-inferrable-types": "error",
      "@typescript-eslint/adjacent-overload-signatures": "error",
      "@typescript-eslint/class-literal-property-style": "error",
      "@typescript-eslint/no-confusing-non-null-assertion": "error",
      "@typescript-eslint/no-unnecessary-parameter-property-assignment":
        "error",
      "@typescript-eslint/no-useless-empty-export": "error",

      "no-unused-vars": "off",
      "@typescript-eslint/no-unused-vars": [
        "error",
        {
          varsIgnorePattern: "^_",
          argsIgnorePattern: "^_",
          destructuredArrayIgnorePattern: "^_",
          ignoreRestSiblings: true,
          caughtErrors: "none",
        },
      ],

      "no-redeclare": "off",
      "@typescript-eslint/no-redeclare": "error",

      // @typescript-eslint/no-dupe-class-members supersedes no-dupe-class-members
      "no-dupe-class-members": "off",
      "@typescript-eslint/no-dupe-class-members": "error",

      "no-useless-constructor": "off",
      "@typescript-eslint/no-useless-constructor": "error",
    },
  })),
  {
    files: ["**/*.spec.ts", "**/*.spec.js"],

    plugins: {
      jest: eslintPluginJest,
      vitest: eslintPluginVitest,
    },

    languageOptions: {
      globals: {
        ...eslintPluginJest.environments.globals.globals,
        ...eslintPluginVitest.environments.env.globals,
        NodeJS: true,
      },

      parser: tsParser,
    },

    rules: {
      ...eslintPluginVitest.configs.recommended.rules,
      ...eslintPluginJest.configs.recommended.rules,

      "no-console": "warn",

      "vitest/expect-expect": "off",

      "jest/expect-expect": "off",
      "jest/no-conditional-expect": "off",
      "jest/no-disabled-tests": "off",
      "jest/no-standalone-expect": "off",

      "local-rules/no-test-com": "error",
      "local-rules/email-domain-example-com": "error",
    },
  },
  {
    files: [
      "packages/string-templates/src/helpers/javascript.ts",
      "packages/server/src/db/inMemoryView.ts",
      "packages/server/src/jsRunner/bundles/snippets.ts",
      "packages/builder/src/components/backend/Datasources/ConfigEditor/stores/validatedConfig.ts",
    ],

    rules: {
      "no-eval": "off",
    },
  },
  {
    files: ["packages/string-templates/src/index.ts"],

    rules: {
      "no-restricted-imports": "off",
    },
  },
  {
    files: ["packages/server/src/sdk/workspace/**/*.{ts,js}"],

    rules: {
      "local-rules/no-context-getglobaldb": "error",
    },
  },
  {
    files: [
      "packages/builder/**/*",
      "packages/bbui/**/*",
      "packages/client/**/*",
      "packages/frontend-core/**/*",
    ],

    rules: {
      "local-rules/no-frontend-randomuuid": "error",
      "no-console": [
        "error",
        {
          allow: ["warn", "error", "debug"],
        },
      ],
    },
  },
  {
    files: ["packages/client/scripts/**/*"],

    rules: {
      "no-console": "off",
    },
  },
]