{"_id":"@arckinteractive/express-ioc","_rev":"3-e0c10ca01dedf0b472157b35662d81eb","name":"@arckinteractive/express-ioc","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@arckinteractive/express-ioc","version":"1.0.0","description":"IoC Container for Express","main":"src/index.js","repository":{"type":"git","url":"git+https://github.com/arckinteractive/express-ioc.git"},"author":{"name":"ArckInteractive"},"license":"MIT","scripts":{"lint":"eslint ./src","test":"nyc mocha ./tests/ --recursive --require @babel/polyfill --require @babel/register"},"devDependencies":{"@babel/core":"^7.2.2","@babel/polyfill":"^7.2.5","@babel/preset-env":"^7.3.1","@babel/register":"^7.0.0","babel-eslint":"^10.0.1","chai":"^4.2.0","eslint":"^5.12.1","eslint-config-airbnb-base":"^13.1.0","eslint-plugin-import":"^2.16.0","mocha":"^5.2.0","nyc":"^13.1.0","supertest":"^3.4.2"},"dependencies":{"cls-hooked":"^4.2.2","express":"^4.16.4","uuid":"^3.3.2"},"nyc":{"check-coverage":true,"per-file":true,"lines":0,"statements":0,"functions":0,"branches":0,"include":["src/**/*.js"],"reporter":["lcov","text-summary"],"cache":true,"all":true,"report-dir":"./coverage"},"gitHead":"2284e563f8437980e72f14f5de0c8ed6597863cb","bugs":{"url":"https://github.com/arckinteractive/express-ioc/issues"},"homepage":"https://github.com/arckinteractive/express-ioc#readme","_id":"@arckinteractive/express-ioc@1.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.0","_npmUser":{"name":"hypejunction","email":"info@hypejunction.com"},"dist":{"integrity":"sha512-g9fvx104Hl1OSkEgJI+vFc8+H9QZ1hQ/ePI/w/0BHGivWMaR0EMBO4V4Nqu9Sevy0t7rssY4zF9w/P2p0/AtWw==","shasum":"c3e32f2ded02d6644cf2937a2175ab87ee4c1e1e","tarball":"https://registry.npmjs.org/@arckinteractive/express-ioc/-/express-ioc-1.0.0.tgz","fileCount":8,"unpackedSize":157368,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUrZOCRA9TVsSAnZWagAAr3IQAIkhBuqE5ZK5FF5T8Zgb\nVJte6FQahVSxp+ifyxoWylu/HUfpxXkpAd2M8C9fQIS9YzFs2oQbiZXkKt9R\nqoCaaRrX/49s1assOirexwquBHhh1uMEWqUDrrHkEl5Q4fUGaoqDv8Wv6ShA\nABv9EGMg+axX/PzInMhN29bn7UJdW3j4rbJTQIiIS2QKAKdmFuwazCHkF3FE\nxJbGmEwX2gobktswldk1K+OkZXwecpVjKFtJaJuOqC9CJ2XoH2B+IqohMTbq\ndqJldeWyzTkQUwzZu1LH2oTb9817HOoAa02GAjvJZkB9dvwOThbGFGFScGJD\n1E1x8xNzvDr4wA+5W40dabcVPgGhu4cvbIbBTjFqEFh347+6+sRwBcbb8aOu\nTcvI2L1cusZ3TajUZP8L9Dcrdzu9YnCTuNdkmxiIGOmcOrjL+d7KU4G+Lss5\njLJoS5XwvK0/GQjL13arwgQ4muJQ1nc1VVKebLdRJ9P/mlIG9sG9C9pt4bPU\nJpXZPA9cHjrQDZY/liPWSwEInnJnP/pdORF4+WcDMpl94ZOpZAVNwNcUOvOZ\nLdzq169LToWUCU3KFcYzHcMzkQPS9mggA1mQDrT26Wy8cwB8eoADxT4P8Zw/\nLV5meQG63+aPMRojP4aiobrnn9yQZ79tzXp8ggDCDgHxzhZO5b5v9SWc23kA\n4es+\r\n=GrZU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDdXKmdI6+KaBABeYj4NQ5RxXHnMSjuDQ2ZOXsMkBkj8AiEAnDyb7Y6bD52XLV/8WWc3JZZdBntwJlqTEfsToAO/Jr4="}]},"maintainers":[{"name":"hypejunction","email":"info@hypejunction.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/express-ioc_1.0.0_1548924494324_0.0074368113927383295"},"_hasShrinkwrap":false},"1.0.1":{"name":"@arckinteractive/express-ioc","version":"1.0.1","description":"IoC Container for Express","main":"src/index.js","repository":{"type":"git","url":"git+https://github.com/arckinteractive/express-ioc.git"},"author":{"name":"ArckInteractive"},"license":"MIT","scripts":{"lint":"eslint ./src","test":"nyc mocha ./tests/ --recursive --require @babel/polyfill --require @babel/register"},"devDependencies":{"@babel/core":"^7.2.2","@babel/polyfill":"^7.2.5","@babel/preset-env":"^7.3.1","@babel/register":"^7.0.0","babel-eslint":"^10.0.1","chai":"^4.2.0","eslint":"^5.12.1","eslint-config-airbnb-base":"^13.1.0","eslint-plugin-import":"^2.16.0","mocha":"^5.2.0","nyc":"^13.1.0","supertest":"^3.4.2"},"dependencies":{"cls-hooked":"^4.2.2","express":"^4.16.4","uuid":"^3.3.2"},"nyc":{"check-coverage":true,"per-file":true,"lines":0,"statements":0,"functions":0,"branches":0,"include":["src/**/*.js"],"reporter":["lcov","text-summary"],"cache":true,"all":true,"report-dir":"./coverage"},"gitHead":"8589cab30a4d407cebd602ba066df406ffaa9c96","bugs":{"url":"https://github.com/arckinteractive/express-ioc/issues"},"homepage":"https://github.com/arckinteractive/express-ioc#readme","_id":"@arckinteractive/express-ioc@1.0.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.0","_npmUser":{"name":"hypejunction","email":"info@hypejunction.com"},"dist":{"integrity":"sha512-OkBubZa+SyUQ59tVgZg9/fj0iI80DXycARkTmhLdsLcjFJadqfBCu57gdr9piO78lPfK/ry42hl2E6U7ZBZ6DA==","shasum":"8d3e166557a2313aaeac83e9ab90bb21993176b5","tarball":"https://registry.npmjs.org/@arckinteractive/express-ioc/-/express-ioc-1.0.1.tgz","fileCount":8,"unpackedSize":157455,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUrdbCRA9TVsSAnZWagAAJ4gP/A6WjyIl4Xbfghj/HZjF\nMUoYxoA+pVATvxn50tPGw8UWqqOiiA6LHgkVk9QcC1HsobF9tVXenZs3W6F9\nFur3ON8rd/gsi2tzwGj+0lxV4tVm19P26RHedzkdtBY4VaO1Sj3BN9vIkB92\n262G789ARe5Hua7CQwmA/QQbh7/SnXvpovkh1gmHTIdwS4wme5eBB5eMMgi1\nqXMc6f+wNLZP/SiWpGB3+kJcspvBRQSC64TSuOocVvMvGvFz0tykM2WKLcLu\nnB/TwQ3mqny/sqdamZPhDSmXTQbB2QZtAkQAkT3jyz7k7sorlb0MTNUOREa5\nXgcHjYh/hRizt15eNzakP8quF/vg77sbQecrvwgguQplbPtHwdbGJPpVtLYA\nKHU2/9NMIeh3DcL3sIN8JMBuDCjiC9mIwugi1dI4pE4uq9bId4N5gQ8N4iI0\nYNDAOwJcOZ2huW20VunRA1HMwOY8i9r5sRwQmiK2Vc9C3m2AgDdc45/QtJNK\nJrgeag7X6ZBCRKdSt2UtOCUQZXCQi7FHcCJa2nEOgozUfwSYEXauwc2HGfzc\nRBHk4sppkqj0NSCibugE03BryspUH6TK+VLMWopdRebZyGbLUwIWyOhCjse/\nG9hfdXyCwxXQDPTtgfiyI8a8okkFG/yM0T+rfFTZ3ZGyPT8VYGgrOK/fpU3u\nQCyC\r\n=/3AA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMKzPOPkPgspz1RVd2w/FIGtscQ0MgJ4m08BDNoca+awIhAK6ScdRWj0uBjUBZs9Tocir4y192DPWlKDBKWFGqbdSD"}]},"maintainers":[{"name":"hypejunction","email":"info@hypejunction.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/express-ioc_1.0.1_1548924763217_0.8869657688292711"},"_hasShrinkwrap":false}},"time":{"created":"2019-01-31T08:48:14.125Z","1.0.0":"2019-01-31T08:48:14.430Z","modified":"2022-04-04T15:18:45.516Z","1.0.1":"2019-01-31T08:52:43.350Z"},"maintainers":[{"email":"paul@arckinteractive.com","name":"paulstewart"},{"email":"info@hypejunction.com","name":"hypejunction"}],"description":"IoC Container for Express","homepage":"https://github.com/arckinteractive/express-ioc#readme","repository":{"type":"git","url":"git+https://github.com/arckinteractive/express-ioc.git"},"author":{"name":"ArckInteractive"},"bugs":{"url":"https://github.com/arckinteractive/express-ioc/issues"},"license":"MIT","readme":"IoC Container for Express\r\n=========================\r\n\r\nA very simple IoC container for Node/Express. \r\n\r\nPrinciples used for this container are outline in this medium article:\r\nhttps://medium.com/@ismayilkhayredinov/building-a-scoped-ioc-container-for-node-express-8bf082d9887\r\n\r\n## Installation\r\n\r\n```sh\r\nyarn add @arckinteractive/express-ioc\r\n```\r\n\r\n## Usage\r\n\r\nYou can construct a new container from an array of service definitions:\r\n\r\n```js\r\nimport { Container } from '@arckinteractive/express-ioc';\r\n\r\nconst definitions = [\r\n    {\r\n        name: 'serviceA',\r\n        factory: () => {\r\n            return {\r\n                foo: process.env.FOO,\r\n            }\r\n        },\r\n    },\r\n    {\r\n        name: 'serviceF',\r\n        factory: (serviceA) => {\r\n            return `I am not a ${serviceA.foo}`;\r\n        },\r\n        dependencies: ['serviceA'],\r\n        options: {\r\n            scoped: true,\r\n        }\r\n    }\r\n];\r\n\r\nconst services = Container.create(definitions);\r\n```\r\n\r\nEach definition has a `name`, `factory`, `dependencies` and `options`.\r\n\r\nA factory is function/constructor that will receive dependencies as arguments.\r\nYou can register new services at runtime, after container has been created.\r\n\r\n```js\r\n// Service factory as a class name\r\nclass ServiceBConstructor {\r\n    constructor (serviceA) {\r\n        this.serviceA = service;\r\n    }\r\n    \r\n    doStuff() {\r\n        \r\n    }\r\n}\r\n\r\n// Service as a plain object\r\nconst serviceC = {};\r\n\r\n// Scoped service (bound to a specific express request, e.g. session)\r\nconst serviceD = (serviceA) => {\r\n    return {};\r\n};\r\n\r\nservices.register('serviceB', ServiceBConstructor, ['serviceA']);\r\nservices.register('serviceC', () => serviceC);\r\nservices.register('serviceD', serviceD, ['serviceA', 'serviceC'], { scoped: true });\r\n```\r\n\r\nOnce you access a service by its name, it's turned into a singleton, and you get the same instance of the service on consecutive calls:\r\n\r\n```js\r\nconst serviceA = services.get('serviceA');\r\n// or\r\nconst { serviceB } = services;\r\n```\r\n\r\nExpress will be instantiated when you create a new container and injected as a service after being bound to a cls-hooked namespace, so be sure to use the same express instance, when registering middleware.\r\n\r\n```js\r\n// some middleware in some external module\r\nexport default (req, res, next) => {\r\n    const services = req.app.get('services');\r\n                   \r\n    services.serviceA.doStuff();\r\n                   \r\n    next();\r\n}\r\n```\r\n\r\n```js\r\n// your app booting module\r\nimport Container from '@arckinteractive/express-ioc';\r\nimport middleware from './some-external-module';\r\n\r\nconst services = Container.create();\r\n\r\nconst { express } = services;\r\n\r\nexpress.use(middleware);\r\n```\r\n","readmeFilename":"README.md"}