It's a good convention to put applications-specific libraries into the directory matching the application name. This provides enough organization for small to mid-size applications(Crema is using this) like below.
Copy crema-4.x/
├── apps/
│ ├── source/
│ ├── source-e2e/
│ ├── adminapp/
│ └── adminapp-e2e/
├── libs/
│ ├── constants/
│ ├── context/
│ ├── helpers/
│ ├── hooks/
│ ├── services/
│ ├── source/
│ │ ├── feature-main/
│ │ ├── ui-table/
│ │ └── utils-testing/
│ ├── adminapp/
│ │ ├── feature-main/
│ │ ├── feature-login/
│ │ ├── ui/
│ │ └── utils-testing/
│ └── shared/
│ ├── ui/
│ └── utils-testing/
├── tools/
├── nx.json
├── package.json
└── tsconfig.base.json
For larger projects, it is a good idea to group libraries into application sections like below
Copy crema-4.x/
├── apps/
│ ├── source/
│ ├── source-e2e/
│ ├── adminapp/
│ └── adminapp-e2e/
├── libs/
│ ├── constants/
│ ├── context/
│ ├── helpers/
│ ├── hooks/
│ ├── services/
│ ├── source/
│ │ ├── registration/
│ │ │ ├── feature-main/
│ │ │ ├── feature-login/
│ │ │ ├── ui-form/
│ │ │ └── utils-testing/
│ │ ├── search/
│ │ │ ├── feature-results/
│ │ │ └── utils-testing/
│ │ └── shared/
│ │ └── ui/
│ ├── source/
| └── shared/
│ ├── ui/
│ └── utils-testing/
├── tools/
├── nx.json
├── package.json
└── tsconfig.base.jso