Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Better Angular Architectures with Libraries and Nx

Better Angular Architectures with Libraries and Nx

Angular is a great tool for creating applications with a big architecture in mind. It comes with benefits like testing, Dependency Injection or HTTP Communication out of the box. But when your application grows and often enlarges, a single Angular application comes unhandy and developer seem to lose the focus on where to put which feature. And after managing Angular's learning curve, designing shared features or loosely couples fragments while developing an app seems to be a challenge still because having everything in one app seems not to be a well-structured architecture.

In the talk "Better Angular Architectures with Libraries and Nx" Fabian will explain the power of Angular's architectural features and push them to the edge where the extraction of libraries and creating a complete workspace with tools like NX can save you and help you to write clean large Angular applications, lovely shareable features and how they help to get your Angular application back into shape again. Because large angular apps don't have to be difficult to maintain.

Fabian Gosebrink

October 25, 2023
Tweet

More Decks by Fabian Gosebrink

Other Decks in Technology

Transcript

  1. @Component({ /* ... */ }) export class MainDoggoComponent implements OnInit

    { private readonly store = inject(Store); private readonly destroyRef = inject(DestroyRef); doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } rateDoggo(rating: number) { this.store.dispatch(DoggosActions.rateDoggo({ rating })); } skipDoggo() { this.store.dispatch(DoggosActions.selectNextDoggo()); } selectDoggo(id: string) { this.store.dispatch(DoggosActions.selectDoggo({ id })); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
  2. @Component({ /* ... */ }) export class MainDoggoComponent implements OnInit

    { private readonly store = inject(Store); private readonly destroyRef = inject(DestroyRef); doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } rateDoggo(rating: number) { this.store.dispatch(DoggosActions.rateDoggo({ rating })); } skipDoggo() { this.store.dispatch(DoggosActions.selectNextDoggo()); } selectDoggo(id: string) { this.store.dispatch(DoggosActions.selectDoggo({ id })); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private readonly store = inject(Store); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30
  3. @Component({ /* ... */ }) export class MainDoggoComponent implements OnInit

    { private readonly store = inject(Store); private readonly destroyRef = inject(DestroyRef); doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } rateDoggo(rating: number) { this.store.dispatch(DoggosActions.rateDoggo({ rating })); } skipDoggo() { this.store.dispatch(DoggosActions.selectNextDoggo()); } selectDoggo(id: string) { this.store.dispatch(DoggosActions.selectDoggo({ id })); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private readonly store = inject(Store); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30 doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 private readonly store = inject(Store); 3 private readonly destroyRef = inject(DestroyRef); 4 5 6 7 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30
  4. @Component({ /* ... */ }) export class MainDoggoComponent implements OnInit

    { private readonly store = inject(Store); private readonly destroyRef = inject(DestroyRef); doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } rateDoggo(rating: number) { this.store.dispatch(DoggosActions.rateDoggo({ rating })); } skipDoggo() { this.store.dispatch(DoggosActions.selectNextDoggo()); } selectDoggo(id: string) { this.store.dispatch(DoggosActions.selectDoggo({ id })); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private readonly store = inject(Store); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30 doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 private readonly store = inject(Store); 3 private readonly destroyRef = inject(DestroyRef); 4 5 6 7 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30 ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 private readonly store = inject(Store); 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 10 11 12 13 14 15 16 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30
  5. @Component({ /* ... */ }) export class MainDoggoComponent implements OnInit

    { private readonly store = inject(Store); private readonly destroyRef = inject(DestroyRef); doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } rateDoggo(rating: number) { this.store.dispatch(DoggosActions.rateDoggo({ rating })); } skipDoggo() { this.store.dispatch(DoggosActions.selectNextDoggo()); } selectDoggo(id: string) { this.store.dispatch(DoggosActions.selectDoggo({ id })); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 private readonly store = inject(Store); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30 doggos = this.store.selectSignal(getAllDoggosButSelected); selectedDoggo = this.store.selectSignal(getSelectedDoggo); loading = this.store.selectSignal(getLoading); @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 private readonly store = inject(Store); 3 private readonly destroyRef = inject(DestroyRef); 4 5 6 7 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30 ngOnInit(): void { this.store.dispatch(DoggosActions.loadDoggos()); this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); this.destroyRef.onDestroy(() => { this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); }); } @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 private readonly store = inject(Store); 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 10 11 12 13 14 15 16 17 18 rateDoggo(rating: number) { 19 this.store.dispatch(DoggosActions.rateDoggo({ rating })); 20 } 21 22 skipDoggo() { 23 this.store.dispatch(DoggosActions.selectNextDoggo()); 24 } 25 26 selectDoggo(id: string) { 27 this.store.dispatch(DoggosActions.selectDoggo({ id })); 28 } 29 } 30 rateDoggo(rating: number) { this.store.dispatch(DoggosActions.rateDoggo({ rating })); } skipDoggo() { this.store.dispatch(DoggosActions.selectNextDoggo()); } selectDoggo(id: string) { this.store.dispatch(DoggosActions.selectDoggo({ id })); } @Component({ /* ... */ }) 1 export class MainDoggoComponent implements OnInit { 2 private readonly store = inject(Store); 3 private readonly destroyRef = inject(DestroyRef); 4 5 doggos = this.store.selectSignal(getAllDoggosButSelected); 6 selectedDoggo = this.store.selectSignal(getSelectedDoggo); 7 loading = this.store.selectSignal(getLoading); 8 9 ngOnInit(): void { 10 this.store.dispatch(DoggosActions.loadDoggos()); 11 this.store.dispatch(DoggosActions.startListeningToRealtimeDoggoEvents()); 12 13 this.destroyRef.onDestroy(() => { 14 this.store.dispatch(DoggosActions.stopListeningToRealtimeDoggoEvents()); 15 }); 16 } 17 18 19 20 21 22 23 24 25 26 27 28 29 } 30
  6. @Component({ /* ... */ }) export class DoggoListComponent { @Input()

    doggos: Doggo[] | null = []; @Output() doggoSelected = new EventEmitter<string>(); selectDoggo(doggo: Doggo) { this.doggoSelected.emit(doggo.id); } } 1 2 3 4 5 6 7 8 9 10
  7. @Component({ /* ... */ }) export class DoggoListComponent { @Input()

    doggos: Doggo[] | null = []; @Output() doggoSelected = new EventEmitter<string>(); selectDoggo(doggo: Doggo) { this.doggoSelected.emit(doggo.id); } } 1 2 3 4 5 6 7 8 9 10 @Input() doggos: Doggo[] | null = []; @Component({ /* ... */ }) 1 export class DoggoListComponent { 2 3 4 @Output() doggoSelected = new EventEmitter<string>(); 5 6 selectDoggo(doggo: Doggo) { 7 this.doggoSelected.emit(doggo.id); 8 } 9 } 10
  8. @Component({ /* ... */ }) export class DoggoListComponent { @Input()

    doggos: Doggo[] | null = []; @Output() doggoSelected = new EventEmitter<string>(); selectDoggo(doggo: Doggo) { this.doggoSelected.emit(doggo.id); } } 1 2 3 4 5 6 7 8 9 10 @Input() doggos: Doggo[] | null = []; @Component({ /* ... */ }) 1 export class DoggoListComponent { 2 3 4 @Output() doggoSelected = new EventEmitter<string>(); 5 6 selectDoggo(doggo: Doggo) { 7 this.doggoSelected.emit(doggo.id); 8 } 9 } 10 @Output() doggoSelected = new EventEmitter<string>(); selectDoggo(doggo: Doggo) { this.doggoSelected.emit(doggo.id); } @Component({ /* ... */ }) 1 export class DoggoListComponent { 2 @Input() doggos: Doggo[] | null = []; 3 4 5 6 7 8 9 } 10
  9. Nx is built on a technology-agnostic core that maintains modular

    units of code and understands the dependency graph between them. "
  10. App About Doggos Feature Feature Ui Domain Utils Shared util-environments

    util-Auth util-Common UI-common scope:about scope:doggos scope:shared
  11. App About Doggos Feature Feature Ui Domain Utils type:feature Shared

    util-environments util-Auth util-Common UI-common scope:about scope:doggos scope:shared
  12. App About Doggos Feature Feature Ui Domain Utils type:feature type:ui

    type:domain type:utils type:feature Shared util-environments util-Auth util-Common UI-common scope:about scope:doggos scope:shared
  13. App About Doggos Feature Feature Ui Domain Utils type:feature type:ui

    type:domain type:utils type:feature Shared util-environments type:util util-Auth util-Common UI-common type:util type:util type:ui scope:about scope:doggos scope:shared
  14. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
  15. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31
  16. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31
  17. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31
  18. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 15 16 17 18 19 20 21 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "sourceTag": "scope:shared", 32 "onlyDependOnLibsWithTags": ["scope:shared"] 33
  19. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 15 16 17 18 19 20 21 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 23 24 25 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "sourceTag": "scope:shared", 32 "onlyDependOnLibsWithTags": ["scope:shared"] 33 }, 34 { 35 "sourceTag": "type:app", 36 "onlyDependOnLibsWithTags": [ 37 "type:feature", 38 "type:util", 39
  20. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 15 16 17 18 19 20 21 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 23 24 25 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 27 28 29 30 { 31 "sourceTag": "scope:shared", 32 "onlyDependOnLibsWithTags": ["scope:shared"] 33 }, 34 { 35 "sourceTag": "type:app", 36 "onlyDependOnLibsWithTags": [ 37 "type:feature", 38 "type:util", 39 "type:ui" 40 ] 41 }, 42 { 43
  21. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 15 16 17 18 19 20 21 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 23 24 25 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 27 28 29 30 { 31 { "sourceTag": "scope:shared", "onlyDependOnLibsWithTags": ["scope:shared"] }, "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 31 32 33 34 { 35 "sourceTag": "type:app", 36 "onlyDependOnLibsWithTags": [ 37 "type:feature", 38 "type:util", 39 "type:ui" 40 ] 41 }, 42 { 43 "sourceTag": "type:feature", 44 "onlyDependOnLibsWithTags": [ 45 "type:domain", 46 "type:ui", 47
  22. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 15 16 17 18 19 20 21 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 23 24 25 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 27 28 29 30 { 31 { { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 31 { "sourceTag": "type:app", "onlyDependOnLibsWithTags": [ "type:feature", "type:util", "type:ui" ] }, { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "sourceTag": "scope:shared", 32 "onlyDependOnLibsWithTags": ["scope:shared"] 33 }, 34 35 36 37 38 39 40 41 42 { 43 "sourceTag": "type:feature", 44 "onlyDependOnLibsWithTags": [ 45 "type:domain", 46 "type:ui", 47 "type:util" 48 ] 49 }, 50 { 51 "sourceTag": "type:ui", 52 "onlyDependOnLibsWithTags": ["type:util", "type:domain"] 53
  23. { "root": true, "ignorePatterns": ["**/*"], "plugins": ["@nx"], "overrides": [ {

    "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "rules": { "@nx/enforce-module-boundaries": [ "error", { "enforceBuildableLibDependency": true, "allow": [], "depConstraints": [ { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 "@nx/enforce-module-boundaries": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "error", { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 "depConstraints": [ { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggo-rating-app", "onlyDependOnLibsWithTags": [ "scope:doggos", "scope:about", "scope:shared" ] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 15 16 17 18 19 20 21 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:about", "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 23 24 25 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "scope:doggos", "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] }, { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 27 28 29 30 { 31 { { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 31 { 1 "root": true, 2 "ignorePatterns": ["**/*"], 3 "plugins": ["@nx"], 4 "overrides": [ 5 { 6 "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 "rules": { 8 "@nx/enforce-module-boundaries": [ 9 "error", 10 { 11 "enforceBuildableLibDependency": true, 12 "allow": [], 13 "depConstraints": [ 14 { 15 "sourceTag": "scope:doggo-rating-app", 16 "onlyDependOnLibsWithTags": [ 17 "scope:doggos", 18 "scope:about", 19 "scope:shared" 20 ] 21 }, 22 { 23 "sourceTag": "scope:about", 24 "onlyDependOnLibsWithTags": ["scope:about", "scope:shared"] 25 }, 26 { 27 "sourceTag": "scope:doggos", 28 "onlyDependOnLibsWithTags": ["scope:doggos", "scope:shared"] 29 }, 30 { 31 { "sourceTag": "type:feature", "onlyDependOnLibsWithTags": [ "type:domain", "type:ui", "type:util" ] }, { 31 "sourceTag": "scope:shared", 32 "onlyDependOnLibsWithTags": ["scope:shared"] 33 }, 34 { 35 "sourceTag": "type:app", 36 "onlyDependOnLibsWithTags": [ 37 "type:feature", 38 "type:util", 39 "type:ui" 40 ] 41 }, 42 43 44 45 46 47 48 49 50 { 51 "sourceTag": "type:ui", 52 "onlyDependOnLibsWithTags": ["type:util", "type:domain"] 53 }, 54 { 55 "sourceTag": "type:domain", 56 "onlyDependOnLibsWithTags": ["type:util"] 57 } 58 ] 59 } 60 ], 61