Skip to content

Commit e52c6fe

Browse files
committed
🔧 Add architecture rule to prevent Helpers/Utility layers from depending on Stores layer
- Add ESLint rule to prohibit Stores layer imports in Helpers/Utility layers - Update README files to document the new architecture rule - Enforce pure function pattern by requiring values to be passed as arguments
1 parent 734c436 commit e52c6fe

3 files changed

Lines changed: 35 additions & 0 deletions

File tree

‎apps/web/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ src/lib/
3838

3939
- **Components**: Access Helpers via Stores/LocalStores (direct Helper dependency is prohibited)
4040
- **Stores/LocalStores**: Can directly access Helpers, pass state to Helpers for execution
41+
- **Helpers/Utility**: Cannot depend on Stores (must be pure functions, receive values as arguments)
4142

4243
## State Management
4344

‎apps/web/eslint.config.js‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,21 @@ export default [
3636
],
3737
},
3838
},
39+
// Helpers and Utility layers cannot depend on Stores layer
40+
{
41+
files: ['src/lib/helpers/**/*.ts', 'src/lib/utility/**/*.ts'],
42+
rules: {
43+
'no-restricted-imports': [
44+
'error',
45+
{
46+
patterns: [
47+
{
48+
group: ['$lib/stores', '$lib/stores/**'],
49+
message: 'Pass values as arguments to keep Helpers/Utility pure functions',
50+
},
51+
],
52+
},
53+
],
54+
},
55+
},
3956
];

‎packages/eslint-config/README.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export default pages;
4646
- **Prettier Integration** - Seamless integration with Prettier formatting
4747
- **Test File Detection** - Automatic relaxed rules for `*.test.{js,ts}` and `*.spec.{js,ts}`
4848
- **Config File Detection** - Relaxed JSDoc requirements for `*.config.{js,ts}`
49+
- **Architecture Rules** - Layered architecture enforcement (available in `web` config)
4950

5051
## Included Plugins
5152

@@ -64,6 +65,22 @@ bun lint # Run linting
6465
bun format # Format code
6566
```
6667

68+
## Architecture Rules (Web Config)
69+
70+
The `web` configuration includes architectural layer rules to enforce clean separation of concerns:
71+
72+
### Layer Restrictions
73+
74+
- **Stores Layer Access**: Direct imports from `$lib/stores/*` are prohibited; use `$lib/stores` index
75+
- **Components Layer**: Cannot directly import Helpers; must access via Stores/LocalStores
76+
- **Helpers/Utility Layers**: Cannot import from Stores layer; must be pure functions receiving values as arguments
77+
78+
These rules ensure:
79+
80+
- **Testability**: Pure functions in Helpers/Utility layers are easy to test without mocking
81+
- **Maintainability**: Clear separation of concerns and unidirectional data flow
82+
- **Type Safety**: Dependency injection through function arguments provides better type inference
83+
6784
## Design Philosophy
6885

6986
- **Centralized Management** - All ESLint configurations managed from a single source

0 commit comments

Comments
 (0)