{"version":3,"file":"index.mjs","names":["pluginConfigs","jsdoc","jsdocPlugin","NodeType","#aliasMap","#rootDir","#configPath","#moduleName","#requireModule","NodeType","NodeType","NodeType","noInvalidModules","noInvalidHierarchy","defineEslintConfig","jsdoc"],"sources":["../../src/utils/utils.ts","../../src/eslint/shared/env-utils.ts","../../src/eslint/shared/restricted.ts","../../src/eslint/core/base.ts","../../src/eslint/core/js.ts","../../src/eslint/core/ts.ts","../../src/eslint/core/vue.ts","../../src/eslint/core/json.ts","../../src/eslint/core/yaml.ts","../../src/eslint/core/markdown.ts","../../src/eslint/core/license.ts","../../src/eslint/core/directives.ts","../../src/eslint/core/packages.ts","../../src/eslint/core/regexp.ts","../../src/eslint/core/promises.ts","../../src/eslint/core/jsdoc.ts","../../src/eslint/core/stylistic.ts","../../src/eslint/env/node.ts","../../src/eslint/env/browser.ts","../../src/eslint/shared/unittest.ts","../../src/eslint/env/jest.ts","../../src/eslint/env/vitest.ts","../../src/eslint/env/codecept.ts","../../src/eslint/shared/rule-utils.ts","../../src/eslint/rules/react/jsxShorthandBoolean.ts","../../src/eslint/rules/react/preferDestructuringAssignment.ts","../../src/eslint/env/react.ts","../../src/eslint/env/eslint.ts","../../src/eslint/rules/project/noInvalidModules.ts","../../src/eslint/rules/project/noInvalidHierarchy.ts","../../src/eslint/env/project.ts","../../src/eslint/env/tsconfig.ts","../../src/eslint/env/decorators.ts","../../src/eslint/index.ts"],"sourcesContent":["\n// types ======================================================================\n\nexport type DeepRequired<T> = {\n  [key in keyof T]-?: DeepRequired<T[key]>\n}\n\nexport type DeepOptArray<T> = T | false | null | undefined | ReadonlyArray<DeepOptArray<T>>\n\n// functions ==================================================================\n\n/**\n * Creates an iterator that visits all truthy elements of all deeply nested\n * arrays.\n *\n * @template T\n *  The element type of the array.\n *\n * @param arrays\n *  The deeply nested arrays to be visited.\n *\n * @yields\n *  The truthy array elements.\n */\nexport function *yieldDeepArrays<T>(...arrays: Array<DeepOptArray<T>>): IterableIterator<T> {\n  for (const element of arrays) {\n    if (Array.isArray(element)) {\n      yield* yieldDeepArrays(...element)\n    } else if (element) {\n      yield element as T\n    }\n  }\n}\n\n/**\n * Returns a flat array with all truthy elements of all deeply nested arrays.\n *\n * @template T\n *  The element type of the array.\n *\n * @param arrays\n *  The deeply nested arrays to be flattened.\n *\n * @returns\n *  The flattened array elements.\n */\nexport function flattenDeepArrays<T>(...arrays: Array<DeepOptArray<T>>): T[] {\n  return [...yieldDeepArrays(...arrays)]\n}\n","\nimport type { Linter } from 'eslint'\nimport type { RuleConfig, RulesConfig, ConfigObject } from '@eslint/core'\nimport type { ConfigWithExtends } from '@eslint/config-helpers'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nimport type { DeepRequired, DeepOptArray } from '@/utils/utils.ts'\nimport { flattenDeepArrays } from '@/utils/utils.ts'\n\n// types ======================================================================\n\n// TODO: investigate: `Config` from '@eslint/config-helpers' is incompatible with `Linter.Config` and `TSESLint.FlatConfig.Config`\nexport type Config = ConfigObject | ConfigWithExtends | Linter.Config | TSESLint.FlatConfig.Config\n\nexport type ConfigArg = DeepOptArray<Config>\n\n// ----------------------------------------------------------------------------\n\n/**\n * Configuration options for language and project setup.\n */\nexport interface LanguageOptions {\n\n  /**\n   * The ECMAScript version to be used in the project (version or year).\n   *\n   * @default 'latest'\n   */\n  ecmaVersion?: Linter.EcmaVersion\n\n  /**\n   * Specifies how to treat `.js`, `.jsx`, `.ts`, and `.tsx` files.\n   *\n   * - 'module': The files will be considered being ES modules.\n   * - 'commonjs': The files will be considered being CommonJS modules.\n   *\n   * @default 'module'\n   */\n  sourceType?: 'module' | 'commonjs'\n}\n\n/**\n * Required configuration options for language and project setup.\n */\nexport type LanguageConfig = DeepRequired<LanguageOptions>\n\n// ----------------------------------------------------------------------------\n\n/**\n * Configuration options for external package dependencies.\n */\nexport interface PackagesOptions {\n\n  /**\n   * A list of packages to be allowed in the project even if they have been\n   * banned by the plugin `eslint-plugin-depend`.\n   */\n  allowed?: readonly string[]\n\n  /**\n   * A list of additional packages to be banned in the project.\n   */\n  banned?: readonly string[]\n}\n\n/**\n * Required configuration options for external package dependencies.\n */\nexport type PackagesConfig = DeepRequired<PackagesOptions>\n\n// ----------------------------------------------------------------------------\n\n/**\n * Configuration options for code indentation per file type.\n */\nexport interface IndentOverridesOptions {\n\n  /**\n   * Indentation size for JavaScript and TypeScript files, including JSX.\n   */\n  js?: number\n\n  /**\n   * Indentation size for JSON files.\n   */\n  json?: number\n\n  /**\n   * Indentation size for YAML files.\n   */\n  yaml?: number\n\n  /**\n   * Indentation size for Vue.js files (script and template blocks).\n   */\n  vue?: number\n}\n\n/**\n * Configuration options for code style.\n */\nexport interface StylisticOptions {\n\n  /**\n   * Default indentation (number of space characters) for all file types.\n   *\n   * @default 2\n   */\n  indent?: number\n\n  /**\n   * Indentation (number of space characters) overrides for specific file\n   * types.\n   *\n   * @default 2\n   */\n  indentOverrides?: IndentOverridesOptions\n\n  /**\n   * Specifies how to treat semicolons.\n   *\n   * - 'always': Require semicolons following all statements.\n   * - 'never': Require to omit semicolons according to ASI rules.\n   * - 'off': Semicolons will not be checked.\n   *\n   * @default 'never'\n   */\n  semi?: 'always' | 'never' | 'off'\n\n  /**\n   * The type of the string delimiter character.\n   *\n   * @default 'single'\n   */\n  quotes?: 'single' | 'double' | 'off'\n\n  /**\n   * Specifies how to treat dangling commas in multiline lists.\n   *\n   * - 'always': Dangling commas will be required in all multi-line array\n   *   literals, object literals, function parameters, template parameters,\n   *   imports, and exports.\n   * - 'never': Dangling commas will be forbidden.\n   * - 'off': Dangling commas will not be checked.\n   *\n   * @default 'always'\n   */\n  dangle?: 'always' | 'never' | 'off'\n}\n\n/**\n * Required configuration options for code style.\n */\nexport type StylisticConfig = DeepRequired<StylisticOptions>\n\n// ----------------------------------------------------------------------------\n\n/**\n * Shared options for an environment preset with included and excluded files.\n */\nexport interface EnvFilesOptions {\n\n  /**\n   * Path to a sub directory to apply the environment preset to. The options\n   * 'files' and 'ignores' will be interpreted relatively to this path.\n   *\n   * @default '.'\n   */\n  basePath?: string\n\n  /**\n   * Glob patterns for source files to be included into the environment. A file\n   * will be included if it matches one of the patterns. Inner arrays can be\n   * used to express AND conditions for files.\n   */\n  files: ReadonlyArray<string | string[]>\n\n  /**\n   * Glob patterns for source files matching `files` to be ignored.\n   *\n   * @default []\n   */\n  ignores?: readonly string[]\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Shared options for an environment preset: include and exclude files, and add\n * more linter rules.\n */\nexport interface EnvBaseOptions extends EnvFilesOptions {\n\n  /**\n   * Additional linter rules to be added to the configuration.\n   */\n  rules?: RulesConfig\n}\n\n// constants ==================================================================\n\n/**\n * File extensions for JavaScript source files.\n */\nexport const JS_EXTENSIONS = ['js', 'jsx', 'mjs', 'cjs']\n\n/**\n * File extensions for TypeScript source files.\n */\nexport const TS_EXTENSIONS = ['ts', 'tsx', 'mts', 'cts']\n\n/**\n * File extensions for all source files (JavaScript and TypeScript).\n */\nexport const SRC_EXTENSIONS = [...JS_EXTENSIONS, ...TS_EXTENSIONS]\n\n/**\n * Glob array for JavaScript source files (including 'jsx').\n */\nexport const JS_GLOB = extGlob(JS_EXTENSIONS)\n\n/**\n * Glob array for TypeScript source files (including 'tsx').\n */\nexport const TS_GLOB = extGlob(TS_EXTENSIONS)\n\n/**\n * Glob array for TypeScript type declaration files.\n */\nexport const DTS_GLOB = extGlob(TS_EXTENSIONS.map(ext => 'd.' + ext))\n\n/**\n * Glob array for all source files (JavaScript and TypeScript).\n */\nexport const SRC_GLOB = extGlob(SRC_EXTENSIONS)\n\n/**\n * Glob array for all VueJS SFC files.\n */\nexport const VUE_GLOB = extGlob(['vue'])\n\n/**\n * Shared options for the core rule `no-unused-vars`, and the plugin rule\n * `@typescript-eslint/no-unused-vars`.\n */\nexport const NO_UNUSED_VARS_OPTIONS = {\n  varsIgnorePattern: '^_.',\n  argsIgnorePattern: '^_.',\n  destructuredArrayIgnorePattern: '^_.',\n  caughtErrors: 'all',\n  ignoreRestSiblings: true,\n}\n\n/**\n * Shared options for the core rule `no-implicit-coercion`, and all related\n * plugin rules (e.g. from the Vue plugin).\n */\nexport const NO_IMPLICIT_COERCION_OPTIONS = {\n  disallowTemplateShorthand: true,\n  allow: ['!!'] as ['!!'], // workaround for overly strict typings of 'eslint-plugin-vue'\n}\n\n// functions ==================================================================\n\n/**\n * Creates a glob pattern deeply matching all files with the specified file\n * extensions.\n *\n * @param extensions\n *  The file extensions to be converted to a glob pattern.\n *\n * @returns\n *  The glob pattern for the specified file extensions.\n */\nexport function extGlob(extensions: string[]): string[] {\n  return extensions.map(ext => '**/*.' + ext)\n}\n\n/**\n * Creates a configuration entry with 'files' and 'ignores' settings from an\n * environment's 'envOptions' object.\n *\n * @param name\n *  The name of the configuration entry.\n *\n * @param envOptions\n *  The environment options containing 'files' and 'ignores' settings.\n *\n * @param config\n *  Properties for the configuration entry to be built. Additional 'files' and\n *  'ignores' properties will be merged with the settings from 'envOptions'.\n *\n * @param rules\n *  Hard-coded rule settings to be added to the configuration.\n *\n * @returns\n *  The resulting configuration entry.\n */\nexport function createConfig(name: string, envOptions: EnvFilesOptions, config: Config, rules?: RulesConfig): Config {\n  const basePath = envOptions.basePath ?? config.basePath\n  return {\n    ...config,\n    name,\n    ...(basePath ? { basePath } : undefined),\n    files: [envOptions.files, config.files].filter(e => !!e).flat(1),\n    ignores: [envOptions.ignores, config.ignores].filter(e => !!e).flat(1),\n    rules: { ...config.rules, ...rules },\n  }\n}\n\n/**\n * Creates a configuration entry with 'files', 'ignores', and 'rules' settings\n * from an environment's 'envOptions' object.\n *\n * @param name\n *  The name of the configuration entry.\n *\n * @param envOptions\n *  The environment options containing 'files', 'ignores', and 'rules'\n *  settings.\n *\n * @param rules\n *  Hard-coded rule settings to be configured by the environment itself. These\n *  rule settings will precede the rules contained in 'envOptions', in order to\n *  allow to override them.\n *\n * @returns\n *  The resulting configuration entry, if the environment options contain\n *  custom rule settings, otherwise `undefined`.\n */\nexport function customRules(name: string, envOptions: EnvBaseOptions, rules?: RulesConfig): Config | undefined {\n  return (rules ?? envOptions.rules) && createConfig(name, envOptions, {\n    rules: { ...rules, ...envOptions.rules },\n  })\n}\n\n/**\n * Finds the first configuration object with a 'files' property, and copies\n * this property into all other configurations objects with language options or\n * rules but lacking the 'files' property.\n *\n * @param configs\n *  The configuration objects to be fixed.\n *\n * @returns\n *  The fixed configuration options.\n */\nexport function fixMissingFilesOption(...configs: ConfigArg[]): Config[] {\n  const flatConfigs = flattenDeepArrays(configs)\n  const files = flatConfigs.find(config => !!config.files)?.files\n  return files ? flatConfigs.map(config => (!config.files && (config.languageOptions || config.rules)) ? { ...config, files } : config) : flatConfigs\n}\n\n/**\n * Converts severity 'warning' of all rules in the passed configuration entry\n * to severity 'error'.\n *\n * @template T\n *  The exact type of the passed configuration.\n *\n * @param config\n *  The configuration entry to be converted.\n *\n * @returns\n *  The converted configuration entry.\n */\nexport function convertRuleWarningsToErrors<T extends { rules?: Partial<RulesConfig> }>(config: T): T {\n  return config.rules ? {\n    ...config,\n    rules: Object.fromEntries(Object.entries(config.rules).map(([key, value]) => {\n      if (value === 'warn') {\n        value = 'error'\n      } else if (Array.isArray(value) && (value[0] === 'warn')) {\n        value = ['error', ...value.slice(1)]\n      }\n      return [key, value]\n    })),\n  } : config\n}\n\n/**\n * Merges settings for a specific plugin in-place into a complete settings\n * object.\n *\n * @param settings\n *  The settings object to be extended.\n *\n * @param plugin\n *  The name of the plugin whose settings will be extended (top-level property\n *  name in `settings`). Missing entries will be created on demand.\n *\n * @param props\n *  The settings properties to me merged into the plugin settings.\n *\n * @returns\n *  The extended settings object.\n */\nexport function mergeSettings(settings: Record<string, unknown>, plugin: string, props: Record<string, unknown>): Record<string, unknown> {\n  const pluginSettings = settings[plugin] ??= {}\n  Object.assign(pluginSettings, props)\n  return settings\n}\n\n/**\n * Translates the stylistic option `dangle` to the configuration options for\n * 'comma-dangle' rules.\n *\n * @param stylisticConfig\n *  Resolved stylistic configuration options.\n *\n * @returns\n *  The configuration options for 'comma-dangle' rules.\n */\nexport function getCommaDangleConfig(stylisticConfig: StylisticConfig): RuleConfig<['never' | 'always' | 'always-multiline']> {\n  const { dangle } = stylisticConfig\n  return (dangle === 'always') ? ['error', 'always-multiline'] : (dangle === 'never') ? ['error', 'never'] : 'off'\n}\n","\nimport type { RulesConfig } from '@eslint/core'\n\nimport { flattenDeepArrays } from '@/utils/utils.ts'\nimport type { ConfigArg, EnvFilesOptions, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig } from '@/eslint/shared/env-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration for a single banned global or import.\n */\nexport interface EnvRestrictedName {\n  name: string\n  message: string\n}\n\n/**\n * Configuration for a single banned object property.\n */\nexport interface EnvRestrictedProperty {\n  object: string\n  property: string\n  message: string\n}\n\n/**\n * Configuration for a single banned syntax construct.\n */\nexport interface EnvRestrictedSyntax {\n  selector: string\n  message: string\n}\n\n/**\n * Collection of banned globals, imports, properties, and syntax constructs.\n */\nexport interface EnvRestrictedItems {\n  /** The global symbols to be banned. */\n  globals?: EnvRestrictedName[]\n  /** The module imports to be banned. */\n  imports?: EnvRestrictedName[]\n  /** The global object properties to be banned. */\n  properties?: EnvRestrictedProperty[]\n  /** The syntax constructs to be banned. */\n  syntax?: EnvRestrictedSyntax[]\n}\n\n/**\n * Collection of banned globals, imports, properties, and syntax constructs,\n * for a specific subset of the files included in an environment.\n */\nexport interface EnvRestrictedOverride extends EnvFilesOptions, EnvRestrictedItems { }\n\n/**\n * Type shape of a dedicated environment option 'restricted' with settings for\n * banned globals, imports, properties, and syntax constructs.\n */\nexport interface EnvRestrictedOption extends EnvRestrictedItems {\n\n  /**\n   * Overrides for specific subsets of files in the environment. All restricted\n   * items of overrides will be merged with the common restricted items defined\n   * for the entire environment.\n   */\n  overrides?: EnvRestrictedOverride[]\n}\n\n/**\n * Shared options for an environment preset: include and exclude files, add\n * more linter rules, and settings for restricted items.\n */\nexport interface EnvRestrictedOptions extends EnvBaseOptions {\n\n  /**\n   * All globals, imports, properties, and syntax constructs to be banned for\n   * the files included by the environment.\n   */\n  restricted?: EnvRestrictedOption\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Helper interface for type conversion.\n */\ninterface EnvRestrictedEntryTypeMap {\n  globals: EnvRestrictedName\n  imports: EnvRestrictedName\n  properties: EnvRestrictedProperty\n  syntax: EnvRestrictedSyntax\n}\n\ntype EnvRestrictedEntryKey = keyof EnvRestrictedEntryTypeMap\ntype EnvRestrictedEntryType = EnvRestrictedEntryTypeMap[EnvRestrictedEntryKey]\n\n// functions ==================================================================\n\n/**\n * Creates a rules configuration record for all restricted items.\n *\n * @param generator\n *  The generator callback function that returns the restricted items to be\n *  inserted into the linter rules.\n *\n * @returns\n *  The rules configuration record containing entries for all existing\n *  restricted items.\n */\nfunction createRulesConfig(generator: (key: EnvRestrictedEntryKey) => readonly EnvRestrictedEntryType[]): RulesConfig {\n  const rules: RulesConfig = {}\n  for (const key of ['globals', 'imports', 'properties', 'syntax'] as const) {\n    const items = generator(key)\n    if (items.length) rules[`no-restricted-${key}`] = ['error', ...items]\n  }\n  // same restrictions for CommonJS `require` as for `import` statements\n  if ('no-restricted-imports' in rules) {\n    rules['no-restricted-modules'] = rules['no-restricted-imports']\n  }\n  return rules\n}\n\n/**\n * Merges built-in items and custom items for restricted rules.\n *\n * @param restrictedItems\n *  The custom items for restricted rules to be merged.\n *\n * @returns\n *  The rules dictionary with all needed restricted rules.\n */\nfunction mergeRestrictedItems(...restrictedItems: Array<EnvRestrictedItems | undefined>): Required<EnvRestrictedItems> {\n\n  const RESTRICTED_GLOBALS: EnvRestrictedName[] = [\n    { name: 'isFinite', message: 'Use `Number.isFinite` instead.' },\n    { name: 'isNaN', message: 'Use `Number.isNaN` instead.' },\n  ]\n\n  const RESTRICTED_SYNTAX: EnvRestrictedSyntax[] = [\n    { selector: ':matches(PropertyDefinition, MethodDefinition[kind!=\"constructor\"])[accessibility=\"private\"]', message: 'Use `#private` syntax instead.' },\n  ]\n\n  // restricted items for all files in the environment\n  return {\n    globals: flattenDeepArrays(RESTRICTED_GLOBALS, restrictedItems.map(item => item?.globals)),\n    imports: flattenDeepArrays(restrictedItems.map(item => item?.imports)),\n    properties: flattenDeepArrays(restrictedItems.map(item => item?.properties)),\n    syntax: flattenDeepArrays(RESTRICTED_SYNTAX, restrictedItems.map(item => item?.syntax)),\n  }\n}\n\n// ----------------------------------------------------------------------------\n\n/**\n * Creates restricted rules with built-in restricted items only.\n *\n * @returns\n *  The rules dictionary with all needed restricted rules.\n */\nexport function builtinRestrictedRules(): RulesConfig {\n\n  // built-in restricted items\n  const items = mergeRestrictedItems()\n\n  // generate the rules dictionary\n  return createRulesConfig(key => items[key])\n}\n\n/**\n * Generates various 'no-restricted-?' rules from the passed configuration.\n *\n * @param baseName\n *  Base name for the configuration objects.\n *\n * @param envOptions\n *  The environment options containing 'files', 'ignores', and 'restricted'\n *  settings.\n *\n * @param fixed\n *  The fixed restricted items provided by the environment preset.\n *\n * @returns\n *  The configuration entries needed to forbid the restricted items.\n */\nexport function restrictedRulesConfig(baseName: string, envOptions: EnvRestrictedOptions, fixed?: EnvRestrictedItems): ConfigArg {\n\n  const { restricted } = envOptions\n\n  // restricted items for all files in the environment\n  const items = mergeRestrictedItems(fixed, restricted)\n\n  // generate the configuration objects\n  return [\n\n    // base rules for all files in the environment\n    createConfig(baseName, envOptions, {\n      rules: createRulesConfig(key => items[key]),\n    }),\n\n    // generate the override entries (join with base items)\n    restricted?.overrides?.map((override, index) => createConfig(`${baseName}.override-${index}`, override, {\n      rules: createRulesConfig(key => flattenDeepArrays<EnvRestrictedEntryType>(items[key], override[key])),\n    })),\n  ]\n}\n","\nimport type { ConfigObject } from '@eslint/core'\nimport eslintJs from '@eslint/js'\n\nimport type { ConfigArg, LanguageConfig } from '@/eslint/shared/env-utils.ts'\nimport { SRC_GLOB, VUE_GLOB, NO_IMPLICIT_COERCION_OPTIONS, extGlob } from '@/eslint/shared/env-utils.ts'\nimport { builtinRestrictedRules } from '@/eslint/shared/restricted.ts'\n\n// functions ==================================================================\n\n/**\n * Defines standard module settings and additional rules targeting JavaScript\n * _and_ TypeScript source files.\n *\n * Wraps the following packages:\n * - `@eslint/js`\n *\n * @param languageConfig\n *  Resolved configuration options.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function base(languageConfig: LanguageConfig): ConfigArg {\n\n  // returns language options for specific file extensions\n  const languageOptions = (sourceType: LanguageConfig['sourceType'], ...extensions: string[]): ConfigObject => {\n    const { ecmaVersion } = languageConfig\n    return {\n      name: `core.base.language-options.${sourceType}.${extensions.join(',')}`,\n      files: extGlob(extensions),\n      languageOptions: { ecmaVersion, sourceType },\n    }\n  }\n\n  return [\n\n    // global linter configuration\n    {\n      name: 'core.base.linter-options',\n      linterOptions: {\n        // report unused inline linter directives in source code\n        reportUnusedDisableDirectives: 'error',\n        reportUnusedInlineConfigs: 'error',\n      },\n    },\n\n    // ECMA version and module type for ES modules\n    languageOptions('module', 'mjs', 'mts'),\n\n    // ECMA version and module type for CommonJS modules\n    languageOptions('commonjs', 'cjs', 'cts'),\n\n    // ECMA version and module type for *.js and *.ts files\n    languageOptions(languageConfig.sourceType, 'js', 'jsx', 'ts', 'tsx'),\n\n    // configure linter rules\n    {\n      name: 'core.base.rules',\n      files: [...SRC_GLOB, ...VUE_GLOB],\n      rules: {\n        // enable all rules recommended by ESLint itself\n        ...eslintJs.configs.recommended.rules,\n        // possible problems\n        'no-cond-assign': ['error', 'except-parens'],\n        'no-constant-binary-expression': 'error',\n        'no-constructor-return': 'error',\n        'no-control-regex': 'off',\n        'no-duplicate-imports': ['error', { allowSeparateTypeImports: true }],\n        'no-new-native-nonconstructor': 'error',\n        'no-new-symbol': 'off', // disabled in favour of 'no-new-native-nonconstructor'\n        'no-promise-executor-return': ['error', { allowVoid: true }],\n        'no-self-compare': 'error',\n        'no-template-curly-in-string': 'error',\n        'no-unassigned-vars': 'error',\n        'no-unreachable-loop': 'error',\n        'no-unsafe-optional-chaining': ['error', { disallowArithmeticOperators: true }],\n        'no-unused-private-class-members': 'off', // separate rules for JS and TS\n        'require-atomic-updates': 'error',\n        // suggestions\n        'block-scoped-var': 'error',\n        curly: ['error', 'multi-line'],\n        eqeqeq: 'error',\n        'grouped-accessor-pairs': 'error',\n        'new-cap': 'error',\n        'no-alert': 'error',\n        'no-caller': 'error',\n        'no-console': 'error',\n        'no-else-return': 'error',\n        'no-empty': 'off',\n        'no-empty-static-block': 'error',\n        'no-eval': 'error',\n        'no-extend-native': 'error',\n        'no-extra-bind': 'error',\n        'no-extra-label': 'error',\n        'no-implicit-coercion': ['error', NO_IMPLICIT_COERCION_OPTIONS],\n        'no-implied-eval': 'error',\n        'no-iterator': 'error',\n        'no-label-var': 'error',\n        'no-labels': 'error',\n        'no-lone-blocks': 'error',\n        'no-lonely-if': 'error',\n        'no-multi-str': 'error',\n        'no-new': 'error',\n        'no-new-func': 'error',\n        'no-new-wrappers': 'error',\n        'no-object-constructor': 'error',\n        'no-octal-escape': 'error',\n        'no-proto': 'error',\n        'no-return-assign': ['error', 'except-parens'],\n        'no-script-url': 'error',\n        'no-sequences': ['error', { allowInParentheses: false }],\n        'no-unneeded-ternary': ['error', { defaultAssignment: false }],\n        'no-unused-expressions': 'error',\n        'no-useless-assignment': 'error',\n        'no-useless-call': 'error',\n        'no-useless-computed-key': 'error',\n        'no-useless-concat': 'error',\n        'no-useless-rename': 'error',\n        'no-useless-return': 'error',\n        'no-var': 'error',\n        'object-shorthand': 'error',\n        'operator-assignment': 'error',\n        'prefer-arrow-callback': 'error',\n        'prefer-const': ['error', { destructuring: 'all', ignoreReadBeforeAssign: true }],\n        'prefer-numeric-literals': 'error',\n        'prefer-regex-literals': 'error',\n        'prefer-rest-params': 'error',\n        'prefer-spread': 'error',\n        radix: 'error',\n        'symbol-description': 'error',\n        // built-in restricted items\n        ...builtinRestrictedRules(),\n      },\n    },\n  ]\n}\n","\nimport { type ConfigArg, JS_GLOB, NO_UNUSED_VARS_OPTIONS } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Defines additional standard rules targeting JavaScript but _not_ TypeScript\n * source files.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function js(): ConfigArg {\n\n  return {\n    name: 'core.js.recommended',\n    files: JS_GLOB,\n    rules: {\n      // possible problems\n      'no-loss-of-precision': 'off',\n      'no-unused-vars': ['error', NO_UNUSED_VARS_OPTIONS],\n      // suggestions\n      'default-param-last': 'error',\n      'dot-notation': 'error',\n      'no-array-constructor': 'error',\n      'no-invalid-this': 'error',\n      'no-loop-func': 'error',\n      'no-redeclare': 'error',\n      'no-shadow': ['error', { ignoreOnInitialization: true }],\n      'no-throw-literal': 'error',\n      'no-unused-private-class-members': 'error',\n      'no-useless-constructor': 'error',\n      'prefer-promise-reject-errors': 'error',\n      'require-await': 'error',\n    },\n  }\n}\n","\nimport type { RulesConfig } from '@eslint/core'\nimport { configs as pluginConfigs } from 'typescript-eslint'\n\nimport type { ConfigArg } from '@/eslint/shared/env-utils.ts'\nimport { SRC_GLOB, TS_GLOB, DTS_GLOB, VUE_GLOB, NO_UNUSED_VARS_OPTIONS } from '@/eslint/shared/env-utils.ts'\n\n// types ======================================================================\n\nexport type TSESLintConfigKey = keyof typeof pluginConfigs\n\n// constants ==================================================================\n\n/**\n * Names of all `typescript-eslint` presets to be included\n */\nexport const TSESLINT_PRESETS = ['strictTypeChecked', 'stylisticTypeChecked'] as const satisfies TSESLintConfigKey[]\n\n/**\n * Custom configuration for `typescript-eslint` rules.\n */\nexport const TSESLINT_RULES = {\n  '@typescript-eslint/array-type': ['error', { default: 'array-simple' }],\n  '@typescript-eslint/consistent-indexed-object-style': 'off',\n  '@typescript-eslint/consistent-type-exports': 'error',\n  '@typescript-eslint/consistent-type-imports': ['error', { disallowTypeAnnotations: false }],\n  '@typescript-eslint/default-param-last': 'error',\n  '@typescript-eslint/explicit-function-return-type': ['error', {\n    allowExpressions: true,\n    allowTypedFunctionExpressions: true,\n    allowHigherOrderFunctions: true,\n    allowConciseArrowFunctionExpressionsStartingWithVoid: true,\n  }],\n  '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public', overrides: { constructors: 'off' } }],\n  '@typescript-eslint/no-confusing-void-expression': 'off',\n  '@typescript-eslint/no-dynamic-delete': 'off',\n  '@typescript-eslint/no-empty-function': ['error', {\n    allow: ['private-constructors', 'protected-constructors', 'decoratedFunctions', 'overrideMethods'],\n  }],\n  '@typescript-eslint/no-empty-object-type': ['error', { allowInterfaces: 'always' }],\n  '@typescript-eslint/no-explicit-any': 'off',\n  '@typescript-eslint/no-import-type-side-effects': 'error',\n  '@typescript-eslint/no-invalid-this': 'error',\n  '@typescript-eslint/no-invalid-void-type': 'off',\n  '@typescript-eslint/no-loop-func': 'error',\n  '@typescript-eslint/no-misused-spread': 'error',\n  '@typescript-eslint/no-namespace': ['error', { allowDeclarations: true }],\n  '@typescript-eslint/no-non-null-assertion': 'off',\n  '@typescript-eslint/no-redeclare': 'error',\n  '@typescript-eslint/no-shadow': ['error', { ignoreOnInitialization: true }],\n  '@typescript-eslint/no-unnecessary-qualifier': 'error',\n  // disabled temporarily: https://github.com/typescript-eslint/typescript-eslint/issues/12158\n  '@typescript-eslint/no-unnecessary-type-arguments': 'off',\n  '@typescript-eslint/no-unnecessary-type-conversion': 'error',\n  '@typescript-eslint/no-unnecessary-type-parameters': 'off',\n  '@typescript-eslint/no-unsafe-declaration-merging': 'off',\n  '@typescript-eslint/no-unused-private-class-members': 'error',\n  '@typescript-eslint/no-unused-vars': ['error', NO_UNUSED_VARS_OPTIONS],\n  '@typescript-eslint/parameter-properties': 'error',\n  '@typescript-eslint/prefer-nullish-coalescing': ['error', { ignorePrimitives: true }],\n  '@typescript-eslint/prefer-readonly': 'error',\n  '@typescript-eslint/prefer-reduce-type-parameter': 'off',\n  '@typescript-eslint/restrict-template-expressions': 'off',\n  '@typescript-eslint/return-await': ['error', 'always'],\n  '@typescript-eslint/strict-void-return': ['error', { allowReturnAny: true }],\n  '@typescript-eslint/switch-exhaustiveness-check': ['error', { considerDefaultExhaustiveForUnions: true }],\n  '@typescript-eslint/unified-signatures': ['error', { ignoreDifferentlyNamedParameters: true }],\n} as const satisfies RulesConfig\n\n// functions ==================================================================\n\n/**\n * Defines standard rules for TypeScript source files.\n *\n * Wraps the following packages:\n * - `typescript-eslint`\n *\n * @param rootDir\n *  The project root directory.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function ts(rootDir: string): ConfigArg {\n\n  // plugin configuration, additional rules\n  return [\n\n    {\n      name: 'core.ts.options',\n      files: [...SRC_GLOB, ...VUE_GLOB],\n      languageOptions: {\n        parserOptions: {\n          projectService: true,\n          tsconfigRootDir: rootDir,\n          // suppress warning for new TypeScript versions\n          warnOnUnsupportedTypeScriptVersion: false,\n        },\n      },\n    },\n\n    {\n      name: 'core.ts.recommended',\n      files: TS_GLOB,\n\n      // recommended rules\n      extends: TSESLINT_PRESETS.map(key => pluginConfigs[key]),\n\n      // reconfigure plugin rules\n      rules: TSESLINT_RULES,\n    },\n\n    // fixes for module definition files\n    {\n      name: 'core.ts.dts',\n      files: DTS_GLOB,\n      rules: {\n        'no-duplicate-imports': 'off', // triggers for multiple 'declare' blocks in a file\n        '@typescript-eslint/consistent-type-exports': 'off',\n        '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'no-type-imports', disallowTypeAnnotations: false }],\n        '@typescript-eslint/no-extraneous-class': 'off',\n        '@typescript-eslint/no-unused-private-class-members': 'off', // allow to declare private class members\n        '@typescript-eslint/prefer-readonly': 'off', // allow to declare class members without 'readonly'\n      },\n    },\n  ]\n}\n","\nimport vuePlugin from 'eslint-plugin-vue'\nimport { configureVueProject, defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'\n\nimport type { ConfigArg, StylisticConfig } from '@/eslint/shared/env-utils.ts'\nimport { VUE_GLOB, NO_IMPLICIT_COERCION_OPTIONS, getCommaDangleConfig } from '@/eslint/shared/env-utils.ts'\n\nimport { TSESLINT_PRESETS, TSESLINT_RULES } from './ts.ts'\n\n// functions ==================================================================\n\n/**\n * Configuration options for Vue source files.\n */\nexport interface VueOptions {\n\n  /**\n   * Names of all globally registered directives to be ignored by the rule\n   * `vue/no-undef-directives` (without 'v-' prefix).\n   */\n  globalDirectives?: readonly string[]\n}\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with linter rules for Vue.js.\n *\n * Wraps the following packages:\n * - `eslint-plugin-vue`\n * - `@vue/eslint-config-typescript`\n *\n * @param rootDir\n *  The project root directory.\n *\n * @param stylisticConfig\n *  Resolved stylistic configuration options.\n *\n * @param vueOptions\n *  Additional configuration for Vue specific rules.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function vue(rootDir: string, stylisticConfig: StylisticConfig, vueOptions: VueOptions | undefined): ConfigArg {\n\n  // configuration properties\n  const { indentOverrides: indent } = stylisticConfig\n\n  configureVueProject({ rootDir, allowComponentTypeUnsafety: false })\n\n  // recommended configuration of the main plugin\n  const recommendedConfigs = vuePlugin.configs['flat/recommended-error']\n\n  return defineConfigWithVueTs(\n\n    // register rule implementations and recommended rules, raise all recommended rules to 'error' level\n    recommendedConfigs.map((config, index) => ({\n      ...config,\n      name: `core.vue.recommended-${index}`,\n    })),\n\n    // reconfigure plugin rules\n    {\n      name: 'core.vue.rules',\n      rules: {\n        'no-undef': 'off',\n        'no-unused-vars': 'off',\n        'no-useless-assignment': 'off',\n        'vue/block-order': ['error', { order: ['script', 'template', 'style'] }],\n        'vue/component-api-style': 'error',\n        'vue/define-emits-declaration': 'error',\n        'vue/define-macros-order': 'error',\n        'vue/define-props-declaration': 'error',\n        'vue/eqeqeq': 'error',\n        'vue/html-button-has-type': 'error',\n        'vue/max-attributes-per-line': 'off',\n        'vue/no-console': 'error',\n        'vue/no-duplicate-class-names': 'error',\n        'vue/no-empty-pattern': 'error',\n        'vue/no-implicit-coercion': ['error', NO_IMPLICIT_COERCION_OPTIONS],\n        'vue/no-irregular-whitespace': 'error',\n        'vue/no-literals-in-template': 'error',\n        'vue/no-sparse-arrays': 'error',\n        'vue/no-template-target-blank': 'error',\n        'vue/no-undef-directives': ['error', { ignore: vueOptions?.globalDirectives }],\n        'vue/no-use-v-else-with-v-for': 'error',\n        'vue/no-useless-concat': 'error',\n        'vue/no-useless-v-bind': 'error',\n        'vue/object-shorthand': 'error',\n        'vue/padding-line-between-blocks': 'error',\n        'vue/prefer-define-options': 'error',\n        'vue/prefer-single-event-payload': 'error',\n        'vue/prefer-true-attribute-shorthand': 'error',\n        'vue/prefer-use-template-ref': 'error',\n        'vue/prefer-v-model': 'error',\n        'vue/require-explicit-slots': 'error',\n        'vue/require-typed-ref': 'error',\n        'vue/singleline-html-element-content-newline': 'off',\n        // stylistic extensions\n        'vue/array-bracket-spacing': 'error',\n        'vue/arrow-spacing': 'error',\n        'vue/block-spacing': 'error',\n        'vue/brace-style': ['error', '1tbs', { allowSingleLine: true }],\n        'vue/comma-dangle': getCommaDangleConfig(stylisticConfig),\n        'vue/comma-spacing': 'error',\n        'vue/comma-style': 'error',\n        'vue/dot-notation': 'error',\n        'vue/func-call-spacing': 'error',\n        'vue/html-indent': ['error', indent.vue],\n        'vue/key-spacing': ['error', { mode: 'minimum' }],\n        'vue/keyword-spacing': 'error',\n        'vue/object-curly-spacing': ['error', 'always'],\n        'vue/quote-props': ['error', 'as-needed'],\n        'vue/space-in-parens': 'error',\n        'vue/space-infix-ops': 'error',\n        'vue/space-unary-ops': 'error',\n        'vue/template-curly-spacing': 'error',\n        // @stylistic plugin\n        '@stylistic/indent': ['error', indent.vue, { SwitchCase: 1, MemberExpression: 'off', flatTernaryExpressions: true }],\n      },\n    },\n\n    // create recommended typescript-eslint rules\n    ...TSESLINT_PRESETS.map(key => vueTsConfigs[key]),\n\n    {\n      name: 'core.vue.ts.rules',\n      rules: TSESLINT_RULES,\n    },\n\n  ).map(config => ({ ...config, files: VUE_GLOB })) // restrict all configurations to Vue files\n}\n","\nimport jsonPlugin from 'eslint-plugin-jsonc'\n\nimport type { ConfigArg, StylisticConfig } from '@/eslint/shared/env-utils.ts'\nimport { fixMissingFilesOption } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Defines standard linting rules for JSON files.\n *\n * Wraps the following packages:\n * - `eslint-plugin-jsonc`\n *\n * @param stylisticConfig\n *  Resolved configuration options.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function json(stylisticConfig: StylisticConfig): ConfigArg {\n\n  // configuration properties\n  const { indentOverrides: indent } = stylisticConfig\n\n  // add missing 'files' property in configurations with rules (otherwise, plugin conflicts with '@eslint/markdown')\n  return fixMissingFilesOption(\n\n    // register rule implementations and recommended rules\n    jsonPlugin.configs['flat/recommended-with-json'].map((config, index) => ({\n      ...config,\n      name: `core.json.recommended-${index}`,\n    })),\n\n    // reconfigure plugin rules\n    {\n      name: 'core.json.rules',\n      rules: {\n        'jsonc/array-bracket-spacing': 'error',\n        'jsonc/comma-style': 'error',\n        'jsonc/indent': ['error', indent.json],\n        'jsonc/key-spacing': ['error', { mode: 'minimum' }],\n        'jsonc/no-irregular-whitespace': 'error',\n        'jsonc/no-octal-escape': 'error',\n      },\n    },\n\n    {\n      name: 'core.json.tsconfig',\n      files: ['**/tsconfig.json', '**/tsconfig.*.json'],\n      rules: {\n        'jsonc/no-comments': 'off',\n      },\n    },\n  )\n}\n","\nimport yamlPlugin from 'eslint-plugin-yml'\n\nimport type { ConfigArg, StylisticConfig } from '@/eslint/shared/env-utils.ts'\nimport { fixMissingFilesOption } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Defines standard linting rules for YAML files.\n *\n * Wraps the following packages:\n * - `eslint-plugin-yml`\n *\n * @param stylisticConfig\n *  Resolved configuration options.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function yaml(stylisticConfig: StylisticConfig): ConfigArg {\n\n  // configuration properties\n  const { indentOverrides: indent } = stylisticConfig\n\n  // add missing 'files' property in configurations with rules (otherwise, plugin conflicts with '@eslint/markdown')\n  return fixMissingFilesOption(\n\n    // register rule implementations and recommended rules\n    yamlPlugin.configs.recommended.map((config, index) => ({\n      ...config,\n      name: `core.yaml.recommended-${index}`,\n    })),\n\n    // reconfigure plugin rules\n    {\n      name: 'core.yaml.rules',\n      rules: {\n        'yml/indent': ['error', indent.yaml],\n        'yml/key-spacing': ['error', { mode: 'minimum' }],\n        'yml/require-string-key': 'error',\n      },\n    },\n  )\n}\n","\nimport markdownPlugin from '@eslint/markdown'\n\nimport type { ConfigArg } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Defines standard linting rules for Markdown files.\n *\n * Wraps the following packages:\n * - `@eslint/markdown`\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function markdown(): ConfigArg {\n  return markdownPlugin.configs.recommended.map((config, index) => ({\n    ...config,\n    name: `core.markdown.recommended-${index}`,\n  }))\n}\n","\nimport licensePlugin from 'eslint-plugin-license-header'\n\nimport { type ConfigArg, SRC_GLOB } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Checks the existence of license headers in source files.\n *\n * Wraps the following packages:\n * - `eslint-plugin-license-header`\n *\n * @param path\n *  Absolute path to the template file containing the license header.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function license(path: string): ConfigArg {\n\n  return {\n    name: 'core.license.plugin',\n    files: SRC_GLOB,\n\n    // register rule implementations of the plugin\n    plugins: {\n      'license-header': licensePlugin,\n    },\n\n    // configure plugin rules\n    rules: {\n      'license-header/header': ['error', path],\n    },\n  }\n}\n","\nimport commentsPluginConfigs from '@eslint-community/eslint-plugin-eslint-comments/configs'\n\nimport { type ConfigArg, SRC_GLOB, VUE_GLOB, createConfig } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Checks inline linter directives.\n *\n * Wraps the following packages:\n * - `eslint-plugin-eslint-comments`\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function directives(): ConfigArg {\n\n  // register rule implementations and recommended rules\n  return createConfig('core.directives.recommended', {\n    files: [...SRC_GLOB, ...VUE_GLOB],\n  }, commentsPluginConfigs.recommended, {\n    '@eslint-community/eslint-comments/disable-enable-pair': ['error', { allowWholeFile: true }],\n  })\n}\n","\nimport * as dependPlugin from 'eslint-plugin-depend'\n\nimport type { ConfigArg, PackagesConfig } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Defines linting rules for outdated or unneeded external dependencies.\n *\n * Wraps the following packages:\n * - `eslint-plugin-depend`\n *\n * @param packagesConfig\n *  Resolved configuration options.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function packages(packagesConfig: PackagesConfig): ConfigArg {\n\n  return [\n\n    // register rule implementations and recommended rules\n    {\n      ...dependPlugin.configs['flat/recommended'],\n      name: 'core.packages.recommended',\n    },\n\n    {\n      name: 'core.packages.rules',\n      rules: {\n        'depend/ban-dependencies': ['error', {\n          modules: packagesConfig.banned,\n          allowed: packagesConfig.allowed,\n        }],\n      },\n    },\n  ]\n}\n","\nimport * as regexpPlugin from 'eslint-plugin-regexp'\n\nimport { type ConfigArg, SRC_GLOB, convertRuleWarningsToErrors } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Checks the regular expressions in source files.\n *\n * Wraps the following packages:\n * - `eslint-plugin-regexp`\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function regexp(): ConfigArg {\n\n  // recommended configuration of the plugin\n  const recommendedConfig = regexpPlugin.configs.recommended\n\n  // register rule implementations and recommended rules\n  return {\n    files: SRC_GLOB,\n    // raise all recommended rules to 'error' level\n    ...convertRuleWarningsToErrors(recommendedConfig),\n    name: 'core.regexp.recommended',\n  }\n}\n","\nimport promisePlugin from 'eslint-plugin-promise'\n\nimport type { ConfigArg } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Checks for correct usage of native promises.\n *\n * Wraps the following packages:\n * - `eslint-plugin-promise`\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function promises(): ConfigArg {\n\n  return [\n\n    // register rule implementations and recommended rules\n    {\n      ...promisePlugin.configs['flat/recommended'],\n      name: 'core.promises.recommended',\n    },\n\n    // reconfigure plugin rules\n    {\n      name: 'core.promises.rules',\n      rules: {\n        'promise/always-return': ['error', { ignoreLastCallback: true }],\n        'promise/no-callback-in-promise': 'off',\n        'promise/no-nesting': 'error',      // warning => error\n        'promise/no-return-in-finally': 'error',\n        'promise/valid-params': 'error',    // warning => error\n      },\n    },\n  ]\n}\n","\nimport { jsdoc as jsdocPlugin } from 'eslint-plugin-jsdoc'\n\nimport { type ConfigArg, TS_GLOB, SRC_GLOB } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Checks the JSDoc comments in source files.\n *\n * Wraps the following packages:\n * - `eslint-plugin-jsdoc`\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function jsdoc(): ConfigArg {\n\n  return [\n\n    // register rule implementations and recommended rules\n    {\n      files: SRC_GLOB,\n      ...jsdocPlugin({\n        config: 'flat/recommended-error',\n        settings: {\n          tagNamePreference: {\n            // disallowed tags for ES6 keywords `const`, `class`, `extends`\n            augments: false,\n            class: false,\n            const: false,\n            constant: false,\n            'tag constructor': false,\n            extends: false,\n          },\n        },\n      }),\n      name: 'core.jsdoc.recommended',\n    },\n\n    // overrides for TypeScript files\n    {\n      files: TS_GLOB,\n      ...jsdocPlugin({\n        config: 'flat/recommended-typescript-error',\n        settings: {\n          structuredTags: {\n            // '@yields' tags in TypeScript do not need a type\n            yields: {\n              type: false,\n            },\n          },\n        },\n        rules: {\n          'jsdoc/check-param-names': ['error', { allowExtraTrailingParamDocs: true }], // overload signatures\n          'jsdoc/require-yields-type': 'off',\n        },\n      }),\n      name: 'core.jsdoc.typescript',\n    },\n\n    // configure plugin rules\n    // Note: These custom override rules must be located after the TS setup block above (instead of adding them\n    // to the 'rules' option inside the leading 'flat/recommended-error' block), otherwise they would be\n    // overwritten for all TS files.\n    {\n      name: 'core.jsdoc.rules',\n      files: SRC_GLOB,\n      rules: {\n        'jsdoc/check-template-names': 'error',\n        'jsdoc/escape-inline-tags': 'error',\n        'jsdoc/require-asterisk-prefix': 'error',\n        'jsdoc/require-jsdoc': ['error', { contexts: ['ClassDeclaration', 'TSInterfaceDeclaration'] }],\n        'jsdoc/require-template': ['error', { requireSeparateTemplates: true }],\n        'jsdoc/require-template-description': 'error',\n        'jsdoc/require-throws': 'error',\n        'jsdoc/require-throws-description': 'error',\n        'jsdoc/require-yields-description': 'error',\n        'jsdoc/tag-lines': 'off',\n        'jsdoc/ts-no-unnecessary-template-expression': 'error',\n      },\n    },\n  ]\n}\n","\nimport stylisticPlugin from '@stylistic/eslint-plugin'\nimport migratePlugin from '@stylistic/eslint-plugin-migrate'\n\nimport type { ConfigArg, StylisticConfig } from '@/eslint/shared/env-utils.ts'\nimport { getCommaDangleConfig } from '@/eslint/shared/env-utils.ts'\n\n// functions ==================================================================\n\n/**\n * Defines standard (opinionated) linter rules for source code style.\n *\n * Wraps the following packages:\n * - `@stylistic/eslint-plugin`\n * - `@stylistic/eslint-plugin-migrate`\n *\n * @param stylisticConfig\n *  Resolved configuration options.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function stylistic(stylisticConfig: StylisticConfig): ConfigArg {\n\n  // configuration properties\n  const { indentOverrides: indent, semi, quotes } = stylisticConfig\n\n  return [\n\n    // globally disable all deprecated stylistic core rules\n    {\n      ...stylisticPlugin.configs['disable-legacy'],\n      name: 'core.stylistic.disable-legacy',\n    },\n\n    // '@stylistic' plugin\n    {\n      name: 'core.stylistic.recommended',\n\n      // do not lint markdown files\n      ignores: ['**/*.md'],\n\n      // register rule implementations of the plugins\n      plugins: {\n        '@stylistic': stylisticPlugin,\n      },\n\n      // configure plugin rules\n      rules: {\n        '@stylistic/array-bracket-spacing': 'error',\n        '@stylistic/arrow-spacing': 'error',\n        '@stylistic/block-spacing': 'error',\n        '@stylistic/brace-style': ['error', '1tbs', { allowSingleLine: true }],\n        '@stylistic/comma-dangle': getCommaDangleConfig(stylisticConfig),\n        '@stylistic/comma-spacing': 'error',\n        '@stylistic/comma-style': 'error',\n        '@stylistic/computed-property-spacing': 'error',\n        '@stylistic/eol-last': 'error',\n        '@stylistic/function-call-spacing': 'error',\n        '@stylistic/generator-star-spacing': 'error',\n        '@stylistic/indent': ['error', indent.js, { SwitchCase: 1, MemberExpression: 'off', flatTernaryExpressions: true }],\n        '@stylistic/indent-binary-ops': ['error', indent.js],\n        '@stylistic/jsx-child-element-spacing': 'error',\n        '@stylistic/jsx-curly-brace-presence': 'error',\n        '@stylistic/jsx-curly-spacing': 'error',\n        '@stylistic/jsx-equals-spacing': 'error',\n        '@stylistic/jsx-function-call-newline': 'error',\n        '@stylistic/jsx-indent-props': ['error', indent.js],\n        '@stylistic/jsx-one-expression-per-line': 'off',\n        '@stylistic/jsx-pascal-case': 'error',\n        '@stylistic/jsx-quotes': 'error',\n        '@stylistic/jsx-self-closing-comp': 'error',\n        '@stylistic/jsx-wrap-multilines': 'error',\n        '@stylistic/key-spacing': ['error', { mode: 'minimum' }],\n        '@stylistic/keyword-spacing': 'error',\n        '@stylistic/linebreak-style': 'error',\n        '@stylistic/member-delimiter-style': (semi === 'off') ? 'off' : ['error', {\n          multiline: { delimiter: (semi === 'always') ? 'semi' : 'none', requireLast: true },\n          singleline: { delimiter: (semi === 'always') ? 'semi' : 'comma', requireLast: false },\n        }],\n        '@stylistic/new-parens': 'error',\n        '@stylistic/no-extra-semi': 'error',\n        '@stylistic/no-floating-decimal': 'error',\n        '@stylistic/no-mixed-operators': ['error', {\n          groups: [\n            // allow to mix arithmetic operators\n            // ['+', '-', '*', '/', '%', '**'],\n            ['&', '|', '^', '~', '<<', '>>', '>>>'],\n            ['==', '!=', '===', '!==', '>', '>=', '<', '<='],\n            ['&&', '||'],\n            ['in', 'instanceof'],\n          ],\n          allowSamePrecedence: true,\n        }],\n        '@stylistic/no-multiple-empty-lines': ['error', { max: 2 }],\n        '@stylistic/no-tabs': 'error',\n        '@stylistic/no-trailing-spaces': 'error',\n        '@stylistic/no-whitespace-before-property': 'error',\n        '@stylistic/object-curly-spacing': ['error', 'always'],\n        '@stylistic/quote-props': ['error', 'as-needed'],\n        '@stylistic/quotes': (quotes === 'off') ? 'off' : ['error', quotes, { avoidEscape: true }],\n        '@stylistic/rest-spread-spacing': 'error',\n        '@stylistic/semi': (semi === 'off') ? 'off' : ['error', semi],\n        '@stylistic/semi-spacing': 'error',\n        '@stylistic/semi-style': 'error',\n        '@stylistic/space-before-blocks': 'error',\n        '@stylistic/space-before-function-paren': ['error', { anonymous: 'always', named: 'never', asyncArrow: 'always' }],\n        '@stylistic/space-in-parens': 'error',\n        '@stylistic/space-infix-ops': 'error',\n        '@stylistic/space-unary-ops': 'error',\n        '@stylistic/switch-colon-spacing': 'error',\n        '@stylistic/template-curly-spacing': 'error',\n        '@stylistic/template-tag-spacing': 'error',\n        '@stylistic/type-annotation-spacing': 'error',\n        '@stylistic/type-generic-spacing': 'error',\n        '@stylistic/type-named-tuple-spacing': 'error',\n        '@stylistic/wrap-iife': 'error',\n        '@stylistic/yield-star-spacing': 'error',\n      },\n    },\n\n    // '@stylistic/migrate' plugin\n    {\n      name: 'core.stylistic.migrate',\n\n      // register rule implementations of the plugins\n      plugins: {\n        '@stylistic/migrate': migratePlugin,\n      },\n\n      // configure plugin rules\n      rules: {\n        '@stylistic/migrate/migrate-js': 'error',\n        '@stylistic/migrate/migrate-ts': 'error',\n        '@stylistic/migrate/migrate-jsx': 'error',\n      },\n    },\n  ]\n}\n","\nimport nodePlugin from 'eslint-plugin-n'\nimport type ts from 'typescript'\n\nimport type { ConfigArg, LanguageOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig, customRules } from '@/eslint/shared/env-utils.ts'\nimport { type EnvRestrictedOptions, restrictedRulesConfig } from '@/eslint/shared/restricted.ts'\n\n// types ======================================================================\n\nexport type EnvNodeConvertPathPattern = [pattern: string, replacement: string]\n\n/**\n * Configuration for the record-style setting 'convertPath' of the plugin\n * `eslint-plugin-n`.\n */\nexport type EnvNodeConvertPathRecord = Record<string, EnvNodeConvertPathPattern>\n\n/**\n * Configuration for the elements in the array-style setting 'convertPath' of\n * the plugin `eslint-plugin-n`.\n */\nexport interface EnvNodeConvertPathElement {\n  include: string[]\n  exclude?: string[]\n  replace: EnvNodeConvertPathPattern\n}\n\n/**\n * Shared settings for the plugin `eslint-plugin-n`.\n */\nexport interface EnvNodeSharedSettings {\n  version?: string\n  allowModules?: string[]\n  resolvePaths?: string[]\n  convertPath?: EnvNodeConvertPathRecord | EnvNodeConvertPathElement[]\n  tryExtensions?: string[]\n  tsconfigPath?: string[]\n  typescriptExtensionMap?: ts.server.protocol.JsxEmit | Array<[string, string]>\n}\n\n/**\n * Configuration options for the environment preset 'env.node'.\n */\nexport interface EnvNodeOptions extends EnvRestrictedOptions {\n\n  /**\n   * The module mode used by the linted files.\n   *\n   * @default 'module'\n   */\n  sourceType?: LanguageOptions['sourceType']\n\n  /**\n   * Shared settings for the plugin `eslint-plugin-n`. Will be merged into the\n   * settings object with the key 'n'.\n   */\n  settings?: EnvNodeSharedSettings\n}\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with global symbols and linter rules for\n * NodeJS modules.\n *\n * Wraps the following packages:\n * - `eslint-plugin-n`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function node(envOptions: EnvNodeOptions): ConfigArg {\n\n  // the plugin configuration key, according to source module type\n  const configKey = (envOptions.sourceType === 'commonjs') ? 'flat/recommended-script' : 'flat/recommended-module'\n\n  return [\n\n    // register rule implementations\n    createConfig('env.node.recommended', envOptions, {\n      ...nodePlugin.configs[configKey],\n      settings: {\n        n: {\n          tryExtensions: ['.js', '.ts', '.d.ts'], // automatically add missing extensions in imports\n          ...envOptions.settings,\n        },\n      },\n    }),\n\n    // generate the 'no-restricted-?' rules according to passed configuration\n    restrictedRulesConfig('env.node.restricted', envOptions),\n\n    // custom rules\n    customRules('env.node.rules', envOptions, {\n      'no-console': 'off',\n      'n/no-missing-import': 'off',\n      'n/no-unsupported-features/node-builtins': ['error', { allowExperimental: true }],\n      'n/prefer-global/buffer': 'error',\n      'n/prefer-global/console': 'error',\n      'n/prefer-global/crypto': 'error',\n      'n/prefer-global/process': 'error',\n      'n/prefer-global/text-decoder': 'error',\n      'n/prefer-global/text-encoder': 'error',\n      'n/prefer-global/timers': 'error',\n      'n/prefer-global/url': 'error',\n      'n/prefer-global/url-search-params': 'error',\n      'n/prefer-node-protocol': 'error',\n    }),\n  ]\n}\n","\nimport JAVASCRIPT_GLOBALS from 'globals'\nimport CONFUSING_BROWSER_GLOBALS from 'confusing-browser-globals'\nimport sanitizedPlugin from 'eslint-plugin-no-unsanitized'\n\nimport { type ConfigArg, createConfig, customRules } from '@/eslint/shared/env-utils.ts'\nimport type { EnvRestrictedName, EnvRestrictedProperty, EnvRestrictedSyntax, EnvRestrictedOptions } from '@/eslint/shared/restricted.ts'\nimport { restrictedRulesConfig } from '@/eslint/shared/restricted.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.browser'.\n */\nexport interface EnvBrowserOptions extends EnvRestrictedOptions { }\n\n// constants ==================================================================\n\n/**\n * Global builtin symbols that are confusing or deprecated.\n */\nconst CONFUSING_BUILTIN_GLOBALS: readonly string[] = [\n  'constructor',\n  'escape',\n  'eval',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'origin',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'unescape',\n  'valueOf',\n]\n\n/**\n * Global browser classes that may conflict with custom application classes.\n * For disambiguation, custom classes must be imported, and global browser\n * classes must be used with their fully qualified name.\n */\nconst AMBIGUOUS_BROWSER_TYPES: readonly string[] = [\n  'Position',\n  'Point',\n  'Size',\n  'Range',\n]\n\n/**\n * Properties of global objects to be banned in all browser modules.\n */\nconst RESTRICTED_PROPERTIES: EnvRestrictedProperty[] = []\n\n/**\n * Syntax constructs to be banned in all browser modules.\n */\nconst RESTRICTED_SYNTAX: EnvRestrictedSyntax[] = [\n  { selector: 'ExportNamedDeclaration > TSEnumDeclaration[const=true]', message: 'Do not export const enums.' },\n]\n\n// initialization =============================================================\n\n/**\n * All supported global browser symbols intended to be used without fully\n * qualified name (e.g. `HTMLElement` instead of `window.HTMLElement`).\n * A few confusing globals will be filtered though, especially symbols with\n * common names (e.g. `name`, `event`, etc.) to be able to catch missing or\n * misspelled variables or parameter names.\n */\nconst BROWSER_GLOBALS: Record<string, 'readonly'> = {}\n\n// Add all builtin ES globals.\nfor (const name of Object.keys(JAVASCRIPT_GLOBALS.builtin)) {\n  BROWSER_GLOBALS[name] = 'readonly'\n}\n\n// Add browser globals (skip writable properties, e.g. window event handlers).\nfor (const [name, writable] of Object.entries(JAVASCRIPT_GLOBALS.browser)) {\n  if (!writable) BROWSER_GLOBALS[name] = 'readonly'\n}\n\n// Remove commonly known confusing or deprecated builtin globals.\nfor (const name of CONFUSING_BUILTIN_GLOBALS) {\n  delete BROWSER_GLOBALS[name]\n}\n\n// Remove commonly known confusing browser globals (e.g. `name`, `event`).\nfor (const name of CONFUSING_BROWSER_GLOBALS) {\n  delete BROWSER_GLOBALS[name]\n}\n\n// Create the configuration list for rule 'no-restricted-globals'.\nconst RESTRICTED_GLOBALS: EnvRestrictedName[] = AMBIGUOUS_BROWSER_TYPES.map(name => {\n  const message = `Import custom type '${name}', or use 'globalThis.${name}' for disambiguation.`\n  return { name, message }\n})\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with global symbols and linter rules for for\n * browser modules.\n *\n * Wraps the following packages:\n * - `globals`\n * - `confusing-browser-globals`\n * - `eslint-plugin-no-unsanitized`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function browser(envOptions: EnvBrowserOptions): ConfigArg {\n\n  return [\n\n    // register global symbols used in browser scripts\n    createConfig('env.browser.globals', envOptions, {\n      languageOptions: {\n        globals: BROWSER_GLOBALS,\n      },\n    }),\n\n    // generate the 'no-restricted-?' rules according to passed configuration\n    restrictedRulesConfig('env.browser.restricted', envOptions, {\n      globals: RESTRICTED_GLOBALS,\n      properties: RESTRICTED_PROPERTIES,\n      syntax: RESTRICTED_SYNTAX,\n    }),\n\n    // register rule implementations and recommended rules\n    createConfig('env.browser.sanitized', envOptions, sanitizedPlugin.configs.recommended),\n\n    // custom rules\n    customRules('env.browser.rules', envOptions),\n  ]\n}\n","\nimport extendedPlugin from 'eslint-plugin-jest-extended'\nimport jestDomPlugin from 'eslint-plugin-jest-dom'\nimport testingLibraryPlugin from 'eslint-plugin-testing-library'\n\nimport type { ConfigArg, EnvBaseOptions } from './env-utils.ts'\nimport { createConfig, customRules } from './env-utils.ts'\n\n// types ======================================================================\n\n/**\n * Shared options for environment presets for unit tests.\n */\nexport interface EnvUnitTestOptions extends EnvBaseOptions {\n\n  /**\n   * Specifies whether to include `eslint-plugin-jest-extended`. Should only be\n   * used, if the package `jest-extended` has been installed in the project.\n   *\n   * @default false\n   */\n  jestExtended?: boolean\n\n  /**\n   * Specifies whether to include `eslint-plugin-jest-dom`. Should only be\n   * used, if the package `@testing-library/jest-dom` has been installed in the\n   * project.\n   *\n   * @default false\n   */\n  jestDom?: boolean\n\n  /**\n   * Specifies the recommended rule set of `eslint-plugin-testing-library` to\n   * be included.\n   */\n  testingLib?: 'angular' | 'dom' | 'marko' | 'react' | 'vue'\n}\n\n// functions ==================================================================\n\n/**\n * Conditionally creates configuration entries for the ESLint plugins\n * `eslint-plugin-jest-dom` and `eslint-plugin-testing-library`.\n *\n * @param baseName\n *  The base name for all configuration entries.\n *\n * @param envOptions\n *  The configuration options for the unit test environment.\n *\n * @returns\n *  The resulting configuration entries.\n */\nexport function createUnitTestPluginConfigs(baseName: string, envOptions: EnvUnitTestOptions): ConfigArg {\n\n  return [\n\n    // do not require strict documentation in unit tests\n    customRules(`${baseName}.jsdoc`, envOptions, {\n      'jsdoc/require-jsdoc': 'off',\n      'jsdoc/require-param': 'off',\n    }),\n\n    // 'jest-extended' plugin (config 'flat/recommended' is empty)\n    envOptions.jestExtended && createConfig(`${baseName}.extended`, envOptions, extendedPlugin.configs['flat/all']),\n\n    // 'jest-dom' plugin\n    envOptions.jestDom && createConfig(`${baseName}.jest-dom`, envOptions, jestDomPlugin.configs['flat/recommended'], {\n      'jest-dom/prefer-to-have-class': 'off', // TODO: crashes with ESLint v10 (dead project: https://github.com/testing-library/eslint-plugin-jest-dom/pull/415)\n    }),\n\n    // 'testing-library' plugin\n    envOptions.testingLib && createConfig(`${baseName}.testing-library`, envOptions, {\n      // register rule implementations of the plugins\n      plugins: {\n        'testing-library': testingLibraryPlugin,\n      },\n      // recommended rules\n      rules: {\n        ...testingLibraryPlugin.configs[`flat/${envOptions.testingLib}`].rules,\n        'testing-library/no-node-access': ['error', { allowContainerFirstChild: true }],\n        'testing-library/prefer-user-event-setup': 'error',\n      },\n    }),\n  ]\n}\n","\nimport jestPlugin from 'eslint-plugin-jest'\n\nimport { type ConfigArg, JS_GLOB, createConfig, customRules } from '@/eslint/shared/env-utils.ts'\nimport { type EnvUnitTestOptions, createUnitTestPluginConfigs } from '@/eslint/shared/unittest.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.jest'.\n */\nexport interface EnvJestOptions extends EnvUnitTestOptions { }\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with global symbols and linter rules for unit\n * tests using Jest.\n *\n * Wraps the following packages:\n * - `eslint-plugin-jest`\n * - `eslint-plugin-jest-extended`\n * - `eslint-plugin-jest-dom`\n * - `eslint-plugin-testing-library`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function jest(envOptions: EnvJestOptions): ConfigArg {\n\n  return [\n\n    // register rule implementations, globals, and recommended rules\n    createConfig('env.jest.recommended', envOptions, jestPlugin.configs['flat/recommended']),\n\n    // add recommended stylistic rules\n    createConfig('env.jest.stylistic', envOptions, jestPlugin.configs['flat/style']),\n\n    // 'jest-dom' and 'testing-library' plugin\n    createUnitTestPluginConfigs('env.jest', envOptions),\n\n    // custom rules\n    customRules('env.jest.rules', envOptions, {\n      // 'jest' plugin\n      'jest/consistent-test-it': ['error', { fn: 'it' }],\n      'jest/expect-expect': ['error', { assertFunctionNames: ['expect*'] }],\n      'jest/no-commented-out-tests': 'error',\n      'jest/no-conditional-expect': 'off',\n      'jest/no-confusing-set-timeout': 'error',\n      'jest/no-duplicate-hooks': 'error',\n      'jest/no-unneeded-async-expect-function': 'error',\n      'jest/no-test-return-statement': 'error',\n      'jest/prefer-comparison-matcher': 'error',\n      'jest/prefer-equality-matcher': 'error',\n      'jest/prefer-expect-resolves': 'error',\n      'jest/prefer-hooks-on-top': 'error',\n      'jest/prefer-jest-mocked': 'error',\n      'jest/prefer-lowercase-title': 'error',\n      'jest/prefer-mock-promise-shorthand': 'error',\n      'jest/prefer-mock-return-shorthand': 'error',\n      'jest/prefer-spy-on': 'error',\n      'jest/prefer-todo': 'error',\n      'jest/require-top-level-describe': 'error',\n    }),\n\n    // enable type-aware rules for TS files\n    createConfig('env.jest.typescript', envOptions, {\n      ignores: JS_GLOB,\n      rules: {\n        'jest/no-error-equal': 'error',\n        'jest/no-unnecessary-assertion': 'error',\n        'jest/unbound-method': 'error',\n        '@typescript-eslint/unbound-method': 'off', // replaced by 'jest/unbound-method'\n      },\n    }),\n  ]\n}\n","\nimport vitestPlugin from '@vitest/eslint-plugin'\n\nimport { type ConfigArg, JS_GLOB, createConfig, customRules } from '@/eslint/shared/env-utils.ts'\nimport { type EnvUnitTestOptions, createUnitTestPluginConfigs } from '@/eslint/shared/unittest.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.vitest'.\n */\nexport interface EnvVitestOptions extends EnvUnitTestOptions { }\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with global symbols and linter rules for unit\n * tests using Vitest.\n *\n * Wraps the following packages:\n * - `eslint-plugin-vitest`\n * - `eslint-plugin-jest-extended`\n * - `eslint-plugin-jest-dom`\n * - `eslint-plugin-testing-library`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function vitest(envOptions: EnvVitestOptions): ConfigArg {\n\n  return [\n\n    // 'vitest' plugin\n    createConfig('env.vitest.recommended', envOptions, {\n      // register rule implementations of the plugins\n      plugins: {\n        vitest: vitestPlugin,\n      },\n      // register global symbols of Vitest\n      languageOptions: {\n        globals: vitestPlugin.environments.env.globals,\n      },\n      // recommended rules\n      rules: vitestPlugin.configs.recommended.rules,\n    }),\n\n    // 'jest-dom' and 'testing-library' plugin\n    createUnitTestPluginConfigs('env.vitest', envOptions),\n\n    // allow to add type-checking expectations in tests\n    createConfig('env.vitest.type-check', envOptions, {\n      ignores: JS_GLOB,\n      settings: {\n        vitest: {\n          typecheck: true,\n        },\n      },\n    }),\n\n    // custom rules\n    customRules('env.vitest.rules', envOptions, {\n      // 'vitest' plugin\n      'vitest/consistent-test-it': 'error',\n      'vitest/expect-expect': ['error', { assertFunctionNames: ['expect*'] }],\n      'vitest/no-alias-methods': 'error',\n      'vitest/no-disabled-tests': 'warn',\n      'vitest/no-duplicate-hooks': 'error',\n      'vitest/no-focused-tests': 'error',\n      'vitest/no-standalone-expect': 'error',\n      'vitest/no-test-prefixes': 'error',\n      'vitest/no-test-return-statement': 'error',\n      'vitest/prefer-comparison-matcher': 'error',\n      'vitest/prefer-each': 'error',\n      'vitest/prefer-equality-matcher': 'error',\n      'vitest/prefer-expect-resolves': 'error',\n      'vitest/prefer-hooks-in-order': 'error',\n      'vitest/prefer-hooks-on-top': 'error',\n      'vitest/prefer-import-in-mock': 'error',\n      'vitest/prefer-mock-promise-shorthand': 'error',\n      'vitest/prefer-mock-return-shorthand': 'error',\n      'vitest/prefer-spy-on': 'error',\n      'vitest/prefer-strict-equal': 'error',\n      'vitest/prefer-to-be': 'error',\n      'vitest/prefer-to-contain': 'error',\n      'vitest/prefer-to-have-length': 'error',\n      'vitest/prefer-vi-mocked': 'error',\n      'vitest/require-top-level-describe': 'error',\n      'vitest/valid-expect-in-promise': 'error',\n    }),\n  ]\n}\n","\nimport codeceptPlugin from 'eslint-plugin-codeceptjs'\nimport chaiExpectPlugin from 'eslint-plugin-chai-expect'\n\nimport type { ConfigArg, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig, customRules } from '@/eslint/shared/env-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.codecept'.\n */\nexport interface EnvCodeceptOptions extends EnvBaseOptions { }\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with global symbols and linter rules for E2E\n * tests using CodeceptJS.\n *\n * Wraps the following packages:\n * - `eslint-plugin-codeceptjs`\n * - `eslint-plugin-chai-expect`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function codecept(envOptions: EnvCodeceptOptions): ConfigArg {\n\n  return [\n\n    // 'codecept' plugin\n    createConfig('env.codecept.plugin', envOptions, {\n      // register rule implementations of the plugins\n      plugins: {\n        codeceptjs: codeceptPlugin,\n      },\n      // register global symbols of CodeceptJS\n      languageOptions: {\n        globals: codeceptPlugin.environments.codeceptjs.globals,\n      },\n      // recommended rules\n      rules: codeceptPlugin.configs.recommended.rules,\n    }),\n\n    // 'chai-expect' plugin\n    createConfig('env.codecept.chai-expect', envOptions, chaiExpectPlugin.configs['recommended-flat']),\n\n    // custom rules\n    customRules('env.codecept.rules', envOptions, {\n      'new-cap': ['error', {\n        capIsNewExceptions: ['After', 'AfterSuite', 'Before', 'BeforeSuite', 'Feature', 'Scenario'],\n      }],\n      'no-restricted-properties': ['warn', { object: 'Scenario', property: 'todo', message: 'Unexpected unimplemented test.' }],\n      'codeceptjs/no-skipped-tests': 'warn',\n      // do not require strict documentation in e2e tests\n      'jsdoc/require-jsdoc': 'off',\n      'jsdoc/require-param': 'off',\n    }),\n  ]\n}\n","\nimport { posix, sep, dirname, extname } from 'node:path'\nimport { lstatSync } from 'node:fs'\nimport { createRequire } from 'node:module'\n\nimport pm, { type Glob } from 'picomatch'\nimport * as find from 'empathic/find'\n\nimport type { JSONSchema, TSESTree, TSESLint } from '@typescript-eslint/utils'\nimport { AST_NODE_TYPES as NodeType } from '@typescript-eslint/utils'\n\n// types ======================================================================\n\nexport type OptASTNode = TSESTree.Node | null | undefined\n\n/**\n * Shared settings used by multiple rules.\n */\nexport interface SharedRuleSettings {\n\n  /**\n   * Maps all alias prefixes to actual paths in the project.\n   */\n  alias?: Record<string, string>\n}\n\n// ----------------------------------------------------------------------------\n\nexport type ImportExportNode =\n  | TSESTree.ImportDeclaration\n  | TSESTree.ImportExpression\n  | TSESTree.ExportAllDeclaration\n  | TSESTree.ExportNamedDeclaration\n  | TSESTree.TSExternalModuleReference\n\n// constants ==================================================================\n\nconst FILE_EXTENSIONS = ['js', 'ts', 'd.ts']\n\nconst CONFIG_FILES: string[] = [\n  'eslint.config.js',\n  'eslint.config.mjs',\n  'eslint.config.cjs',\n  'eslint.config.ts',\n  'eslint.config.mts',\n  'eslint.config.cts',\n]\n\n// Schema =====================================================================\n\n/**\n * Helper functions to build a JSON schema for custom ESLint rules.\n */\nexport const Schema = {\n\n  boolean(): JSONSchema.JSONSchema4BooleanSchema {\n    return { type: 'boolean' }\n  },\n\n  string(): JSONSchema.JSONSchema4StringSchema {\n    return { type: 'string' }\n  },\n\n  stringNE(): JSONSchema.JSONSchema4StringSchema {\n    return { type: 'string', minLength: 1 }\n  },\n\n  array(items: JSONSchema.JSONSchema4): JSONSchema.JSONSchema4ArraySchema {\n    return { type: 'array', items, uniqueItems: true }\n  },\n\n  maybeArray(items: JSONSchema.JSONSchema4): JSONSchema.JSONSchema4OneOfSchema {\n    return { oneOf: [items, Schema.array(items)] }\n  },\n\n  dictionary(properties: JSONSchema.JSONSchema4): JSONSchema.JSONSchema4ObjectSchema {\n    return { type: 'object', additionalProperties: properties }\n  },\n\n  options(properties: Record<string, JSONSchema.JSONSchema4>, required?: boolean | string[]): JSONSchema.JSONSchema4ObjectSchema {\n    return { type: 'object', properties, required, additionalProperties: false }\n  },\n}\n\n// functions ==================================================================\n\n/**\n * Returns whether the passed AST node is an `Identifier `node.\n *\n * @param node\n *  The AST node to be checked.\n *\n * @returns\n *  Whether the passed AST node is an `Identifier` node.\n */\nexport function isIdentifier(node: OptASTNode): node is TSESTree.Identifier {\n  return node?.type === NodeType.Identifier\n}\n\n/**\n * Returns whether the passed AST node is a `Literal` node.\n *\n * @param node\n *  The AST node to be checked.\n *\n * @returns\n *  Whether the passed AST node is a `Literal` node.\n */\nexport function isLiteral(node: OptASTNode): node is TSESTree.Literal {\n  return node?.type === NodeType.Literal\n}\n\n/**\n * Returns whether the passed AST node is a `Literal` node with a specific\n * constant value.\n *\n * @param node\n *  The AST node to be checked.\n *\n * @param value\n *  The expected literal value.\n *\n * @returns\n *  Whether the passed AST node is a `Literal` node with a constant value.\n */\nexport function isLiteralValue(node: TSESTree.Node, value: unknown): node is TSESTree.Literal {\n  return isLiteral(node) && (node.value === value)\n}\n\n/**\n * Returns whether the passed AST node is an `AssignmentExpression` node.\n *\n * @param node\n *  The AST node to be checked.\n *\n * @returns\n *  Whether the passed AST node is an `AssignmentExpression` node.\n */\nexport function isAssignmentExpression(node: OptASTNode): node is TSESTree.AssignmentExpression {\n  return node?.type === NodeType.AssignmentExpression\n}\n\n/**\n * Returns whether the passed AST node is a `MemberExpression` node.\n *\n * @param node\n *  The AST node to be checked.\n *\n * @returns\n *  Whether the passed AST node is a `MemberExpression` node.\n */\nexport function isMemberExpression(node: OptASTNode): node is TSESTree.MemberExpression {\n  return node?.type === NodeType.MemberExpression\n}\n\n/**\n * Returns a passed array unmodified, converts the value `undefined` to an\n * empty array, and converts all other values to an array with one element.\n *\n * @template T\n *  The type of the array elements.\n *\n * @param value\n *  Any value to be converted to an array.\n *\n * @returns\n *  An array containing the value, unless the value is already an array.\n */\nexport function makeArray<T>(value: T | T[] | undefined): T[] {\n  return Array.isArray(value) ? value : (value === undefined) ? [] : [value]\n}\n\n/**\n * Converts a Windows file path to a Posix file path.\n *\n * @param path\n *  The file path to be normalized to Posix format.\n *\n * @returns\n *  The normalized Posix file path.\n */\nexport function toPosixPath(path: string): string {\n  return path.replaceAll(sep, posix.sep)\n}\n\n/**\n * Returns whether the passed path refers to an existing file.\n *\n * @param path\n *  The path to be checked.\n *\n * @returns\n *  Whether the passed path refers to an existing file (returns `false` for\n *  existing directories).\n */\nexport function isFile(path: string): boolean {\n  try {\n    return lstatSync(path).isFile()\n  } catch {\n    return false\n  }\n}\n\n// class ImportNodeWrapper ====================================================\n\n/**\n * A wrapper for an `import` statement containing a string literal node with a\n * module name, and the resulting extracted module name.\n */\nexport class ImportNodeWrapper {\n\n  /** The string literal node containing the name of the imported module. */\n  readonly sourceNode: TSESTree.StringLiteral\n\n  /** The original name of the imported module (with alias key). */\n  readonly moduleName: string\n\n  // constructor ------------------------------------------------------------\n\n  constructor(node: TSESTree.StringLiteral) {\n    this.sourceNode = node\n    // strip URL query strings from module name\n    this.moduleName = node.value.replace(/\\?.*$/, '')\n  }\n\n  // public methods ---------------------------------------------------------\n\n  /**\n   * Returns whether the name of the imported module matches the specified glob\n   * patterns.\n   *\n   * @param patterns\n   *  The glob patterns to be matched against the module name.\n   *\n   * @returns\n   *  Whether the name of the wrapped module matches at least one glob\n   *  pattern.\n   */\n  matchModuleName(patterns: Glob): boolean {\n    return pm.isMatch(this.moduleName, patterns)\n  }\n}\n\n// class ProjectContext =======================================================\n\n/**\n * A custom context helper for the linter rules of the preset environment\n * 'env.project'.\n *\n * @param context\n *  The rule context of the module currently linted.\n */\nexport class ProjectContext {\n\n  /** Maps alias keys to alias paths. */\n  readonly #aliasMap: Map<string, string>\n\n  /** Root directory containing the linter configuration file. */\n  readonly #rootDir: string\n\n  /** Absolute path to the linter configuration file. */\n  readonly #configPath: string\n\n  /** The name of the linted module (with alias prefix if available). */\n  readonly #moduleName: string\n\n  /** Resolver for npm packages. */\n  #requireModule: NodeJS.Require | undefined\n\n  // constructor ------------------------------------------------------------\n\n  constructor(context: Readonly<TSESLint.RuleContext<any, any>>) {\n\n    // convert 'alias' option to map\n    const sharedSettings = context.settings['env-project'] as SharedRuleSettings | undefined\n    this.#aliasMap = new Map(Object.entries(sharedSettings?.alias ?? {}))\n\n    // resolve root directory\n    const configPath = find.any(CONFIG_FILES)\n    if (!configPath) {\n      throw new Error('cannot find configuration file')\n    }\n    const rootDir = toPosixPath(dirname(configPath))\n    const fileName = toPosixPath(context.filename)\n    if (!fileName.startsWith(rootDir + '/')) {\n      throw new Error('invalid root directory')\n    }\n    this.#rootDir = rootDir\n    this.#configPath = configPath\n\n    // path of current module (slice rootDir with '/' from start, and extension with '.' from end)\n    const fileExt = extname(fileName)\n    const selfModulePath = fileName.slice(rootDir.length + 1, -fileExt.length)\n    if (!selfModulePath) {\n      throw new Error('invalid own module path')\n    }\n\n    // replace alias path with alias key\n    this.#moduleName = selfModulePath\n    for (const [aliasKey, aliasPath] of this.#aliasMap) {\n      if (selfModulePath.startsWith(aliasPath + '/')) {\n        this.#moduleName = aliasKey + '/' + selfModulePath.slice(aliasPath.length + 1)\n        break\n      }\n    }\n  }\n\n  // public methods ---------------------------------------------------------\n\n  /**\n   * Extracts the source node and module name of an import/export statement\n   * node, or a dynamic import expression node.\n   *\n   * @param node\n   *  The import/export statement node, or dynamic import expression node.\n   *\n   * @returns\n   *  The string literal node containing the module name, and the resulting\n   *  extracted module name.\n   */\n  resolveImportNode(node: ImportExportNode): ImportNodeWrapper | undefined {\n\n    // TSExternalModuleReference: module name in property 'expression', otherwise 'source'\n    const sourceNodeRaw = (node.type === NodeType.TSExternalModuleReference) ? node.expression : node.source\n\n    // module name is expected to be a string literal\n    const isStringLiteral = (sourceNodeRaw?.type === NodeType.Literal) && (typeof sourceNodeRaw.value === 'string')\n    return isStringLiteral ? new ImportNodeWrapper(sourceNodeRaw) : undefined\n  }\n\n  /**\n   * Extracts an existing alias key, and resolves the module path of a module\n   * name.\n   *\n   * @param moduleName\n   *  The module name to extract an alias key from.\n   *\n   * @returns\n   *  A pair containing the alias key (empty string if no alias found), and the\n   *  resolved module path (passed module name if no alias found).\n   */\n  resolveAlias(moduleName: string): [string, string] {\n    const [key, ...rest] = moduleName.split('/')\n    const aliasPath = (key && rest[0]) ? this.#aliasMap.get(key) : undefined\n    const aliasKey = aliasPath ? key : ''\n    const modulePath = aliasPath ? posix.join(aliasPath, ...rest) : moduleName\n    return [aliasKey, modulePath]\n  }\n\n  /**\n   * Returns whether the name of the module currently linted matches the\n   * specified glob patterns.\n   *\n   * @param patterns\n   *  The glob patterns to be matched against the current module name.\n   *\n   * @returns\n   *  Whether the current module name matches at least one glob pattern.\n   */\n  matchModuleName(patterns: Glob): boolean {\n    return pm.isMatch(this.#moduleName, patterns)\n  }\n\n  /**\n   * Returns whether a source file exists for the specified module.\n   *\n   * @param modulePath\n   *  The resolved module path (alias key replaced with path).\n   *\n   * @returns\n   *  Whether a source file exists for the specified module.\n   */\n  fileExists(modulePath: string): boolean {\n    // check modules with explicit extension\n    const resolvedPath = posix.join(this.#rootDir, modulePath)\n    if (extname(modulePath)) return isFile(resolvedPath)\n    // search for a file with a known extension\n    return FILE_EXTENSIONS.some(ext => isFile(resolvedPath + '.' + ext))\n  }\n\n  /**\n   * Returns whether the passed module name is an installed npm package.\n   *\n   * @param moduleName\n   *  The module name to be checked.\n   *\n   * @returns\n   *  Whether the passed module name is an installed npm package.\n   */\n  packageExists(moduleName: string): boolean {\n    this.#requireModule ??= createRequire(this.#configPath)\n    try {\n      this.#requireModule.resolve(moduleName)\n      return true\n    } catch {\n      return false\n    }\n  }\n}\n","\nimport { AST_NODE_TYPES as NodeType } from '@typescript-eslint/utils'\nimport type { RuleFunction } from '@eslint-react/kit'\n\nimport { isLiteralValue } from '@/eslint/shared/rule-utils'\n\n// functions ==================================================================\n\n/**\n * Enforce shorthand notation for boolean JSX attributes.\n *\n * @returns\n *  The rule implementation.\n */\nexport default function jsxShorthandBoolean(): RuleFunction {\n\n  // @eslint-react plugin injects the toolkit\n  return (context, toolkit) => ({\n    JSXAttribute(node) {\n\n      // check attribute expressions only\n      const value = node.value\n      if (value?.type !== NodeType.JSXExpressionContainer) return\n\n      // unwrap expression root node from TypeScript type augmentations\n      const expression = toolkit.ast.unwrap(value.expression)\n\n      // trigger for literal value `true` only\n      if (isLiteralValue(expression, true)) {\n        context.report({\n          node,\n          message: 'Omit the value for boolean attributes.',\n          fix: fixer => fixer.removeRange([node.name.range[1], value.range[1]]),\n        })\n      }\n    },\n  })\n}\n","\nimport { type RuleFunction, merge } from '@eslint-react/kit'\nimport { isIdentifier, isAssignmentExpression, isMemberExpression } from '@/eslint/shared/rule-utils'\n\n// functions ==================================================================\n\n/**\n * Enforce destructuring assignment for component props.\n *\n * @returns\n *  The rule implementation.\n */\nexport default function preferDestructuringAssignment(): RuleFunction {\n\n  // @eslint-react plugin injects the toolkit\n  return (context, toolkit) => {\n\n    // collect all function components in the source file while traversing\n    const components = toolkit.collect.components(context)\n\n    return merge(components.visitor, {\n      'Program:exit'(program) {\n\n        // process all collected function components\n        for (const component of components.query.all(program)) {\n\n          // inspect the first function parameter (skip direct destructuring)\n          const param = component.node.params[0]\n          if (!isIdentifier(param)) continue\n\n          // find the scope of the parameter containing all access references\n          const scope = context.sourceCode.getScope(component.node)\n          const variable = scope.variables.find(v => v.name === param.name)\n          if (!variable?.references) continue\n\n          // check all access references\n          for (const reference of variable.references) {\n\n            // must be part of a member expression\n            const parent = reference.identifier.parent\n            if (!isMemberExpression(parent)) continue\n\n            // ignore assignments (will be caught by 'immutable' rule)\n            if (isAssignmentExpression(parent.parent) && (parent === parent.parent.left)) continue\n\n            context.report({\n              node: parent,\n              message: 'Use destructuring assignment for component props.',\n            })\n          }\n        }\n      },\n    })\n  }\n}\n","\nimport reactPlugin from '@eslint-react/eslint-plugin'\nimport reactKit from '@eslint-react/kit'\nimport reactHooksPlugin from 'eslint-plugin-react-hooks'\nimport { reactRefresh } from 'eslint-plugin-react-refresh'\nimport jsxA11yPlugin from 'eslint-plugin-jsx-a11y'\nimport { parser } from 'typescript-eslint'\n\nimport type { ConfigArg, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig, customRules, convertRuleWarningsToErrors, mergeSettings } from '@/eslint/shared/env-utils.ts'\n\nimport jsxShorthandBoolean from '@/eslint/rules/react/jsxShorthandBoolean'\nimport preferDestructuringAssignment from '@/eslint/rules/react/preferDestructuringAssignment'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.react'.\n */\nexport interface EnvReactOptions extends EnvBaseOptions {\n\n  /**\n   * Configuration for the rule '@eslint-react/rules-of-hooks'.\n   *\n   * Additional hooks that will be treated as effect hooks, like 'useEffect'.\n   */\n  effectHooks?: readonly string[]\n\n  /**\n   * Configuration for the rule '@eslint-react/set-state-in-effect'.\n   *\n   * Additional hooks that will be treated as state hooks, like 'useState'.\n   */\n  stateHooks?: readonly string[]\n}\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects with linter rules for ReactJS.\n *\n * Wraps the following packages:\n * - `@eslint-react/eslint-plugin`\n * - `eslint-plugin-react-hooks`\n * - `eslint-plugin-react-refresh`\n * - `eslint-plugin-jsx-a11y`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function react(envOptions: EnvReactOptions): ConfigArg {\n\n  const reactConfig = reactPlugin.configs['strict-type-checked']\n\n  // extend shared plugin settings\n  const settings = { ...reactConfig.settings }\n  if (envOptions.effectHooks?.length) {\n    const additionalEffectHooks = `/^(${envOptions.effectHooks.join('|')})$/`\n    mergeSettings(settings, 'react-x', { additionalEffectHooks })\n  }\n  if (envOptions.stateHooks?.length) {\n    const additionalStateHooks = `/^(${envOptions.stateHooks.join('|')})$/`\n    mergeSettings(settings, 'react-x', { additionalStateHooks })\n  }\n\n  return [\n\n    // configure 'react' plugin for all source files (JSX and TSX)\n    createConfig('env.react.recommended', envOptions, {\n      // auto-detect installed React version\n      languageOptions: {\n        parser,\n        parserOptions: { projectService: true },\n      },\n      // register rule implementations and language settings, raise all recommended rules to 'error' level\n      ...convertRuleWarningsToErrors(reactConfig),\n      // additional settings\n      settings,\n    }, {\n      // custom overrides\n      '@eslint-react/dom-no-unknown-property': 'error',\n      '@eslint-react/jsx-no-leaked-dollar': 'error',\n      '@eslint-react/jsx-no-useless-fragment': ['error', { allowEmptyFragment: true }],\n      '@eslint-react/naming-convention-context-name': 'error',\n      '@eslint-react/no-missing-component-display-name': 'error',\n      '@eslint-react/no-missing-context-display-name': 'error',\n    }),\n\n    createConfig('env.react.recommended', envOptions, {\n      extends: [\n        reactKit()\n          .use(jsxShorthandBoolean)\n          .use(preferDestructuringAssignment)\n          .getConfig(),\n      ],\n    }),\n\n    // 'react-hooks' plugin and recommended rules, raise all recommended rules to 'error' level\n    createConfig('env.react.react-hooks', envOptions, convertRuleWarningsToErrors(reactHooksPlugin.configs.flat.recommended), {\n      // disable rules that are also implemented in @eslint-react\n      'react-hooks/exhaustive-deps': 'off',\n      'react-hooks/rules-of-hooks': 'off',\n      'react-hooks/set-state-in-effect': 'off',\n      'react-hooks/set-state-in-render': 'off',\n    }),\n\n    // 'react-refresh' plugin\n    createConfig('env.react.react-refresh', envOptions, reactRefresh.configs.vite()),\n\n    // 'jsx-a11y' plugin\n    createConfig('env.react.jsx-a11y', envOptions, jsxA11yPlugin.flatConfigs.recommended),\n\n    // custom rules\n    customRules('env.react.rules', envOptions),\n  ]\n}\n","\nimport eslintPlugin from 'eslint-plugin-eslint-plugin'\n\nimport type { ConfigArg, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig, customRules } from '@/eslint/shared/env-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.eslint'.\n */\nexport interface EnvEslintOptions extends EnvBaseOptions { }\n\n// exports ====================================================================\n\n/**\n * Adds linter rules for ESLint plugin implementations.\n *\n * Wraps the following packages:\n * - `eslint-plugin-eslint-plugin`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function eslint(envOptions: EnvEslintOptions): ConfigArg {\n\n  return [\n\n    // register rule implementations and recommended rules\n    createConfig('env.eslint.recommended', envOptions, eslintPlugin.configs['rules-recommended']),\n\n    // custom rules\n    customRules('env.eslint.rules', envOptions, {\n      'eslint-plugin/no-property-in-node': 'error',\n      'eslint-plugin/prefer-placeholders': 'error',\n      'eslint-plugin/prefer-replace-text': 'error',\n      'eslint-plugin/require-meta-docs-description': 'error',\n    }),\n  ]\n}\n","\nimport { AST_NODE_TYPES as NodeType, ESLintUtils } from '@typescript-eslint/utils'\n\nimport type { ImportExportNode } from '@/eslint/shared/rule-utils.ts'\nimport { Schema, ProjectContext } from '@/eslint/shared/rule-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration for the rule 'env-project/no-invalid-modules'.\n */\nexport interface RuleNoInvalidModulesOptions {\n\n  /**\n   * Specifies glob patterns for external modules.\n   */\n  external?: string[]\n}\n\n// ----------------------------------------------------------------------------\n\ntype RuleOptions = [Required<RuleNoInvalidModulesOptions>]\ntype RuleMessageIds = 'SOURCE_FILE_NOT_FOUND'\n\n// exports ====================================================================\n\nexport default ESLintUtils.RuleCreator.withoutDocs<RuleOptions, RuleMessageIds>({\n\n  meta: {\n    type: 'problem',\n    schema: [\n      // single options object\n      Schema.options({\n        external: Schema.array(Schema.stringNE()),\n      }),\n    ],\n    messages: {\n      SOURCE_FILE_NOT_FOUND: 'Source file for `{{moduleName}}` not found.',\n    },\n    fixable: 'code',\n  },\n\n  defaultOptions: [{\n    external: [],\n  }],\n\n  create(context, [options]) {\n\n    // create the project context with aliases, root path, own module name, etc.\n    const projectContext = new ProjectContext(context)\n\n    return {\n      'ImportDeclaration, TSExternalModuleReference, ImportExpression, ExportAllDeclaration, ExportNamedDeclaration'(node: ImportExportNode) {\n\n        // import/export statement must contain string literal\n        const importWrapper = projectContext.resolveImportNode(node)\n        if (!importWrapper) return\n\n        // skip glob patterns in TypeScript type imports\n        if ((node.type === NodeType.ImportDeclaration) && (node.importKind === 'type') && importWrapper.moduleName.includes('*')) {\n          return\n        }\n\n        // accept known external module\n        if (importWrapper.matchModuleName(options.external)) return\n\n        // extract alias key, replace with alias path\n        const [aliasKey, modulePath] = projectContext.resolveAlias(importWrapper.moduleName)\n\n        // accept installed npm package\n        if (!aliasKey && projectContext.packageExists(modulePath)) return\n\n        // check existence of source file\n        if (!projectContext.fileExists(modulePath)) {\n          context.report({\n            messageId: 'SOURCE_FILE_NOT_FOUND',\n            node: importWrapper.sourceNode,\n            data: { moduleName: importWrapper.moduleName },\n          })\n        }\n      },\n    }\n  },\n})\n","\nimport { AST_NODE_TYPES as NodeType, ESLintUtils } from '@typescript-eslint/utils'\n\nimport type { ImportExportNode } from '@/eslint/shared/rule-utils.ts'\nimport { Schema, makeArray, ProjectContext } from '@/eslint/shared/rule-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration for the rule 'env-project/no-invalid-hierarchy' to specify a\n * sub package inside a project.\n */\nexport interface RuleNoInvalidHierarchyPackage {\n\n  /**\n   * Glob patterns selecting all source files that are part of the package.\n   */\n  files: string[]\n\n  /**\n   * Specifies the names of all packages (keys of the `packages` dictionary)\n   * this package depends on.\n   */\n  extends?: string | string[]\n\n  /**\n   * Set to `true` to mark an optional package that may be missing in an\n   * installation. Such a package cannot be imported statically (with `import`\n   * statement) from a non-optional package, but can only be loaded dynamically\n   * at runtime (by calling `import()`). The rule will mark all static imports\n   * of optional code as an error.\n   *\n   * @default false\n   */\n  optional?: boolean\n}\n\n// ----------------------------------------------------------------------------\n\nexport type RuleNoInvalidHierarchyOptions = Record<string, RuleNoInvalidHierarchyPackage>\n\n// ----------------------------------------------------------------------------\n\ntype RuleOptions = [RuleNoInvalidHierarchyOptions]\ntype RuleMessageIds = 'UNEXPECTED_OPTIONAL_STATIC' | 'INVALID_PACKAGE_HIERARCHY'\n\n// exports ====================================================================\n\nexport default ESLintUtils.RuleCreator.withoutDocs<RuleOptions, RuleMessageIds>({\n\n  meta: {\n    type: 'problem',\n    schema: [\n      // single options object\n      Schema.dictionary(Schema.options({\n        files: Schema.maybeArray(Schema.stringNE()),\n        extends: Schema.maybeArray(Schema.stringNE()),\n        optional: Schema.boolean(),\n      }, ['files'])),\n    ],\n    messages: {\n      UNEXPECTED_OPTIONAL_STATIC: 'Unexpected static import of optional package.',\n      INVALID_PACKAGE_HIERARCHY: 'Low-level package cannot import modules from higher-level package.',\n    },\n    fixable: 'code',\n  },\n\n  defaultOptions: [{}],\n\n  create(context, [options]) {\n\n    // create the project context with aliases, root path, own module name, etc.\n    const projectContext = new ProjectContext(context)\n\n    /** @ignore */\n    interface Package extends RuleNoInvalidHierarchyPackage {\n      extends: string[]\n    }\n\n    // convert strings in record entries to arrays\n    const hierarchyMap = new Map<string, Package>()\n    for (const [key, settings] of Object.entries(options)) {\n      hierarchyMap.set(key, {\n        ...settings,\n        extends: makeArray(settings.extends),\n      })\n    }\n\n    // collect all globs for package members\n    const packagesGlobs = Array.from(hierarchyMap.values(), settings => settings.files).flat()\n\n    return {\n      'ImportDeclaration, TSExternalModuleReference, ImportExpression, ExportAllDeclaration, ExportNamedDeclaration'(node: ImportExportNode) {\n\n        // import/export statement must contain string literal\n        const importWrapper = projectContext.resolveImportNode(node)\n        if (!importWrapper) return\n\n        // check dependencies if the imported module is covered in the configuration\n        if (!importWrapper.matchModuleName(packagesGlobs)) return\n\n        // whether an invalid static import has been found ('as boolean' to workaround linter)\n        let invalidStatic = false as boolean\n\n        // recursively checks the imported module for dependency violations\n        const checkDependencies = (settings: Package, root: boolean): boolean => {\n\n          // only allow static imports from specified package, if it is not optional\n          if (importWrapper.matchModuleName(settings.files)) {\n            if (!root && (node.type !== NodeType.ImportExpression) && settings.optional) invalidStatic = true\n            return true\n          }\n\n          // do not traverse into dependencies of optional modules\n          if (!settings.extends.length || (!root && settings.optional)) {\n            return false\n          }\n\n          // allow imports from any of the dependent packages\n          return settings.extends.some(key => {\n            const package2 = hierarchyMap.get(key)\n            return !!package2 && checkDependencies(package2, false)\n          })\n        }\n\n        // check dependencies of all configured packages (not for anonymous modules)\n        let invalidDeps = false\n        for (const settings of hierarchyMap.values()) {\n          if (projectContext.matchModuleName(settings.files) && !checkDependencies(settings, true)) {\n            invalidDeps = true\n            break\n          }\n        }\n\n        // report package hierarchy errors\n        if (invalidStatic) {\n          context.report({ messageId: 'UNEXPECTED_OPTIONAL_STATIC', node: importWrapper.sourceNode })\n        } else if (invalidDeps) {\n          context.report({ messageId: 'INVALID_PACKAGE_HIERARCHY', node: importWrapper.sourceNode })\n        }\n      },\n    }\n  },\n})\n","\nimport type { ConfigArg, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig, customRules } from '@/eslint/shared/env-utils.ts'\nimport type { SharedRuleSettings } from '@/eslint/shared/rule-utils.ts'\n\nimport noInvalidModules, { type RuleNoInvalidModulesOptions } from '@/eslint/rules/project/noInvalidModules.ts'\nimport noInvalidHierarchy, { type RuleNoInvalidHierarchyOptions } from '@/eslint/rules/project/noInvalidHierarchy.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.project'.\n */\nexport interface EnvProjectOptions extends EnvBaseOptions {\n\n  /**\n   * Maps all alias prefixes to actual paths in the project.\n   */\n  alias?: SharedRuleSettings['alias']\n\n  /**\n   * Options to be passed to the rule 'env-project/no-invalid-modules'.\n   */\n  external?: RuleNoInvalidModulesOptions['external']\n\n  /**\n   * Options to be passed to the rule 'env-project/no-invalid-hierarchy'.\n   */\n  hierarchy?: RuleNoInvalidHierarchyOptions\n}\n\n// exports ====================================================================\n\n/**\n * Adds custom linter rules for checking project setup and module hierarchy.\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function project(envOptions: EnvProjectOptions): ConfigArg {\n\n  return [\n\n    // register rule implementations\n    createConfig('env.project.plugin', envOptions, {\n      plugins: {\n        'env-project': {\n          rules: {\n            'no-invalid-modules': noInvalidModules,\n            'no-invalid-hierarchy': noInvalidHierarchy,\n          },\n        },\n      },\n      settings: {\n        'env-project': {\n          alias: envOptions.alias,\n        },\n      },\n    }),\n\n    // custom rules\n    customRules('env.project.rules', envOptions, {\n      'env-project/no-invalid-modules': ['error', { external: envOptions.external ?? [] }],\n      'env-project/no-invalid-hierarchy': envOptions.hierarchy ? ['error', envOptions.hierarchy] : 'off',\n    }),\n  ]\n}\n","\nimport type { ConfigArg, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { createConfig, customRules } from '@/eslint/shared/env-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.tsconfig'.\n */\nexport interface EnvTSConfigOptions extends EnvBaseOptions {\n\n  /**\n   * The path to the TypeScript project configuration file (`tsconfig.json`).\n   */\n  project: string\n}\n\n// functions ==================================================================\n\n/**\n * Creates configuration objects for TypeScript projects.\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function tsconfig(envOptions: EnvTSConfigOptions): ConfigArg {\n\n  return [\n\n    // path to project configuration file\n    createConfig('env.tsconfig.project', envOptions, {\n      languageOptions: {\n        parserOptions: {\n          projectService: false,\n          project: envOptions.project,\n        },\n      },\n    }),\n\n    // custom rules\n    customRules('env.tsconfig.rules', envOptions),\n  ]\n}\n","\nimport * as babelParser from '@babel/eslint-parser'\n\nimport type { ConfigArg, EnvBaseOptions } from '@/eslint/shared/env-utils.ts'\nimport { TS_GLOB, createConfig, customRules } from '@/eslint/shared/env-utils.ts'\n\n// types ======================================================================\n\n/**\n * Configuration options for the environment preset 'env.decorators'.\n */\nexport interface EnvDecoratorsOptions extends EnvBaseOptions { }\n\n// functions ==================================================================\n\n/**\n * Adds support for native decorators in JavaScript source files.\n *\n * Wraps the following packages:\n * - `@babel/eslint-parser`\n * - `@babel/plugin-proposal-decorators`\n *\n * @param envOptions\n *  Configuration options for the environment.\n *\n * @returns\n *  The configuration entries to be added to the resulting configuration array.\n */\nexport default function decorators(envOptions: EnvBaseOptions): ConfigArg {\n\n  return [\n\n    createConfig('core.decorators.babel', envOptions, {\n      ignores: TS_GLOB,\n      languageOptions: {\n        parser: babelParser,\n        parserOptions: {\n          requireConfigFile: false,\n          babelOptions: {\n            babelrc: false,\n            configFile: false,\n            parserOpts: { plugins: ['decorators'] },\n          },\n        },\n      },\n    }),\n\n    customRules('core.decorators.rules', envOptions),\n  ]\n}\n","\nimport type { ConfigObject, RulesConfig } from '@eslint/core'\nimport {  defineConfig as defineEslintConfig, globalIgnores } from '@eslint/config-helpers'\n\nimport { flattenDeepArrays } from '@/utils/utils.ts'\nimport { PathResolver } from '@/utils/resolver.ts'\nimport type { Config, ConfigArg, LanguageOptions, LanguageConfig, PackagesOptions, PackagesConfig, StylisticOptions, StylisticConfig } from '@/eslint/shared/env-utils.ts'\nimport type { VueOptions } from '@/eslint/core/vue.ts'\n\nimport base from '@/eslint/core/base.ts'\nimport js from '@/eslint/core/js.ts'\nimport ts from '@/eslint/core/ts.ts'\nimport vue from '@/eslint/core/vue.ts'\nimport json from '@/eslint/core/json.ts'\nimport yaml from '@/eslint/core/yaml.ts'\nimport markdown from '@/eslint/core/markdown.ts'\nimport license from '@/eslint/core/license.ts'\nimport directives from '@/eslint/core/directives.ts'\nimport packages from '@/eslint/core/packages.ts'\nimport regexp from '@/eslint/core/regexp.ts'\nimport promises from '@/eslint/core/promises.ts'\nimport jsdoc from '@/eslint/core/jsdoc.ts'\nimport stylistic from '@/eslint/core/stylistic.ts'\n\nimport node from '@/eslint/env/node.ts'\nimport browser from '@/eslint/env/browser.ts'\nimport jest from '@/eslint/env/jest.ts'\nimport vitest from '@/eslint/env/vitest.ts'\nimport codecept from '@/eslint/env/codecept.ts'\nimport react from '@/eslint/env/react.ts'\nimport eslint from '@/eslint/env/eslint.ts'\nimport project from '@/eslint/env/project.ts'\nimport tsconfig from '@/eslint/env/tsconfig.ts'\nimport decorators from '@/eslint/env/decorators.ts'\n\n// types ======================================================================\n\nexport type { ConfigObject, LanguageOptions, PackagesOptions, RulesConfig, StylisticOptions, VueOptions }\n\n/**\n * Configuration options for linting the entire project with ESLint.\n */\nexport interface ProjectOptions {\n\n  /**\n   * The URL of the project root containing the ESLint configuration file.\n   * Should usually be set to `import.meta.url`.\n   */\n  root: string\n\n  /**\n   * Glob patterns with all files and folders to be ignored by ESLint.\n   */\n  ignores?: readonly string[]\n\n  /**\n   * Path to the template file containing the license header to be used in all\n   * source files. May be a path relative to the project root.\n   */\n  license?: string\n\n  /**\n   * Configuration options for language and project setup.\n   */\n  language?: LanguageOptions\n\n  /**\n   * Configuration options for external package dependencies.\n   */\n  packages?: PackagesOptions\n\n  /**\n   * Configuration options for code style.\n   */\n  stylistic?: StylisticOptions\n\n  /**\n   * Additional configuration options for Vue source files.\n   */\n  vue?: VueOptions\n\n  /**\n   * Additional linter rules to be added to the global configuration.\n   */\n  rules?: RulesConfig\n}\n\n// environment presets ========================================================\n\n/**\n * A collection with all available environment presets.\n */\nexport const env = {\n  node,\n  browser,\n  jest,\n  vitest,\n  codecept,\n  react,\n  eslint,\n  project,\n  tsconfig,\n  decorators,\n} as const\n\n// functions ==================================================================\n\n/**\n * Generates a complete ESLint configuration array.\n *\n * @param options\n *  Options for the base configuration that will be generated.\n *\n * @param configs\n *  Additional configuration entries: Each parameter may be a callback function\n *  that will be invoked with a `PathResolver` utility.\n *\n * @returns\n *  The resulting ESLint configuration array that must be returned from the\n *  `eslint.config.*` file.\n */\nexport function defineConfig(options: ProjectOptions, ...configs: Array<ConfigArg | ((resolver: PathResolver) => ConfigArg)>): ConfigObject[] {\n\n  const ignores: string[] = [\n    '*/.yarn',\n    'dist',\n    'output',\n    'vite.config.ts.*.mjs',\n    'gitlab-ci',\n    '.gitlab-ci.yml',\n    'coverage',     // Vitest\n    '.nuxt',        // NuxtJS\n    '.output',      // NuxtJS\n    ...(options.ignores ?? []),\n  ]\n\n  // resolve language configuration options\n  const languageConfig: LanguageConfig = {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    ...options.language,\n  }\n\n  // resolve dependency configuration options\n  const packagesConfig: PackagesConfig = {\n    allowed: [],\n    banned: [],\n    ...options.packages,\n  }\n\n  // resolve stylistic configuration options\n  const indent = options.stylistic?.indent ?? 2\n  const stylisticConfig: StylisticConfig = {\n    semi: 'never',\n    quotes: 'single',\n    dangle: 'always',\n    ...options.stylistic,\n    indent,\n    indentOverrides: {\n      js: indent,\n      json: indent,\n      yaml: indent,\n      vue: indent,\n      ...options.stylistic?.indentOverrides,\n    },\n  }\n\n  // the resolver for relative file paths\n  const resolver = new PathResolver(options.root)\n\n  return defineEslintConfig(flattenDeepArrays<Config>(\n\n    // ignore certain files and folders\n    globalIgnores(ignores, 'index:global-ignores'),\n\n    // module types and standard rules for all JS/TS source files\n    base(languageConfig),\n\n    // default configuration for JavaScript files\n    js(),\n\n    // default configuration for TypeScript files\n    ts(resolver.root),\n\n    // default configuration for Vue.js files\n    vue(resolver.root, stylisticConfig, options.vue),\n\n    // default configuration for JSON files\n    json(stylisticConfig),\n\n    // default configuration for YAML files\n    yaml(stylisticConfig),\n\n    // default configuration for Markdown files\n    markdown(),\n\n    // check for correct license headers\n    options.license ? license(resolver.path(options.license)) : undefined,\n\n    // default configuration for ESLint inline directives\n    directives(),\n\n    // default configuration for outdated dependencies\n    packages(packagesConfig),\n\n    // default configuration for regular expressions\n    regexp(),\n\n    // default configuration for native promises\n    promises(),\n\n    // default configuration for JSDoc\n    jsdoc(),\n\n    // default configuration for code style checks\n    stylistic(stylisticConfig),\n\n    // custom rules\n    options.rules && { name: 'core.index.custom-rules', rules: options.rules },\n\n    // custom configuration entries\n    configs.map(config => (typeof config === 'function') ? config(resolver) : config),\n  ) as ConfigObject[])\n}\n"],"mappings":"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"}