Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,5 @@
"workbench.colorTheme": "Visual Studio Dark",
"workbench.layoutControl.enabled": false,
// Spell check settings
"cSpell.words": ["basenames", "Codacy", "elif", "Molyuk", "releaserc", "vitest"]
"cSpell.words": ["basenames", "Codacy", "elif", "Molyuk", "pascalcase", "releaserc", "vitest"]
}
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
![Hero Image](./docs/assets/social.png)

# eslint-plugin-vue-modular

[![Build Status](https://github.com/andrewmolyuk/eslint-plugin-vue-modular/actions/workflows/test.yml/badge.svg)](https://github.com/andrewmolyuk/eslint-plugin-vue-modular/actions/workflows/test.yml)
Expand Down
18 changes: 9 additions & 9 deletions bun.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
"": {
"name": "eslint-plugin-vue-modular",
"dependencies": {
"@eslint/js": "^9.35.0",
"@eslint/js": "^9.36.0",
"@vue/compiler-sfc": "^3.5.21",
"eslint": "^9.35.0",
"eslint": "^9.36.0",
"minimatch": "^10.0.3",
"typescript": "^5.9.2",
"typescript-eslint": "^8.44.0",
Expand All @@ -24,9 +24,9 @@
"eslint-plugin-markdown": "^5.1.0",
"eslint-plugin-prettier": "^5.5.4",
"husky": "^9.1.7",
"npm-check-updates": "^18.1.1",
"npm-check-updates": "^18.2.1",
"prettier": "^3.6.2",
"semantic-release": "^24.2.8",
"semantic-release": "^24.2.9",
"vitest": "^3.2.4",
},
},
Expand Down Expand Up @@ -146,7 +146,7 @@

"@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],

"@eslint/js": ["@eslint/js@9.35.0", "", {}, "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw=="],
"@eslint/js": ["@eslint/js@9.36.0", "", {}, "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw=="],

"@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],

Expand Down Expand Up @@ -486,7 +486,7 @@

"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],

"eslint": ["eslint@9.35.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg=="],
"eslint": ["eslint@9.36.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ=="],

"eslint-compat-utils": ["eslint-compat-utils@0.6.5", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ=="],

Expand Down Expand Up @@ -792,7 +792,7 @@

"npm": ["npm@10.9.3", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^8.0.1", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", "@npmcli/map-workspaces": "^4.0.2", "@npmcli/package-json": "^6.2.0", "@npmcli/promise-spawn": "^8.0.2", "@npmcli/redact": "^3.2.2", "@npmcli/run-script": "^9.1.0", "@sigstore/tuf": "^3.1.1", "abbrev": "^3.0.1", "archy": "~1.0.0", "cacache": "^19.0.1", "chalk": "^5.4.1", "ci-info": "^4.2.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.4.5", "graceful-fs": "^4.2.11", "hosted-git-info": "^8.1.0", "ini": "^5.0.0", "init-package-json": "^7.0.2", "is-cidr": "^5.1.1", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", "libnpmdiff": "^7.0.1", "libnpmexec": "^9.0.1", "libnpmfund": "^6.0.1", "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", "libnpmpack": "^8.0.1", "libnpmpublish": "^10.0.1", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", "make-fetch-happen": "^14.0.3", "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^11.2.0", "nopt": "^8.1.0", "normalize-package-data": "^7.0.0", "npm-audit-report": "^6.0.0", "npm-install-checks": "^7.1.1", "npm-package-arg": "^12.0.2", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", "p-map": "^7.0.3", "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", "read": "^4.1.0", "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0", "ssri": "^12.0.0", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", "validate-npm-package-name": "^6.0.1", "which": "^5.0.0", "write-file-atomic": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" } }, "sha512-6Eh1u5Q+kIVXeA8e7l2c/HpnFFcwrkt37xDMujD5be1gloWa9p6j3Fsv3mByXXmqJHy+2cElRMML8opNT7xIJQ=="],

"npm-check-updates": ["npm-check-updates@18.1.1", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-sr+z5tEZop9n+uxAv/FVbpIdrayfG3Dr/D91igb+GyBl9eiudYUfGUZEBsmHq6kMOGEssSM3YWrP3njQjVU4Gw=="],
"npm-check-updates": ["npm-check-updates@18.2.1", "", { "bin": { "npm-check-updates": "build/cli.js", "ncu": "build/cli.js" } }, "sha512-g1VjhAtGMSFFmmN5fT77aF9Eg9dZ6WG9WAqOv7RmWL2ANfeBZGgi6MxYwcNxwSIp5t7Nky0oNFEwHcG6EHQFKw=="],

"npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],

Expand Down Expand Up @@ -894,11 +894,11 @@

"safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],

"semantic-release": ["semantic-release@24.2.8", "", { "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.2", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^4.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.0", "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" } }, "sha512-uvoLiKEB/AvvA3SCPE78cd90nVJXn220kkEA6sNGzDpas4s7pe4OgYWvhfR0lvWBdBH/T0RFCI6U+GvcT2CypQ=="],
"semantic-release": ["semantic-release@24.2.9", "", { "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.2", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^4.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.0", "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^5.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" } }, "sha512-phCkJ6pjDi9ANdhuF5ElS10GGdAKY6R1Pvt9lT3SFhOwM4T7QZE7MLpBDbNruUx/Q3gFD92/UOFringGipRqZA=="],

"semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],

"semver-diff": ["semver-diff@4.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA=="],
"semver-diff": ["semver-diff@5.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0HbGtOm+S7T6NGQ/pxJSJipJvc4DK3FcRVMRkhsIwJDJ4Jcz5DQC1cPPzB5GhzyHjwttW878HaWQq46CkL3cqg=="],

"semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="],

Expand Down
Binary file added docs/assets/social-lg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/social.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
93 changes: 0 additions & 93 deletions docs/severity-sorted.md

This file was deleted.

78 changes: 78 additions & 0 deletions docs/suggested-rules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Suggested Rules by Severity Score

The following rules are suggestions for future implementation. They are sorted from highest to lowest severity score (1-10 scale).

Scoring is based on: modular architecture impact (50%), maintainability (30%), and clean code practices (20%).

- stores-shared-location - 6.45 — shared store placement.
- services-shared-location - 6.20 — shared services placement.
- services-feature-location - 6.00 — feature-local services placement.
- store-pinia-composition - 5.84 — store composition conventions.
- stores-feature-location - 5.70 — feature stores placement.
- feature-stores-no-imports - 5.34 — prevent external imports into feature stores.
- routes-global-location - 5.20 — convention for global routes placement.
- routes-feature-location - 5.00 — convention for feature routes placement.
- routes-merge-in-app - 4.95 — merge feature routes into app router.
- routes-lazy-load - 4.90 — lazy-loading routes where appropriate.
- routes-layout-meta - 4.66 — consistency for route layout metadata.
- feature-components-location - 4.49 — location for feature components.
- ui-components-location - 4.38 — rules for UI component placement.
- business-components-location - 4.33 — rules for business component placement.
- layout-components-location - 3.90 — rules for layout components.
- views-feature-location - 3.75 — location for feature view files.
- component-props-typed - 3.65 — require typed component props.
- views-global-location - 3.64 — global view placement rules.
- views-no-business-logic - 3.48 — keep business logic out of views.
- composables-shared-location - 3.38 — shared location for composables.
- views-layout-meta - 3.37 — view layout metadata rules.
- composables-feature-location - 3.08 — location for feature composables.
- composables-prefix-use - 2.79 — require `use` prefix for composables.
- composables-return-reactive - 2.68 — enforce reactive returns for composables.
- types-shared-location - 2.64 — shared location for types.
- composables-no-dom - 2.57 — avoid DOM operations in composables.
- types-feature-location - 2.53 — feature-local type location.
- types-export-interfaces - 2.42 — export interfaces from feature roots.
- types-common-location - 2.31 — location for common types.
- types-api-location - 2.20 — API types location.
- utils-shared-location - 2.11 — shared placement for utilities.
- utils-feature-location - 1.99 — feature-local utilities location.
- utils-pure-functions - 1.89 — enforce pure functions in utils.
- utils-stateless - 1.77 — keep utils stateless.
- assets-styles-location - 1.67 — styles placement.
- assets-images-location - 1.59 — images placement.
- assets-icons-location - 1.52 — icons placement.
- assets-fonts-location - 1.44 — fonts placement.
- assets-scoped-styles - 1.38 — scoped styles guidance.
- middleware-global-location - 1.31 — global middleware location.
- middleware-feature-location - 1.26 — feature middleware location.
- middleware-descriptive-names - 1.19 — descriptive middleware names.
- middleware-registration - 1.11 — middleware registration checks.
- middleware-composable - 1.03 — middleware composable usage.
- plugins-registration - 1.01 — plugin registration rules.
- plugins-env-aware - 0.96 — plugin env-awareness checks.
- plugins-init-before-mount - 0.88 — plugin initialization ordering.
- plugins-api-conformance - 0.83 — plugin API conformance checks.
- plugins-document-deps - 0.78 — plugin dependency documentation.
- config-type-safe - 0.73 — config type-safety rules.
- config-env-files - 0.68 — env file placement and usage.
- config-no-secrets - 0.63 — prevent secrets in config.
- config-environments - 0.58 — environment-specific config rules.
- config-validate-runtime - 0.53 — runtime config validation.
- config-location - 0.48 — config file location guidance.
- config-export-typed - 0.43 — typed exports for config.
- exports-named - 0.38 — prefer named exports.
- exports-internal-hidden - 0.33 — hiding internal exports.
- exports-types - 0.28 — export location for types.
- exports-components-index - 0.23 — exporting components via index.
- naming-pascalcase-exports - 0.18 — PascalCase export naming.
- naming-camelcase-runtime - 0.15 — camelCase runtime naming.
- naming-composables-prefix - 0.12 — `use` prefix naming for composables.
- naming-pinia-stores - 0.09 — naming for Pinia stores.
- naming-constants - 0.07 — naming for constants.
- naming-event-kebab - 0.06 — kebab-case naming for events.
- imports-no-deep-relative - 0.05 — avoid deep relative imports.
- imports-from-index - 0.04 — prefer index imports.
- imports-grouping - 0.03 — import grouping conventions.
- service-named-exports - 0.02 — named exports for services.
- service-use-api-client - 0.01 — enforce API client usage in services.
- stores-cross-cutting - 0.01 — checks for cross-cutting stores.
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@
"eslint-plugin-markdown": "^5.1.0",
"eslint-plugin-prettier": "^5.5.4",
"husky": "^9.1.7",
"npm-check-updates": "^18.1.1",
"npm-check-updates": "^18.2.1",
"prettier": "^3.6.2",
"semantic-release": "^24.2.8",
"semantic-release": "^24.2.9",
"vitest": "^3.2.4"
},
"dependencies": {
"@eslint/js": "^9.35.0",
"@eslint/js": "^9.36.0",
"@vue/compiler-sfc": "^3.5.21",
"eslint": "^9.35.0",
"eslint": "^9.36.0",
"minimatch": "^10.0.3",
"typescript": "^5.9.2",
"typescript-eslint": "^8.44.0",
Expand Down