{"id":13495156,"url":"https://github.com/michaelyali/mrepo","last_synced_at":"2025-03-22T02:31:17.926Z","repository":{"id":46809216,"uuid":"221635720","full_name":"michaelyali/mrepo","owner":"michaelyali","description":"CLI tool for scaffolding a TypeScript monorepo, powered with scripts and generators","archived":false,"fork":false,"pushed_at":"2023-01-07T06:24:40.000Z","size":1001,"stargazers_count":67,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-17T20:54:07.687Z","etag":null,"topics":["build-tool","cli","generator","javascript","lerna","lerna-monorepo","monorepo","monorepos","monorepository","npm-package","npm-scripts","scaffold","tools","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michaelyali.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-14T07:19:11.000Z","updated_at":"2024-09-26T03:02:30.000Z","dependencies_parsed_at":"2023-02-06T14:01:23.360Z","dependency_job_id":null,"html_url":"https://github.com/michaelyali/mrepo","commit_stats":null,"previous_names":["zmotivat0r/mrepo"],"tags_count":36,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelyali%2Fmrepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelyali%2Fmrepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelyali%2Fmrepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaelyali%2Fmrepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michaelyali","download_url":"https://codeload.github.com/michaelyali/mrepo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244897992,"owners_count":20528329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["build-tool","cli","generator","javascript","lerna","lerna-monorepo","monorepo","monorepos","monorepository","npm-package","npm-scripts","scaffold","tools","typescript"],"created_at":"2024-07-31T19:01:31.765Z","updated_at":"2025-03-22T02:31:17.402Z","avatar_url":"https://github.com/michaelyali.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eMREPO\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eAwesome TypeScript monorepository swiss knife\u003c/strong\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/zMotivat0r/mrepo/actions/workflows/tests.yml\"\u003e\n      \u003cimg src=\"https://github.com/zMotivat0r/mrepo/actions/workflows/tests.yml/badge.svg\" alt=\"Tests\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/zMotivat0r/mrepo/blob/master/LICENSE\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/license/zMotivat0r/mrepo.svg\" alt=\"License\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003csub\u003eBuilt with :purple_heart: by \n  \u003ca href=\"https://twitter.com/MichaelYali\"\u003e@MichaelYali\u003c/a\u003e\n  \u003cdiv align=\"center\"\u003e\n    :star2: :eyes: :zap: :boom:\n  \u003c/div\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\nMrepo makes it easy to create new TypeScript packages monorepository, generate new packages, build, test, link/unlink to try them locally, publish either to GitHub or NPM package registry.\n\n## Features\n\n\u003cimg align=\"right\" src=\"lib/img/demo.gif\" alt=\"Mrepo demo\" width=\"420\" /\u003e\n\n- :rocket: Generate TypeScript monorepository\n- :airplane: Package generator with references between other packages included, and sub-generators support\n- :vertical_traffic_light: Build, clean, link/unlink, release packages commnads\n- :icecream: Jest testing ready (unit, e2e, coverage commands included)\n- :lollipop: Lint and format (eslint \u0026 prettier)\n- :candy: Husky hooks ready (pre-commit hook included)\n- :watermelon: Conventional commits and changelogs\n- :pineapple: GitHub actions included (tests \u0026 release)\n- :coffee: Issues and Pull Request templates\n\n## Install\n\n```shell\n$ npm i @zmotivat0r/mrepo -g\n```\n\n## Commands\n\n- [mrepo new](#mrepo-new)\n- [mrepo generate](#mrepo-generate)\n- [mrepo build](#mrepo-build)\n- [mrepo clean](#mrepo-clean)\n- [mrepo test](#mrepo-test)\n- [mrepo link](#mrepo-link)\n- [mrepo unlink](#mrepo-unlink)\n- [mrepo digest](#mrepo-digest)\n- [mrepo release](#mrepo-release)\n  - [release flow](#release-flow)\n\n### mrepo new\n\n_Generate new TypeScript monorepository._\n\n_Info:_\n\n```shell\nmrepo new|n [options] \u003cname\u003e\n\nArguments:\n  name               Monorepo name\n\nOptions:\n  -y, --yes          Skip prompts and use default options (default: false)\n  --dry-run          Dry run (default: false)\n  --skip-scripts     Skip post-generator scripts (default: false)\n  --skip-git         Skip git init (default: false)\n  --skip-git-commit  Skip git initial commit (default: false)\n  --skip-install     Skip dependencies installation (default: false)\n  -h, --help         display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo new awesome-monorepo\n$ mrepo new awesome-monorepo --yes --skip-git\n```\n\n### mrepo generate\n\n_Generate new package, update root `tsconfig.json`, add references to other packages, if needed._\n\n_Info:_\n\n```shell\nmrepo generate|g [options] [package]\n\nArguments:\n  package                    Package name, optional\n\nOptions:\n  -y, --yes                  Skip prompts and use default options (default: false)\n  --dry-run                  Dry run (default: false)\n  --depends-on \u003cpacakges\u003e    Depends on scope package(s), comma-separated\n  --dependent-of \u003cpacakges\u003e  Dependent of scope package(s), comma-separated\n  -h, --help                 display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo generate\n$ mrepo generate cool-new-package --yes\n```\n\n### mrepo build\n\n_Build all packages or a specified one._\n\n_Info:_\n\n```shell\nmrepo build|b [options] [package]\n\nArguments:\n  package     Package name, optional\n\nOptions:\n  -h, --help  display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo build\n$ mrepo build packageName\n```\n\n### mrepo clean\n\n_Remove `lib` folder in all packages ot a specified one._\n\n_Info:_\n\n```shell\nmrepo clean|c [options] [package]\n\nArguments:\n  package     Package name, optional\n\nOptions:\n  -h, --help  display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo clean\n$ mrepo clean packageName\n```\n\n### mrepo test\n\n_Run tests using Jest for all packages or a specified one._\n\n_Info:_\n\n```shell\nmrepo test|t [options] [package]\n\nArguments:\n  package               Package name, optional\n\nOptions:\n  -f, --folder \u003cvalue\u003e  Tests folder (default: \"packages\")\n  -s, --suite \u003cvalue\u003e   Suite path to run\n  -c, --config \u003cvalue\u003e  Jest config file (default: \"jest.config.js\")\n  --coverage            Run with coverage (default: false)\n  --verbose             Run verbose (default: false)\n  -h, --help            display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo test\n$ mrepo test packageName --verbose\n```\n\n### mrepo link\n\n_Exec `npm link` for all packages or a specified one._\n\n_Info:_\n\n```shell\nmrepo link|l [options] [package]\n\nArguments:\n  package     Package name, optional\n\nOptions:\n  --build     Build before linking (default: false)\n  -h, --help  display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo link\n$ mrepo link packageName --build\n```\n\n### mrepo unlink\n\n_Exec `npm unlink` for all packages or a specified one._\n\n_Info:_\n\n```shell\nmrepo unlink|u [options] [package]\n\nArguments:\n  package     Package name, optional\n\nOptions:\n  -h, --help  display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo unlink\n$ mrepo unlink packageName\n```\n\n### mrepo digest\n\n_Install or create symlinks from mrepos to local target repositories._\n\n_Info:_\n\n```shell\nmrepo digest|d [options] [from] [to]\n\nArguments:\n  from                      Mrepo names from the digest config file, comma-separated (optional)\n  to                        Target names from the digest config file, comma-separated (optional)\n\nOptions:\n  -c, --config \u003cvalue\u003e      Config file name or path (optional) (default: \"mrepo-digest.json\")\n  -m, --mode \u003cvalue\u003e        Digest mode. One of ln, install, copy. (optional)\n  -p, --packages \u003cvalue\u003e    Mrepo packages to digest, comma-separated (optional)\n  --withVersion \u003cvalue\u003e     Install packages with version (optional)\n  --withLocalVersions       Install packages with their local versions (optional) (default: false)\n  --quiet                   Run quietly (optional) (default: false)\n  -h, --help  display info\n```\n\n_Usage:_\n\n1. Create a config json (default name \"mrepo-digest.json\") and place it somewhere in your system.\n\n_Example config:_\n\n```json\n{\n  \"paths\": [\n    {\n      \"name\": \"first\",\n      \"path\": \"/some/path/to/first\"\n    },\n    {\n      \"name\": \"second\",\n      \"path\": \"/some/path/to/second\"\n    },\n    {\n      \"name\": \"third\",\n      \"path\": \"/some/path/to/third\"\n    }\n  ],\n  \"mrepos\": [\n    {\n      \"name\": \"first\",\n      \"defaultPackages\": [\"one-package\", \"another-cool-package\"],\n      \"targets\": [\n        {\n          \"name\": \"second\",\n          \"packages\": [\"awesome-package\"]\n        },\n        {\n          \"name\": \"third\"\n        }\n      ]\n    },\n    {\n      \"name\": \"second\",\n      \"targets\": [\n        {\n          \"name\": \"third\",\n          \"packages\": [\"from-second-package\"],\n          \"noDefaultPackages\": true,\n          \"mode\": \"install\"\n        }\n      ]\n    }\n  ],\n  \"targets\": [\n    {\n      \"name\": \"second\",\n      \"installExec\": \"yarn add -W\"\n    },\n    {\n      \"name\": \"third\",\n      \"installExec\": \"npm i\"\n    }\n  ],\n  \"mode\": \"ln\"\n}\n```\n\nIn this example `first` and `second` are both `mrepo` generated monorepositories, where `second` depends on `first` (e.g. one has only public packages, another has only private packages under the same npm scope) and the `third` is just another node project wich depends on packages from both those mrepos.\n\n`mrepos.defaultPackages` and `mrepos.targets.packages` are merged (`mrepos.targets.noDefaultPackages` prevents using default packages) . Can be overridden by using `--packages` option.\n\n`mode` and `mrepos.targets.mode` have two values: `ln` - create symbolic links for packages from mrepo, `install` - install packages, `copy` - copy lib folders to targets. Can be overridden by using `--mode` option.\n\n```shell\n$ mrepo digest\n$ mrepo digest -c another-config.json first third --mode install\n```\n\n### mrepo release\n\n_Start release new version: bump package(s) version, generate changelog, git commit and push._\n\n_Info:_\n\n```shell\nmrepo release|r [options] \u003csemver\u003e\n\nArguments:\n  semver              Package version semver type. One of: patch, minor, major,\n                        prepatch, preminor, premajor, prerelease, select\n\nOptions:\n  --no-git-push       Skip git commit and push\n  --no-changelog      Skip changelog generation\n  --preid \u003cvalue\u003e     Prerelease identifier (default: \"alpha\")\n  --dist-tag \u003cvalue\u003e  Dist tag when Lerna version is \"independent\" (default: \"latest\")\n  --force-publish     Force packages release (default: false)\n  -h, --help          display info\n```\n\n_Usage:_\n\n```shell\n$ mrepo release minor\n$ mrepo release premajor --preid beta\n```\n\n### release flow\n\nMrepo comes with the `release` GitHub action wich supports `independent` and `common` packages versioning. Here is the default release flow:\n\n1. A developer creates a branch with the name that starts with `release` (e.g. `release/my-new-package`).\n2. Runs `mrepo release \u003csemver\u003e [options]`.\n3. Creates a Pull Request.\n4. When merged, the `release` GitHub action executes the following:\n   - Install, build, test\n   - Checks latest git tag, then creates a new tag\n     - if versioning is `independent` then a tag will be incremented from the previous one (semver `minor` part)\n     - if versioning is `common` then a tag will be created from common version\n   - Creates GitHub release with newly created tag\n   - Publishes packages to the registry\n   - Notifies in the comment of a Pull Request when packages are being published\n\nIt's worth mentioning that all of the default commands, along with some others are already added to the `package.json` scripts section.\n\n## Support\n\nAny support is welcome. At least you can give it a star :star:\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaelyali%2Fmrepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichaelyali%2Fmrepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaelyali%2Fmrepo/lists"}