{"id":19777,"library":"eslint-plugin-harlanzw","title":"eslint-plugin-harlanzw","description":"An experimental ESLint plugin v0.12.1 by Harlan Wilton for Vue/Nuxt projects, shipping 26+ rules across four categories: link hygiene (ASCII-only, lowercase, trailing slashes), Nuxt best practices (await navigateTo, prefer NuxtLink), Vue reactivity patterns (avoid nested reactivity, ref unwrapping), and AI deslop tools (clean AI-generated markdown slop). Requires eslint >=9.0.0 (flat config only), ships with TypeScript types, and is released irregularly with breaking changes (e.g., v0.12.0 dropped `mixed-conventions`). Differentiates from eslint-plugin-vue by targeting Nuxt-specific patterns and opinionated link rules not found elsewhere.","status":"active","version":"0.12.1","language":"javascript","source_language":"en","source_url":"https://github.com/harlan-zw/eslint-plugin-harlanzw","tags":["javascript","eslint-plugin","typescript"],"install":[{"cmd":"npm install eslint-plugin-harlanzw","lang":"bash","label":"npm"},{"cmd":"yarn add eslint-plugin-harlanzw","lang":"bash","label":"yarn"},{"cmd":"pnpm add eslint-plugin-harlanzw","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Peer dependency: plugin requires ESLint >=9.0.0 with flat config support","package":"eslint","optional":false}],"imports":[{"note":"ESM-only; CommonJS require() will fail. The default export is the plugin object.","wrong":"const pluginHarlanzw = require('eslint-plugin-harlanzw')","symbol":"pluginHarlanzw","correct":"import pluginHarlanzw from 'eslint-plugin-harlanzw'"},{"note":"Rules are exported as a named export from the plugin package, not from a subpath.","wrong":"import { rules } from 'eslint-plugin-harlanzw/rules'","symbol":"rules","correct":"import { rules } from 'eslint-plugin-harlanzw'"},{"note":"Configs are available as a named export; there is no default config bundle in v0.12.x.","symbol":"configs","correct":"import { configs } from 'eslint-plugin-harlanzw'"}],"quickstart":{"code":"import pluginHarlanzw from 'eslint-plugin-harlanzw';\n\nexport default [\n  {\n    plugins: {\n      harlanzw: pluginHarlanzw\n    },\n    rules: {\n      'harlanzw/link-ascii-only': 'error',\n      'harlanzw/link-lowercase': 'warn',\n      'harlanzw/link-trailing-slash': ['error', { trailing: 'never' }],\n      'harlanzw/nuxt-await-navigate-to': 'error',\n      'harlanzw/vue-no-nested-reactivity': 'error'\n    }\n  }\n];","lang":"typescript","description":"Flat ESLint config enabling link hygiene and Nuxt rules with plugin import and rule registration."},"warnings":[{"fix":"Remove any references to 'harlanzw/mixed-conventions' from your ESLint configuration; the rule no longer exists.","message":"Mixed-conventions rule has been removed in v0.12.0.","severity":"breaking","affected_versions":">=0.12.0"},{"fix":"Switch to flat config format (eslint.config.js or eslint.config.mjs) with ESLint >=9.0.0.","message":"The plugin requires ESLint flat config (>=9.0.0). Using .eslintrc or eslintrc configs will fail.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Pin the plugin version and test rules thoroughly. Monitor release notes for rule changes.","message":"Rules are experimental and may change without major version bump. Some rules may have false positives in edge cases.","severity":"gotcha","affected_versions":">=0.0.0"},{"fix":"Use with caution; consider if these rules are necessary before adopting.","message":"The 'deslop' rules are highly experimental and may be removed or renamed in future versions.","severity":"deprecated","affected_versions":">=0.10.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Run 'npm install eslint-plugin-harlanzw --save-dev' or 'yarn add -D eslint-plugin-harlanzw'.","cause":"Plugin not installed or missing from package.json dependencies.","error":"Error: Cannot find module 'eslint-plugin-harlanzw'"},{"fix":"Use ESM import syntax: 'import pluginHarlanzw from 'eslint-plugin-harlanzw';'.","cause":"Using legacy require() in CommonJS with ESLint flat config.","error":"TypeError: eslint.Plugin is not a constructor"},{"fix":"Remove 'harlanzw/mixed-conventions' from your rules object.","cause":"Mixed-conventions rule was removed in v0.12.0 but still referenced in config.","error":"Error: Failed to load plugin 'harlanzw': Rule 'harlanzw/mixed-conventions' is not found"},{"fix":"Wrap rules inside a config object with 'plugins' property as shown in the quickstart.","cause":"Attempting to use flat config without the proper plugins object structure.","error":"Error: ESLint configuration in eslint.config.mjs is invalid: Unexpected top-level property 'rules'."}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}