{"id":23988835,"url":"https://github.com/philip-bui/dagger","last_synced_at":"2025-10-05T05:55:07.760Z","repository":{"id":39982919,"uuid":"243915410","full_name":"philip-bui/dagger","owner":"philip-bui","description":"Javascript - Declarative dependency injection through IoC containers inspired by Java Dagger.","archived":false,"fork":false,"pushed_at":"2023-01-06T02:36:10.000Z","size":1140,"stargazers_count":4,"open_issues_count":13,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-14T12:14:51.397Z","etag":null,"topics":["dependency-injection","inversion-of-control","javascript","javascript-decorators","react"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/philip-bui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-29T06:13:47.000Z","updated_at":"2024-02-21T01:45:15.000Z","dependencies_parsed_at":"2023-02-05T03:16:49.259Z","dependency_job_id":null,"html_url":"https://github.com/philip-bui/dagger","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philip-bui%2Fdagger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philip-bui%2Fdagger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philip-bui%2Fdagger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philip-bui%2Fdagger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philip-bui","download_url":"https://codeload.github.com/philip-bui/dagger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248877961,"owners_count":21176244,"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":["dependency-injection","inversion-of-control","javascript","javascript-decorators","react"],"created_at":"2025-01-07T16:18:19.190Z","updated_at":"2025-10-05T05:55:02.733Z","avatar_url":"https://github.com/philip-bui.png","language":"JavaScript","readme":"# Dagger\n[![Actions Status](https://github.com/philip-bui/dagger/workflows/build/badge.svg)](https://github.com/philip-bui/dagger/actions)\n[![CodeCov](https://codecov.io/gh/philip-bui/dagger/branch/master/graph/badge.svg)](https://codecov.io/gh/philip-bui/dagger)\n[![npm](https://img.shields.io/npm/v/@dagger-js/core.svg?style=flat)](https://www.npmjs.com/package/@dagger-js/core)\n![Downloads](https://img.shields.io/npm/dt/@dagger-js/core.svg?style=flat)\n\nDeclarative dependency injection for Javascript, inspired by Java's [Dagger](https://dagger.dev/).\n\n- **Declarative.** Dagger makes it easy to read and build complex applications. \nAnnotate dependencies, compose them and Dagger handles the wiring and injections.\n- **Expressive.** Few simple decorators, yet powerful. Use a minimalistic API extended by rich options chaining.\n- **Interoperable.** Adopt as little or as much dependency injection as you want. \nDagger helps improve class cohesion, loose coupling and testability.\n\n## Installation\n\n```bash\n$ yarn add @dagger-js/core\n```\n\nBabel is used to compile decorators syntax and maintain compatibility with old JS environments. Add the [class](https://babeljs.io/docs/en/babel-plugin-proposal-decorators), \n[properties](https://babeljs.io/docs/en/babel-plugin-proposal-class-properties) and \n[parameter](https://www.npmjs.com/package/babel-plugin-parameter-decorator) decorator plugins.\n\n```bash\n$ yarn add -D @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties babel-plugin-parameter-decorator \n```\n\n```javascript\n\"plugins\": [\n    [\"@babel/plugin-proposal-decorators\", {\"legacy\": true}],\n    [\"@babel/plugin-proposal-class-properties\", {\"loose\": true}],\n    \"babel-plugin-parameter-decorator\"\n]\n```\n\nIf you're using ESLint (and you probably should!), add the [babel-eslint](https://github.com/babel/babel-eslint) \nparser to run on Babel compiled code.\n\n```javascript\n$ yarn add -D babel-eslint\n```\n\n```json\n\"eslintConfig\": {\n    \"parser\": \"babel-eslint\",\n    \"parserOptions\": {\n        \"ecmaFeatures\": {\n            \"legacyDecorators\": true\n        }\n    },\n}\n```\n\n## Usage\n\n```javascript\nimport { Provides } from \"@dagger-js/core\";\n\n@Provides\nclass FoodService {\n    \n    getFood = () =\u003e [\"Apple\"];\n}\n```\n\n```javascript\nimport { Singleton } from \"@dagger-js/core\";\n\n@Singleton\nclass HeroService {\n\n    getHeroes = () =\u003e [\"Saitama\"];\n}\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eConstructor Injection\u003c/summary\u003e\n\u003cp\u003e\n\n```javascript\nimport { Inject, Named } from \"@dagger-js/core\";\n\n@Inject\nclass HeroAcademcy {\n    \n    constructor(@Named(\"HeroService\") heroService, water, @Named(\"FoodService\") foodService) {\n        this.heroes = heroService.getHeroes();\n        this.water = water;\n        this.food = foodService.getFood();\n    }\n}\n\nconst heroAcademy = new HeroAcademcy(undefined, [\"Water\"]);\n\nconsole.log(heroAcademy.heroes); // [\"Saitama\"];\nconsole.log(heroAcademy.water); // [\"Water\"];\nconsole.log(heroAcademy.food); // [\"Apple\"];\n```\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eProperty Injection\u003c/summary\u003e\n\u003cp\u003e\n\n```javascript\nimport { Inject } from \"@dagger-js/core\";\nimport HeroService from \"./HeroService\";\n\nclass HeroAcademcy {\n    \n    @Inject\n    heroService = HeroService; // Class\n\n    @Inject\n    HeroService = null;\n\n    @Inject.optional\n    godService = null;\n\n    @Inject.named(\"HeroService\")\n    peopleService = null;\n}\n\nconst heroAcademy = new HeroAcademcy();\n\nconsole.log(heroAcademy.heroService.getHeroes()); // [\"Saitama\"];\nconsole.log(heroAcademy.HeroService.getHeroes()); // [\"Saitama\"];\nconsole.log(heroAcademy.godService); // null;\nconsole.log(heroAcademy.peopleService.getHeroes()); // [\"Saitama\"];\n```\n\u003c/p\u003e\n\u003c/details\u003e\n\n## Advanced\n\nDecorators are exported both capitalized and lower-case for convenience.\n\nExtend your decorators with chainable options, chaining the same option twice will use the latter option.\n\n### @Provides\n\nClass decorator that declares a Class as Provider, creating new instances upon every injection.\n\n- **lazy** - Instantiate instance lazily. \n  - Default: *false*\n- **named(name)** - Register dependency under `name`. \n  - Default: *Class*\n\n### @Singleton\n\nClass decorator that declares a Class as Singleton, creating a single instance for every injection.\n\n- **lazy** - Instantiate instance lazily.\n  - Default: *false*\n- **named(name)** - Registers dependency under `name`. \n  - Default: *Class*\n\n### @Inject\n\nClass or property injection decorator that injects on constructor parameters, or ClassType or PropertyKey respectively.\n\n- **computed** - Computed property. \n  - Default: *false*.\n- **lazy** - Computed property until invoked once, then becomes a static value. \n  - Default: *false*.\n- **optional** - Injects `undefined` if not found. \n  - Default: *false*\n- **named(name)** - Injects dependency under `name`. \n  - Default: *Class*\n  \n\u003e Note: Calling a constructor with provided values means Dagger won't override those values (unless `undefined`). This is by design.\n\n### @Named(name)\n\nConstructor parameter decorator used in conjunction with [@Inject](#@Inject).\n\n- **optional** - Injects `undefined` if not found.\n\n## License\n\nDagger is available under the MIT license. [See LICENSE](https://github.com/philip-bui/dagger/blob/master/LICENSE) for details.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilip-bui%2Fdagger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilip-bui%2Fdagger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilip-bui%2Fdagger/lists"}