{"version":3,"sources":["../src/index.ts","../src/factory.ts","../src/config.ts","../src/rules/compact-return.ts","../src/rules/jsdoc-max-len.ts","../src/rules/jsdoc-oneline.ts","../src/rules/prefer-concise-async-arrow.ts","../src/utils.ts"],"sourcesContent":["import { maninak } from './factory.js'\n\nexport default maninak\n","import type {\n  OptionsConfig,\n  OptionsTypescript,\n  TypedFlatConfigItem,\n} from '@antfu/eslint-config'\nimport antfu from '@antfu/eslint-config'\nimport { merge } from 'ts-deepmerge'\nimport buildConfig, { requireJsdocInUtilsBlocks } from './config.js'\nimport { hasConsumerTsconfig, isInConsumerDeps } from './utils.js'\n\n/** Maninak-specific options layered on top of antfu's. All optional. */\nexport interface ManinakExtraOptions {\n  /**\n   * When true, require a JSDoc block on `export`ed functions, classes, and methods in folders\n   * that conventionally hold reusable utilities e.g. `utils/`, `lib/`, etc.\n   * `@param` and `@returns` tags stay optional; a free-text description alone is enough\n   * of a contract.\n   *\n   * Test files e.g. `*.test.*`, `*.spec.*`, are always exempt even when their path matches one\n   * of the utility globs.\n   *\n   * Default: `false`. Off by default to keep the preset lower friction.\n   */\n  requireJsdocInUtils?: boolean\n}\n\n/**\n * Maninak's public options type. Extends antfu's `OptionsConfig` with `ManinakExtraOptions`\n * and widens `typescript.tsconfigPath` to accept a string array. antfu only accepts a single\n * string (it feeds it into `projectService.defaultProject`), but the maninak factory detects\n * an array and switches the resulting parser blocks to legacy `parserOptions.project` mode,\n * which natively accepts multiple paths.\n */\nexport type ManinakOptions = Omit<OptionsConfig, 'typescript'> &\n  ManinakExtraOptions & {\n    typescript?:\n      | boolean\n      | (Omit<OptionsTypescript, 'tsconfigPath'> & {\n          tsconfigPath?: string | string[]\n        })\n  }\n\n/**\n * Build the final ESLint flat config array using the maninak preset.\n *\n * Wraps antfu's factory with the maninak ruleset and, when the consumer has Nuxt\n * installed, the official Nuxt flat config. Type-aware rules activate automatically\n * when a `tsconfig.json` exists at cwd, or when an explicit `typescript.tsconfigPath`\n * is provided. `tsconfigPath` accepts a string or a string array (useful when some\n * tsconfigs use non-standard names that TypeScript's project service won't discover).\n *\n * @param options Same shape as antfu's options, extended with maninak-specific knobs (see\n *   {@link ManinakExtraOptions}). Common antfu keys: `typescript`, `vue`, `react`, `svelte`,\n *   `stylistic`, `ignores`. Maninak's defaults (e.g. `stylistic: false`, rule overrides)\n *   deep-merge with what you pass; your values win on conflict.\n * @param userConfigs Additional flat-config items appended after maninak's\n *   blocks, so they override everything that came before.\n *\n * @example <caption>Minimal usage in `eslint.config.mjs`</caption>\n * ```ts\n * import maninak from '@maninak/eslint-config'\n *\n * export default maninak()\n * ```\n *\n * @example <caption>Multiple tsconfigs when non-standard names rule out auto-discovery</caption>\n * ```ts\n * export default maninak({\n *   typescript: {\n *     tsconfigPath: ['./tsconfig.json', './test/tsconfig.wdio.json'],\n *   },\n * })\n * ```\n *\n * @example <caption>Append a project-specific block that overrides a rule</caption>\n * ```ts\n * export default maninak(\n *   {},\n *   {\n *     files: ['src/legacy/**'],\n *     rules: { 'ts/no-explicit-any': 'off' },\n *   },\n * )\n * ```\n *\n * @example <caption>Opt in to JSDoc requirements for utility code</caption>\n * ```ts\n * export default maninak({\n *   requireJsdocInUtils: true,\n * })\n * ```\n */\nexport async function maninak(\n  options: ManinakOptions = {},\n  ...userConfigs: Parameters<typeof antfu>['1'][]\n): Promise<TypedFlatConfigItem[]> {\n  const { requireJsdocInUtils = false, ...antfuOptions } = options\n  const [maninakOptions, ...maninakConfig] = buildConfig()\n  const nuxtConfigs = isInConsumerDeps('nuxt') ? await getNuxtConfigs() : []\n  const frameworkDefaults = {\n    vue: isInConsumerDeps('vue') || isInConsumerDeps('nuxt'),\n    svelte: isInConsumerDeps('svelte'),\n    react: isInConsumerDeps('react') || isInConsumerDeps('next'),\n  }\n\n  const tsconfigPaths = resolveTsconfigPaths(antfuOptions.typescript)\n  const tsconfigOverride = tsconfigPaths\n    ? { typescript: { tsconfigPath: tsconfigPaths[0] } }\n    : {}\n\n  const configs = await antfu(\n    merge(frameworkDefaults, maninakOptions, antfuOptions, tsconfigOverride),\n    ...maninakConfig,\n    ...(requireJsdocInUtils ? requireJsdocInUtilsBlocks : []),\n    ...nuxtConfigs,\n    ...userConfigs,\n  )\n\n  if (tsconfigPaths && tsconfigPaths.length > 1) {\n    switchToLegacyProjectMode(configs, tsconfigPaths)\n  }\n\n  return configs\n}\n\n/**\n * Returns the final list of tsconfig paths to drive type-aware linting, or `undefined` if\n * type-aware linting should stay off.\n *\n * Resolution order:\n * 1. If the consumer set `typescript: false`, return undefined (TS is being disabled\n * outright).\n * 2. If the consumer set `typescript.tsconfigPath` (string or string[]), use that.\n * 3. Otherwise auto-detect: a `tsconfig.json` at cwd plus `typescript` in the consumer's\n *    deps activates type-aware linting silently.\n */\nfunction resolveTsconfigPaths(\n  typescriptOption: ManinakOptions['typescript'],\n): string[] | undefined {\n  if (typescriptOption === false) {\n    return undefined\n  }\n  const tsObject = typeof typescriptOption === 'object' ? typescriptOption : {}\n  const explicit = tsObject.tsconfigPath\n\n  if (Array.isArray(explicit)) {\n    const paths = explicit.filter((item): item is string => item.length > 0)\n    return paths.length > 0 ? paths : undefined\n  }\n  if (typeof explicit === 'string' && explicit.length > 0) {\n    return [explicit]\n  }\n\n  return isInConsumerDeps('typescript') && hasConsumerTsconfig()\n    ? ['./tsconfig.json']\n    : undefined\n}\n\n/**\n * antfu v9 forwards `tsconfigPath` straight into `projectService.defaultProject`, which only\n * accepts a single string. When the consumer wants multiple non-standard-named tsconfigs,\n * we swap the type-aware parser blocks over to legacy `parserOptions.project`, which natively\n * accepts an array. Run in place after `antfu()` returns.\n */\nfunction switchToLegacyProjectMode(\n  configs: TypedFlatConfigItem[],\n  tsconfigPaths: string[],\n): void {\n  for (const block of configs) {\n    const parserOptions = block.languageOptions?.['parserOptions'] as\n      | { projectService?: unknown; project?: unknown }\n      | undefined\n    if (parserOptions && 'projectService' in parserOptions) {\n      delete parserOptions.projectService\n      parserOptions.project = tsconfigPaths\n    }\n  }\n}\n\nasync function getNuxtConfigs(): Promise<Parameters<typeof antfu>['1'][]> {\n  try {\n    const { createConfigForNuxt } = await import('@nuxt/eslint-config/flat')\n    const configs = await createConfigForNuxt({})\n    const arr = Array.isArray(configs) ? configs : [configs]\n\n    // Nuxt's config registers `eslint-plugin-import`; antfu v9 already registers a\n    // different fork (`eslint-plugin-import-x` / `eslint-plugin-import-lite`) under\n    // the same `import` key. Flat config rejects two distinct plugin objects under\n    // one key, so we drop the offending nuxt block and let antfu's import rules\n    // continue to apply.\n    return arr.filter((block) => !block?.plugins?.['import']).map(makeNuxtGlobsWorkspaceWide)\n  } catch {\n    // @nuxt/eslint-config not installed; skip silently\n    return []\n  }\n}\n\n/**\n * Nuxt's generated config anchors its convention-file globs at the lint root (the `pages/`,\n * `layouts/`, `components/` dirs, and `error.vue` / `app.vue`). When the Nuxt app lives in a\n * workspace sub-package (e.g. `apps/web`) those globs never match `apps/web/pages/...`, so the\n * exemptions they carry, like turning `vue/multi-word-component-names` off for `pages/` and\n * `error.vue`, silently fail and the convention files (whose names Nuxt dictates and the user\n * cannot rename) get flagged. Prefixing each glob not already globstar-anchored with a\n * leading globstar makes it match the Nuxt dirs at any depth; a leading globstar matches\n * zero segments too, so a Nuxt app at the lint root still matches. These blocks only relax\n * rules for the convention files, so broadening the match is safe.\n */\nfunction makeNuxtGlobsWorkspaceWide<T extends { files?: unknown }>(block: T): T {\n  if (!Array.isArray(block.files)) {\n    return block\n  }\n\n  const files = (block.files as unknown[]).map((glob) =>\n    typeof glob === 'string' && !glob.startsWith('**/') && !glob.startsWith('/')\n      ? `**/${glob}`\n      : glob,\n  )\n\n  return { ...block, files }\n}\n","/* eslint-disable ts/no-unsafe-member-access */\n/* eslint-disable ts/no-unsafe-assignment */\n\nimport type antfu from '@antfu/eslint-config'\nimport type { TypedFlatConfigItem } from '@antfu/eslint-config'\nimport type { Config as PrettierConfig } from 'prettier'\nimport {\n  GLOB_JS,\n  GLOB_JSON,\n  GLOB_JSON5,\n  GLOB_JSONC,\n  GLOB_JSX,\n  GLOB_SVELTE,\n  GLOB_TESTS,\n  GLOB_TOML,\n  GLOB_TSX,\n  GLOB_VUE,\n} from '@antfu/eslint-config'\nimport pluginStylistic from '@stylistic/eslint-plugin'\nimport configPrettier from 'eslint-config-prettier'\nimport pluginJasmine from 'eslint-plugin-jasmine'\nimport pluginPrettier from 'eslint-plugin-prettier'\nimport pluginPrettierVue from 'eslint-plugin-prettier-vue'\nimport pluginTailwindcss from 'eslint-plugin-tailwindcss'\nimport pluginVueScopedCss from 'eslint-plugin-vue-scoped-css'\nimport compactReturn from './rules/compact-return.js'\nimport jsdocMaxLen from './rules/jsdoc-max-len.js'\nimport jsdocOneline from './rules/jsdoc-oneline.js'\nimport preferConciseAsyncArrow from './rules/prefer-concise-async-arrow.js'\nimport { getConsumerVueVersion, isInConsumerDeps } from './utils.js'\n\nconst prettier = interopDefault(pluginPrettier)\n\nconst prettierRulesFixingConflictsWithEslint = {\n  ...interopDefault(configPrettier).rules,\n}\ndelete prettierRulesFixingConflictsWithEslint['vue/html-self-closing']\n\nconst maxColumnsPerLine = 95\n\nconst prettierConfig: PrettierConfig = {\n  printWidth: maxColumnsPerLine,\n  useTabs: false,\n  tabWidth: 2,\n  semi: false,\n  singleQuote: true,\n  trailingComma: 'all',\n  quoteProps: 'consistent',\n  arrowParens: 'always',\n  htmlWhitespaceSensitivity: 'css',\n}\n\n/**\n * Builds the maninak rule preset. Returns a tuple `[maninakOptionsForAntfu, ...flatBlocks]`:\n * the first element is the options object passed to antfu's factory, the rest are flat-config\n * items appended after antfu has run.\n *\n * Exported as a function (not a static array) so that gates which depend on the consumer's\n * environment, like `isInConsumerDeps('vue')` and `isInConsumerDeps('tailwindcss')`, evaluate\n * lazily on every `maninak()` call. A static array would freeze those gates at module-load\n * time, which works fine in real consumer setups but breaks tests that run multiple specs\n * under different cwds.\n */\nexport default function buildConfig() {\n  const resolvedVueVersion = getConsumerVueVersion()\n\n  return [\n    {\n      ignores: ['static', '.*', '!.*.*', 'LICENCE', 'pnpm-workspace.yaml'],\n      stylistic: false,\n      typescript: {\n        // Rules that do NOT require type information (applied to all TS files,\n        // regardless of whether `tsconfigPath` is set by the consumer).\n        overrides: {\n          /*\n           * Rules implemented by `@typescript-eslint` (exposed as `ts/` in antfu) follow.\n           * ==================================================================================\n           */\n\n          // antfu default: ['error', { minimumDescriptionLength: 3, ... }]. Maninak turns off\n          // (ts-expect-error and ts-ignore are sometimes the pragmatic escape hatch).\n          'ts/ban-ts-comment': 'off',\n\n          // antfu default: ['error', 'type']. Maninak prefers interface for structural types.\n          'ts/consistent-type-definitions': ['warn', 'interface'],\n\n          // antfu default: off. Maninak enforces inline type imports.\n          'ts/consistent-type-imports': [\n            'warn',\n            { disallowTypeAnnotations: false, fixStyle: 'inline-type-imports' },\n          ],\n\n          // antfu does not enforce a function style. Maninak prefers `function foo() {}` over\n          // `const foo = () => {}` for top-level/named declarations.\n          'func-style': ['warn', 'declaration', { allowArrowFunctions: false }],\n\n          'no-nested-ternary': 'warn',\n          'complexity': ['warn', { max: 25 }],\n\n          'ts/no-explicit-any': 'warn', // antfu default: off.\n          'ts/no-extraneous-class': 'warn', // antfu default: off.\n          'ts/no-import-type-side-effects': 'warn', // antfu default: off.\n          'ts/unified-signatures': 'warn', // antfu default: off.\n          'ts/no-unused-vars': 'off', // antfu default: off. Managed by unused-imports plugin instead.\n\n          /*\n           * Rules below have no antfu default (maninak additions)\n           * ==================================================================================\n           */\n\n          'ts/array-type': ['warn', { default: 'array', readonly: 'array' }],\n          'ts/explicit-member-accessibility': 'warn',\n          'ts/prefer-for-of': 'warn',\n          'ts/member-ordering': 'warn',\n          'ts/no-inferrable-types': 'off',\n          'ts/no-this-alias': 'off',\n          'ts/naming-convention': [\n            'warn',\n            {\n              selector: 'interface',\n              format: ['PascalCase'],\n              custom: { regex: '^I[A-Z]', match: false },\n            },\n            {\n              selector: 'variable',\n              format: ['camelCase', 'UPPER_CASE'],\n              leadingUnderscore: 'allow',\n              trailingUnderscore: 'allow',\n            },\n            { selector: 'typeLike', format: ['PascalCase'] },\n          ],\n          'ts/no-extra-non-null-assertion': 'warn',\n          'ts/prefer-function-type': 'warn',\n\n          // overrides to antfu's defaults\n          'ts/indent': 'off',\n          'ts/consistent-type-assertions': [\n            'warn',\n            { assertionStyle: 'as', objectLiteralTypeAssertions: 'allow-as-parameter' },\n          ],\n        },\n\n        overridesTypeAware: {\n          // antfu default: error. Off in maninak: fire-and-forget is a frequent legitimate\n          // pattern in this codebase's domain (extension activation, UI side effects), and\n          // the rule's noise on intentional cases outweighed its catch rate for accidental ones.\n          'ts/no-floating-promises': 'off',\n\n          // antfu default: error.\n          'ts/promise-function-async': 'warn',\n\n          // antfu default: error. Fixable, but the auto-fix often inserts noisy String()\n          // conversions; downgrade to warn so the dev sees it and decides.\n          'ts/restrict-template-expressions': 'warn',\n\n          // antfu default: ['error', 'in-try-catch']. Maninak uses 'always' (always explicit\n          // about async/await).\n          'ts/return-await': ['warn', 'always'],\n\n          // Disabled: the rule's `allow*` options don't compose over union types, so a\n          // legitimately-written `if (!errorCode)` where\n          // `errorCode: string | number | undefined` still fires even with allowNullableString\n          // + allowNullableNumber options set.This creates noise without safety benefit, since\n          // `ts/no-unnecessary-condition` catches the genuinely problematic cases\n          // (always-true/always-false), while `ts/no-unsafe-member-access`\n          // and friends catch `any`-typed conditions.\n          'ts/strict-boolean-expressions': 'off',\n\n          // Type-aware additions not in antfu's defaults (all fixable, so warn).\n          'ts/require-array-sort-compare': 'warn',\n          'ts/prefer-readonly': 'warn',\n          'ts/no-unnecessary-qualifier': 'warn',\n          'ts/no-duplicate-type-constituents': 'warn',\n          // `ignoreArrowShorthand` permits the common `() => sideEffectReturningVoid()`\n          // form (e.g. `{ dispose: () => watcher.close() }`), which is unambiguous and\n          // reads better as a one-liner than the brace-wrapped block the rule otherwise demands.\n          'ts/no-confusing-void-expression': ['warn', { ignoreArrowShorthand: true }],\n        },\n      },\n    },\n    {\n      rules: {\n        // antfu's pnpm plugin enforces shellEmulator: true and trustPolicy: \"no-downgrade\"\n        // via this rule. The trust-policy demand rejects legitimate dependency updates.\n        'pnpm/yaml-enforce-settings': 'off',\n        // antfu enables this for jsonc files. Key order in tsconfig.json (and similar) is\n        // conventional and not alphabetical, and the rule fights that convention.\n        'jsonc/sort-keys': 'off',\n        // antfu default: ['error', 'top-level']. Conflicts with our inline-type-imports\n        // preference (see `ts/consistent-type-imports` below) AND with `perfectionist/sort-imports`,\n        // which sorts top-level type-imports as a separate group. Turn off and let\n        // `ts/consistent-type-imports` enforce the inline style on new code.\n        'import/consistent-type-specifier-style': 'off',\n      },\n    },\n    {\n      plugins: {\n        // antfu with `stylistic: false` does not register the @stylistic plugin, but\n        // we still need it for `style/member-delimiter-style` further below.\n        style: interopDefault(pluginStylistic),\n        // A single registration for every custom maninak rule. Separate `maninak` plugin\n        // objects under one key conflict in flat config, so all custom rules live here.\n        maninak: {\n          rules: {\n            'prefer-concise-async-arrow': preferConciseAsyncArrow,\n            'compact-return': compactReturn,\n            'jsdoc-oneline': jsdocOneline,\n            'jsdoc-max-len': jsdocMaxLen,\n          },\n        },\n      },\n      rules: {\n        /*\n         * Rules native to ESLint follow, antfu-overrides first then maninak additions\n         * ====================================================================================\n         */\n\n        // overrides to antfu's defaults\n        'no-console': ['warn', { allow: ['warn', 'error'] }],\n        'no-unused-expressions': [\n          'warn',\n          {\n            allowShortCircuit: true,\n            allowTernary: true,\n            allowTaggedTemplates: true,\n            enforceForJSX: true,\n          },\n        ],\n        // Disabling antfu/curly lets `curly: 'all'` win unopposed. Net behavior: unchanged.\n        'antfu/curly': 'off',\n        'curly': ['warn', 'all'],\n        'no-debugger': 'warn',\n        'prefer-const': ['warn', { destructuring: 'all', ignoreReadBeforeAssign: true }],\n        'no-restricted-syntax': [\n          'error',\n          {\n            selector: 'TSEnumDeclaration',\n            message:\n              \"Don't declare enums. See alternative: https://twitter.com/maninak_/status/1448344698704343040\",\n          },\n          // LabeledStatement and WithStatement are archaic and dangerous constructs\n          'LabeledStatement',\n          'WithStatement',\n        ],\n\n        // maninak additions follow\n        'no-confusing-arrow': ['warn', { allowParens: true }],\n        'no-extra-boolean-cast': 'warn',\n        // Blank-line-before-return is owned by `maninak/compact-return` (declared below), not\n        // by padding-line. The custom rule requires a blank before return in normal bodies AND\n        // forbids one in compact two-statement bodies. Keeping that policy in padding-line too\n        // would make the two fixers fight over the compact case and never converge.\n        'maninak/compact-return': 'warn',\n        'padding-line-between-statements': [\n          'warn',\n          { blankLine: 'always', prev: 'directive', next: '*' },\n          { blankLine: 'always', prev: '*', next: 'multiline-block-like' },\n          // Relax for co-located early return ifs\n          { blankLine: 'any', prev: '*', next: 'if' },\n          // Relax for co-located vars set by loops\n          { blankLine: 'any', prev: 'singleline-let', next: 'multiline-block-like' },\n          { blankLine: 'any', prev: 'singleline-const', next: 'for' },\n          { blankLine: 'any', prev: 'singleline-const', next: 'while' },\n          { blankLine: 'any', prev: 'singleline-const', next: 'do' },\n          // Relax for co-located declarations used in functions\n          // e.g. defining a let/const/type/interface that gets used in the following func\n          // We blanket allow (`prev: '*'`) because there's no dedicated STATEMENT_TYPE\n          // for type/interface declarations...\n          { blankLine: 'any', prev: '*', next: 'function' },\n          // ...so immediately we restore requiring blank line for common things\n          { blankLine: 'always', prev: 'class', next: 'function' },\n          { blankLine: 'always', prev: 'function', next: 'function' },\n          { blankLine: 'always', prev: 'expression', next: 'function' },\n          { blankLine: 'always', prev: 'multiline-expression', next: 'function' },\n        ],\n        'id-length': ['warn', { min: 2, max: 50, exceptions: ['i', 'j', 'x', 'y', 'z', '_'] }],\n        'max-len': [\n          'warn',\n          {\n            code: maxColumnsPerLine,\n            tabWidth: 2,\n            ignoreComments: true,\n            ignoreTrailingComments: true,\n            ignoreTemplateLiterals: true, // TODO: remove once prettier resolves https://github.com/prettier/prettier/issues/3368\n            ignoreRegExpLiterals: true,\n            ignoreUrls: true,\n            ignorePattern: '^\\\\s*:?(?:class|style)=\".+\"',\n          },\n        ],\n        'no-restricted-imports': [\n          'error',\n          {\n            paths: [\n              {\n                name: 'lodash',\n                message:\n                  \"Instead use `import [module] from 'lodash/[module]'`, or `import {[module]} from 'lodash-es'` (latter is preferable if possible).\\nMore info: https://www.labnol.org/code/import-lodash-211117\",\n              },\n            ],\n          },\n        ],\n        'space-before-function-paren': [\n          'warn',\n          { anonymous: 'always', named: 'never', asyncArrow: 'always' },\n        ],\n        'prefer-exponentiation-operator': 'warn',\n        'prefer-rest-params': 'warn',\n        'prefer-spread': 'warn',\n        'prefer-template': 'warn',\n        'template-curly-spacing': 'warn',\n        // Flag `async () => { await expr }` and auto-fix to `async () => await expr`. Prettier\n        // always expands block bodies to multiline; the concise form stays on one line.\n        'maninak/prefer-concise-async-arrow': 'warn',\n        'arrow-parens': ['warn', 'always', { requireForBlockBody: true }],\n        'spaced-comment': [\n          'warn',\n          'always',\n          {\n            line: { markers: ['/'], exceptions: ['/', '#'] },\n            block: { markers: ['!'], exceptions: ['*'], balanced: true },\n          },\n        ],\n        'consistent-return': 'warn',\n        'complexity': ['warn', 40],\n        'require-await': 'warn',\n        'max-statements-per-line': 'warn',\n        'no-empty': ['warn', { allowEmptyCatch: true }],\n        'no-multiple-empty-lines': ['warn', { max: 1, maxBOF: 0, maxEOF: 1 }],\n        'no-useless-return': 'warn',\n        'no-undef-init': 'warn',\n\n        /*\n         * Rules from `perfectionist` follow\n         * ====================================================================================\n         */\n        'perfectionist/sort-imports': [\n          'warn',\n          {\n            internalPattern: ['^@/', '^~/'],\n            groups: [\n              'type-import',\n              ['type-parent', 'type-sibling', 'type-index', 'type-internal'],\n              'value-builtin',\n              'value-external',\n              'value-internal',\n              ['value-parent', 'value-sibling', 'value-index'],\n              'side-effect',\n              'ts-equals-import',\n              'unknown',\n            ],\n            newlinesBetween: 'ignore',\n            newlinesInside: 'ignore',\n            order: 'asc',\n            type: 'natural',\n          },\n        ],\n        'perfectionist/sort-named-imports': ['warn', { order: 'asc', type: 'natural' }],\n        'perfectionist/sort-named-exports': ['warn', { order: 'asc', type: 'natural' }],\n        'perfectionist/sort-exports': ['warn', { order: 'asc', type: 'natural' }],\n\n        /*\n         * Rules from `eslint-plugin-unused-imports` follow\n         * ====================================================================================\n         */\n        'unused-imports/no-unused-imports': 'warn',\n        'unused-imports/no-unused-vars': [\n          'warn',\n          {\n            vars: 'all',\n            varsIgnorePattern: '^_',\n            args: 'after-used',\n            argsIgnorePattern: '^_',\n          },\n        ],\n\n        /*\n         * Rules from `eslint-plugin-antfu` follow\n         * ====================================================================================\n         */\n        // Collapse a description-only JSDoc block to a single line `/** text */` when it fits\n        // the print width, normalizing interior spacing. The official jsdoc plugin's\n        // `multiline-blocks` leaves single-line blocks with stray interior spaces intact, so\n        // this owns the whole normalization to guarantee every variant converges identically.\n        'maninak/jsdoc-oneline': ['warn', { maxColumns: maxColumnsPerLine }],\n        // Wrap any JSDoc line past the print width onto continuation lines. `max-len` sets\n        // `ignoreComments: true`, so comments get no width enforcement otherwise; this fills\n        // that gap with a fixer. Split-only (never joins), so it cannot loop against\n        // `jsdoc-oneline` above, which only collapses blocks already within the width.\n        'maninak/jsdoc-max-len': ['warn', { maxColumns: maxColumnsPerLine }],\n        'antfu/if-newline': 'warn',\n        'antfu/import-dedupe': 'warn',\n        'antfu/top-level-function': 'warn',\n        'antfu/consistent-chaining': 'off', // conflict with prettier\n        'antfu/consistent-list-newline': ['warn', { CallExpression: false }], // conflict with prettier\n        // antfu/curly is declared at the top of this rules block (near its sibling curly rule)\n\n        /*\n         * Rules from `eslint-plugin-n` (exposed as `node/` in antfu) follow\n         * ====================================================================================\n         */\n        // antfu default: off . maninak enforces use of global process over importing it\n        'node/prefer-global/process': ['warn', 'always'],\n\n        /*\n         * Rules from `@stylistic/eslint-plugin` (exposed as `style/` in antfu) follow.\n         * Since maninak uses `stylistic: false`, antfu enables none of these by default.\n         * ====================================================================================\n         */\n        // `ts/member-delimiter-style` was removed from @typescript-eslint v8 and moved here.\n        'style/member-delimiter-style': [\n          'warn',\n          {\n            multiline: { delimiter: 'none', requireLast: true },\n            singleline: { delimiter: 'semi', requireLast: false },\n          },\n        ],\n      },\n    },\n    {\n      /*\n       * Rules for non-Vue files\n       * ======================================================================================\n       */\n      files: ['**/*'],\n      ignores: [GLOB_VUE, GLOB_SVELTE, GLOB_TOML],\n      plugins: { prettier },\n      rules: {\n        ...prettierRulesFixingConflictsWithEslint,\n        ...prettier.configs.recommended.rules,\n        'prettier/prettier': ['warn', prettierConfig],\n      },\n    },\n    {\n      /*\n       * Prettier parser override for known files that use JSONC semantics (trailing commas,\n       * comments) despite the `.json` extension.\n       * ======================================================================================\n       */\n      files: ['**/tsconfig*.json', '**/jsconfig*.json', '**/.vscode/*.json'],\n      rules: { 'prettier/prettier': ['warn', { ...prettierConfig, parser: 'jsonc' }] },\n    },\n    {\n      /*\n       * Rules for shared utility function files\n       * ======================================================================================\n       */\n      files: ['**/utils/**/*.ts', '**/util/**/*.ts'],\n      rules: {\n        'ts/explicit-function-return-type': [\n          'warn',\n          {\n            allowExpressions: true,\n            allowConciseArrowFunctionExpressionsStartingWithVoid: true, // eslint-disable-line id-length\n            allowIIFEs: true,\n          },\n        ],\n      },\n    },\n    {\n      /*\n       * Rules for test files\n       * ======================================================================================\n       * `eslint-plugin-jasmine` rules are used despite the name: these specific rules are\n       * framework-agnostic and work with any expect()-style API (Vitest, WDIO, Jest, Playwright,\n       * Mocha+Chai, Jasmine, etc.).\n       */\n      files: [...GLOB_TESTS],\n      plugins: { jasmine: interopDefault(pluginJasmine) },\n      rules: {\n        'jasmine/new-line-before-expect': 'warn',\n        'jasmine/new-line-between-declarations': 'warn',\n\n        // overrides to antfu's defaults:\n        // test titles are natural-language sentences; uppercase first letter is correct grammar\n        'test/prefer-lowercase-title': 'off',\n        // fixable (renames test() to it()), so warn\n        'test/consistent-test-it': ['warn', { fn: 'it' }],\n      },\n    },\n    {\n      /*\n       * Rules for JavaScript config files (e.g. .eslintrc.js, vite.config.js)\n       * ======================================================================================\n       */\n      files: ['**/.*.js', '**/*.config.js'],\n      rules: {\n        'ts/no-var-requires': 'off',\n      },\n    },\n    {\n      /*\n       * Rules for plain JavaScript files\n       * ======================================================================================\n       */\n      files: [GLOB_JS, GLOB_JSX],\n      rules: {\n        'ts/no-var-requires': 'off',\n        'ts/explicit-function-return-type': 'off',\n        // Disable type-unsafe rules for JS files (no TypeScript type information available)\n        'ts/no-unsafe-assignment': 'off',\n        'ts/no-unsafe-argument': 'off',\n        'ts/no-unsafe-member-access': 'off',\n        'ts/no-unsafe-call': 'off',\n        'ts/no-unsafe-return': 'off',\n      },\n    },\n    {\n      /*\n       * Rules for ECMAScript module files\n       * ======================================================================================\n       */\n      files: ['**/*.esm', '**/*.mts'],\n      rules: {\n        'ts/no-var-requires': 'error',\n      },\n    },\n    {\n      /*\n       * Rules for TypeScript type declaration files\n       * ======================================================================================\n       */\n      files: ['**/*.d.ts'],\n      rules: {\n        'id-length': 'off',\n        'ts/no-explicit-any': 'off',\n        'unused-imports/no-unused-imports': 'off',\n        'unused-imports/no-unused-vars': 'off',\n      },\n    },\n    {\n      /*\n       * Rules for JSON-type files\n       * ======================================================================================\n       */\n      files: [GLOB_JSON, GLOB_JSON5, GLOB_JSONC],\n      rules: {\n        'max-len': 'off',\n      },\n    },\n    /*\n     * Rules for Vue single-file components\n     * ========================================================================================\n     */\n    ...(isInConsumerDeps('vue')\n      ? ([\n          ...(pluginVueScopedCss.configs.recommended as TypedFlatConfigItem[]),\n          {\n            name: 'maninak/vue-scoped-css/overrides',\n            files: [GLOB_VUE],\n            rules: {\n              'vue-scoped-css/no-unused-selector': 'off', // alias of require-selector-used-inside\n              'vue-scoped-css/no-deprecated-v-enter-v-leave-class': 'error',\n              'vue-scoped-css/require-selector-used-inside': 'warn',\n              'vue-scoped-css/v-deep-pseudo-style': 'error',\n              'vue-scoped-css/v-global-pseudo-style': 'error',\n              'vue-scoped-css/v-slotted-pseudo-style': 'error',\n            },\n          },\n        ] satisfies TypedFlatConfigItem[])\n      : []),\n    ...(isInConsumerDeps('vue')\n      ? ([\n          {\n            name: 'maninak/prettier-vue',\n            files: [GLOB_VUE],\n            plugins: { 'prettier-vue': interopDefault(pluginPrettierVue) },\n            rules: {\n              ...prettierRulesFixingConflictsWithEslint,\n              'prettier-vue/prettier': ['warn', prettierConfig],\n            },\n          },\n          {\n            name: 'maninak/vue/rules',\n            files: [GLOB_VUE],\n            rules: {\n              // overrides to antfu's defaults\n              'vue/html-self-closing': [\n                'warn',\n                {\n                  html: { void: 'always', normal: 'never', component: 'always' },\n                  svg: 'always',\n                  math: 'always',\n                },\n              ],\n              'vue/no-v-html': 'error',\n              'vue/require-prop-types': 'warn',\n              'vue/require-default-prop': 'warn',\n              // The following rules are in eslint-config-prettier's Vue section (all `off`)\n              // but antfu's vue() config re-enables several of them because they don't use\n              // prettier. We disable explicitly so prettier-vue handles all Vue template\n              // formatting without circular fix conflicts.\n              'vue/html-indent': 'off',\n              'vue/html-closing-bracket-newline': 'off',\n              'vue/multiline-html-element-content-newline': 'off',\n              'vue/singleline-html-element-content-newline': 'off',\n              'vue/max-attributes-per-line': 'off',\n              'vue/block-tag-newline': 'off',\n              'vue/operator-linebreak': 'off',\n              'vue/quote-props': 'off',\n\n              'vue/multi-word-component-names': 'warn',\n              'vue/prefer-import-from-vue': 'warn',\n              'vue/no-dupe-keys': 'error',\n              'vue/no-v-text-v-html-on-component': 'warn',\n              'vue/no-setup-props-reactivity-loss': 'warn',\n              'vue/block-order': ['warn', { order: ['script', 'template', 'style'] }],\n              'vue/component-name-in-template-casing': ['warn', 'PascalCase'],\n              'vue/component-options-name-casing': ['warn', 'PascalCase'],\n              'vue/custom-event-name-casing': ['warn', 'camelCase'],\n              'vue/define-macros-order': ['warn', { order: ['defineProps', 'defineEmits'] }],\n              'vue/html-comment-content-spacing': ['warn', 'always', { exceptions: ['-'] }],\n              'vue/no-restricted-v-bind': ['warn', '/^v-/'],\n              'vue/no-useless-v-bind': 'warn',\n              'vue/no-unused-refs': 'warn',\n              'vue/prefer-separate-static-class': 'warn',\n\n              /*\n               * Version-agnostic Vue rules\n               * Apply on any Vue major; useful for both Options API and Composition API.\n               * --------------------------------------------------------------------------\n               */\n              'vue/no-unused-properties': [\n                'warn',\n                {\n                  deepData: true,\n                  groups: ['props', 'data', 'computed', 'methods', 'setup'],\n                },\n              ],\n              // Nuxt auto-imports its built-ins (NuxtLink, NuxtPage, ...) and every component\n              // under `components/`, none of which this rule can see, so under Nuxt it only\n              // false-positives. Turn it off there; the real restore is the `@nuxt/eslint`\n              // module, whose generated flat config registers the auto-imported components.\n              // In non-Nuxt Vue projects the rule stays on, where it is genuinely useful.\n              'vue/no-undef-components': isInConsumerDeps('nuxt') ? 'off' : 'warn',\n              'vue/no-undef-properties': 'warn',\n              'vue/max-template-depth': ['warn', { maxDepth: 8 }],\n              'vue/no-required-prop-with-default': ['warn', { autofix: false }],\n              'vue/html-button-has-type': [\n                'warn',\n                { button: true, submit: true, reset: true },\n              ],\n\n              /*\n               * Vue 3+ rules\n               * Type-based macros and the composition API. Auto-detected from the consumer's\n               * `vue` (or `nuxt`) dep range; manually override the rule level in your own\n               * `eslint.config.mjs` for a Vue 2 codebase if needed.\n               * --------------------------------------------------------------------------\n               */\n              ...(resolvedVueVersion >= 3\n                ? {\n                    'vue/define-props-declaration': ['warn', 'type-based'],\n                    'vue/define-emits-declaration': ['warn', 'type-based'],\n                    'vue/no-unused-emit-declarations': 'warn',\n                    'vue/component-api-style': ['warn', ['script-setup']],\n                    'vue/prefer-define-options': 'warn',\n                    'vue/require-typed-ref': 'warn',\n                  }\n                : {}),\n\n              /*\n               * Vue 3.5+ rules\n               * Rules that require APIs introduced in Vue 3.5 (e.g. `useTemplateRef`).\n               * --------------------------------------------------------------------------\n               */\n              ...(resolvedVueVersion >= 3.5 ? { 'vue/prefer-use-template-ref': 'warn' } : {}),\n\n              // Vue equivalents of native JS logic rules\n              'vue/dot-notation': ['warn', { allowKeywords: true }],\n              'vue/eqeqeq': ['warn', 'smart'],\n              'vue/no-empty-pattern': 'warn',\n              'vue/no-irregular-whitespace': 'warn',\n              'vue/object-shorthand': [\n                'warn',\n                'always',\n                { ignoreConstructors: false, avoidQuotes: true },\n              ],\n              'vue/prefer-template': 'warn',\n            },\n          },\n        ] satisfies TypedFlatConfigItem[])\n      : []),\n    ...(isInConsumerDeps('tailwindcss')\n      ? ([\n          /*\n           * Rules for front-end component files (Vue, JSX, TSX)\n           * ==================================================================================\n           */\n          ...(interopDefault(pluginTailwindcss).configs[\n            'flat/recommended'\n          ] as TypedFlatConfigItem[]),\n          {\n            name: 'maninak/tailwindcss/overrides',\n            files: [GLOB_VUE, GLOB_JSX, GLOB_TSX, GLOB_SVELTE],\n            rules: {\n              'tailwindcss/no-custom-classname': 'off',\n            },\n          },\n        ] satisfies TypedFlatConfigItem[])\n      : []),\n  ] satisfies [Parameters<typeof antfu>['0'], ...TypedFlatConfigItem[]]\n}\n\n// eslint-disable-next-line ts/no-explicit-any\nfunction interopDefault(module: any) {\n  // eslint-disable-next-line ts/no-unsafe-return\n  return module?.default ?? module\n}\n\nexport const requireJsdocInUtilsBlocks: TypedFlatConfigItem[] = [\n  {\n    name: 'maninak/jsdoc-required-in-utility-code',\n    files: [\n      '**/utils/**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/util/**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/lib/**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/helpers/**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/utils.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/util.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/lib.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/helpers.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n    ],\n    rules: {\n      'jsdoc/require-jsdoc': [\n        'warn',\n        {\n          publicOnly: true,\n          require: {\n            FunctionDeclaration: true,\n            MethodDefinition: true,\n            ClassDeclaration: true,\n            ArrowFunctionExpression: false,\n            FunctionExpression: false,\n          },\n        },\n      ],\n      'jsdoc/require-description': 'warn',\n    },\n  },\n  {\n    name: 'maninak/jsdoc-disabled-in-tests',\n    files: [\n      '**/*.{test,spec,unit}.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n      '**/test/**',\n      '**/tests/**',\n      '**/__tests__/**',\n      '**/__specs__/**',\n      '**/specs/**',\n    ],\n    rules: {\n      'jsdoc/require-jsdoc': 'off',\n    },\n  },\n]\n","import type { Rule } from 'eslint'\nimport type { Node } from 'estree'\n\n/**\n * Owns the blank-line-before-`return` policy. This rule deliberately replaces the\n * `always(*, return)` entry of `padding-line-between-statements`: the two cannot coexist\n * because they disagree on the compact case below, and two fixers fighting over the same line\n * never converge. Keeping the whole policy in one rule guarantees a single fixed point.\n *\n * Policy, applied to a `return` that has a preceding sibling statement in the same block:\n * - Compact body (the block holds exactly two statements and both are single-line): the\n *   `return` MUST NOT have a blank line before it. A blank in a two-line body is pure noise.\n * - Any other body: the `return` MUST have exactly one blank line before it, matching the\n *   long-standing `always(*, return)` behavior.\n *\n * A `return` that is the first statement in its block is left untouched (nothing to separate).\n * The fix only ever adds or removes blank lines: any comment in the gap, whether trailing the\n * previous statement's line or standing on its own line, is always preserved.\n */\nconst compactReturn: Rule.RuleModule = {\n  meta: {\n    type: 'layout',\n    fixable: 'whitespace',\n    schema: [],\n    messages: {\n      noBlankInCompact:\n        'Remove the blank line before `return`: a two-statement body should stay compact.',\n      blankRequired:\n        'Add a blank line before `return` to separate it from the statement above.',\n    },\n  },\n\n  create(context) {\n    const src = context.sourceCode\n\n    /** True when `node` begins and ends on the same source line. */\n    function isSingleLine(node: Node): boolean {\n      return node.loc?.start.line === node.loc?.end.line\n    }\n\n    /**\n     * Counts blank lines in the gap between `prev` and `next`, treating any comment lines in\n     * the gap as non-blank so that comment-adjacent spacing is never collapsed by this rule.\n     */\n    function blankLineCountBetween(prev: Node, next: Node): number {\n      const prevEndLine = prev.loc?.end.line ?? 0\n      const nextStartLine = next.loc?.start.line ?? 0\n\n      const commentLines = new Set<number>()\n      const commentsBetween = src.getCommentsBefore(next)\n      for (const comment of commentsBetween) {\n        const start = comment.loc?.start.line ?? 0\n        const end = comment.loc?.end.line ?? 0\n        for (let line = start; line <= end; line++) {\n          commentLines.add(line)\n        }\n      }\n\n      let blanks = 0\n      for (let line = prevEndLine + 1; line < nextStartLine; line++) {\n        if (!commentLines.has(line)) {\n          blanks++\n        }\n      }\n\n      return blanks\n    }\n\n    /** The statement list a node lives in, for a block, program, or switch case parent. */\n    function siblingStatementsOf(parent: Node): Node[] | undefined {\n      if (parent.type === 'BlockStatement' || parent.type === 'Program') {\n        return parent.body\n      }\n      if (parent.type === 'SwitchCase') {\n        return parent.consequent\n      }\n\n      return undefined\n    }\n\n    function checkReturn(node: Node & { type: 'ReturnStatement' }): void {\n      const parent = (node as unknown as { parent?: Node }).parent\n      if (!parent) {\n        return\n      }\n\n      // Only handle returns that live directly in a statement list with siblings.\n      const body = siblingStatementsOf(parent)\n      if (!body) {\n        return\n      }\n\n      const index = body.indexOf(node)\n      if (index <= 0) {\n        return // first statement, or not found: nothing to separate\n      }\n\n      const prev = body[index - 1] as Node\n\n      const isCompact =\n        parent.type === 'BlockStatement' &&\n        body.length === 2 &&\n        isSingleLine(prev) &&\n        isSingleLine(node)\n\n      const blanks = blankLineCountBetween(prev, node)\n\n      if (isCompact && blanks > 0) {\n        context.report({\n          node,\n          messageId: 'noBlankInCompact',\n          fix(fixer) {\n            const gap = src.getText().slice(prev.range![1], node.range![0])\n            // Drop only the blank (whitespace-only) lines in the gap. The first segment is\n            // whatever trails the previous statement on its line (e.g. a `// comment`), the\n            // last is the indentation before `return`; both are kept, as is any standalone\n            // comment line between them. A blanket collapse would delete those comments.\n            const segments = gap.split('\\n')\n            const kept = segments.filter(\n              (segment, i) =>\n                i === 0 || i === segments.length - 1 || segment.trim().length > 0,\n            )\n\n            return fixer.replaceTextRange([prev.range![1], node.range![0]], kept.join('\\n'))\n          },\n        })\n\n        return\n      }\n\n      if (!isCompact && blanks === 0) {\n        context.report({\n          node,\n          messageId: 'blankRequired',\n          fix(fixer) {\n            // Anchor the blank on the token or comment immediately before `return`, not on the\n            // previous statement node. That keeps a comment trailing the previous statement\n            // attached to it and lands the blank before `return`, instead of inserting it\n            // between the statement and its own trailing comment.\n            const before = src.getTokenBefore(node, { includeComments: true })\n            return before ? fixer.insertTextAfter(before, '\\n') : null\n          },\n        })\n      }\n    }\n\n    return {\n      ReturnStatement: checkReturn,\n    }\n  },\n}\n\nexport default compactReturn\n","import type { Rule } from 'eslint'\nimport type { Comment } from 'estree'\n\nconst DEFAULT_MAX_COLUMNS = 95\n\n/**\n * Enforces that no physical line of a JSDoc block comment (a `/**` block) runs past the column\n * limit, wrapping overflowing prose onto continuation lines that keep the same `* ` prefix.\n *\n * The fixer only ever inserts line breaks between existing words. It never joins lines,\n * reorders text, or rewrites content, so it preserves deliberate breaks and touches only the\n * lines that are too long. It leaves untouched, and does not report, any line it cannot wrap\n * safely:\n * - fenced code blocks and `@example` bodies, where reflowing would corrupt the code;\n * - lines with an inline `{@tag ...}`, a markdown table (a `|`), or the closing `*\\/` on them;\n * - lines whose single longest word cannot itself fit, e.g. a long URL: no break would help.\n *\n * The limit is the first option's `maxColumns` (default 95), like `max-len` / `printWidth`.\n */\nconst jsdocMaxLen: Rule.RuleModule = {\n  meta: {\n    type: 'layout',\n    fixable: 'whitespace',\n    schema: [\n      {\n        type: 'object',\n        properties: { maxColumns: { type: 'integer', minimum: 1 } },\n        additionalProperties: false,\n      },\n    ],\n    messages: {\n      tooLong:\n        'This JSDoc line exceeds the {{max}}-column limit; wrap it onto continuation lines.',\n    },\n  },\n\n  create(context) {\n    const options = context.options[0] as { maxColumns?: number } | undefined\n    const max = options?.maxColumns ?? DEFAULT_MAX_COLUMNS\n    const src = context.sourceCode\n    const nl = src.getText().includes('\\r\\n') ? '\\r\\n' : '\\n'\n\n    function isJsdoc(comment: Comment): boolean {\n      return comment.type === 'Block' && comment.value.startsWith('*')\n    }\n\n    /** Content this rule must not reflow: inline tags, tables, fences, or a closing `*\\/`. */\n    function isUnsafeToWrap(content: string): boolean {\n      return (\n        content.includes('{@') ||\n        content.includes('|') ||\n        content.includes('```') ||\n        content.includes('*/')\n      )\n    }\n\n    /**\n     * Greedily packs `content` into lines that each fit within `max` once `prefix` is added,\n     * breaking only at existing whitespace and preserving the gaps between kept words. Returns\n     * `undefined` when one word cannot fit even alone, so the caller leaves the line as-is.\n     */\n    function wrapContent(content: string, prefix: string): string[] | undefined {\n      const parts = content.split(/(\\s+)/)\n      const lines: string[] = []\n      let current = ''\n\n      for (let i = 0; i < parts.length; i += 2) {\n        const word = parts[i]\n        if (word === undefined || word === '') {\n          continue\n        }\n        if (current === '') {\n          if (prefix.length + word.length > max) {\n            return undefined\n          }\n          current = word\n          continue\n        }\n\n        const gap = parts[i - 1] ?? ' '\n        const candidate = current + gap + word\n        if (prefix.length + candidate.length <= max) {\n          current = candidate\n          continue\n        }\n\n        lines.push(current)\n        if (prefix.length + word.length > max) {\n          return undefined\n        }\n        current = word\n      }\n\n      if (current !== '') {\n        lines.push(current)\n      }\n\n      return lines\n    }\n\n    /**\n     * A single-line `/** ... *\\/` doc comment that overflows: rewrite it as a multiline block\n     * whose body is the wrapped description. Skipped for trailing comments (code precedes them\n     * on the line) and content that is unsafe to wrap or holds an unbreakable word.\n     */\n    function checkSingleLine(comment: Comment): void {\n      const line = comment.loc?.start.line ?? 0\n      const column = comment.loc?.start.column ?? 0\n      const lineText = src.lines[line - 1]\n      if (lineText === undefined || lineText.length <= max) {\n        return\n      }\n      // Only rewrite a comment that starts its own line; injecting breaks into a code line is\n      // both surprising and needless.\n      const indent = lineText.slice(0, column)\n      if (indent.trim() !== '') {\n        return\n      }\n\n      const trimmed = lineText.trim()\n      if (!trimmed.startsWith('/**') || !trimmed.endsWith('*/')) {\n        return\n      }\n      const content = trimmed.slice(3, -2).trim()\n      if (content === '' || isUnsafeToWrap(content)) {\n        return\n      }\n\n      const prefix = `${indent} * `\n      const wrapped = wrapContent(content, prefix)\n      if (!wrapped || wrapped.length === 0) {\n        return\n      }\n\n      const body = wrapped.map((chunk) => `${prefix}${chunk}`).join(nl)\n      const replacement = `${indent}/**${nl}${body}${nl}${indent} */`\n\n      context.report({\n        loc: comment.loc!,\n        messageId: 'tooLong',\n        data: { max: String(max) },\n        fix: (fixer) => fixer.replaceTextRange(comment.range!, replacement),\n      })\n    }\n\n    /**\n     * A multiline block: wrap each overflowing ` * ` continuation line on its own, so breaks\n     * elsewhere survive. Tracks fenced-code and `@example` regions so their bodies are never\n     * reflowed.\n     */\n    function checkMultiLine(comment: Comment): void {\n      const startLine = comment.loc?.start.line ?? 0\n      const endLine = comment.loc?.end.line ?? 0\n      let insideFence = false\n      let insideExample = false\n\n      for (let ln = startLine; ln <= endLine; ln++) {\n        const lineText = src.lines[ln - 1]\n        if (lineText === undefined) {\n          continue\n        }\n\n        const parsed = lineText.match(/^(\\s*\\*\\s?)(.*)$/)\n        if (!parsed) {\n          continue // the opener `/**` line, or a non-standard line: nothing to wrap\n        }\n        const trimmed = (parsed[2] ?? '').trim()\n\n        if (trimmed.startsWith('```')) {\n          insideFence = !insideFence\n          continue\n        }\n        if (insideFence) {\n          continue\n        }\n        if (/^@example\\b/.test(trimmed)) {\n          insideExample = true\n          continue\n        }\n        if (insideExample) {\n          if (/^@\\w/.test(trimmed)) {\n            insideExample = false // a new tag ends the example body; fall through to wrap it\n          } else {\n            continue\n          }\n        }\n\n        if (\n          lineText.length <= max ||\n          trimmed === '' ||\n          trimmed === '/' ||\n          isUnsafeToWrap(trimmed)\n        ) {\n          continue\n        }\n\n        const prefix = `${(parsed[1] ?? '').replace(/\\s+$/, '')} `\n        const wrapped = wrapContent(trimmed, prefix)\n        if (!wrapped || wrapped.length < 2) {\n          continue // a single word too long to break, or already fits once trimmed: leave it\n        }\n\n        const replacement = wrapped.map((chunk) => `${prefix}${chunk}`).join(nl)\n        const from = src.getIndexFromLoc({ line: ln, column: 0 })\n        const to = from + lineText.length\n\n        context.report({\n          loc: {\n            start: { line: ln, column: 0 },\n            end: { line: ln, column: lineText.length },\n          },\n          messageId: 'tooLong',\n          data: { max: String(max) },\n          fix: (fixer) => fixer.replaceTextRange([from, to], replacement),\n        })\n      }\n    }\n\n    function checkComment(comment: Comment): void {\n      if (!isJsdoc(comment)) {\n        return\n      }\n\n      if (comment.loc?.start.line === comment.loc?.end.line) {\n        checkSingleLine(comment)\n      } else {\n        checkMultiLine(comment)\n      }\n    }\n\n    return {\n      Program() {\n        for (const comment of src.getAllComments()) {\n          checkComment(comment)\n        }\n      },\n    }\n  },\n}\n\nexport default jsdocMaxLen\n","import type { Rule } from 'eslint'\nimport type { Comment } from 'estree'\n\nconst DEFAULT_MAX_COLUMNS = 80\n\n/**\n * Collapses a JSDoc block whose only content is a plain description onto a single line,\n * `/** text *\\/`, normalizing interior whitespace to single spaces, as long as the result fits\n * within the configured print width.\n *\n * Left untouched:\n * - Blocks that carry any `@tag` (`@param`, `@returns`, and so on): those stay multiline.\n * - Blocks with a blank line in the description (deliberate multi-paragraph prose).\n * - Blocks whose single-line form would exceed the print width.\n * - Non-JSDoc block comments (a `/*` that is not `/**`) and line comments.\n *\n * The print width is read from the first rule option, defaulting to 80, so a consumer can pass\n * the same value used for `max-len` / prettier `printWidth`.\n */\nconst jsdocOneline: Rule.RuleModule = {\n  meta: {\n    type: 'layout',\n    fixable: 'whitespace',\n    schema: [\n      {\n        type: 'object',\n        properties: { maxColumns: { type: 'integer', minimum: 1 } },\n        additionalProperties: false,\n      },\n    ],\n    messages: {\n      collapse: 'Collapse this single-description JSDoc comment onto one line.',\n    },\n  },\n\n  create(context) {\n    const options = context.options[0] as { maxColumns?: number } | undefined\n    const maxColumns = options?.maxColumns ?? DEFAULT_MAX_COLUMNS\n    const src = context.sourceCode\n\n    function isJsdoc(comment: Comment): boolean {\n      return comment.type === 'Block' && comment.value.startsWith('*')\n    }\n\n    /**\n     * Returns the description text of a JSDoc comment with interior whitespace and leading\n     * asterisks collapsed to single spaces, or `undefined` when the block must be left alone\n     * (it carries a tag or contains a blank line in its body).\n     */\n    function normalizedDescription(comment: Comment): string | undefined {\n      // `comment.value` is the text between `/*` and `*/`, so it starts with the leading `*`.\n      const inner = comment.value.replace(/^\\*/, '')\n\n      const rawLines = inner.split('\\n')\n      const contentLines = rawLines.map((line) => line.replace(/^\\s*\\*?/, '').trim())\n      const nonEmpty = contentLines.filter((line) => line.length > 0)\n\n      if (nonEmpty.length === 0) {\n        return undefined\n      }\n\n      // A blank line between content lines signals deliberate multi-paragraph prose.\n      const firstContent = contentLines.findIndex((line) => line.length > 0)\n      const lastContent =\n        contentLines.length -\n        1 -\n        [...contentLines].reverse().findIndex((line) => line.length > 0)\n\n      for (let i = firstContent; i <= lastContent; i++) {\n        if (contentLines[i]?.length === 0) {\n          return undefined\n        }\n      }\n\n      const text = nonEmpty.join(' ').replace(/\\s+/g, ' ').trim()\n\n      // Any JSDoc tag means this is not a plain description; leave it to the jsdoc plugin.\n      if (/(?:^|\\s)@\\w/.test(text)) {\n        return undefined\n      }\n\n      return text\n    }\n\n    function checkComment(comment: Comment): void {\n      if (!isJsdoc(comment)) {\n        return\n      }\n\n      const text = normalizedDescription(comment)\n      if (text === undefined) {\n        return\n      }\n\n      const singleLine = `/** ${text} */`\n\n      const startColumn = comment.loc?.start.column ?? 0\n      const isAlreadySingleLine = comment.loc?.start.line === comment.loc?.end.line\n      const currentText = src.getText(comment as never)\n\n      if (isAlreadySingleLine && currentText === singleLine) {\n        return\n      }\n\n      // Only collapse when the result fits; otherwise leave the block as-is.\n      if (startColumn + singleLine.length > maxColumns) {\n        return\n      }\n\n      context.report({\n        loc: comment.loc!,\n        messageId: 'collapse',\n        fix(fixer) {\n          return fixer.replaceTextRange(comment.range!, singleLine)\n        },\n      })\n    }\n\n    return {\n      Program() {\n        for (const comment of src.getAllComments()) {\n          checkComment(comment)\n        }\n      },\n    }\n  },\n}\n\nexport default jsdocOneline\n","import type { Rule } from 'eslint'\n\n/**\n * Flags `async () => { await expr }` (an async arrow whose block body is a single `await`\n * expression statement) and auto-fixes it to the concise form `async () => await expr`.\n *\n * Prettier leaves the concise form alone but always expands block bodies to multiline, so the\n * two forms are not style-equivalent when `prettier/prettier` is active. This rule resolves\n * the conflict in the right direction: it picks the form prettier accepts without rewriting.\n *\n * Only fires when the block body holds exactly one statement, that statement is an expression\n * statement, and that expression is an `AwaitExpression`. Multi-statement bodies, `return`\n * statements, and non-`await` single expressions are left untouched.\n */\nconst preferConciseAsyncArrow: Rule.RuleModule = {\n  meta: {\n    type: 'suggestion',\n    fixable: 'code',\n    schema: [],\n    messages: {\n      preferConcise:\n        'Prefer `async () => await expr` over `async () => { await expr }`. ' +\n        'Prettier always expands block bodies to multiline; the concise form stays on one line.',\n    },\n  },\n\n  create(context) {\n    const src = context.sourceCode\n\n    return {\n      ArrowFunctionExpression(node) {\n        if (!node.async) {\n          return\n        }\n        if (node.body.type !== 'BlockStatement') {\n          return\n        }\n\n        const block = node.body\n        const { body: statements } = block\n        if (statements.length !== 1) {\n          return\n        }\n\n        const [statement] = statements\n        if (!statement || statement.type !== 'ExpressionStatement') {\n          return\n        }\n        if (statement.expression.type !== 'AwaitExpression') {\n          return\n        }\n\n        // Collapsing the block would discard any comment sitting inside the braces, so report\n        // the violation but leave the fix off rather than silently drop the comment.\n        const hasInnerComments = src.getCommentsInside(block).length > 0\n\n        context.report({\n          node,\n          messageId: 'preferConcise',\n          fix: hasInnerComments\n            ? undefined\n            : (fixer) =>\n                // Replace ONLY the block body with the await expression. This preserves the\n                // async keyword, params, generics, and any return-type annotation, none of\n                // which a from-scratch reconstruction of the node would keep.\n                fixer.replaceText(block, src.getText(statement.expression)),\n        })\n      },\n    }\n  },\n}\n\nexport default preferConciseAsyncArrow\n","import { existsSync, readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { globSync } from 'tinyglobby'\nimport { parse as parseYaml } from 'yaml'\n\ninterface PackageJsonDeps {\n  dependencies?: Record<string, string>\n  devDependencies?: Record<string, string>\n  peerDependencies?: Record<string, string>\n  workspaces?: string[] | { packages?: string[] }\n}\n\nfunction readPackageJsonAt(dir: string): PackageJsonDeps | undefined {\n  try {\n    return JSON.parse(readFileSync(path.join(dir, 'package.json'), 'utf8')) as PackageJsonDeps\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * The workspace package globs a monorepo declares, read from `pnpm-workspace.yaml`\n * (`packages`) or, failing that, the root `package.json` `workspaces` field (array or\n * `{ packages }`). A `pnpm-workspace.yaml` that carries only other settings (e.g.\n * `allowBuilds`) yields no globs, so a single-package consumer is treated exactly as before.\n */\nfunction getWorkspaceGlobs(root: string, rootPkg: PackageJsonDeps | undefined): string[] {\n  const pnpmWorkspacePath = path.join(root, 'pnpm-workspace.yaml')\n  if (existsSync(pnpmWorkspacePath)) {\n    try {\n      const parsed = parseYaml(readFileSync(pnpmWorkspacePath, 'utf8')) as\n        | { packages?: unknown }\n        | undefined\n      if (Array.isArray(parsed?.packages)) {\n        return parsed.packages.filter((glob): glob is string => typeof glob === 'string')\n      }\n    } catch {\n      // Malformed yaml: fall through to the package.json `workspaces` field.\n    }\n  }\n\n  const workspaces = rootPkg?.workspaces\n  if (Array.isArray(workspaces)) {\n    return workspaces.filter((glob): glob is string => typeof glob === 'string')\n  }\n  if (workspaces && Array.isArray(workspaces.packages)) {\n    return workspaces.packages.filter((glob): glob is string => typeof glob === 'string')\n  }\n\n  return []\n}\n\nconst workspaceDepsCache = new Map<string, PackageJsonDeps[]>()\n\n/**\n * Every declared-dependency set in the consumer's workspace: the root `package.json` plus each\n * sub-package `package.json` reachable through the workspace globs. Cached per cwd (detection\n * runs once per `maninak()` call, and several framework checks share the same scan).\n *\n * We read DECLARED deps only and never walk `node_modules`. Under pnpm's strict layout\n * maninak's own transitive deps leak into resolution (e.g. `react` riding in via\n * eslint-plugin-vue, or `tailwindcss` as a peer-auto-install of eslint-plugin-tailwindcss); a\n * resolvability check would turn those into false positives. The consumer's declared deps,\n * anywhere in the workspace, are the authoritative answer for \"does the user intend to lint\n * this kind of file\".\n */\nfunction getWorkspacePackageJsons(): PackageJsonDeps[] {\n  const root = process.cwd()\n  const cached = workspaceDepsCache.get(root)\n  if (cached) {\n    return cached\n  }\n\n  const rootPkg = readPackageJsonAt(root)\n  const result: PackageJsonDeps[] = rootPkg ? [rootPkg] : []\n\n  const globs = getWorkspaceGlobs(root, rootPkg)\n  if (globs.length > 0) {\n    // Positive globs select package dirs; a `!`-prefixed glob (pnpm negation) is an ignore.\n    const positive = globs\n      .filter((glob) => !glob.startsWith('!'))\n      .map((glob) => `${glob}/package.json`)\n    const negative = globs\n      .filter((glob) => glob.startsWith('!'))\n      .map((glob) => `${glob.slice(1)}/package.json`)\n\n    try {\n      const matches = globSync(positive, {\n        cwd: root,\n        ignore: ['**/node_modules/**', ...negative],\n        absolute: true,\n      })\n\n      for (const match of matches) {\n        const pkg = readPackageJsonAt(path.dirname(match))\n        if (pkg) {\n          result.push(pkg)\n        }\n      }\n    } catch {\n      // Glob failure degrades gracefully to root-only detection.\n    }\n  }\n\n  workspaceDepsCache.set(root, result)\n\n  return result\n}\n\nfunction isDeclaredIn(pkg: PackageJsonDeps, name: string): boolean {\n  return (\n    name in (pkg.dependencies ?? {}) ||\n    name in (pkg.devDependencies ?? {}) ||\n    name in (pkg.peerDependencies ?? {})\n  )\n}\n\n/**\n * True when `name` is declared as a regular, dev, or peer dependency anywhere in the\n * consumer's workspace: the root `package.json` or any sub-package reachable through the\n * workspace globs. This lets a plain `maninak()` enable Vue/Nuxt/Svelte/React config when the\n * framework lives in a sub-package (e.g. `apps/web`) rather than the workspace root.\n */\nexport function isInConsumerDeps(name: string): boolean {\n  return getWorkspacePackageJsons().some((pkg) => isDeclaredIn(pkg, name))\n}\n\nconst DEFAULT_VUE_VERSION_TARGET = 3.5\n\n/**\n * Returns a numeric Vue major.minor version inferred from the `vue` (or `nuxt`) dependency\n * range declared anywhere in the consumer's workspace, or {@link DEFAULT_VUE_VERSION_TARGET}\n * when nothing is declared.\n *\n * The number is intentionally lossy: only the first two components are kept (3.5, 3.4, 3.0,\n * 2.7 etc.) because that's all the version-gated rule sections need to distinguish. Build\n * metadata, patch versions, pre-release tags, and prefixes (`^`, `~`, `>=`, `workspace:`,\n * `npm:`) are stripped before parsing.\n *\n * Auto-detection is just a default. Consumers who want different gating can override any rule\n * in their own `eslint.config.mjs` by appending a config block that re-sets the rule.\n */\nexport function getConsumerVueVersion(): number {\n  for (const pkg of getWorkspacePackageJsons()) {\n    const range =\n      pkg.dependencies?.['vue'] ??\n      pkg.devDependencies?.['vue'] ??\n      pkg.peerDependencies?.['vue'] ??\n      pkg.dependencies?.['nuxt'] ??\n      pkg.devDependencies?.['nuxt']\n    if (!range) {\n      continue\n    }\n    const match = /(\\d+)\\.(\\d+)/.exec(range)\n    if (match) {\n      return Number.parseFloat(`${match[1]}.${match[2]}`)\n    }\n  }\n\n  return DEFAULT_VUE_VERSION_TARGET\n}\n\n/** True when the consumer's cwd has a `tsconfig.json` at its root. */\nexport function hasConsumerTsconfig(): boolean {\n  return existsSync(path.join(process.cwd(), 'tsconfig.json'))\n}\n"],"mappings":"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","names":["import_eslint_config","DEFAULT_MAX_COLUMNS","path","parseYaml","pluginPrettier","configPrettier","pluginStylistic","pluginJasmine","pluginVueScopedCss","pluginPrettierVue","pluginTailwindcss","module","antfu"]}