This rule reports when a source file does not adhere to the architectural constraints defined for a project.

== Why is this an issue?

There is an import from one source file to another that is prohibited by the architectural constraints defined for the project.
These constraints are established by the project maintainers in the architecture configuration file.

=== What is the potential impact?

Over time, codebases often drift from the intended project architecture,
gradually degrading the code structure and misaligning it with the original design.

This misalignment reduces visibility and control over daily decisions affecting the architecture.
As these small decisions accumulate, the codebase becomes harder to understand, and the architecture grows increasingly complex and unstructured.

== How to fix it

Refactor your source code to adhere to the architectural constraints.
The specific approach will depend on your project architecture and the code not adhering to the constraints.
For example, you might replace an import with an alternative import from another module
or create a new function in the appropriate module to maintain a clean architecture.

=== Code examples

Assuming that files in the directory `./src/panels` should not directly access files in the directory `./src/repos`:

==== Noncompliant code example

[source,javascript,diff-id=1,diff-type=noncompliant]
----
// ./src/panels/showCustomersPanel.js
import { CustomerRepo } from '../repos/customerRepo.js';

class ShowCustomersPanel {
    constructor() {
        this.customerRepo = new CustomerRepo();
    }

    getCustomers() {
        return this.customerRepo.findAll();
    }
}
----

==== Compliant solution

[source,javascript,diff-id=1,diff-type=compliant]
----
// ./src/panels/showCustomersPanel.js
import { CustomerService } from '../services/customerService.js';

class ShowCustomersPanel {
    constructor() {
        this.customerService = new CustomerService();
    }

    getCustomers() {
        return this.customerService.getAllCustomers();
    }
}
----

=== Documentation

- Defining architectural constraints for SonarQube
