{"id":13493339,"url":"https://github.com/javierbrea/eslint-plugin-boundaries","last_synced_at":"2026-03-14T13:01:15.814Z","repository":{"id":38827228,"uuid":"271004752","full_name":"javierbrea/eslint-plugin-boundaries","owner":"javierbrea","description":"Eslint plugin checking architecture boundaries between elements","archived":false,"fork":false,"pushed_at":"2025-03-28T12:25:51.000Z","size":2048,"stargazers_count":632,"open_issues_count":11,"forks_count":12,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-03T06:37:26.781Z","etag":null,"topics":["architectural-patterns","architecture","dependencies","eslint","eslint-plugin","eslint-rules","import","quality"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javierbrea.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-09T13:05:33.000Z","updated_at":"2025-04-01T19:43:31.000Z","dependencies_parsed_at":"2022-08-09T06:15:32.520Z","dependency_job_id":"6f5b9edd-6eac-4c36-8c24-bd9fcb2de4e4","html_url":"https://github.com/javierbrea/eslint-plugin-boundaries","commit_stats":{"total_commits":514,"total_committers":12,"mean_commits":"42.833333333333336","dds":0.4260700389105059,"last_synced_commit":"400796330d29b47a3cd0c6c016a3050e6fe6e2fe"},"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javierbrea%2Feslint-plugin-boundaries","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javierbrea%2Feslint-plugin-boundaries/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javierbrea%2Feslint-plugin-boundaries/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javierbrea%2Feslint-plugin-boundaries/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javierbrea","download_url":"https://codeload.github.com/javierbrea/eslint-plugin-boundaries/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248208673,"owners_count":21065203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["architectural-patterns","architecture","dependencies","eslint","eslint-plugin","eslint-rules","import","quality"],"created_at":"2024-07-31T19:01:14.319Z","updated_at":"2026-03-14T13:01:15.807Z","avatar_url":"https://github.com/javierbrea.png","language":"JavaScript","funding_links":[],"categories":["TypeScript","JavaScript","Plugins"],"sub_categories":["Practices and Specific ES Features"],"readme":"[![Build status][build-image]][build-url] [![Coverage Status][coveralls-image]][coveralls-url] \u003c!-- [![Quality Gate][quality-gate-image]][quality-gate-url] --\u003e\n\n[![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com) [![Last commit][last-commit-image]][last-commit-url] [![Last release][release-image]][release-url]\n\n[![NPM downloads][npm-downloads-image]][npm-downloads-url] [![License][license-image]][license-url]\n\n[coveralls-image]: https://coveralls.io/repos/github/javierbrea/eslint-plugin-boundaries/badge.svg\n[coveralls-url]: https://coveralls.io/github/javierbrea/eslint-plugin-boundaries\n[build-image]: https://github.com/javierbrea/eslint-plugin-boundaries/workflows/build/badge.svg\n[build-url]: https://github.com/javierbrea/eslint-plugin-boundaries/actions?query=workflow%3Abuild+branch%3Amaster\n[last-commit-image]: https://img.shields.io/github/last-commit/javierbrea/eslint-plugin-boundaries.svg\n[last-commit-url]: https://github.com/javierbrea/eslint-plugin-boundaries/commits\n[license-image]: https://img.shields.io/npm/l/eslint-plugin-boundaries.svg\n[license-url]: https://github.com/javierbrea/eslint-plugin-boundaries/blob/master/LICENSE\n[npm-downloads-image]: https://img.shields.io/npm/dm/eslint-plugin-boundaries.svg\n[npm-downloads-url]: https://www.npmjs.com/package/eslint-plugin-boundaries\n[quality-gate-image]: https://sonarcloud.io/api/project_badges/measure?project=javierbrea_eslint-plugin-boundaries\u0026metric=alert_status\n[quality-gate-url]: https://sonarcloud.io/dashboard?id=javierbrea_eslint-plugin-boundaries\n[release-image]: https://img.shields.io/github/release-date/javierbrea/eslint-plugin-boundaries.svg\n[release-url]: https://github.com/javierbrea/eslint-plugin-boundaries/releases\n\n# ESLint Plugin Boundaries\n\nEnforce architectural boundaries in your JavaScript and TypeScript projects.\n\n**ESLint Plugin Boundaries** is an ESLint plugin that helps you maintain clean architecture by enforcing boundaries between different parts of your codebase. Define your architectural layers, specify how they can interact, and get instant feedback when boundaries are violated.\n\n- **Architectural Enforcement**: Define elements and dependency rules that match your project's architecture\n- **Flexible Configuration**: Adapt the plugin to any project structure. It works with monorepos, modular architectures, layered patterns, and any custom structure you can imagine\n- **Real-time Feedback**: Get immediate ESLint errors when imports violate your architectural rules\n\n## Documentation\n\nThe full documentation is available on the [JS Boundaries website](https://www.jsboundaries.dev/docs/overview/).\n\n### Key Sections\n\n- **[Overview](https://www.jsboundaries.dev/docs/overview/)** - Introduction to the plugin and its core concepts\n- **[Quick Start](https://www.jsboundaries.dev/docs/quick-start/)** - Set up the plugin in 5 minutes\n- **[Setup Guide](https://www.jsboundaries.dev/docs/setup/)** - In-depth configuration guide\n  - [Define Elements](https://www.jsboundaries.dev/docs/setup/elements/)\n  - [Use Element Selectors](https://www.jsboundaries.dev/docs/setup/selectors/)\n  - [Configure Rules](https://www.jsboundaries.dev/docs/setup/rules/)\n  - [Global Settings](https://www.jsboundaries.dev/docs/setup/settings/)\n- **[Rules Reference](https://www.jsboundaries.dev/docs/rules/)** - Complete documentation for all available rules\n- **[TypeScript Support](https://www.jsboundaries.dev/docs/guides/typescript-support/)** - Use with TypeScript projects\n\n## Quick Example\n\nInstall the plugin using npm:\n\n```bash\nnpm install eslint eslint-plugin-boundaries --save-dev\n```\n\nDefine your architectural elements:\n\n```javascript\nimport boundaries from \"eslint-plugin-boundaries\";\n\nexport default [\n  {\n    plugins: { boundaries },\n    settings: {\n      \"boundaries/elements\": [\n        { type: \"controller\", pattern: \"controllers/*\" },\n        { type: \"model\", pattern: \"models/*\" },\n        { type: \"view\", pattern: \"views/*\" }\n      ]\n    }\n  }\n];\n```\n\nDefine your dependency rules:\n\n```javascript\n{\n  rules: {\n    \"boundaries/dependencies\": [2, {\n      default: \"disallow\",\n      rules: [\n        { from: { type: \"controller\" }, allow: { to: { type: [\"model\", \"view\"] } } },\n        { from: { type: \"view\" }, allow: { to: { type: \"model\" } } },\n        { from: { type: \"model\" }, disallow: { to: { type: \"*\" } } }\n      ]\n    }]\n  }\n}\n```\n\nNow ESLint will catch violations:\n\n```javascript\n// In src/models/model.js\nimport View from \"../views/view\"; // ❌ Error: Architectural boundary violated\n```\n\n## Contributing\n\nTo everyone who has opened an issue, suggested improvements, fixed bugs, added features, or improved documentation: **Thank you**. Your contributions, no matter how small, make a real difference. Every bug report helps us improve, every feature request guides our roadmap, and every pull request strengthens the project.\n\nSpecial recognition goes to [those who have contributed code to the project](https://github.com/javierbrea/eslint-plugin-boundaries/graphs/contributors). Your technical contributions are the foundation of what makes this plugin valuable to the community.\n\nWant to contribute? We'd love to have you! Here are some ways to get involved:\n\n- **Report Issues**: [Open an issue](https://github.com/javierbrea/eslint-plugin-boundaries/issues) if you find a bug or have a suggestion\n- **Participate in Discussions**: Join the conversation on our [GitHub Discussions](https://github.com/javierbrea/eslint-plugin-boundaries/discussions). Review RFCs, share ideas, and help shape the future of the project.\n- **Contribute Code**: Check out our [Contributing Guidelines](https://github.com/javierbrea/eslint-plugin-boundaries/blob/main/.github/CONTRIBUTING.md)\n\n## License\n\nMIT © [javierbrea](https://github.com/javierbrea)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavierbrea%2Feslint-plugin-boundaries","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavierbrea%2Feslint-plugin-boundaries","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavierbrea%2Feslint-plugin-boundaries/lists"}