{"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,"search_vec":"'26':17 '9.0.0':57 'across':19 'ai':46,51 'ai-gener':50 'ascii':25 'ascii-on':24 'avoid':40 'await':33 'best':31 'break':70 'categori':21 'chang':71 'clean':49 'config':59 'convent':77 'deslop':47 'differenti':78 'drop':74 'e.g':72 'elsewher':96 'eslint':2,7,56,81,99 'eslint-plugin':98 'eslint-plugin-harlanzw':1 'eslint-plugin-vu':80 'experiment':6 'flat':58 'found':95 'four':20 'generat':52 'harlan':11 'harlanzw':4 'hygien':23 'irregular':68 'javascript':97 'link':22,92 'lowercas':27 'markdown':53 'mix':76 'mixed-convent':75 'navigateto':34 'nest':41 'nuxt':30,87 'nuxt-specif':86 'nuxtlink':36 'opinion':91 'pattern':39,89 'plugin':3,8,82,100 'practic':32 'prefer':35 'project':15 'reactiv':38,42 'ref':43 'releas':67 'requir':55 'rule':18,93 'ship':16,61 'slash':29 'slop':54 'specif':88 'target':85 'tool':48 'trail':28 'type':64 'typescript':63,101 'unwrap':44 'v0.12.0':73 'v0.12.1':9 'vue':37,83 'vue/nuxt':14 'wilton':12","created_at":"2026-04-25T11:19:36.633548+00:00","updated_at":"2026-04-25T11:19:36.633548+00:00","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,"quickstart_score":null,"quickstart_tag":null,"pypi_latest":null,"cli_name":"","cli_version":null,"type":"library","homepage":null,"github":"https://github.com/harlan-zw/eslint-plugin-harlanzw","docs":null,"changelog":null,"pypi":null,"npm":"https://www.npmjs.com/package/eslint-plugin-harlanzw","openapi_spec":null,"status_page":null,"smithery":null,"categories":["testing","devops"],"base_url":null,"auth_type":null,"provenance":{"verified_status":null,"verified_at":null,"last_verified":"2026-06-17","next_check":"2026-07-24","install_tag":null}}