{"id":40161262,"url":"https://github.com/angular-architects/nx-ddd-plugin","last_synced_at":"2026-01-19T16:11:01.730Z","repository":{"id":37075913,"uuid":"245816808","full_name":"angular-architects/nx-ddd-plugin","owner":"angular-architects","description":"Nx plugin for structuring a monorepo with domains and layers","archived":false,"fork":false,"pushed_at":"2025-07-13T15:07:27.000Z","size":2741,"stargazers_count":333,"open_issues_count":39,"forks_count":56,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-09-20T10:31:12.285Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/angular-architects.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-08T13:11:33.000Z","updated_at":"2025-09-03T16:14:14.000Z","dependencies_parsed_at":"2024-06-18T15:13:54.117Z","dependency_job_id":"6f6f6f8a-1a10-459a-88c6-d98d3852cfd3","html_url":"https://github.com/angular-architects/nx-ddd-plugin","commit_stats":{"total_commits":16,"total_committers":3,"mean_commits":5.333333333333333,"dds":0.25,"last_synced_commit":"515a67ee48cc82fe2927742c1848bc3fa9cd71b2"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/angular-architects/nx-ddd-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angular-architects%2Fnx-ddd-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angular-architects%2Fnx-ddd-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angular-architects%2Fnx-ddd-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angular-architects%2Fnx-ddd-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/angular-architects","download_url":"https://codeload.github.com/angular-architects/nx-ddd-plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angular-architects%2Fnx-ddd-plugin/sbom","scorecard":{"id":196158,"data":{"date":"2025-08-11","repo":{"name":"github.com/angular-architects/nx-ddd-plugin","commit":"92821c32865b7b7239e4141dd509f500f3daf4b5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.2,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":7,"reason":"7 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"29 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-4www-5p9h-95mh","Warn: Project is vulnerable to: GHSA-9gqv-wp59-fq42","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-92r3-m2mg-pj97","Warn: Project is vulnerable to: GHSA-c24v-8rfc-w8vw","Warn: Project is vulnerable to: GHSA-8jhw-289h-jh2g","Warn: Project is vulnerable to: GHSA-64vr-g452-qvp3","Warn: Project is vulnerable to: GHSA-9cwx-2883-4wfx","Warn: Project is vulnerable to: GHSA-vg6x-rcgg-rjx6","Warn: Project is vulnerable to: GHSA-x574-m823-4x7w","Warn: Project is vulnerable to: GHSA-4r4m-qw57-chr8","Warn: Project is vulnerable to: GHSA-xcj6-pq6g-qj4x","Warn: Project is vulnerable to: GHSA-356w-63v5-8wf4","Warn: Project is vulnerable to: GHSA-859w-5945-r5v3","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T21:52:38.717Z","repository_id":37075913,"created_at":"2025-08-16T21:52:38.717Z","updated_at":"2025-08-16T21:52:38.717Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28573306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T15:45:05.669Z","status":"ssl_error","status_checked_at":"2026-01-19T15:44:23.317Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-01-19T16:11:01.134Z","updated_at":"2026-01-19T16:11:01.720Z","avatar_url":"https://github.com/angular-architects.png","language":"TypeScript","readme":"# DDD Plugin for Angular Nx Monorepos\n\n## Versions\n\nThe package versions are aligned with the _Angular_ version.\n\n* for **Nx \u003c v19** and **NG v17** use _v17.0.5_.\n* for **Nx \u003c v20** and **NG v18** use _v18.0.1_.\n* for **Nx \u003e= v20** and **NG v18** use _v18.1.1_.\n* for **Nx \u003e= v20** and **NG v19** use _v19.0.7_.\n* for **Nx \u003e= v21.2** and **NG v20** use _v20.0.0_.\n\n**Breaking change** in v18.1.0:\n\nThe naming of the **Nx** `includePaths` has changed to only use one \"/\".\n\nUntil _v18.0.1_, the generated `includePaths` were like this, which is illegal in **npm**:\n\n```json\n  \"@org/booking/domain\": [\"libs/booking/domain/src/index.ts\"],\n\"@org/booking/feature-test\": [\"libs/booking/feature-test/src/index.ts\"]\n```\n\nStarting with _v18.1.0_, the generated `includePaths` are using dashes instead:\n\n```json\n  \"@org/booking-domain\": [\"libs/booking/domain/src/index.ts\"],\n\"@org/booking-feature-test\": [\"libs/booking/feature-test/src/index.ts\"]\n```\n\n## About\n\nThis plugin installs some schematics which automate slicing your Nx workspace into domains and layers according to Nrwl's best practices and our ideas about [client-side DDD with Angular](- [Blog: All about DDD for Angular \u0026 Frontend Architectures](https://www.angulararchitects.io/blog/all-about-ddd-for-frontend-architectures-with-angular-co/)):\n\n![domains and layers](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/ddd.png?raw=true)\n\nThe generated access restrictions prevent unwanted access between libraries respecting layers and domains:\n\n![access restrictions](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/linting-2.png?raw=true)\n\n## Features\n\n- 🗺️ Generating domains with domain libraries including a facades, models, and data services\n- ⚙️ Generating feature libraries including a feature components using the facades\n- 🙅‍♂️ Adding linting rules for access restrictions between domains as proposed by Nrwl\n- 🙅‍♀️ Adding linting rules for access restrictions between layers as proposed by Nrwl (supports tslint and eslint)\n- 🔥 Optionally generates skeleton for NGRX and integrates it into the DDD design (`--ngrx` switch, needs @ngrx/schematics)\n- 💥 Supports Standalone Components\n\n### Features Overview Video\n\n\u003ca href=\"https://www.youtube.com/watch?v=39JLXMEE7Ds\" target=\"_blank\"\u003e![Screenshot of Overview Video](https://i.imgur.com/VlTRE80.png)\u003c/a\u003e\n\n## Usage\n\nAdd this plugin to a Nx workspace:\n\n```\nnpm i @angular-architects/ddd\nnx g @angular-architects/ddd:init\n```\n\nInstead, you can also use ng add, however, Nx currently emits a warning when using ng add:\n\n```\nnx add @angular-architects/ddd\n```\n\nAdd domains and features manually:\n\n```\nnx g @angular-architects/ddd:domain booking --addApp\nnx g @angular-architects/ddd:domain boarding --addApp\nnx g @angular-architects/ddd:feature search --domain booking --entity flight\nnx g @angular-architects/ddd:feature cancel --domain booking\nnx g @angular-architects/ddd:feature manage --domain boarding\n```\n\nFor NGRX support, just add the `--ngrx` switch:\n\n```\nnx g @angular-architects/ddd:domain luggage --addApp --ngrx\nnx g @angular-architects/ddd:feature checkin --domain luggage --entity luggage-list --ngrx\n[...]\n```\n\nThis example assumes that you have an app `flight-app` in place.\n\nThese schematics also wire up the individual libs. To see the result, create a dependency graph:\n\n```\nnpm run dep-graph\n```\n\n![dependency graph](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/ddd.png?raw=true)\n\nTo see that the skeleton works end-to-end, call the generated feature component in your `app.component.html`:\n\n```html\n\u003cbooking-search\u003e\u003c/booking-search\u003e\n```\n\nYou don't need any TypeScript or Angular imports. The plugin already took care about that. After running the example, you should see something like this:\n\n![Result proving that the generated skeleton works end-to-end](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/result.png?raw=true)\n\n## Standalone Components\n\nAll generators have a switch ``--standalone`` to support Standalone Components:\n\n```\nnx g @angular-architects/ddd:domain booking --addApp --standalone\n\nnx g @angular-architects/ddd:feature search --domain booking --entity flight --standalone\n```\n\nDon't mix Standalone Components and traditional ones within the same domain.\n\n**Since version 19**, standalone **defaults to true**.\n\n## Generated Structure\n\nThe included schematics generate a folder for each domain. This folder contains feature libs as well as a library with the domain logic:\n\n![Folder per Domain](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/ddd-libs.png?raw=true)\n\nThe domain layer is subdivided into three parts:\n\n![Structured Domain Layer](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/domain-layer.png?raw=true)\n\n### Generated Structure for Domain Library\n\n- **application:** Contains application services. This is a DDD term for what we call facades in Angular nowadays. They orchestrate everything for a use case given so that a feature component only needs to communicate with one such facade. Also, it hides details for state management. While the generates facades just use a `BehaviorSubject`, feel free to add a library like NGRX underneath. As such a modifications changes nothing from the component's perspective, you can use facades to introduce NGRX later on demand.\n- **entities:** Client-side data model including logic operating on it (like validations).\n- **infrastructure:** Services for communicating with the backend.\n\n## Consider Automatically Checking Access Restrictions\n\nAs the access restrictions defined with Nx use linting, you can check against them at the command line too. Hence, you might consider including this into your automated build process.\n\n![Access restrictions via linting](https://github.com/angular-architects/nx-ddd-plugin/blob/master/libs/ddd/assets/linting-3.png?raw=true)\n\n## Demo Application\n\nsee https://github.com/angular-architects/ddd-demo\n\n## Resources\n\n- [Blog: All about DDD for Angular \u0026 Frontend Architectures](https://www.angulararchitects.io/blog/all-about-ddd-for-frontend-architectures-with-angular-co/)\n- [Nx](https://nx.dev/web)\n- [Nrwl's eBook about monorepos and best practices](https://go.nrwl.io/angular-enterprise-monorepo-patterns-new-book)\n- [Recording of session about this architecture](https://www.youtube.com/watch?v=94HFD391zkE\u0026t=1s)\n- [Article series about DDD with Angular](https://www.softwarearchitekt.at/aktuelles/sustainable-angular-architectures-1/)\n- [Our eBook on Enterprise Angular](https://www.angulararchitects.io/en/ebooks/micro-frontends-and-moduliths-with-angular/)\n\n## More Architecture\n\n- [Enterprise Architecture Workshop](https://www.angulararchitects.io/en/training/advanced-angular-architecture-workshop/)\n- [Angular Architects Blog](https://www.angulararchitects.io/en/blog/)\n\n## Get in touch with authors\n\n- [ManfredSteyer on X](https://x.com/ManfredSteyer), [LX_T on X](https://x.com/LX_T)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangular-architects%2Fnx-ddd-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fangular-architects%2Fnx-ddd-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangular-architects%2Fnx-ddd-plugin/lists"}