{"_id":"@darkobits/ng-inject-decorator","_rev":"5-f276722ff8e451ddcaf57436a5df200d","name":"@darkobits/ng-inject-decorator","description":"Dependency injector for classes with Angular 1.","dist-tags":{"latest":"1.0.0"},"versions":{"0.2.0":{"name":"@darkobits/ng-inject-decorator","version":"0.2.0","description":"Dependency injector for classes with Angular 1.","contributors":[{"name":"Joshua Martin","email":"joshua@frontlawn.net"}],"license":"WTFPL","files":["dist"],"main":"dist/ng-inject-decorator.js","scripts":{"lint":"xo","test":"jest","test:watch":"npm t -- --watch","prebuild":"rimraf dist","build":"babel src --out-dir dist","build:watch":"watch \"npm run build\" ./src/","prepublish":"run-p lint test build","prebump":"npm run prepublish","bump":"standard-version"},"peerDependencies":{"babel-plugin-transform-decorators-legacy":"1.x"},"dependencies":{"@darkobits/class-decorator":"2.x","ramda":"0.24.x"},"devDependencies":{"angular":"1.6.x","babel-cli":"6.x","babel-core":"6.x","babel-eslint":"8.x","babel-jest":"21.x","babel-plugin-transform-decorators-legacy":"1.x","babel-preset-env":"1.x","eslint":"4.x","husky":"0.14.x","jest":"21.x","npm-run-all":"4.x","rimraf":"2.x","standard-version":"4.x","watch":"1.x","xo":"0.18.x"},"xo":{"parser":"babel-eslint","env":["node","jest"],"space":true},"gitHead":"387e3ff1c0e698e42d9947ecaa6d5c4d6d554f5c","_id":"@darkobits/ng-inject-decorator@0.2.0","_npmVersion":"5.3.0","_nodeVersion":"6.9.5","_npmUser":{"name":"darkobits","email":"joshua@frontlawn.net"},"dist":{"integrity":"sha512-yC2Ve9roJY+gCZP71ws4WbcZ/MpZYvMNR0zMwFU5ow+IHF3L8QGbjhmCD33tVExRr9LKWBM2gCDwZV9mhXRYYw==","shasum":"c54b2867622387a7bd7b468349f30e87a80fa85c","tarball":"https://registry.npmjs.org/@darkobits/ng-inject-decorator/-/ng-inject-decorator-0.2.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAqYB3r8wWG3YOGOZXAW+gzmBt6rT13/NsH+4ood4cSpAiEA5mr9p7q8m8oV/O4ASmpX1LGM53uVFe7CEiH/PIQ4iW4="}]},"maintainers":[{"name":"darkobits","email":"joshua@frontlawn.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ng-inject-decorator-0.2.0.tgz_1505996460840_0.6994062699377537"}},"0.3.0":{"name":"@darkobits/ng-inject-decorator","version":"0.3.0","description":"Dependency injector for classes with Angular 1.","contributors":[{"name":"Joshua Martin","email":"joshua@frontlawn.net"}],"license":"WTFPL","files":["dist"],"main":"dist/ng-inject-decorator.js","scripts":{"lint":"xo","test":"jest","test:watch":"npm t -- --watch","prebuild":"rimraf dist","build":"babel src --out-dir dist","build:watch":"watch \"npm run build\" ./src/","prepublish":"run-p lint test build","prebump":"npm run prepublish","bump":"standard-version"},"peerDependencies":{"babel-plugin-transform-decorators-legacy":"1.x"},"dependencies":{"@darkobits/class-decorator":"3.x","ramda":"0.24.x"},"devDependencies":{"angular":"1.6.x","babel-cli":"6.x","babel-core":"6.x","babel-eslint":"8.x","babel-jest":"21.x","babel-plugin-transform-decorators-legacy":"1.x","babel-preset-env":"1.x","eslint":"4.x","husky":"0.14.x","jest":"21.x","npm-run-all":"4.x","rimraf":"2.x","standard-version":"4.x","watch":"1.x","xo":"0.18.x"},"xo":{"parser":"babel-eslint","env":["node","jest"],"space":true},"gitHead":"2cefe7ea58babefded1d0ecb5d99cac587158cf6","_id":"@darkobits/ng-inject-decorator@0.3.0","_shasum":"e1df87361963145cac0b0f9905f9f7c62b8183fd","_from":".","_npmVersion":"4.6.1","_nodeVersion":"6.10.0","_npmUser":{"name":"darkobits","email":"joshua@frontlawn.net"},"dist":{"shasum":"e1df87361963145cac0b0f9905f9f7c62b8183fd","tarball":"https://registry.npmjs.org/@darkobits/ng-inject-decorator/-/ng-inject-decorator-0.3.0.tgz","integrity":"sha512-eWhK0ieE1uh8WX2/B5UA5h3YjSpYXB+fWGdfyMxZo9tx+WVdq50X6Z++UBBZyY6LnBLp6akwJF9Z21tMowsuxQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZP7NdtXS6S0cO/ScJgSUPJenYTfRvSp3eC9PVr5Ww4QIgU8eKeVscl5WtHj27xkQIsQ0uxlExWyfJ8tw3+PEyrg8="}]},"maintainers":[{"name":"darkobits","email":"joshua@frontlawn.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ng-inject-decorator-0.3.0.tgz_1506413729408_0.5348159330897033"}},"1.0.0":{"name":"@darkobits/ng-inject-decorator","version":"1.0.0","description":"Dependency injector for classes with Angular 1.","contributors":[{"name":"Joshua Martin","email":"joshua@frontlawn.net"}],"license":"WTFPL","files":["dist"],"main":"dist/ng-inject-decorator.js","scripts":{"lint":"xo","test":"jest","test:watch":"npm t -- --watch","prebuild":"rimraf dist","build":"babel src --out-dir dist","build:watch":"watch \"npm run build\" ./src/","prepublish":"run-p lint test build","prebump":"npm run prepublish","bump":"standard-version"},"peerDependencies":{"babel-plugin-transform-decorators-legacy":"1.x"},"dependencies":{"@darkobits/class-decorator":"3.x","ramda":"0.24.x"},"devDependencies":{"@darkobits/unity":"1.x","angular":"1.6.x","angular-mocks":"1.6.x","babel-cli":"6.x","babel-core":"6.x","babel-eslint":"8.x","babel-jest":"21.x","babel-plugin-transform-decorators-legacy":"1.x","babel-preset-env":"1.x","eslint":"4.x","husky":"0.14.x","jest":"21.x","npm-run-all":"4.x","rimraf":"2.x","standard-version":"4.x","watch":"1.x","xo":"0.18.x"},"xo":{"parser":"babel-eslint","env":["node","jest"],"space":true},"gitHead":"d1d8f73b9b9adeb6a591251709f81d788f8aa5c6","_id":"@darkobits/ng-inject-decorator@1.0.0","_shasum":"d6a00aa81d75e47f59a4495d5f1aaeb2a0cc6972","_from":".","_npmVersion":"4.6.1","_nodeVersion":"6.10.0","_npmUser":{"name":"darkobits","email":"joshua@frontlawn.net"},"dist":{"shasum":"d6a00aa81d75e47f59a4495d5f1aaeb2a0cc6972","tarball":"https://registry.npmjs.org/@darkobits/ng-inject-decorator/-/ng-inject-decorator-1.0.0.tgz","integrity":"sha512-uddx3gKtoGRCwbHhJBT1VfmFtA6XRyWmilkUaK6IOwRwpxW2LGPA3tRqIrnD6YTL/xpNdEBxPZP7azszgjxc5A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaMSWJgvtu6GV+5dmMWoCOG70JNBnd/ErQUNVcDGgIAQIgSMyJDKk9QqciiBRCo7WKpfe1gzJg7aAMKCPqwz3WR74="}]},"maintainers":[{"name":"darkobits","email":"joshua@frontlawn.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ng-inject-decorator-1.0.0.tgz_1506498310657_0.7720774081535637"}}},"readme":"[![][travis-img]][travis-url] [![][npm-img]][npm-url] [![][codacy-img]][codacy-url] [![][xo-img]][xo-url] [![][cc-img]][cc-url]\n\n# ng-inject-decorator\n\nThis package provides a [decorator](https://github.com/tc39/proposal-decorators) which can be used to make [dependency injection](https://docs.angularjs.org/guide/di) with [classes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) easier.\n\n## Installation\n\nThis package requires `babel-plugin-transform-decorators-legacy`.\n\n```bash\n$ yarn add -D babel-plugin-transform-decorators-legacy\n$ yarn add @darkobits/ng-inject-decorator\n```\n\nor\n\n```bash\n$ npm install --save-dev babel-plugin-transform-decorators-legacy\n$ npm install --save @darkobits/ng-inject-decorator\n```\n\nThen, update your `.babelrc` file:\n\n```\n{\n  \"plugins\": [\"transform-decorators-legacy\"]\n}\n```\n\n## Features\n\n- Classes express their dependencies in a single place, without incurring constructor bloat.\n- Providing dependencies to parent classes is trivial.\n- Parent classes and child classes that use the same dependency can (and should) declare it; `inject` will take care of de-duping for you.\n\n## Usage\n\n#### `default(...dependencies: [string]): function`\n\nThis package's default export is a function that accepts an arbitrary number of string arguments representing dependencies to be injected into the decorated class upon instantiation, and returns a decorator function.\n\n### Example\n\nFirst, let's look at how dependency injection is typically handled in Angular 1 when using classes:\n\n```js\nimport angular from 'angular';\n\nclass MyCtrl {\n  // 1. Declare dependencies as constructor arguments.\n  constructor ($document, $http, $q) {\n    // 2. Attach each dependency to the instance.\n    this.$document = $document;\n    this.$http = $http;\n    this.$q = $q;\n  }\n\n  someMethod () {\n    // 3. Use dependencies in controller methods.\n    this.$http({\n      // ...\n    });\n  }\n}\n\nangular.module('MyApp').component({\n  controller: MyCtrl,\n  // ...\n});\n```\n\nThis approach is fairly verbose because it requires each additional dependency be added as a constructor argument and then manually attached to the controller instance in the constructor.\n\nAnother problem with this approach is that `extend`-ing a parent class that may also need to use dependency injection is awkward:\n\n> `ParentCtrl.js`\n\n```js\nexport default class ParentCtrl {\n  // Some method that needs $element.\n  parentMethod () {\n    this.$element; // ...\n  }\n}\n```\n\n> `MyComponent.js`\n\n```js\nimport angular from 'angular';\nimport ParentCtrl from './ParentCtrl.js';\n\nclass MyCtrl extends ParentCtrl {\n  constructor ($document, $element, $http, $q) {\n    this.$document = $document;\n    this.$http = $http;\n    this.$q = $q;\n\n    // MyCtrl needs to declare $element as a dependency, even though it doesn't\n    // use it directly, so that ParentCtrl will have access to it. Meanwhile,\n    // ParentCtrl must assume that classes that extend it will declare $element\n    // as a dependency.\n    this.$element = $element;\n  }\n\n  // Implement methods that use $document, $http, $q...\n}\n\nangular.module('MyApp').component({\n  controller: MyCtrl,\n  // ...\n});\n```\n\nLet's see how we can improve this with the `inject` decorator:\n\n> `ParentCtrl.js`\n\n```js\nimport inject from '@darkobits/ng-inject-decorator';\n\n@inject('$element')\nexport default class ParentCtrl {\n  // Some method that needs $element.\n  parentMethod () {\n    this.$element; // ...\n  }\n}\n```\n\n> `MyComponent.js`\n\n```js\nimport ParentCtrl from './ParentCtrl.js';\n\n@inject('$document', '$http', '$q')\nclass MyCtrl extends ParentCtrl {\n  myMethod () {\n    // Do something with this.$document, this.$http, this.$q...\n  }\n}\n\nangular.module('MyApp').component({\n  controller: MyCtrl,\n  // ...\n});\n```\n\n_Wowza!_ We did such a good job of reducing constructor bloat that we were able to eliminate them entirely!\n\n## &nbsp;\n<p align=\"center\">\n  <br>\n  <img width=\"22\" height=\"22\" src=\"https://cloud.githubusercontent.com/assets/441546/25318539/db2f4cf2-2845-11e7-8e10-ef97d91cd538.png\">\n</p>\n\n[travis-img]: https://img.shields.io/travis/darkobits/ng-inject-decorator.svg?style=flat-square\n[travis-url]: https://travis-ci.org/darkobits/ng-inject-decorator\n\n[npm-img]: https://img.shields.io/npm/v/@darkobits/ng-inject-decorator.svg?style=flat-square\n[npm-url]: https://www.npmjs.com/package/@darkobits/ng-inject-decorator\n\n[codacy-img]: https://img.shields.io/codacy/coverage/8cf3c53ed5124385964e7d053cb90e82.svg?style=flat-square\n[codacy-url]: https://www.codacy.com/app/darkobits/ng-inject-decorator\n\n[xo-img]: https://img.shields.io/badge/code_style-XO-e271a5.svg?style=flat-square\n[xo-url]: https://github.com/sindresorhus/xo\n\n[cc-img]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg?style=flat-square\n[cc-url]: https://conventionalcommits.org/\n","maintainers":[{"name":"darkobits","email":"joshua@frontlawn.net"}],"time":{"modified":"2022-06-12T16:52:40.903Z","created":"2017-09-21T12:21:00.948Z","0.2.0":"2017-09-21T12:21:00.948Z","0.3.0":"2017-09-26T08:15:29.488Z","1.0.0":"2017-09-27T07:45:10.796Z"},"contributors":[{"name":"Joshua Martin","email":"joshua@frontlawn.net"}],"license":"WTFPL","readmeFilename":"README.md"}