Skip to content

Folder structure

Raphaël Balet edited this page Dec 6, 2023 · 26 revisions

Reglements

Repository name

  1. should become increasingly more specific as you read from left to right
  2. no underscores
  3. All lowercase
  4. No special characters
  5. Example: home-header

Structure

Project structure

src
├── app
│   ├── pages
│   │   ├── auth
│   │   │   ├── auth-login
│   │   │   ├── auth-signup
│   │   │   ├── auth-password-request
│   │   │   └── auth-password-reset
│   │   └── [page]
│   │       ├── [page].page.html
│   │       ├── [page].page.scss
│   │       ├── [page].page.ts
│   │       ├── [page].module.ts
│   │       └── [page].[name]
│   │           ├── [page]-[name].component.html
│   │           ├── [page]-[name].component.scss
│   │           ├── [page]-[name].component.ts
│   │           ├── [page]-[name].module.ts
│   │           └── state
│   │               ├── [name].query.ts
│   │               ├── [name].service.ts
│   │               └── [name].store.ts
│   ├── configs
│   │   ├── [name].config.ts
│   │   └── global.config.ts
│   ├── core
│   │   ├── animations
│   │   │   └── global.ts
│   │   ├── interceptors
│   │   │   ├── version.interceptor.ts
│   │   │   └── auth.interceptor.ts
│   │   ├── guards
│   │   │   ├── auth.guard.ts
│   │   │   └── admin.guard.ts
│   │   ├── directives
│   │   │   └── validation.directive.ts
│   │   ├── services
│   │   │   ├── dal.service.ts
│   │   │   ├── session.service.ts
│   │   │   └── [another-api].service.ts
│   │   └── bases
│   │   │   └── base-[type].[service, query, component].ts
│   │   └── models
│   │       ├── core.enums.ts
│   │       ├── core.d.ts // interfaces
│   │       └── core.models.ts
│   │       └── core.types.ts
│   └── shared
│       ├── components
│       │   └── [name]
│       │    	└── [name].component.ts
│       ├── fragments
│       │   └── [name]
│       │    	└── [name].fragment.ts
│       ├── layouts
│       │   └── [name]
│       │    	└── [name].layout.ts
│       ├── pipes
│       │   └── [name]
│       │    	└── [name].pipe.ts
│       └── vendors
│           ├── components
│           │   └── [name].component.ts
│           ├── fragments
│           │   └── [name].fragment.ts
│           └── layouts
│               └── [name].layout.ts
├── assets
│   ├── fonts
│   ├── i18n
│   ├── icons
│   │   └── [name]-[direction]-[color].svg
│   ├── img
│   │   └── components
│   │       └── [page, fragment, component]-[name]
│   │           └── bg-desktop.jpg
│   │           └── bg-mobile.jpg
│   ├── js
│   ├── json
│   ├── pdf
│   └── video
├── environments
│   ├── environment.hmr.ts
│   ├── environment.prod.ts
│   └── environment.ts
└── styles
    ├── base
    │   ├── _colors.scss
    │   ├── _img.scss
    │   ├── _reset.scss
    │   └── _typography.scss
    ├── components
    │   ├── _buttons.scss
    │   └── _gallery.scss
    ├── themes
    │   ├── _admin.scss
    │   └── _theme.scss
    ├── utils
    │   ├── _functions.scss
    │   ├── _mixins.scss
    │   └── _variables.scss
    ├── _shared.scss
    └── main.scss

Logic explanation

folder description
pages Contains different pages
  • @pages | Contains components
  • [page] | Page name (ex: home, about)
  • [page]-[name] | Contains the component
    • state | Contains query, service and store (from Akita) configs | Contains global logic, normally constant variables core | App core logic
  • guards | For restricted routes
  • store | Storing values coming from the services
  • services | Getting values from an API or a Database
  • bases | Intended to be extended
  • models |  
    • enums | Enumeration of constant variable
    • interfaces | Contain globally used types
    • models | Type that has function let var = new MyModel({}) shared | Used many times by different elements
  • layouts | Positioning of many components
  • components | Imported directly by the pages (ex: footer)
  • fragments | Smallest piece of code, shall import something else than themself
  • pipes | Converting data inside fragments / components
  • vendors | Third-party code assets | Contains static assets
  • fonts |  
  • i18n | International language files how to
  • icons | Contains only .svg files

Core vs Shared

Core

Contains the code that is specific to the application and implements the Cross-Cutting Concerns of the applications.

  • Should be imported only once, usually into the app.module.ts
  • Services are usually provideIn: root

Shared

Contains the code that could potentially be reused across the app

TsConfig paths

Remove the one you aren't using

"baseUrl": "./src",
"paths": {
  "@auth/*": ["app/pages/auth/*"],
  "@pages/*": ["app/pages/*"],
  "@configs/*": ["app/configs/*"],
  "@bases/*": ["app/core/bases/*"],
  "@guards/*": ["app/core/guards/*"],
  "@store/*": ["app/core/store/*"],
  "@models/*": ["app/core/models/*"],
  "@services/*": ["app/core/services/*"],
  "@fragments/*": ["app/shared/fragments/*"],
  "@layouts/*": ["app/shared/layouts/*"],
  "@modals/*": ["app/shared/components/modals/*"],
  "@components/*": ["app/shared/components/*"],
  "@pipes/*": ["app/shared/pipes/*"],
  "@vendors/*": ["app/shared/vendors/*"],
  "@shared/*": ["app/shared/*"],
  "@app/*": ["app/*"],
}

Acknowledgments

Clone this wiki locally