{"id":15495081,"url":"https://github.com/chnapy/bloup","last_synced_at":"2026-04-19T14:08:27.954Z","repository":{"id":37953551,"uuid":"477151106","full_name":"Chnapy/bloup","owner":"Chnapy","description":"Yarn 3 monorepo with React / NestJS-TypeORM-GraphQL","archived":false,"fork":false,"pushed_at":"2023-01-23T18:08:12.000Z","size":283245,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-25T23:49:51.667Z","etag":null,"topics":["docker","graphql","monorepo","typescript","vscode"],"latest_commit_sha":null,"homepage":"http://vps-0c88ff97.vps.ovh.net","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Chnapy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-04-02T19:23:41.000Z","updated_at":"2022-08-15T17:21:40.000Z","dependencies_parsed_at":"2023-02-13T01:45:51.752Z","dependency_job_id":null,"html_url":"https://github.com/Chnapy/bloup","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Chnapy/bloup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chnapy%2Fbloup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chnapy%2Fbloup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chnapy%2Fbloup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chnapy%2Fbloup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Chnapy","download_url":"https://codeload.github.com/Chnapy/bloup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chnapy%2Fbloup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32009243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","graphql","monorepo","typescript","vscode"],"created_at":"2024-10-02T08:16:02.467Z","updated_at":"2026-04-19T14:08:27.936Z","avatar_url":"https://github.com/Chnapy.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bloup\n\n[![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers\u0026message=Open\u0026color=blue\u0026logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/Chnapy/bloup)\n\nThis is a sandbox repo to try some techs and ways of doing\n\n- Dev\n  - NestJS with mongoDB, TypeORM and GraphQL - all linked and automatized as much as possible\n  - React 18\n- Tools \u0026 config\n  - Yarn 3 monorepo\n  - Yarn Zero-installs\n  - Strong linking between frontend\u003c-\u003ebackend using GraphQL\n  - GraphQL strong tooling (editor validation, editor operations, editor lint, code generation, api playground)\n  - Use of non-JS build tools like esbuild\n- Devops\n  - CI cover and optimization\n  - CD optimization using Docker\n  - Docker dev environment (including Windows)\n\nTODO\n\n- Devops\n  - App deploy on change only\n  - PR preview environment\n\n[Nx framework](https://nx.dev/) was also tried. Powerful but quite restrictive and not compatible with Yarn 2+.\n\n## Dev environment\n\nThis repo is made to be used with [VSCode Remote-Containers](https://code.visualstudio.com/docs/remote/containers) which setup a Docker container with a fully controlled dev environment (including database and VSCode itself, all in a Linux distro).\n\n### Dev in Windows OS\n\nOn Windows it is recommended to use [Windows WSL with Docker](https://docs.docker.com/desktop/windows/wsl/#develop-with-docker-and-wsl-2) which allow to work on an optimized Linux VM. Using VSCode Remote-Containers with them gives the best dev experience in this OS.\n\n## Monorepo architecture\n\nThis repo follows a monorepo architecture using Yarn 3 with its [workspace feature](https://yarnpkg.com/features/workspaces).\n\n- Every packages are in `packages` folder.\n- Tooling is shared between every packages, and can be used globally on the whole repo.\n- Each package is independent, but same dependencies should use the same version for consistency reasons.\n\n### Run yarn command on specific package\n\nTo target a specific package simply use `yarn workspace \u003cpkg_name\u003e`:\n\n- `yarn workspace web-app add -D typescript`\n- `yarn workspace web-app c:lint:fix`\n- `yarn workspace web-app c:test`\n\nNote that [shared scripts](https://yarnpkg.com/getting-started/qa/#how-to-share-scripts-between-workspaces) should contains `:` in there names.\n\n## Generators \u0026 formatters\n\nSome tools are used to ensure files format and generated content.\nYou can use them with these yarn commands:\n\n- `gen:tsconfig` - Generate all the `tsconfig.json` files with default values and packages references.\n  You should run it after add/remove a package.\n- `c:pkg:fix` - Format every `package.json` files and fix as possible dependencies versions to avoid multiple versions for a single one.\n- `c:lint:fix` - ESLint in fix mode\n- `c:format:fix` - Prettier in fix mode\n\n## Esbuild \u0026 Vite\n\nApp `web-app` uses [Vite](https://github.com/vitejs/vite) build tool instead of common Webpack.\nVite uses [esbuild](https://github.com/evanw/esbuild) which is a non-JS builder allowing big performance improvement, and trivial config.\n\n### Jest\n\nJest is used for testing.\n\n[Vitest](https://github.com/vitest-dev/vitest) was tried as a esbuild-based fast testing tool, but it does not work well with monorepos.\n\n## Zero-installs principe\n\nFor stability \u0026 speed concerns, this repo follows the [\"Zero Installs\" principe proposed by Yarn](https://yarnpkg.com/features/zero-installs).\n\nIt is why dependencies are versionned ([.yarn/cache](.yarn/cache)).\nSo in theory there is no need to do any `yarn install` anymore.\n\n## CI\n\nGithub Actions CI runs these jobs to ensure as possible PR quality:\n\n- check packages versions and possible duplicates\n- check lint\n- check tests\n- check TS typing\n- build (on apps)\n\nAll these jobs are done on the whole repo for processing time reason.\nGithub Actions free offer may be limited for big projects, running one check on all the code instead of a check on each package takes way less time to run.\n\n### CD\n\nFollowing continuous deployment goal, after CI checks are done on `master` a deployment is made to a Docker-based staging environment.\n\n- `web-app`: http://vps-0c88ff97.vps.ovh.net\n- `api`: http://vps-0c88ff97.vps.ovh.net:3333/graphql\n\nDocker is configured to use [swarm](https://docs.docker.com/engine/swarm/) allowing zero downtime, rolling update, load balancing etc.\n\nFor each app, CI generates a Docker image which is pushed from `master` to GH Container Repository.\nThen a deploy is triggered on the server itself, which updates its image \u0026 container with latest pushed image.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchnapy%2Fbloup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchnapy%2Fbloup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchnapy%2Fbloup/lists"}