Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SUGGESTION] Adding eslint-plugin-project-structure to the project for validating folder structure and more, to automatically ensure scalability and consistency. #204

Open
Igorkowalski94 opened this issue Sep 1, 2024 · 3 comments

Comments

@Igorkowalski94
Copy link

Igorkowalski94 commented Sep 1, 2024

Hi everyone, I think my library works perfectly with bulletproof-react. It allows you to automatically enforce the correctness of the folder structure based on project-structure.md. Additionally, it can create more precise modularity rules for functionalities and allow for advanced naming conventions.

Cloud Shows an illustrated sun in light mode and a moon with stars in dark mode. Cloud

FolderOwl
eslint‑plugin-project‑structure

Powerful ESLint plugin with rules to help you achieve a scalable, consistent, and well-structured project.

Create your own framework! Define your folder structure, file composition, advanced naming conventions, and create independent modules.

Take your project to the next level and save time by automating the review of key principles of a healthy project!

npmnpm downloadsCheck, test, buildSponsorGitHub Repo stars

project‑structure/​folder‑structure

Enforce rules on folder structure to keep your project consistent, orderly and well thought out.

Rocket Features:

  • Validation of folder structure. Any files/folders outside the structure will be considered an error.
  • File/Folder name regex validation with features like wildcard * and treating . as a character, along with other conveniences.
  • Build in case validation.
  • Inheriting the folder's name. The file/folder inherits the name of the folder in which it is located. Option of adding your own prefixes/suffixes or changing the case.
  • Enforcing the existence of a files/folders when a specific file/folder exists. For example, if ./src/Component.tsx exists, then ./src/Component.test.tsx and ./src/stories/Component.stories.tsx must also exist.
  • Reusable rules for folder structures.
  • An option to create a separate configuration file with TypeScript support.
  • Forcing a nested/flat structure for a given folder.
  • Support for all file extensions.
  • Folder recursion. You can repeatedly nest a folder structure and set a limit on the nesting depth. There is also an option to change the rule at the final level, such as flattening the folder structure.
  • Fewer repetitions and precise error messages, even for deeply nested folders (recursion), by representing the folder structure as a tree.
  • Checking the length of paths and notifying when the limit is exceeded.

project‑structure/​independent‑modules

A key principle of a healthy project is to prevent the creation of a massive dependency tree, where removing or editing one feature triggers a chain reaction that impacts the entire project.

Create independent modules to keep your project scalable and easy to maintain. Get rid of dependencies between modules and create truly independent functionalities.

Rocket Features:

  • Creating independent modules in which you control what can be imported (e.g. types, functions, components of one functionality cannot be imported into another functionality).
  • The ability to create very detailed rules, even for nested folder structures. Whether it's a large module, a sub-module, or a single file, there are no limitations.
  • Support for all types of imports, including require(), import(), jest.mock(), and jest.requireActual(), as well as ExportAllDeclaration and ExportNamedDeclaration.
  • Disabling external imports (node_modules) for a given module (Option to add exceptions).
  • Non-relative/relative imports support.
  • Support for imports without extension.
  • Reusable import patterns.
  • Support for path aliases. The plugin will automatically detect your tsconfig.json and use your settings. There is also an option to enter them manually.
  • An option to create a separate configuration file with TypeScript support.

project‑structure/​file‑composition

Compose your ideal files!

Have full control over the order and quantity of selectors.

Define advanced naming conventions and prohibit the use of specific selectors in given files.

Rocket Features:

  • File composition validation.
  • Supported selectors: class, function, arrowFunction, type, interface, enum, variable, variableExpression.
  • Inheriting the filename as the selector name. Option to add your own prefixes/suffixes, change the case, or remove parts of the filename.
  • Prohibit the use of given selectors in a given file. For example, **/*.consts.ts files can only contain variables, **/*.types.ts files can only contain interfaces and types.
  • Define the order in which your selectors should appear in a given file. Support for --fix to automatically correct the order.
  • Rules for exported selectors, selectors in the root of the file and nested/all selectors in the file. They can be used together in combination.
  • Enforcing a maximum of one main function/class per file.
  • The ability to set a specific limit on the occurrence of certain selectors in the root of a given file.
  • Selector name regex validation.
  • Build in case validation.
  • Different rules for different files.
  • An option to create a separate configuration file with TypeScript support.
@alan2207
Copy link
Owner

alan2207 commented Sep 8, 2024

Hey @Igorkowalski94 , that is a great suggesstion, cool project BTW! I will give it a try and see how it fits...

@Igorkowalski94
Copy link
Author

Thanks! If you have any problems or questions, I'm happy to help.

@Igorkowalski94
Copy link
Author

Hey @alan2207 , did you find time to try out the library? If so, do you have any thoughts or suggestions?

In the meantime, I’ve added some new features, like enforcing the correct order of selectors in a file, with support for --fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants