- copy env.example to
.env.dev
and fill out env variables - run command :
make start
if using make file or:docker compose -f compose.dev.yaml --env-file .env.dev up --build
- seed the database :
make seed
ordocker exec -it backend-eco sh -c "npm run seed"
- generate graphql queries with codegen :
make codegen
orcd ./frontend && npm run codegen
You can check out the Makefile commands to run quick actions
-
🖼️ Frontend
- React 19 - JavaScript library for building user interfaces
- TypeScript - Static type checking
- Vite - Next generation frontend tooling
- TailwindCSS v4 - Utility-first CSS framework
- Apollo Client - GraphQL client
- Shadcn/ui : UI Components toolkit, based on Radix UI and Tailwind CSS
- Radix UI - Unstyled, accessible UI components
- React Router - Client-side routing
-
💽 Backend
- Node.js - JavaScript runtime
- TypeScript - Static type checking
- Apollo Server - GraphQL server
- TypeORM - ORM for TypeScript and JavaScript
- PostgreSQL - Open source relational database
- Type-GraphQL - Create GraphQL schema and resolvers with TypeScript
-
⚙️ Development Tools
- ESLint - JavaScript/TypeScript linting
- Prettier - Code formatting
- Docker - Containerization
- GraphQL Codegen - Generate TypeScript types from GraphQL schema
- ESLint - JavaScript/TypeScript linting
- Prettier - Code formatting
- GraphQL: Langage Feature Support - GraphQL LSP
- GraphQL: Syntax Hightlighting - GraphQL syntax hightlighting
- Tailwind CSS IntelliSense - Tailwind CSS tooling
-
create a
<pluralEntityName>.seed.json
file in backend/src/seeding/seeds/ that match the entity you want to seed -
import and export it in backend/src/database/seeds/index.ts
-
follow this structure :
{ "pluralEntityName": [ { "field1": "someData", "field2": "94538032" } ] }
-
go to backend/src/seeding/index.ts
- import it using the TypeScript import alias
@/database/seeds
- find the line
// Seed your entities here
and paste your seeding instruction at the end of existing ones :
await seed(EntityClass, entityData.pluralEntityName, { relations: [{ { name: 'relationName', entity: relationEntityClass, property: 'email', type: 'manyToOne'}, }], dates: ['startDate', 'endDate'], } );
-
the third paramater is optional : an option object where you can pass relations and date properties
relations
: an array of objects describing the relationsname
: relation name as a stringentity
: the entity class of the relationproperty
: optional, specify if other thanid
type
: optional, specify if other thanmanyToMany
dates
: an array of date properties as strings
- import it using the TypeScript import alias
-
🎉 you can now run the seed command (
make seed
) to add your new seeding data!