{"_id":"@adimm/x-injection","_rev":"66-61e9b76a2fc3241a3a6e65fcb89af3db","name":"@adimm/x-injection","dist-tags":{"latest":"3.0.5"},"versions":{"0.3.1":{"name":"@adimm/x-injection","version":"0.3.1","keywords":["inversion of control","ioc","di","dependency injection"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.3.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"698eb4867f69504aedaa095b329aa409478b513d","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.3.1.tgz","fileCount":9,"integrity":"sha512-7nHy5MYxo9+V7wYjxnJlWJ/4+o0JxCbRiQCB6vW8ukcetkGCRUz3p+TwYFCSFEyIflxppbPIpc4ywqyfJJcM5w==","signatures":[{"sig":"MEUCIBFBYBfqGcWkf31PJR65kgAQjMsNFlSw+CGvbD9yIwnAAiEAw6FDZnPiWAQhJuudUqSfHuAtKqQeD02TifCtKaMunFU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248488},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"65ca6d72af0eac855c7b77d9d1f4199a6abc7a2e","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: upgrade to %s\"","v:bump-minor":"npm version minor -m \"chore: upgrade to %s\"","v:bump-patch":"npm version patch -m \"chore: upgrade to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.3.1_1746643778584_0.647990363329565","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@adimm/x-injection","version":"0.3.2","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.3.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"c43e6498188c5a1b5f2cc7c0fc7ffdb3c6de636d","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.3.2.tgz","fileCount":9,"integrity":"sha512-kM4aCrVgm4Dm+uULJ0yvcjxVAQjeZ50RAaBXM04g+XS0XlT5mTYVhAjvz5Pe9fjF5C7GWNMglrVOobN7Vfbd0g==","signatures":[{"sig":"MEYCIQDxOMOuVSq67tPSoyhkPcfTOKVCgZeS88idUzWrlF1iYQIhANDGWEGy54SnNDaO/wVd8cON/64BgJfl5uD6gfLh1MA5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":251016},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"82829882e1a163f9351b878bdbc329ad4f6adcf9","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: upgrade to %s\"","v:bump-minor":"npm version minor -m \"chore: upgrade to %s\"","v:bump-patch":"npm version patch -m \"chore: upgrade to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.3.2_1746667309489_0.09179014528953933","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@adimm/x-injection","version":"0.4.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.4.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"5f27123e8661cc6ed8a69b1feb871e36f6f0a9f8","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.4.0.tgz","fileCount":9,"integrity":"sha512-8oLG422nMAe2ouQEKUMOieAM9gCj7nho/RrMl+lWcnaoNomKKzPtS/086KQ+xRQ9IuYrAuLzTroAh6DCWp6SwQ==","signatures":[{"sig":"MEUCIDeWRXAQ8eMBSWwfUWl7wTwSdSWLrDaJhmWRMUZb9rZLAiEAlRT5dyFREvEIbSlrLruaFVmgB+5Vf5EeN5YRQF+a6QI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258499},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"f76d847417bc46c4b56fb53dd1ff6586be9c5113","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update `package.json` major version %s\"","v:bump-minor":"npm version minor -m \"chore: update `package.json` minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update `package.json` patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.4.0_1746731210417_0.08126358919228993","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@adimm/x-injection","version":"0.5.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.5.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"a870f8f99daee23f1b03c2b2091ca1d0e22fa895","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.5.0.tgz","fileCount":9,"integrity":"sha512-DE/cueWYnhGZupy6Cf5i49M163WfS5aTPBfo9zSljlGuFKerwd5iblQFz+7Z8lQoYhf2Es4D0udn3aywvOPR7w==","signatures":[{"sig":"MEQCIDdtyL3NdiuyW5kx4UXSTVMNCDlNsrORrBIGGUYkuM9eAiA67isDjvtHX+SRSY8nJcsbCuqdF03WVzMie5EM1ejccQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273033},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"8c8a2450673d337c672432674f4e6a3de5f824d7","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.5.0_1746996043967_0.5667934086545359","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@adimm/x-injection","version":"0.5.1","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.5.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"4b33ac4ceede5ea6d9d1ebbf7782ca8c5d6df115","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.5.1.tgz","fileCount":9,"integrity":"sha512-A1TnhpY8EGt4yJSS7vS+6tgQnO98MvpkZi9ZTorr/N0NM3IwzzZkMHLG5w0rNrI5OoxqTzLq8bvy0D/h3rYiDQ==","signatures":[{"sig":"MEUCIQCeSgsLA//BdzlQH9F3XA4cpUy7j9dHICIjVA1ZnxmnbQIgUiNFZrV9M+TkKaIR62XZSJTLwZ0dYKgkPBBs7oNa3Sw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272563},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"79ebcf7e1c8344c5b558563bf12e33be05a76a7a","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.5.1_1747002125431_0.0026763441285011513","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@adimm/x-injection","version":"0.5.2","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.5.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"6c9c9e5152756c60f78b89dd9c7cbf25ea26a699","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.5.2.tgz","fileCount":9,"integrity":"sha512-l2pmKbR55tg9mRJWOCLlDYonEziE+t6B8Ylc3LeDZfsJCoq8F6HuJxLbbtn/3OgfqDDuIyNILTNshnBP9X4g/Q==","signatures":[{"sig":"MEQCIEjjyVPK/uR2f+1X5aHzjYF8O9LNBfthPoJyiUYw5F7JAiAuu97taD4qz/fyUTSvaSOfMNnSCiLygSj+OBmIMzYmNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273145},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"8ac3a79cbc604d4bf2e148fb17c0de7afd229100","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.5.2_1747130324746_0.7153389952820524","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@adimm/x-injection","version":"0.6.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.6.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"753fd3ec4e28276f7ceaadf4ee729db1fc73433c","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.6.0.tgz","fileCount":9,"integrity":"sha512-9JoXRTrhqB7ZK3xG8fHOvo7esB5SNWIVGDXkJ1+yG/EklBtziKHatfbWaBGrIUHBi8HcCUy+6D14DJTam1pHLw==","signatures":[{"sig":"MEUCIQCsCKTP3GbdcMoYZwj/Pa0Unu8S3OVQuSgKQo13unRsnwIgPhK9b4kwRWuunsLLJyU3Shj1m06RYWahv+r6fduG8v0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291191},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"5408095c05f35f7d03007eb6538e200b8b419ef2","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"deprecated":"deprecated: has experimental leftover code which affects the behavior of modules imported into the AppModule","_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.6.0_1747175908214_0.00587465647708707","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@adimm/x-injection","version":"0.6.1","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.6.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"5211e36fac75cc45cd1f8073adf11ae30b0e553e","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.6.1.tgz","fileCount":9,"integrity":"sha512-XVKg6VfDv+iBx9ESs3OrztEZbS+eJq4gqnN2/Kp52D2FtgNjDb9ymBrF17cdTNkdN4H8vnkvxixnvUVa0uZ9mw==","signatures":[{"sig":"MEUCIH0zt97oRw7FfRMoRq/8+nr+SP+JkXLj+j6RwxmFFLFoAiEAqnJwlDoyfRjjDarpIwGZsqPh8o3Dw/ODd5kyZP3E1Ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291350},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"6f33321d0084662fa0e320a77f4ef8eb104e0618","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"deprecated":"deprecated: has experimental leftover code which affects the behavior of modules imported into the AppModule","_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.6.1_1747176385718_0.04200036200117485","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@adimm/x-injection","version":"0.6.2","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.6.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"600a031c0574700236b84d1b79d5fafd1ad0f820","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.6.2.tgz","fileCount":9,"integrity":"sha512-x+X9eW+195AYAhHcb+fZns9o0WkOpmenUa+1YkTQPVpkXxjo9TDrxP8/E5QxUCdAaDealJBhez9GegVsWMz3+Q==","signatures":[{"sig":"MEUCIC3El/dUKh4UREQCrY4/3u2p94SRWfGceLDBycYC0UDmAiEApQXTK+OlGgBKkVye/nqn+HhdnBIloL3ty61dohQSU3c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287294},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"84b782eeb382f2f547b16b700ed6a0f6704da7cf","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.6.2_1747176916004_0.559239718381765","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"@adimm/x-injection","version":"0.6.3","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.6.3","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"c7e3ecac6ad0be945a1eac91bc65e7289316bcbd","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.6.3.tgz","fileCount":9,"integrity":"sha512-pOsAFdopvS/SMNpC9UxyQYBiHPMZMAylJLd8qRUEjc0/xgj5a5iqDQVf2o7TE1jn9cKxIrnVrB28cu62uAOsNg==","signatures":[{"sig":"MEUCIAKQoIuN7/Knwt1LDy+25f5Zt4p5XW8UeeIDoKo9dLrCAiEAzbdtPLPVbeDp1reBcnVfTb9ii1mOThwBcGbBKJjHnRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288148},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"535f538772a0c139b017527f1e41ba14c4488aa6","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.6.3_1747181612011_0.6556078006425106","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"@adimm/x-injection","version":"0.6.4","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.6.4","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"f358555f8589db16eab574af919b3afcd3ad0f8f","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.6.4.tgz","fileCount":9,"integrity":"sha512-VKpW+tPhPPVO/dnmFArd5Cn0taaBFTaHDALDvF1zgUrpFZpR2E8ER/PVkH+hir02J9ajm9W/wM5a2508jym1AA==","signatures":[{"sig":"MEYCIQCHUcq1fbetMqlb+jEaovh3t04wQ2sXYJVGGp5ax60cxQIhANUNdhKMkfMze0eq89NcPIw5gZVMQRlokIrZlJkMd6PF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288082},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"3893656db08e5663d61ac233603f267f385d7c71","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.6.4_1747226616901_0.9704234603996194","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"@adimm/x-injection","version":"0.6.5","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.6.5","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"01291594e654b335830aaa2578b4d0f3a8e05261","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.6.5.tgz","fileCount":9,"integrity":"sha512-O8AL7C8t9IwWzTDVmWmwuEZ4yfXQ68CKtCgNU+v+wHT6zTXx0fBuDVodUuBZKlvhACxq0n5HT3E+EcoJPaGyFw==","signatures":[{"sig":"MEQCICtJt+HkduBqQwvIg0cF2Fw+LlBG8FpnSLKJtYe21biCAiAriTxmicB64HCodnFd1B3zmcuBVswN0GvilfTdUW8hOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":290742},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"f4f1582a843b78617550a23cdde3c636227b25ce","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.6.5_1747237208922_0.012172645925845993","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@adimm/x-injection","version":"0.7.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.7.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"c3703f6a94f839d72b28a0b0686b6f3f6190703e","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.7.0.tgz","fileCount":9,"integrity":"sha512-ueSmYjS7ZHiTbwLVxylpdhZl3qZkgO4+pTRCPfuPCJRnobqzuwzEFlpBmHXmSUVudI/VOhY937ZNzhxq/J5pKA==","signatures":[{"sig":"MEUCICcar+nwcEfJh4kFxwg2n4ESMYRM5hRkaUfHT+HShghOAiEAgLIlC2BNn/IkvWNCHuvjMVyhPKkvA4RU94b+vPSSUxM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280503},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"693a3bace37ae6f573e9512d537ff7563ae78ad8","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.7.0_1747436856979_0.46321271045401247","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@adimm/x-injection","version":"0.8.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@0.8.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"56bf6659accdc7fd8c9e54bf197d7d12a466aac5","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-0.8.0.tgz","fileCount":9,"integrity":"sha512-Zpg0QQbUTPw5xiQITMNf+JL8RXh6ssoX7+rTjc01ddHtOdw1hLA2dJptP5DTpuGekKedwmvu0QumvsWLr2UXaQ==","signatures":[{"sig":"MEUCIQDGJZSC1XdSv6QAu5uFLlTa1HL8CNd/W/GIBdRKgoT/ZwIgd/uu1CYLpOkw+T1mFtyxNet2CbdBy84AB3XdHumyXVw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288857},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"a7162ea096dd576400957664f2aa9bc9257f2737","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.1","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_0.8.0_1747594565824_0.5622210805102665","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@adimm/x-injection","version":"1.1.5","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@1.1.5","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"f455ed1afcff028240829f0e173b5c07471b6f68","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-1.1.5.tgz","fileCount":9,"integrity":"sha512-XCyh7dQI1k7yAm3ETD+YTEaeNQ4JWlZt4GYDBdP9sE3wXW1haqXn0lTdyDygcr31DTBkCKQw6pyBLoQesKjZkw==","signatures":[{"sig":"MEYCIQDc+iuZLC64pALRI9jcvmT9fELdxE1W4kACZV1D+7QE6wIhAMHCmT96V5rRctbdjnBqeEiB7lqqFmhoZu6t2eoLAd6p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295001},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"02c27195094c989dd12697a544c41551d9c128f3","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"11.3.0","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_1.1.5_1749687793522_0.8539608761054807","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@adimm/x-injection","version":"1.1.6","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@1.1.6","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"de4cf3be8df80edceae24cd133e44e1c4a74ab1b","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-1.1.6.tgz","fileCount":9,"integrity":"sha512-UmYkOptcIL8UEFXwUjEK2+nlCtdwmyTyx3Enw7gVDLx23LvpjUqw3SAujHykblbD3UkpJl11o4YWsjaWOkej5Q==","signatures":[{"sig":"MEYCIQCNJRGxGuhouH9sYgs+TSeKNQm/QPEao5bj35KQtfUT7AIhAI/T48NlU6kvKA9v8z2WZ+F42qaZKRhuKQnBqf5fIhnU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296382},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"21e2b0f76e8bfeaccfdf7a1f7eba2ba7f60787c7","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_1.1.6_1749688416281_0.49801405627834083","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@adimm/x-injection","version":"1.2.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@1.2.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"66387c74ecf35588dfaf540179246adddb05b044","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-1.2.0.tgz","fileCount":9,"integrity":"sha512-OufdCro/9Ibbo2nxODsNPjBw6ixRPCvJ7T/EtbTht5LEqcXMk4odZ1v+nMmEQ5+BVkKp6wBozMfD00y0eAWiDw==","signatures":[{"sig":"MEUCIQDxAD1CVI+QusqXMP+ypwOzfdbtrLtiwAzglOoT/+90egIgMWeJRVEOVugc6nWvr6lB7RVy8f/wLo/vm4WsZz8zS6w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311156},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"789f507333530a21471d4e8d45ee4f6c00152c12","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_1.2.0_1749748644233_0.7845793010859488","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@adimm/x-injection","version":"1.2.1","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@1.2.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"7fec281a93582701826a731c0544ab3b30d805ab","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-1.2.1.tgz","fileCount":9,"integrity":"sha512-DBT8of/Lc0dsy8tRLeeFJmmxSih7Y0zUzGvZzpGtDQ7eI/cFJFqhIeaTnMeEXv89SyWEAOeIBkWZcHnbsee8HA==","signatures":[{"sig":"MEQCIEq/njScitPWnau67SP/LJqeOYGKdi6m2g6isgaC9CauAiBBiIbm1cOU9e0/DJkg47cQFrWgCOfsh8h6TjZnyhhnMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311140},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"a4060d74caf911c1f6300be1516fbb30f72fdc09","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.8.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_1.2.1_1749760879707_0.9729887985826218","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@adimm/x-injection","version":"2.0.3","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@2.0.3","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"dc2ab06d95c5afb7fcac3242abdb9f8d1d06fc49","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-2.0.3.tgz","fileCount":9,"integrity":"sha512-wPqjjDlZym1qH/cn9dXpi2Afz099W1In1DU1yTViHzEmaHwXBNX3lszMZY8XGUuqeqrQdNP6j3kW/yXTSXS6eg==","signatures":[{"sig":"MEQCIE7mUoU+Z8sQPMWDnTBo17hJjM5KxosAFY1Ikibwc6UUAiBeZy18PLcksqT3/y1TtvapQ+oISOwNSZSIPWgrP5+K1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":353591},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"ea7e7ab0e8ecb121e614b5d73c3c418d7250f2d0","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","actor":{"name":"adimm","type":"user","email":"mutu.adi.marian@gmail.com"},"email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.9.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^5.0.10","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"3.2.4","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^29.5.14","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node18":"^18.2.4","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@ianvs/prettier-plugin-sort-imports":"^4.4.1"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_2.0.3_1750141718252_0.38385327658521584","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@adimm/x-injection","version":"2.0.4","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@2.0.4","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"d0ffbc2738570cffa238571697e289d63b841907","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-2.0.4.tgz","fileCount":9,"integrity":"sha512-qIdc1FXnPPyTWJVjab37TUYOKxaqYq43XRZTwMQP1fKw3Q7dUn4ZsrbSQJld6LH/JLLiRYB/UbJ2t5QL0EW1Rw==","signatures":[{"sig":"MEQCIFEBi+vq9JclwwLMw0WV8U8RUYbxvd4gCkws4U3XwTdxAiAlvznSmMQ0RXIZBnmN+Af8iaFGc/EiuJNbJTx5wwdPlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":355890},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"6006cb291606fa156b28b3fcb6b2e12c573559a8","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","actor":{"name":"adimm","type":"user","email":"mutu.adi.marian@gmail.com"},"email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.9.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_2.0.4_1750151490015_0.1037722218517978","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@adimm/x-injection","version":"2.1.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@2.1.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"dd3a0e14b1e064dfad8ab08e4576f40b42cae5ea","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-2.1.0.tgz","fileCount":9,"integrity":"sha512-Pk0AIi8NjWqPguyfEZmA2W76n+8Niw9Tt1ctEuf76Bf2hjLd8OSl2Qpew4cAFa3n0bzWhc93TNQwDpxvk5+8TQ==","signatures":[{"sig":"MEUCIAvuRVfduOMjFA03RdVd82I8aSBb2m1e+xpSqNoSmeGlAiEA8/TfvOy6yLkHjRrU+pW3n7m1HLMnxRhgFbmXNBm3KdQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":359882},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"30997ee6c3d79e538ca2fc411a12c27a4324f790","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","actor":{"name":"adimm","type":"user","email":"mutu.adi.marian@gmail.com"},"email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.9.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_2.1.0_1750273610509_0.7046415522744871","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@adimm/x-injection","version":"2.1.1","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@2.1.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"27d8caf9acef6cfcf0cd4fcff979a0254b91502e","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-2.1.1.tgz","fileCount":7,"integrity":"sha512-HugMVrGKy8Vwzlr3lzeQtOOZ8d2aMktdVk3yjtY9fl7DdJo8UQ8F+imyUvxKGXdmabvmUXKllkt8z7TPKQ3pFA==","signatures":[{"sig":"MEUCIQCbgNLYeeiYX9M3ip/KYBUdaT9jBfg90t61LAcVlMkeBwIgO3vYvzRBtrvz8Yt5rnjSbqwE/kgBZwLwnxq5gCn0fSo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176297},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"7d3f0de1e60465f4f2a44845fd321bca57175c09","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","actor":{"name":"adimm","type":"user","email":"mutu.adi.marian@gmail.com"},"email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.9.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_2.1.1_1750406670439_0.8226677338717829","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"@adimm/x-injection","version":"2.1.2","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@2.1.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"70db83888ca26a29c18648074dc60692400a037a","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-2.1.2.tgz","fileCount":7,"integrity":"sha512-fNOXAEsI4K2diUShi0bfymhSWRl+Iu1p1L+saygdIhdDCuE0jun8xRZEqDPqsLwJGqslGZfZrinGcG87wv3jzA==","signatures":[{"sig":"MEUCIQDPIz5tQDzjKbUrBMf8kJHIAKOQB15QZI4olGVVXS2UJwIgTyYXARgDLOcP4icbI7WfgLm1uBzQAu6NuPobWeRaoUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176524},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"26629a986500e5666c0e5b3555b09e59ad6d0a9b","scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"adimm","actor":{"name":"adimm","type":"user","email":"mutu.adi.marian@gmail.com"},"email":"mutu.adi.marian@gmail.com"},"_npmVersion":"10.9.2","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_2.1.2_1751205881087_0.7976503138500755","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@adimm/x-injection","version":"3.0.0","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@3.0.0","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"be6ce6b8a4d7684718b7284e16beb32bb5c19255","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-3.0.0.tgz","fileCount":7,"integrity":"sha512-0dpo9Vd4skv+fqNQ/Jmqamun472KLffdEHsD+bbfhUKNTgP3yuG7n0+KM6mMl3TdF/GH88pV5VUYd5cYc8BZeg==","signatures":[{"sig":"MEYCIQCVFOp3hxr5eeEPZpJarm0X+ZDTdwl/9RdoSJVJjIk+yAIhAK5pBKJB1TjVYq8ONp5bE0eS+FP28qP/u5KaX83gjm7g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":157561},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"0cb1844abf688f133b6e27d2bc852d62975ca373","private":false,"scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7777bf6a-030b-4f32-ad06-71fab8ae65e9"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection.git"},"_npmVersion":"11.9.0","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_3.0.0_1770564403888_0.5172821266913756","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@adimm/x-injection","version":"3.0.1","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@3.0.1","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"44479b3a3138802a2856178d4cda7bee0ccf025a","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-3.0.1.tgz","fileCount":7,"integrity":"sha512-7fcJkFNS1d4F7VpMkTuO5f4D+d1BIM0hJhTNWLlFo6dfVbzORoxMosA0bqxCUpHSK6o5NNpni6dz+ZQy6QJXOg==","signatures":[{"sig":"MEUCIQDc4SJHNaNViZj8lVPoEGfQ5CWyhWpmLQAhEwCyos0EhwIgQTPs3JWM7dTlnx3kQNBpwQlJ9T4c4b4yqbu2o6konYw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":212222},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"93afa618ca0cc0f15118f9ebe2e3b06c202bc775","private":false,"scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7777bf6a-030b-4f32-ad06-71fab8ae65e9"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection.git"},"_npmVersion":"11.9.0","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"inversify":"^7.5.2","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_3.0.1_1770662654324_0.8268902687975914","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@adimm/x-injection","version":"3.0.2","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@3.0.2","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"0b4db80d9eccfc664a9dfa658cd33f64833d71e5","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-3.0.2.tgz","fileCount":7,"integrity":"sha512-xOwm75U24dBTqi/4pvWT7OnMWEIgHIj1c1lglXZ7vO77dSq2vSx87FU6smdTlGViXmziGY47ZTsYaDsYVziHgg==","signatures":[{"sig":"MEYCIQCeBobPMPOMU2XvzN2zNA6tbz3p2o3Wn8Tpt5aMdfAE5wIhAJxXu1RzMtA4qD8BX9T4mTy3u69hAJXYGGKoIwgHuxqy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection@3.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":204875},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"d7c7a321eccc0c6fe3b2daffb7d2c3e3a4aef3ee","private":false,"scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7777bf6a-030b-4f32-ad06-71fab8ae65e9"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection.git"},"_npmVersion":"11.10.0","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"inversify":"^7.11.0","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_3.0.2_1771434253178_0.03464659645743029","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"@adimm/x-injection","version":"3.0.4","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"author":{"name":"Adi-Marian Mutu"},"license":"MIT","_id":"@adimm/x-injection@3.0.4","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"dist":{"shasum":"ba04a9f8b4b8965950ba0d431ab19fd1a8ba0502","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-3.0.4.tgz","fileCount":7,"integrity":"sha512-H2esyWDuooAY4s2xKmJtv0NWaazk/ThtaJvTMlcXEjm/HF7/UO9pHh7KsWbfWlQE6FwyJ2oRsnaL3sPRUKoBvg==","signatures":[{"sig":"MEUCIQDVYRmReciQqpEYC2vhpXVrLzaatpUkgi+FX11Y1ZmcfwIgHS7tuoS7/mLY1WPff4DN9os/RPvOFiKT5DEEP7bvvW0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection@3.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":204199},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.0.0"},"gitHead":"f1c1a015e943402d48b96ba6657abb83f01d61ba","private":false,"scripts":{"lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","test":"jest --config ./config/jest.config.ts","build":"tsup --config ./config/tsup.config.ts","start":"npm run build && node dist/index.js","prepare":"husky install","pretest":"rimraf coverage","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","v:bump-major":"npm version major -m \"chore: update lib major version %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7777bf6a-030b-4f32-ad06-71fab8ae65e9"}},"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection.git"},"_npmVersion":"11.10.0","description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"inversify":"^7.11.0","reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","tsup":"^8.4.0","husky":"^9.1.7","eslint":"^8.57.1","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","typedoc":"^0.28.4","prettier":"^3.5.3","@swc/core":"^1.11.24","type-fest":"^4.40.1","typescript":"^5.8.3","@types/jest":"^30.0.0","http-server":"^14.1.1","node-notifier":"^10.0.1","@tsconfig/node22":"^22.0.2","eslint-plugin-import":"^2.31.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.3.1","typedoc-theme-hierarchy":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","@ianvs/prettier-plugin-sort-imports":"^4.4.2"},"_npmOperationalInternal":{"tmp":"tmp/x-injection_3.0.4_1771435613692_0.25390392358338","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"@adimm/x-injection","private":false,"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection.git"},"description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","version":"3.0.5","author":{"name":"Adi-Marian Mutu"},"homepage":"https://github.com/AdiMarianMutu/x-injection#readme","bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"license":"MIT","scripts":{"build":"tsup --config ./config/tsup.config.ts","docs:build":"typedoc --options ./config/typedoc.json","docs:serve":"npm run docs:build && http-server ./docs --cors -p 8080 -c-1","lint":"eslint \"src/**/*.ts\" --config ./config/.eslintrc.cjs","lint:fix":"npm run lint -- --fix","prebuild":"rimraf dist","prepare":"husky install","pretest":"rimraf coverage","prettier:format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \"config/**/*\" --config config/.prettierrc.cjs","start":"npm run build && node dist/index.js","start:watch":"tsup src/index.ts --config ./config/tsup.config.ts --watch --onSuccess 'node dist/index.js'","test":"jest --config ./config/jest.config.ts","test:coverage":"npm run test && http-server ./coverage/lcov-report --cors -p 8081 -c-1","v:bump-patch":"npm version patch -m \"chore: update lib patch version to %s\"","v:bump-minor":"npm version minor -m \"chore: update lib minor version to %s\"","v:bump-major":"npm version major -m \"chore: update lib major version %s\""},"dependencies":{"inversify":"^7.11.0","reflect-metadata":"^0.2.2","type-fest":"^4.40.1"},"devDependencies":{"@ianvs/prettier-plugin-sort-imports":"^4.4.2","@swc/core":"^1.11.24","@tsconfig/node22":"^22.0.2","@types/jest":"^30.0.0","@typescript-eslint/eslint-plugin":"^8.34.1","eslint":"^8.57.1","eslint-config-prettier":"^10.1.5","eslint-plugin-import":"^2.31.0","eslint-plugin-prettier":"^5.3.1","http-server":"^14.1.1","husky":"^9.1.7","jest":"^30.0.0","node-notifier":"^10.0.1","prettier":"^3.5.3","rimraf":"^6.0.1","terser":"^5.39.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","tsup":"^8.4.0","typedoc":"^0.28.4","typedoc-theme-hierarchy":"^6.0.0","typescript":"^5.8.3"},"engines":{"node":">=22.0.0"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"gitHead":"9772dacc02553a924ca7bbe10cf172ab8c640554","_id":"@adimm/x-injection@3.0.5","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-5m5QupsISUvmddGi6NMMOcD6sRB1qW6SiRAjzB9Ng2oLEh9Za9ARfgtyXOh6LTFRHiEmiKZoCgBn/VRr/3Hx1g==","shasum":"1961d068b9169b4b940558664d6cb592585ca420","tarball":"https://registry.npmjs.org/@adimm/x-injection/-/x-injection-3.0.5.tgz","fileCount":7,"unpackedSize":204199,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@adimm%2fx-injection@3.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHvRlRNTr8It981kt3XtI28bP4CQ4aIAMlBFTyzJ3GqPAiA1QGgIPDqqbMQrPU6DIihfsOHlptImVXLCglLqh/Sb9g=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7777bf6a-030b-4f32-ad06-71fab8ae65e9"}},"directories":{},"maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/x-injection_3.0.5_1776516545794_0.00571979197218031"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-04T18:38:26.505Z","modified":"2026-04-18T12:49:06.190Z","1.0.0":"2025-05-04T18:38:26.801Z","1.0.1":"2025-05-04T18:42:03.382Z","1.0.2":"2025-05-04T19:10:36.779Z","1.0.5":"2025-05-04T19:47:58.328Z","1.0.6":"2025-05-04T19:57:33.241Z","1.0.7":"2025-05-04T20:05:22.565Z","1.0.8":"2025-05-04T20:15:07.320Z","1.0.9":"2025-05-04T21:08:03.363Z","1.0.10":"2025-05-04T21:41:44.956Z","1.1.0":"2025-05-05T16:21:08.409Z","1.1.1":"2025-05-05T18:17:37.470Z","1.1.2":"2025-05-05T22:08:07.240Z","1.1.3":"2025-05-05T23:13:44.966Z","1.1.4":"2025-05-06T08:30:41.730Z","2.0.0":"2025-05-06T20:55:44.510Z","2.0.1":"2025-05-06T21:30:12.296Z","2.0.2":"2025-05-06T21:42:04.974Z","0.2.2":"2025-05-07T06:57:46.994Z","0.3.1":"2025-05-07T18:49:38.819Z","0.3.2":"2025-05-08T01:21:49.749Z","0.4.0":"2025-05-08T19:06:50.631Z","0.5.0":"2025-05-11T20:40:44.184Z","0.5.1":"2025-05-11T22:22:05.615Z","0.5.2":"2025-05-13T09:58:44.939Z","0.6.0":"2025-05-13T22:38:28.502Z","0.6.1":"2025-05-13T22:46:25.921Z","0.6.2":"2025-05-13T22:55:16.207Z","0.6.3":"2025-05-14T00:13:32.190Z","0.6.4":"2025-05-14T12:43:37.097Z","0.6.5":"2025-05-14T15:40:09.116Z","0.7.0":"2025-05-16T23:07:37.179Z","0.8.0":"2025-05-18T18:56:06.030Z","1.1.5":"2025-06-12T00:23:13.718Z","1.1.6":"2025-06-12T00:33:36.484Z","1.2.0":"2025-06-12T17:17:24.400Z","1.2.1":"2025-06-12T20:41:19.914Z","2.0.3":"2025-06-17T06:28:38.457Z","2.0.4":"2025-06-17T09:11:30.192Z","2.1.0":"2025-06-18T19:06:50.695Z","2.1.1":"2025-06-20T08:04:30.634Z","2.1.2":"2025-06-29T14:04:41.264Z","3.0.0":"2026-02-08T15:26:44.045Z","3.0.1":"2026-02-09T18:44:14.489Z","3.0.2":"2026-02-18T17:04:13.335Z","3.0.4":"2026-02-18T17:26:53.828Z","3.0.5":"2026-04-18T12:49:05.933Z"},"bugs":{"url":"https://github.com/AdiMarianMutu/x-injection/issues"},"author":{"name":"Adi-Marian Mutu"},"license":"MIT","homepage":"https://github.com/AdiMarianMutu/x-injection#readme","keywords":["inversion of control","ioc","di","dependency injection","inversify","nest","ts","typescript"],"repository":{"url":"git+https://github.com/AdiMarianMutu/x-injection.git"},"description":"Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.","maintainers":[{"name":"adimm","email":"mutu.adi.marian@gmail.com"}],"readme":"<p align=\"center\">\n<img width=\"260px\" height=\"auto\" alt=\"xInjection Logo\" src=\"https://raw.githubusercontent.com/AdiMarianMutu/x-injection/main/assets/logo.png\"><br /><a href=\"https://www.npmjs.com/package/@adimm/x-injection\" target=\"__blank\"><img src=\"https://badgen.net/npm/v/@adimm/x-injection\"></a>\n<a href=\"https://app.codecov.io/gh/AdiMarianMutu/x-injection\" target=\"__blank\"><img src=\"https://badgen.net/codecov/c/github/AdiMarianMutu/x-injection\"></a>\n<img src=\"https://badgen.net/npm/license/@adimm/x-injection\">\n</p>\n\n<p align=\"center\">\n<a href=\"https://github.com/AdiMarianMutu/x-injection/actions/workflows/ci.yml?query=branch%3Amain\" target=\"__blank\"><img src=\"https://github.com/AdiMarianMutu/x-injection/actions/workflows/ci.yml/badge.svg?branch=main\"></a>\n<a href=\"https://github.com/AdiMarianMutu/x-injection/actions/workflows/publish.yml\" target=\"__blank\"><img src=\"https://github.com/AdiMarianMutu/x-injection/actions/workflows/publish.yml/badge.svg\"></a>\n<br>\n<img src=\"https://badgen.net/bundlephobia/minzip/@adimm/x-injection\">\n<a href=\"https://www.npmjs.com/package/@adimm/x-injection\" target=\"__blank\"><img src=\"https://badgen.net/npm/dm/@adimm/x-injection\"></a>\n\n</p>\n\n**A powerful, modular dependency injection library for TypeScript** — Built on [InversifyJS](https://github.com/inversify/InversifyJS), inspired by [NestJS](https://github.com/nestjs/nest)'s elegant module architecture.\n\n> **TL;DR** — Mark classes with `@Injectable()`, group them into `ProviderModule`s with explicit `imports`/`exports`, and call `module.get(MyService)`. Dependencies are wired automatically, scoped correctly, and fully testable without touching production code.\n\n## Table of Contents\n\n- [Table of Contents](#table-of-contents)\n- [What Problems Does This Solve?](#what-problems-does-this-solve)\n  - [Problem 1: Manual Dependency Wiring](#problem-1-manual-dependency-wiring)\n  - [Problem 2: Tight Coupling and Testing Difficulty](#problem-2-tight-coupling-and-testing-difficulty)\n  - [Problem 3: Lack of Encapsulation](#problem-3-lack-of-encapsulation)\n  - [Problem 4: Lifecycle Management Complexity](#problem-4-lifecycle-management-complexity)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Core Concepts](#core-concepts)\n  - [Services with @Injectable](#services-with-injectable)\n  - [Modules](#modules)\n  - [Blueprints](#blueprints)\n  - [AppModule](#appmodule)\n- [Provider Tokens](#provider-tokens)\n  - [1. Class Token](#1-class-token)\n  - [2. Class Token with Substitution](#2-class-token-with-substitution)\n  - [3. Value Token](#3-value-token)\n  - [4. Factory Token](#4-factory-token)\n- [Injection Scopes](#injection-scopes)\n  - [Singleton (Default)](#singleton-default)\n  - [Transient](#transient)\n  - [Request](#request)\n  - [Scope Priority Order](#scope-priority-order)\n- [Module System](#module-system)\n  - [Import/Export Pattern](#importexport-pattern)\n  - [Re-exporting Modules](#re-exporting-modules)\n  - [Dynamic Module Updates](#dynamic-module-updates)\n  - [Global Modules](#global-modules)\n- [Dependency Injection](#dependency-injection)\n  - [Constructor Injection](#constructor-injection)\n  - [@Inject Decorator](#inject-decorator)\n  - [@MultiInject Decorator](#multiinject-decorator)\n  - [Optional Dependencies](#optional-dependencies)\n- [Lifecycle Hooks](#lifecycle-hooks)\n  - [onReady Hook](#onready-hook)\n  - [onReset Hook](#onreset-hook)\n  - [onDispose Hook](#ondispose-hook)\n- [Events System](#events-system)\n  - [Subscribing to Events](#subscribing-to-events)\n  - [Available Event Types](#available-event-types)\n  - [Event Use Cases](#event-use-cases)\n- [Middlewares](#middlewares)\n  - [BeforeGet Middleware](#beforeget-middleware)\n  - [BeforeAddProvider Middleware](#beforeaddprovider-middleware)\n  - [BeforeAddImport Middleware](#beforeaddimport-middleware)\n  - [OnExportAccess Middleware](#onexportaccess-middleware)\n  - [BeforeRemoveImport Middleware](#beforeremoveimport-middleware)\n  - [BeforeRemoveProvider Middleware](#beforeremoveprovider-middleware)\n  - [BeforeRemoveExport Middleware](#beforeremoveexport-middleware)\n  - [All Available Middleware Types](#all-available-middleware-types)\n- [Testing](#testing)\n  - [Blueprint Cloning](#blueprint-cloning)\n  - [Provider Substitution](#provider-substitution)\n  - [Mocking Services](#mocking-services)\n- [OOP-Style Modules with ProviderModuleClass](#oop-style-modules-with-providermoduleclass)\n  - [Basic OOP Module](#basic-oop-module)\n  - [When to Use OOP vs Functional](#when-to-use-oop-vs-functional)\n- [Advanced Module API](#advanced-module-api)\n  - [Query Methods](#query-methods)\n  - [Batch Resolution with getMany()](#batch-resolution-with-getmany)\n- [Hierarchical Dependency Injection](#hierarchical-dependency-injection)\n- [Resources](#resources)\n- [Contributing](#contributing)\n- [Credits](#credits)\n- [License](#license)\n\n## What Problems Does This Solve?\n\nModern applications face several dependency management challenges. Let's examine these problems and how xInjection solves them.\n\n### Problem 1: Manual Dependency Wiring\n\n**Without xInjection:**\n\n```ts\n// Manually creating and wiring dependencies\nclass DatabaseService {\n  constructor(private readonly config: ConfigService) {}\n}\n\nclass UserRepository {\n  constructor(private readonly db: DatabaseService) {}\n}\n\nclass AuthService {\n  constructor(private readonly userRepo: UserRepository) {}\n}\n\n// Manual instantiation nightmare\nconst config = new ConfigService();\nconst database = new DatabaseService(config);\nconst userRepo = new UserRepository(database);\nconst authService = new AuthService(userRepo);\n\n// Every file needs to repeat this setup\n// Changes to constructors require updating all instantiation sites\n```\n\n**With xInjection:**\n\n```ts\n@Injectable()\nclass DatabaseService {\n  constructor(private readonly config: ConfigService) {}\n}\n\n@Injectable()\nclass UserRepository {\n  constructor(private readonly db: DatabaseService) {}\n}\n\n@Injectable()\nclass AuthService {\n  constructor(private readonly userRepo: UserRepository) {}\n}\n\nconst AuthModule = ProviderModule.create({\n  id: 'AuthModule',\n  providers: [ConfigService, DatabaseService, UserRepository, AuthService],\n});\n\n// Automatic dependency resolution\nconst authService = AuthModule.get(AuthService);\n// All dependencies automatically injected!\n```\n\n### Problem 2: Tight Coupling and Testing Difficulty\n\n**Without xInjection:**\n\n```ts\nclass PaymentService {\n  // Hardcoded dependency - impossible to mock\n  private stripe = new StripeClient('api-key');\n\n  async charge(amount: number) {\n    return this.stripe.charge(amount);\n  }\n}\n\n// Testing requires hitting the real Stripe API\n// No way to inject a mock without changing production code\n```\n\n**With xInjection:**\n\n```ts\n@Injectable()\nclass PaymentService {\n  constructor(private readonly paymentGateway: PaymentGateway) {}\n\n  async charge(amount: number) {\n    return this.paymentGateway.charge(amount);\n  }\n}\n\n// Production: Use real Stripe\nconst ProductionModule = ProviderModule.create({\n  providers: [{ provide: PaymentGateway, useClass: StripePaymentGateway }, PaymentService],\n});\n\n// Testing: Use mock (no production code changes needed!)\nconst TestModule = ProviderModule.create({\n  providers: [{ provide: PaymentGateway, useClass: MockPaymentGateway }, PaymentService],\n});\n\nconst testService = TestModule.get(PaymentService);\n// testService.charge() → logs \"Mock charge: $100\" instead of hitting Stripe\n```\n\n### Problem 3: Lack of Encapsulation\n\n**Without xInjection:**\n\n```ts\n// Internal implementation details exposed\nclass CacheService {\n  // Should be private but other modules need access\n  public internalCache = new Map();\n}\n\nclass DatabaseModule {\n  // Everything is public - no control over what gets used\n  public connection = createConnection();\n  public cache = new CacheService();\n  public queryBuilder = new QueryBuilder();\n}\n\n// Other modules can access internals they shouldn't\nconst cache = databaseModule.internalCache; // Bad!\n```\n\n**With xInjection:**\n\n```ts\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [ConnectionPool, CacheService, QueryBuilder],\n  exports: [QueryBuilder], // Only expose public API\n});\n\n// Other modules can only access QueryBuilder\n// ConnectionPool and CacheService remain internal\nconst ApiModule = ProviderModule.create({\n  imports: [DatabaseModule],\n});\n\n// ✅ Works - QueryBuilder is exported\nconst queryBuilder = ApiModule.get(QueryBuilder);\n\n// ❌ Error - CacheService not exported (properly encapsulated!)\nconst cache = ApiModule.get(CacheService); // throws InjectionProviderModuleMissingProviderError\n```\n\n### Problem 4: Lifecycle Management Complexity\n\n**Without xInjection:**\n\n```ts\nclass AppServices {\n  database: DatabaseService;\n  cache: CacheService;\n\n  async initialize() {\n    this.database = new DatabaseService();\n    await this.database.connect();\n\n    this.cache = new CacheService();\n    await this.cache.initialize();\n\n    // Manually track initialization order and cleanup\n  }\n\n  async cleanup() {\n    // Must remember to clean up in reverse order\n    await this.cache.dispose();\n    await this.database.disconnect();\n  }\n}\n\n// Easy to forget cleanup, leading to resource leaks\n```\n\n**With xInjection:**\n\n```ts\nconst AppModule = ProviderModule.create({\n  id: 'AppModule',\n  providers: [DatabaseService, CacheService],\n  onReady: async (module) => {\n    // Initialization logic - called immediately after module creation\n    const db = module.get(DatabaseService);\n    await db.connect();\n  },\n  onDispose: () => {\n    return {\n      before: async (mod) => {\n        // Automatic cleanup in proper order\n        const db = mod.get(DatabaseService);\n        await db.disconnect();\n      },\n    };\n  },\n});\n\n// Lifecycle automatically managed — onDispose runs db.disconnect() automatically\nawait AppModule.dispose(); // ✅ No forgotten cleanup, no resource leaks\n```\n\n**xInjection** is a [Dependency Injection](https://en.wikipedia.org/wiki/Dependency_injection) library built on [InversifyJS](https://github.com/inversify/InversifyJS), inspired by [NestJS](https://github.com/nestjs/nest)'s modular architecture. It solves the pain points above through:\n\n- **Modular Architecture** - NestJS-style import/export system for clean dependency boundaries\n- **Isolated Containers** - Each module manages its own InversifyJS container\n- **Flexible Scopes** - Singleton, Transient, and Request-scoped providers\n- **Lazy Loading** - Blueprint pattern for deferred module instantiation\n- **Lifecycle Hooks** - `onReady`, `onReset`, `onDispose` for module lifecycle management\n- **Events & Middlewares** - Deep customization through event subscriptions and middleware chains\n- **OOP Support** - `ProviderModuleClass` for class-based module architecture\n- **Framework Agnostic** - Works in Node.js and browser environments\n- **TypeScript First** - Full type safety with decorator support\n\n## Installation\n\n```bash\nnpm install @adimm/x-injection reflect-metadata\n```\n\n**TypeScript Configuration** (`tsconfig.json`):\n\n```json\n{\n  \"compilerOptions\": {\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true\n  }\n}\n```\n\nImport `reflect-metadata` at your application's entry point:\n\n```ts\nimport 'reflect-metadata';\n```\n\n## Quick Start\n\n```ts\nimport { Injectable, ProviderModule } from '@adimm/x-injection';\n\n@Injectable()\nclass UserService {\n  getUser(id: string) {\n    return { id, name: 'John Doe' };\n  }\n}\n\n@Injectable()\nclass AuthService {\n  constructor(private readonly userService: UserService) {}\n\n  login(userId: string) {\n    const user = this.userService.getUser(userId);\n    return `Logged in as ${user.name}`;\n  }\n}\n\nconst AuthModule = ProviderModule.create({\n  id: 'AuthModule',\n  providers: [UserService, AuthService],\n  exports: [AuthService],\n});\n\nconst authService = AuthModule.get(AuthService);\nconsole.log(authService.login('123')); // \"Logged in as John Doe\"\n```\n\n## Core Concepts\n\n### Services with @Injectable\n\nThe `@Injectable()` decorator marks a class as available for dependency injection. It enables automatic constructor parameter resolution.\n\n```ts\nimport { Injectable, InjectionScope } from '@adimm/x-injection';\n\n// Basic injectable service (Singleton by default)\n@Injectable()\nclass LoggerService {\n  log(message: string) {\n    console.log(`[LOG] ${message}`);\n  }\n}\n\n// Injectable with scope specification\n@Injectable(InjectionScope.Request)\nclass RequestContext {\n  requestId = Math.random();\n}\n\n// Complex service with dependencies\n@Injectable()\nclass ApiService {\n  constructor(\n    private readonly logger: LoggerService,\n    private readonly context: RequestContext\n  ) {}\n\n  async fetchData() {\n    this.logger.log(`Fetching data for request ${this.context.requestId}`);\n    return { data: 'example' };\n  }\n}\n```\n\n> [!IMPORTANT]\n> The `@Injectable()` decorator is **required** for any class that:\n>\n> - Has constructor dependencies\n> - Needs to be resolved from a module container\n> - Should be managed by the dependency injection system\n\n### Modules\n\nModules are the fundamental building blocks of xInjection. Each module encapsulates providers with explicit control over imports and exports.\n\n```ts\nimport { ProviderModule } from '@adimm/x-injection';\n\n// Define services\n@Injectable()\nclass DatabaseService {\n  query(sql: string) {\n    return [{ id: 1, name: 'Result' }];\n  }\n}\n\n@Injectable()\nclass InternalCacheService {\n  // Internal-only service\n  private cache = new Map();\n}\n\n@Injectable()\nclass UserRepository {\n  constructor(\n    private readonly db: DatabaseService,\n    private readonly cache: InternalCacheService\n  ) {}\n\n  findById(id: string) {\n    return this.db.query(`SELECT * FROM users WHERE id = ${id}`);\n  }\n}\n\n// Create module with encapsulation\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [DatabaseService, InternalCacheService, UserRepository],\n  exports: [UserRepository], // Only UserRepository accessible to importers\n});\n\n// Use the module\nconst ApiModule = ProviderModule.create({\n  id: 'ApiModule',\n  imports: [DatabaseModule],\n});\n\n// ✅ Works - UserRepository is exported\nconst userRepo = ApiModule.get(UserRepository);\n\n// ❌ Throws error - InternalCacheService not exported\n// const cache = ApiModule.get(InternalCacheService);\n```\n\n### Blueprints\n\nBlueprints allow you to define module configurations without instantiating them, enabling lazy loading and template reuse.\n\n```ts\nimport { ProviderModule } from '@adimm/x-injection';\n\n@Injectable()\nclass ConfigService {\n  getConfig() {\n    return { apiUrl: 'https://api.example.com' };\n  }\n}\n\n// Define blueprint (not instantiated yet)\nconst ConfigModuleBp = ProviderModule.blueprint({\n  id: 'ConfigModule',\n  providers: [ConfigService],\n  exports: [ConfigService],\n});\n\n// Use blueprint in imports (auto-converts to module)\nconst ApiModule = ProviderModule.create({\n  id: 'ApiModule',\n  imports: [ConfigModuleBp], // Instantiated automatically when needed\n});\n\n// Or create module from blueprint explicitly\nconst ConfigModule = ProviderModule.create(ConfigModuleBp);\n\n// Clone blueprints for testing\nconst ConfigModuleMock = ConfigModuleBp.clone().updateDefinition({\n  id: 'ConfigModuleMock',\n  providers: [{ provide: ConfigService, useValue: { getConfig: () => ({ apiUrl: 'mock' }) } }],\n});\n```\n\n**Benefits of Blueprints:**\n\n- **Deferred Instantiation** - Only create modules when needed\n- **Reusable Templates** - Define once, use in multiple places\n- **Testing** - Clone and modify for test scenarios\n- **Scoped Singletons** - Each importing module gets its own independent module instance converted from the blueprint\n\n> [!TIP]\n> Use blueprints when you need the same module configuration in multiple places, or when you want to delay module creation until runtime.\n\n> [!IMPORTANT]\n> When a blueprint is imported into multiple modules, each importing module receives its **own separate instance** of that blueprint — converted to a full module independently. This means that providers declared as `Singleton` inside a blueprint are only singletons **relative to the module that imported them**, not globally. If `ModuleA` and `ModuleB` both import `ConfigModuleBp`, they each get their own `ConfigService` singleton — the two instances are completely independent of each other.\n\n### AppModule\n\n`AppModule` is the built-in global root container. Any module or blueprint created with `isGlobal: true` is automatically imported into it, making its exported providers available to every other module without an explicit `imports` declaration.\n\n> [!WARNING]\n>\n> - `id: 'AppModule'` is reserved — you cannot create your own module with that name\n> - You cannot import `AppModule` into other modules\n>\n> See [Global Modules](#global-modules) for full usage and best practices.\n\n## Provider Tokens\n\nxInjection supports four types of provider tokens, each serving different use cases.\n\n### 1. Class Token\n\nThe simplest form - just provide the class directly.\n\n```ts\n@Injectable()\nclass UserService {\n  getUsers() {\n    return [{ id: '1', name: 'Alice' }];\n  }\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [UserService], // Class token\n});\n\nconst userService = MyModule.get(UserService);\n```\n\n### 2. Class Token with Substitution\n\nUse one class as the token but instantiate a different class. Perfect for polymorphism and testing.\n\n```ts\n@Injectable()\nabstract class PaymentGateway {\n  abstract charge(amount: number): Promise<void>;\n}\n\n@Injectable()\nclass StripePaymentGateway extends PaymentGateway {\n  async charge(amount: number) {\n    console.log(`Charging $${amount} via Stripe`);\n  }\n}\n\n@Injectable()\nclass MockPaymentGateway extends PaymentGateway {\n  async charge(amount: number) {\n    console.log(`Mock charge: $${amount}`);\n  }\n}\n\n// Production\nconst ProductionModule = ProviderModule.create({\n  id: 'ProductionModule',\n  providers: [{ provide: PaymentGateway, useClass: StripePaymentGateway }],\n});\n\n// Testing\nconst TestModule = ProviderModule.create({\n  id: 'TestModule',\n  providers: [{ provide: PaymentGateway, useClass: MockPaymentGateway }],\n});\n\nconst prodGateway = ProductionModule.get(PaymentGateway); // StripePaymentGateway\nconst testGateway = TestModule.get(PaymentGateway); // MockPaymentGateway\n```\n\n### 3. Value Token\n\nProvide constant values or pre-instantiated objects.\n\n```ts\n// Configuration values\nconst ConfigModule = ProviderModule.create({\n  id: 'ConfigModule',\n  providers: [\n    { provide: 'API_KEY', useValue: 'secret-key-123' },\n    { provide: 'API_URL', useValue: 'https://api.example.com' },\n    { provide: 'MAX_RETRIES', useValue: 3 },\n  ],\n  exports: ['API_KEY', 'API_URL', 'MAX_RETRIES'],\n});\n\nconst apiKey = ConfigModule.get('API_KEY'); // 'secret-key-123'\nconst apiUrl = ConfigModule.get('API_URL'); // 'https://api.example.com'\nconst maxRetries = ConfigModule.get('MAX_RETRIES'); // 3\n\n// Pre-instantiated objects\nconst existingLogger = new Logger();\nconst LoggerModule = ProviderModule.create({\n  id: 'LoggerModule',\n  providers: [{ provide: Logger, useValue: existingLogger }],\n});\n```\n\n### 4. Factory Token\n\nUse a factory function to create providers dynamically. The `inject` parameter specifies dependencies.\n\n```ts\n@Injectable()\nclass ConfigService {\n  dbUrl = 'postgres://localhost:5432/mydb';\n  dbPort = 5432;\n}\n\ninterface DatabaseConnection {\n  url: string;\n  port: number;\n  connected: boolean;\n}\n\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [\n    ConfigService,\n    {\n      provide: 'DATABASE_CONNECTION',\n      useFactory: (config: ConfigService) => {\n        // Factory receives injected dependencies\n        return {\n          url: config.dbUrl,\n          port: config.dbPort,\n          connected: true,\n        };\n      },\n      inject: [ConfigService], // Dependencies to inject into factory\n    },\n  ],\n  exports: ['DATABASE_CONNECTION'],\n});\n\nconst connection = DatabaseModule.get<DatabaseConnection>('DATABASE_CONNECTION');\nconsole.log(connection.url); // 'postgres://localhost:5432/mydb'\n```\n\n> [!TIP]\n> Use factory tokens when:\n>\n> - Provider creation requires complex logic\n> - You need to inject dependencies into the factory\n> - You're creating providers that depend on runtime configuration\n> - You need to create multiple instances with different configurations\n\n## Injection Scopes\n\nControl provider lifecycle with three scope types. Scope priority order: **token scope > decorator scope > module default scope**.\n\n### Singleton (Default)\n\nCached after first resolution - same instance returned every time.\n\n```ts\n@Injectable() // Singleton by default\nclass DatabaseService {\n  connectionId = Math.random();\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [DatabaseService],\n});\n\nconst db1 = MyModule.get(DatabaseService);\nconst db2 = MyModule.get(DatabaseService);\n\nconsole.log(db1 === db2); // true\nconsole.log(db1.connectionId === db2.connectionId); // true\n```\n\n### Transient\n\nNew instance created on every resolution.\n\n```ts\n@Injectable(InjectionScope.Transient)\nclass RequestLogger {\n  requestId = Math.random();\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [RequestLogger],\n});\n\nconst logger1 = MyModule.get(RequestLogger);\nconst logger2 = MyModule.get(RequestLogger);\n\nconsole.log(logger1 === logger2); // false\nconsole.log(logger1.requestId === logger2.requestId); // false\n```\n\n### Request\n\nSingle instance per resolution tree. All dependencies resolved in the same `get()` call share the same instance.\n\n```ts\n@Injectable(InjectionScope.Request)\nclass RequestContext {\n  requestId = Math.random();\n}\n\n@Injectable(InjectionScope.Transient)\nclass ServiceA {\n  constructor(public ctx: RequestContext) {}\n}\n\n@Injectable(InjectionScope.Transient)\nclass ServiceB {\n  constructor(public ctx: RequestContext) {}\n}\n\n@Injectable(InjectionScope.Transient)\nclass Controller {\n  constructor(\n    public serviceA: ServiceA,\n    public serviceB: ServiceB\n  ) {}\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [RequestContext, ServiceA, ServiceB, Controller],\n});\n\n// First resolution tree\nconst controller1 = MyModule.get(Controller);\nconsole.log(controller1.serviceA.ctx === controller1.serviceB.ctx); // true\n// ServiceA and ServiceB share the same RequestContext\n\n// Second resolution tree\nconst controller2 = MyModule.get(Controller);\nconsole.log(controller2.serviceA.ctx === controller2.serviceB.ctx); // true\n// New resolution, both services get a new shared RequestContext\n\n// Different resolution trees get different contexts\nconsole.log(controller1.serviceA.ctx === controller2.serviceA.ctx); // false\n```\n\n**Visual Representation:**\n\n```\nFirst module.get(Controller):\n  Controller (new) ──┬──> ServiceA (new) ──┐\n                     │                      ├──> RequestContext (SAME instance)\n                     └──> ServiceB (new) ──┘\n\nSecond module.get(Controller):\n  Controller (new) ──┬──> ServiceA (new) ──┐\n                     │                      ├──> RequestContext (NEW instance)\n                     └──> ServiceB (new) ──┘\n```\n\n### Scope Priority Order\n\nScopes are resolved in the following priority order (highest to lowest):\n\n1. **Token scope** (highest priority)\n2. **Decorator scope**\n3. **Module default scope** (lowest priority)\n\n```ts\n@Injectable(InjectionScope.Singleton) // Priority 2\nclass MyService {}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  defaultScope: InjectionScope.Singleton, // Priority 3 (lowest)\n  providers: [\n    {\n      provide: MyService,\n      useClass: MyService,\n      scope: InjectionScope.Transient, // Priority 1 (highest) - WINS!\n    },\n  ],\n});\n\n// Token scope wins: new instance every time\nconst s1 = MyModule.get(MyService);\nconst s2 = MyModule.get(MyService);\nconsole.log(s1 === s2); // false\n```\n\n> [!IMPORTANT]\n> Request scope is useful for scenarios like:\n>\n> - HTTP request tracking (same request ID across all services in one request)\n> - Transaction contexts (same database transaction across all repositories)\n> - User context (same user data across all services in one operation)\n\n## Module System\n\n### Import/Export Pattern\n\nModules explicitly control dependency boundaries through imports and exports, providing encapsulation and clear interfaces.\n\n```ts\n@Injectable()\nclass DatabaseService {\n  query(sql: string) {\n    return [{ result: 'data' }];\n  }\n}\n\n@Injectable()\nclass InternalCacheService {\n  // Private to DatabaseModule\n  cache = new Map();\n}\n\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [DatabaseService, InternalCacheService],\n  exports: [DatabaseService], // Only DatabaseService is accessible\n});\n\nconst ApiModule = ProviderModule.create({\n  id: 'ApiModule',\n  imports: [DatabaseModule],\n  providers: [ApiService],\n});\n\n// ✅ Works - DatabaseService is exported\nconst dbService = ApiModule.get(DatabaseService);\n\n// ❌ Error - InternalCacheService not exported\n// const cache = ApiModule.get(InternalCacheService);\n```\n\n**Nested Imports:**\n\n```ts\nconst LayerA = ProviderModule.create({\n  id: 'LayerA',\n  providers: [ServiceA],\n  exports: [ServiceA],\n});\n\nconst LayerB = ProviderModule.create({\n  id: 'LayerB',\n  imports: [LayerA],\n  providers: [ServiceB],\n  exports: [ServiceB, LayerA], // Re-export LayerA\n});\n\nconst LayerC = ProviderModule.create({\n  id: 'LayerC',\n  imports: [LayerB],\n});\n\n// ✅ Works - ServiceA accessible through LayerB's re-export\nconst serviceA = LayerC.get(ServiceA);\n\n// ✅ Works - ServiceB exported by LayerB\nconst serviceB = LayerC.get(ServiceB);\n```\n\n### Re-exporting Modules\n\nModules can re-export imported modules to create aggregation modules.\n\n```ts\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [DatabaseService],\n  exports: [DatabaseService],\n});\n\nconst ConfigModule = ProviderModule.create({\n  id: 'ConfigModule',\n  providers: [ConfigService],\n  exports: [ConfigService],\n});\n\nconst LoggerModule = ProviderModule.create({\n  id: 'LoggerModule',\n  providers: [LoggerService],\n  exports: [LoggerService],\n});\n\n// CoreModule aggregates common modules\nconst CoreModule = ProviderModule.create({\n  id: 'CoreModule',\n  imports: [DatabaseModule, ConfigModule, LoggerModule],\n  exports: [DatabaseModule, ConfigModule, LoggerModule], // Re-export all\n});\n\n// Consumers import CoreModule and get all three modules\nconst FeatureModule = ProviderModule.create({\n  id: 'FeatureModule',\n  imports: [CoreModule], // Just import one module\n});\n\n// Access all re-exported providers\nconst db = FeatureModule.get(DatabaseService);\nconst config = FeatureModule.get(ConfigService);\nconst logger = FeatureModule.get(LoggerService);\n```\n\n> [!TIP]\n> Create \"barrel\" or \"core\" modules that re-export commonly used modules to simplify imports throughout your application.\n\n### Dynamic Module Updates\n\nModules support runtime modifications for flexibility. Use sparingly as it can impact performance.\n\n```ts\nconst DynamicModule = ProviderModule.create({\n  id: 'DynamicModule',\n  providers: [ServiceA],\n});\n\n// Add providers dynamically\nDynamicModule.update.addProvider(ServiceB);\nDynamicModule.update.addProvider(ServiceC, true); // true = also export\n\n// Add imports dynamically\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [DatabaseService],\n  exports: [DatabaseService],\n});\n\nDynamicModule.update.addImport(DatabaseModule, true); // true = also export\n\n// Check what's available\nconsole.log(DynamicModule.hasProvider(ServiceB)); // true\nconsole.log(DynamicModule.isImportingModule('DatabaseModule')); // true\nconsole.log(DynamicModule.isExportingProvider(ServiceC)); // true\n\n// Remove providers and imports\nDynamicModule.update.removeProvider(ServiceB);\nDynamicModule.update.removeImport(DatabaseModule);\nDynamicModule.update.removeFromExports(ServiceC);\n```\n\n**Dynamic Import Propagation:**\n\n```ts\nconst ModuleA = ProviderModule.create({\n  id: 'ModuleA',\n  providers: [ServiceA],\n  exports: [ServiceA],\n});\n\nconst ModuleB = ProviderModule.create({\n  id: 'ModuleB',\n  imports: [ModuleA],\n  exports: [ModuleA],\n});\n\nconst ModuleC = ProviderModule.create({\n  id: 'ModuleC',\n  providers: [ServiceC],\n  exports: [ServiceC],\n});\n\n// Initially, ModuleB doesn't have ServiceC\nconsole.log(ModuleB.hasProvider(ServiceC)); // false\n\n// Dynamically import ModuleC into ModuleA and export it\nModuleA.update.addImport(ModuleC, true);\n\n// Now ModuleB automatically has ServiceC (import propagation!)\nconsole.log(ModuleB.hasProvider(ServiceC)); // true\n```\n\n> [!WARNING]\n> Dynamic module updates:\n>\n> - Can impact performance if used frequently\n> - Should be used primarily for testing or plugin systems\n> - May make dependency graphs harder to understand\n> - Are propagated automatically to importing modules\n\n### Global Modules\n\nDeclare a single `AppBootstrapModule` blueprint with `isGlobal: true` at your app's entry point. It is automatically imported into `AppModule`, making its exported providers available to every module without any explicit `imports`.\n\n```ts\n@Injectable()\nclass LoggerService {\n  log(message: string) {\n    console.log(`[LOG] ${message}`);\n  }\n}\n\n@Injectable()\nclass ConfigService {\n  apiUrl = 'https://api.example.com';\n}\n\n// Declare once at app entry point\nProviderModule.blueprint({\n  id: 'AppBootstrapModule',\n  isGlobal: true,\n  providers: [LoggerService, ConfigService],\n  exports: [LoggerService, ConfigService],\n});\n\n// Automatically imported into AppModule\nconsole.log(AppModule.isImportingModule('AppBootstrapModule')); // true\n\n// Every module can resolve these without importing anything\nconst FeatureModule = ProviderModule.create({ id: 'FeatureModule' });\nconst logger = FeatureModule.get(LoggerService); // Works!\n```\n\n> [!CAUTION]\n> Even if not enforced, it is recommended to keep `isGlobal: true` to a **single** `AppBootstrapModule`. Multiple global modules create hidden implicit dependencies that are hard to trace. If a module is not truly app-wide, import it explicitly instead.\n\n## Dependency Injection\n\n### Constructor Injection\n\nThe primary way to inject dependencies. TypeScript metadata handles it automatically with `@Injectable()`.\n\n```ts\n@Injectable()\nclass DatabaseService {\n  query(sql: string) {\n    return [{ data: 'result' }];\n  }\n}\n\n@Injectable()\nclass LoggerService {\n  log(message: string) {\n    console.log(message);\n  }\n}\n\n@Injectable()\nclass UserRepository {\n  // Dependencies automatically injected via constructor\n  constructor(\n    private readonly db: DatabaseService,\n    private readonly logger: LoggerService\n  ) {}\n\n  findAll() {\n    this.logger.log('Finding all users');\n    return this.db.query('SELECT * FROM users');\n  }\n}\n\nconst UserModule = ProviderModule.create({\n  id: 'UserModule',\n  providers: [DatabaseService, LoggerService, UserRepository],\n});\n\n// UserRepository automatically receives DatabaseService and LoggerService\nconst userRepo = UserModule.get(UserRepository);\n```\n\n### @Inject Decorator\n\nUse `@Inject` for explicit injection when automatic resolution doesn't work (e.g., string tokens, interfaces).\n\n```ts\nimport { Inject, Injectable } from '@adimm/x-injection';\n\n@Injectable()\nclass ApiService {\n  constructor(\n    @Inject('API_KEY') private readonly apiKey: string,\n    @Inject('API_URL') private readonly apiUrl: string,\n    @Inject('MAX_RETRIES') private readonly maxRetries: number\n  ) {}\n\n  makeRequest() {\n    console.log(`Calling ${this.apiUrl} with key ${this.apiKey}`);\n    console.log(`Max retries: ${this.maxRetries}`);\n  }\n}\n\nconst ApiModule = ProviderModule.create({\n  id: 'ApiModule',\n  providers: [\n    { provide: 'API_KEY', useValue: 'secret-123' },\n    { provide: 'API_URL', useValue: 'https://api.example.com' },\n    { provide: 'MAX_RETRIES', useValue: 3 },\n    ApiService,\n  ],\n});\n\nconst apiService = ApiModule.get(ApiService);\napiService.makeRequest();\n```\n\n**Injecting Abstract Classes:**\n\n```ts\n@Injectable()\nabstract class PaymentGateway {\n  abstract charge(amount: number): Promise<void>;\n}\n\n@Injectable()\nclass StripePaymentGateway extends PaymentGateway {\n  async charge(amount: number) {\n    console.log(`Stripe: Charging $${amount}`);\n  }\n}\n\n@Injectable()\nclass PaymentService {\n  constructor(@Inject(PaymentGateway) private readonly gateway: PaymentGateway) {}\n\n  async processPayment(amount: number) {\n    await this.gateway.charge(amount);\n  }\n}\n\nconst PaymentModule = ProviderModule.create({\n  id: 'PaymentModule',\n  providers: [{ provide: PaymentGateway, useClass: StripePaymentGateway }, PaymentService],\n});\n```\n\n### @MultiInject Decorator\n\nInject multiple providers bound to the same token as an array.\n\n```ts\nimport { Injectable, MultiInject } from '@adimm/x-injection';\n\n@Injectable()\nclass EmailNotifier {\n  notify() {\n    console.log('Email notification sent');\n  }\n}\n\n@Injectable()\nclass SmsNotifier {\n  notify() {\n    console.log('SMS notification sent');\n  }\n}\n\n@Injectable()\nclass PushNotifier {\n  notify() {\n    console.log('Push notification sent');\n  }\n}\n\nabstract class Notifier {\n  abstract notify(): void;\n}\n\n@Injectable()\nclass NotificationService {\n  constructor(@MultiInject(Notifier) private readonly notifiers: Notifier[]) {}\n\n  notifyAll() {\n    this.notifiers.forEach((notifier) => notifier.notify());\n  }\n}\n\nconst NotificationModule = ProviderModule.create({\n  id: 'NotificationModule',\n  providers: [\n    { provide: Notifier, useClass: EmailNotifier },\n    { provide: Notifier, useClass: SmsNotifier },\n    { provide: Notifier, useClass: PushNotifier },\n    NotificationService,\n  ],\n});\n\nconst service = NotificationModule.get(NotificationService);\nservice.notifyAll();\n// Output:\n// Email notification sent\n// SMS notification sent\n// Push notification sent\n```\n\n**Alternative with module.get():**\n\n```ts\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [\n    { provide: 'Handler', useValue: 'Handler1' },\n    { provide: 'Handler', useValue: 'Handler2' },\n    { provide: 'Handler', useValue: 'Handler3' },\n  ],\n});\n\n// Get all providers bound to 'Handler'\nconst handlers = MyModule.get('Handler', false, true); // (token, isOptional=false, asList=true)\nconsole.log(handlers); // ['Handler1', 'Handler2', 'Handler3']\n```\n\n### Optional Dependencies\n\nUse the `isOptional` flag to handle missing dependencies gracefully.\n\n```ts\n@Injectable()\nclass ServiceA {\n  value = 'A';\n}\n\n@Injectable()\nclass ServiceB {\n  constructor(\n    private serviceA: ServiceA,\n    @Inject('OPTIONAL_CONFIG') private readonly config?: any\n  ) {}\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [ServiceA, ServiceB],\n});\n\n// Get with optional flag\nconst optionalService = MyModule.get('NOT_EXISTS', true); // isOptional = true\nconsole.log(optionalService); // undefined (no error thrown)\n\n// Without optional flag (throws error)\ntry {\n  const service = MyModule.get('NOT_EXISTS'); // Throws!\n} catch (error) {\n  console.error('Provider not found');\n}\n```\n\n> [!TIP]\n> Use `@Inject` when:\n>\n> - Injecting string tokens or symbols\n> - Injecting abstract classes\n> - TypeScript's automatic injection doesn't work (interfaces, etc.)\n>\n> Use `@MultiInject` when:\n>\n> - You want to collect all providers bound to a single token\n> - Implementing plugin systems\n> - Working with strategy patterns\n\n## Lifecycle Hooks\n\nLifecycle hooks allow you to execute code at specific points in a module's lifecycle.\n\n### onReady Hook\n\nInvoked immediately after module creation. Perfect for initialization logic.\n\n```ts\n@Injectable()\nclass DatabaseService {\n  connected = false;\n\n  async connect() {\n    console.log('Connecting to database...');\n    this.connected = true;\n  }\n}\n\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [DatabaseService],\n  onReady: async (module) => {\n    console.log('DatabaseModule is ready!');\n\n    // Initialize services\n    const db = module.get(DatabaseService);\n    await db.connect();\n\n    console.log('Database connected:', db.connected);\n  },\n});\n\n// Output:\n// DatabaseModule is ready!\n// Connecting to database...\n// Database connected: true\n```\n\n### onReset Hook\n\nInvoked when `module.reset()` is called. Provides `before` and `after` callbacks for cleanup and reinitialization.\n\n```ts\n@Injectable()\nclass CacheService {\n  cache = new Map();\n\n  clear() {\n    this.cache.clear();\n  }\n}\n\nconst CacheModule = ProviderModule.create({\n  id: 'CacheModule',\n  providers: [CacheService],\n  onReset: () => {\n    return {\n      before: async (mod) => {\n        console.log('Before reset - clearing cache');\n        const cache = mod.get(CacheService);\n        cache.clear();\n      },\n      after: async () => {\n        console.log('After reset - cache reinitialized');\n      },\n    };\n  },\n});\n\n// Trigger reset\nawait CacheModule.reset();\n// Output:\n// Before reset - clearing cache\n// After reset - cache reinitialized\n```\n\n### onDispose Hook\n\nInvoked when `module.dispose()` is called. Perfect for cleanup tasks like closing connections.\n\n```ts\n@Injectable()\nclass DatabaseService {\n  connected = true;\n\n  async disconnect() {\n    console.log('Disconnecting from database...');\n    this.connected = false;\n  }\n}\n\n@Injectable()\nclass FileService {\n  async closeFiles() {\n    console.log('Closing open files...');\n  }\n}\n\nconst AppModule = ProviderModule.create({\n  id: 'AppModule',\n  providers: [DatabaseService, FileService],\n  onDispose: () => {\n    return {\n      before: async (mod) => {\n        console.log('Cleanup started');\n        const db = mod.get(DatabaseService);\n        const files = mod.get(FileService);\n\n        await db.disconnect();\n        await files.closeFiles();\n      },\n      after: async () => {\n        console.log('Cleanup completed');\n      },\n    };\n  },\n});\n\n// Dispose module\nawait AppModule.dispose();\n// Output:\n// Cleanup started\n// Disconnecting from database...\n// Closing open files...\n// Cleanup completed\n\n// Module is now disposed\nconsole.log(AppModule.isDisposed); // true\n\n// Subsequent operations throw error\ntry {\n  AppModule.get(DatabaseService);\n} catch (error) {\n  console.error('Cannot access disposed module');\n}\n```\n\n> [!IMPORTANT]\n> Lifecycle hook execution order:\n>\n> 1. **onReady** - Immediately after module creation\n> 2. **onReset** (before) → module reset → **onReset** (after)\n> 3. **onDispose** (before) → module disposal → **onDispose** (after)\n\n> [!WARNING]\n> After calling `dispose()`:\n>\n> - All module operations will throw errors\n> - The module cannot be reused\n> - Internal resources are cleaned up\n> - Use for application shutdown or when modules are truly finished\n\n## Events System\n\nThe events system allows you to observe and react to module changes in real-time.\n\n### Subscribing to Events\n\n```ts\nimport { DefinitionEventType } from '@adimm/x-injection';\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [ServiceA],\n});\n\n// Subscribe to all events\nconst unsubscribe = MyModule.update.subscribe(({ type, change }) => {\n  console.log(`Event: ${DefinitionEventType[type]}`, change);\n});\n\n// Trigger events\nMyModule.update.addProvider(ServiceB); // Event: Provider\nMyModule.update.addImport(OtherModule); // Event: Import\nconst service = MyModule.get(ServiceA); // Event: GetProvider\n\n// Clean up\nunsubscribe();\n```\n\n### Available Event Types\n\n```ts\nenum DefinitionEventType {\n  Noop, // No operation\n  Import, // Module/blueprint added\n  Provider, // Provider added\n  GetProvider, // Provider resolved\n  Export, // Export added\n  ExportModule, // Module added to exports\n  ExportProvider, // Provider added to exports\n  ImportRemoved, // Module removed\n  ProviderRemoved, // Provider removed\n  ExportRemoved, // Export removed\n  ExportModuleRemoved, // Module removed from exports\n  ExportProviderRemoved, // Provider removed from exports\n}\n```\n\n### Event Use Cases\n\n**Monitoring Provider Resolution:**\n\n```ts\nconst MonitoredModule = ProviderModule.create({\n  id: 'MonitoredModule',\n  providers: [DatabaseService, CacheService],\n});\n\nMonitoredModule.update.subscribe(({ type, change }) => {\n  if (type === DefinitionEventType.GetProvider) {\n    console.log('Provider accessed:', change.constructor.name);\n    console.log('Access time:', new Date().toISOString());\n  }\n});\n\n// Logs access\nconst db = MonitoredModule.get(DatabaseService);\n// Output: Provider accessed: DatabaseService\n//         Access time: 2024-01-15T10:30:00.000Z\n```\n\n**Tracking Module Composition:**\n\n```ts\n@Injectable()\nclass ServiceA {}\n@Injectable()\nclass ServiceB {}\n\nconst DatabaseModule = ProviderModule.create({\n  id: 'DatabaseModule',\n  providers: [ServiceA],\n  exports: [ServiceA],\n});\n\nconst RootModule = ProviderModule.create({\n  id: 'RootModule',\n});\n\nconst compositionLog: string[] = [];\n\nRootModule.update.subscribe(({ type, change }) => {\n  switch (type) {\n    case DefinitionEventType.Import:\n      compositionLog.push(`Imported: ${change.id}`);\n      break;\n    case DefinitionEventType.Provider:\n      const providerName = typeof change === 'function' ? change.name : change.provide;\n      compositionLog.push(`Added provider: ${providerName}`);\n      break;\n    case DefinitionEventType.Export:\n      compositionLog.push(`Exported: ${JSON.stringify(change)}`);\n      break;\n  }\n});\n\nRootModule.update.addImport(DatabaseModule);\nRootModule.update.addProvider(ServiceA);\nRootModule.update.addProvider(ServiceB, true);\n\nconsole.log(compositionLog);\n// [\n//   'Imported: DatabaseModule',\n//   'Added provider: ServiceA',\n//   'Added provider: ServiceB',\n//   'Exported: ServiceB'\n// ]\n```\n\n**Debugging Dynamic Changes:**\n\n```ts\nconst DebugModule = ProviderModule.create({\n  id: 'DebugModule',\n});\n\nDebugModule.update.subscribe(({ type, change }) => {\n  const eventName = DefinitionEventType[type];\n\n  if (type === DefinitionEventType.ImportRemoved) {\n    console.warn(`⚠️ Module removed: ${change.id}`);\n  } else if (type === DefinitionEventType.ProviderRemoved) {\n    console.warn(`⚠️ Provider removed:`, change);\n  } else {\n    console.log(`✅ ${eventName}:`, change);\n  }\n});\n\nDebugModule.update.addProvider(ServiceA);\nDebugModule.update.removeProvider(ServiceA);\n```\n\n> [!WARNING]\n>\n> - Always call `unsubscribe()` to prevent memory leaks\n> - Events fire **after** middlewares have executed\n> - Event handlers are synchronous - avoid heavy operations\n> - High-frequency events (like `GetProvider`) can impact performance\n\n## Middlewares\n\nMiddlewares intercept and transform module operations before they complete. They provide powerful customization capabilities.\n\n### BeforeGet Middleware\n\nTransform provider values before they're returned to consumers.\n\n```ts\nimport { MiddlewareType } from '@adimm/x-injection';\n\n@Injectable()\nclass UserService {\n  getUser() {\n    return { id: 1, name: 'Alice' };\n  }\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [UserService],\n});\n\n// Wrap resolved providers with metadata\nMyModule.middlewares.add(MiddlewareType.BeforeGet, (provider, token, inject) => {\n  // Return true to pass through unchanged\n  if (!(provider instanceof UserService)) return true;\n\n  // Transform the value\n  return {\n    timestamp: Date.now(),\n    instance: provider,\n    metadata: { cached: false },\n  };\n});\n\nconst result = MyModule.get(UserService);\nconsole.log(result);\n// {\n//   timestamp: 1705320000000,\n//   instance: UserService { ... },\n//   metadata: { cached: false }\n// }\n```\n\n**Conditional Transformation:**\n\n```ts\n@Injectable()\nclass ServiceA {}\n\n@Injectable()\nclass ServiceB {}\n\nMyModule.middlewares.add(MiddlewareType.BeforeGet, (provider, token) => {\n  // Only transform ServiceA\n  if (provider instanceof ServiceA) {\n    return { wrapped: provider, type: 'A' };\n  }\n\n  // Pass through everything else unchanged\n  return true;\n});\n\nconst serviceA = MyModule.get(ServiceA); // { wrapped: ServiceA, type: 'A' }\nconst serviceB = MyModule.get(ServiceB); // ServiceB (unchanged)\n```\n\n**Using inject() to avoid infinite loops:**\n\n```ts\n@Injectable()\nclass LoggerService {\n  log(message: string) {\n    console.log(message);\n  }\n}\n\n@Injectable()\nclass PaymentService {}\n\nMyModule.middlewares.add(MiddlewareType.BeforeGet, (provider, token, inject) => {\n  if (!(provider instanceof PaymentService)) return true;\n\n  // Use inject() instead of module.get() to avoid infinite loop\n  const logger = inject(LoggerService);\n  logger.log('Payment service accessed');\n\n  return provider; // Or transform it\n});\n```\n\n### BeforeAddProvider Middleware\n\nBlock specific providers:\n\n```ts\nMyModule.middlewares.add(MiddlewareType.BeforeAddProvider, (provider) => {\n  // Block ServiceB from being added\n  if ((provider as any).name === 'ServiceB') {\n    return false; // Abort\n  }\n  return true; // Allow\n});\n\nMyModule.update.addProvider(ServiceA);\nMyModule.update.addProvider(ServiceB); // Silently rejected\nMyModule.update.addProvider(ServiceC);\n\nconsole.log(MyModule.hasProvider(ServiceA)); // true\nconsole.log(MyModule.hasProvider(ServiceB)); // false\nconsole.log(MyModule.hasProvider(ServiceC)); // true\n```\n\n### BeforeAddImport Middleware\n\nIntercept modules before they're imported.\n\n```ts\nconst Module1 = ProviderModule.create({ id: 'Module1' });\nconst Module2 = ProviderModule.create({ id: 'Module2' });\nconst RestrictedModule = ProviderModule.create({ id: 'RestrictedModule' });\n\nconst MainModule = ProviderModule.create({ id: 'MainModule' });\n\n// Block specific modules\nMainModule.middlewares.add(MiddlewareType.BeforeAddImport, (module) => {\n  if (module.id === 'RestrictedModule') {\n    console.warn(`❌ Cannot import ${module.id}`);\n    return false; // Block\n  }\n  return true; // Allow\n});\n\nMainModule.update.addImport(Module1); // ✅ Allowed\nMainModule.update.addImport(Module2); // ✅ Allowed\nMainModule.update.addImport(RestrictedModule); // ❌ Blocked\n\nconsole.log(MainModule.isImportingModule('Module1')); // true\nconsole.log(MainModule.isImportingModule('RestrictedModule')); // false\n```\n\n**Auto-add providers to imported modules:**\n\n```ts\nMyModule.middlewares.add(MiddlewareType.BeforeAddImport, (importedModule) => {\n  // Add logger to every imported module\n  importedModule.update.addProvider(LoggerService, true);\n  return importedModule; // Return modified module\n});\n\nMyModule.update.addImport(FeatureModule);\n// FeatureModule now has LoggerService\n```\n\n### OnExportAccess Middleware\n\nControl which importing modules can access exports.\n\n```ts\n@Injectable()\nclass SensitiveService {}\n\n@Injectable()\nclass PublicService {}\n\nconst SecureModule = ProviderModule.create({\n  id: 'SecureModule',\n  providers: [SensitiveService, PublicService],\n  exports: [SensitiveService, PublicService],\n});\n\n// Restrict access based on importer\nSecureModule.middlewares.add(MiddlewareType.OnExportAccess, (importerModule, exportToken) => {\n  // Block untrusted modules from accessing SensitiveService\n  if (importerModule.id === 'UntrustedModule' && exportToken === SensitiveService) {\n    console.warn(`❌ ${importerModule.id} denied access to SensitiveService`);\n    return false; // Deny\n  }\n  return true; // Allow\n});\n\nconst TrustedModule = ProviderModule.create({\n  id: 'TrustedModule',\n  imports: [SecureModule],\n});\n\nconst UntrustedModule = ProviderModule.create({\n  id: 'UntrustedModule',\n  imports: [SecureModule],\n});\n\n// Trusted module can access both\nconsole.log(TrustedModule.hasProvider(SensitiveService)); // true\nconsole.log(TrustedModule.hasProvider(PublicService)); // true\n\n// Untrusted module blocked from SensitiveService\nconsole.log(UntrustedModule.hasProvider(SensitiveService)); // false\nconsole.log(UntrustedModule.hasProvider(PublicService)); // true\n```\n\n**Complete access control:**\n\n```ts\nSecureModule.middlewares.add(MiddlewareType.OnExportAccess, (importer, exportToken) => {\n  const allowlist = ['TrustedModule1', 'TrustedModule2'];\n\n  if (!allowlist.includes(String(importer.id))) {\n    console.warn(`Access denied for ${importer.id}`);\n    return false;\n  }\n\n  return true;\n});\n```\n\n### BeforeRemoveImport Middleware\n\nPrevent specific modules from being removed.\n\n```ts\nconst PermanentModule = ProviderModule.create({ id: 'PermanentModule' });\nconst TemporaryModule = ProviderModule.create({ id: 'TemporaryModule' });\n\nconst MainModule = ProviderModule.create({ id: 'MainModule' });\n\n// Protect PermanentModule\nMainModule.middlewares.add(MiddlewareType.BeforeRemoveImport, (module) => {\n  if (module.id === 'PermanentModule') {\n    console.warn(`⚠️ Cannot remove ${module.id}`);\n    return false; // Block removal\n  }\n  return true; // Allow removal\n});\n\nMainModule.update.addImport(PermanentModule);\nMainModule.update.addImport(TemporaryModule);\n\n// Try to remove\nMainModule.update.removeImport(PermanentModule); // ❌ Blocked\nMainModule.update.removeImport(TemporaryModule); // ✅ Removed\n\nconsole.log(MainModule.isImportingModule('PermanentModule')); // true\nconsole.log(MainModule.isImportingModule('TemporaryModule')); // false\n```\n\n### BeforeRemoveProvider Middleware\n\nPrevent specific providers from being removed.\n\n```ts\nMyModule.middlewares.add(MiddlewareType.BeforeRemoveProvider, (provider) => {\n  // Block removal of critical services\n  if (provider === DatabaseService) {\n    console.warn('⚠️ Cannot remove DatabaseService');\n    return false;\n  }\n  return true;\n});\n\nMyModule.update.addProvider(DatabaseService);\nMyModule.update.addProvider(CacheService);\n\nMyModule.update.removeProvider(DatabaseService); // ❌ Blocked\nMyModule.update.removeProvider(CacheService); // ✅ Removed\n\nconsole.log(MyModule.hasProvider(DatabaseService)); // true\nconsole.log(MyModule.hasProvider(CacheService)); // false\n```\n\n### BeforeRemoveExport Middleware\n\nPrevent specific exports from being removed.\n\n```ts\nimport { ProviderModuleHelpers } from '@adimm/x-injection';\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [ServiceA, ServiceB],\n  exports: [ServiceA, ServiceB],\n});\n\nMyModule.middlewares.add(MiddlewareType.BeforeRemoveExport, (exportDef) => {\n  // Check if it's a module or provider\n  if (ProviderModuleHelpers.isModule(exportDef)) {\n    // Block module removal\n    return exportDef.id !== 'ProtectedModule';\n  } else {\n    // Block ServiceA removal\n    return exportDef !== ServiceA;\n  }\n});\n\nMyModule.update.removeFromExports(ServiceA); // ❌ Blocked\nMyModule.update.removeFromExports(ServiceB); // ✅ Removed\n\nconsole.log(MyModule.isExportingProvider(ServiceA)); // true\nconsole.log(MyModule.isExportingProvider(ServiceB)); // false\n```\n\n### All Available Middleware Types\n\n```ts\nenum MiddlewareType {\n  BeforeAddImport, // Before importing a module\n  BeforeAddProvider, // Before adding a provider\n  BeforeGet, // Before returning provider to consumer\n  BeforeRemoveImport, // Before removing an import\n  BeforeRemoveProvider, // Before removing a provider\n  BeforeRemoveExport, // Before removing an export\n  OnExportAccess, // When importer accesses exports\n}\n```\n\n**Middleware Return Values:**\n\n- `false` - Abort the operation (block it)\n- `true` - Pass through unchanged\n- Modified value - Transform and continue\n- For `BeforeGet`: Can return any value (transformation)\n\n> [!CAUTION]\n> Middleware best practices:\n>\n> - Returning `false` aborts the chain (no value returned)\n> - Middlewares execute in registration order\n> - Always handle errors in middleware chains\n> - Use `inject()` parameter in BeforeGet to avoid infinite loops\n> - Be careful with performance - middlewares run on every operation\n> - Events fire **after** middlewares complete\n\n## Testing\n\nxInjection makes testing easy through blueprint cloning and provider substitution.\n\n### Blueprint Cloning\n\nClone blueprints to create test-specific configurations without affecting production code.\n\n```ts\n// Production blueprint\nconst DatabaseModuleBp = ProviderModule.blueprint({\n  id: 'DatabaseModule',\n  providers: [DatabaseService, ConnectionPool],\n  exports: [DatabaseService],\n});\n\n// Test blueprint - clone and modify\nconst DatabaseModuleMock = DatabaseModuleBp.clone().updateDefinition({\n  id: 'DatabaseModuleMock',\n  providers: [\n    { provide: DatabaseService, useClass: MockDatabaseService },\n    { provide: ConnectionPool, useClass: MockConnectionPool },\n  ],\n});\n\n// Use in tests\nconst TestModule = ProviderModule.create({\n  id: 'TestModule',\n  imports: [DatabaseModuleMock],\n});\n\nconst db = TestModule.get(DatabaseService); // MockDatabaseService\n```\n\n**Deep Blueprint Cloning:**\n\n```ts\nconst OriginalBp = ProviderModule.blueprint({\n  id: 'Original',\n  providers: [ServiceA, ServiceB, ServiceC],\n  exports: [ServiceA, ServiceB],\n  onReady: (module) => console.log('Original ready'),\n});\n\n// Clone and completely override\nconst ClonedBp = OriginalBp.clone().updateDefinition({\n  id: 'Cloned',\n  providers: [MockServiceA, MockServiceB], // Different providers\n  exports: [MockServiceA], // Different exports\n  onReady: undefined, // Remove lifecycle hooks\n});\n\n// Original blueprint unchanged\nconsole.log(OriginalBp.providers?.length); // 3\nconsole.log(ClonedBp.providers?.length); // 2\n```\n\n### Provider Substitution\n\nReplace real services with mocks for testing.\n\n```ts\n// Production services\n@Injectable()\nclass ApiService {\n  async fetchData() {\n    return fetch('https://api.example.com/data').then((r) => r.json());\n  }\n}\n\n@Injectable()\nclass UserService {\n  constructor(private api: ApiService) {}\n\n  async getUsers() {\n    return this.api.fetchData();\n  }\n}\n\n// Mock service\nclass MockApiService {\n  async fetchData() {\n    return { users: [{ id: 1, name: 'Mock User' }] };\n  }\n}\n\n// Production module\nconst ProductionModule = ProviderModule.create({\n  id: 'ProductionModule',\n  providers: [ApiService, UserService],\n});\n\n// Test module with substitution\nconst TestModule = ProviderModule.create({\n  id: 'TestModule',\n  providers: [\n    { provide: ApiService, useClass: MockApiService },\n    UserService, // Uses MockApiService automatically\n  ],\n});\n\nconst userService = TestModule.get(UserService);\nconst users = await userService.getUsers();\nconsole.log(users); // Mock data\n```\n\n### Mocking Services\n\n**Using useValue for simple mocks:**\n\n```ts\nconst mockPaymentGateway = {\n  charge: jest.fn().mockResolvedValue({ success: true }),\n  refund: jest.fn().mockResolvedValue({ success: true }),\n};\n\nconst TestModule = ProviderModule.create({\n  id: 'TestModule',\n  providers: [{ provide: PaymentGateway, useValue: mockPaymentGateway }, PaymentService],\n});\n\nconst paymentService = TestModule.get(PaymentService);\nawait paymentService.processPayment(100);\n\nexpect(mockPaymentGateway.charge).toHaveBeenCalledWith(100);\n```\n\n**Using useFactory for complex mocks:**\n\n```ts\nconst TestModule = ProviderModule.create({\n  id: 'TestModule',\n  providers: [\n    {\n      provide: 'DATABASE_CONNECTION',\n      useFactory: () => {\n        return {\n          query: jest.fn().mockResolvedValue([{ id: 1, name: 'Test' }]),\n          connect: jest.fn().mockResolvedValue(true),\n          disconnect: jest.fn().mockResolvedValue(true),\n        };\n      },\n    },\n  ],\n});\n\nconst db = TestModule.get('DATABASE_CONNECTION');\nconst results = await db.query('SELECT * FROM users');\nexpect(results).toEqual([{ id: 1, name: 'Test' }]);\n```\n\n**Complete Testing Example:**\n\n```ts\n// Production code\n@Injectable()\nclass EmailService {\n  async sendEmail(to: string, subject: string, body: string) {\n    // Real email sending logic\n    console.log(`Sending email to ${to}`);\n  }\n}\n\n@Injectable()\nclass UserNotificationService {\n  constructor(private emailService: EmailService) {}\n\n  async notifyUser(userId: string, message: string) {\n    await this.emailService.sendEmail(`user${userId}@example.com`, 'Notification', message);\n  }\n}\n\n// Test code\ndescribe('UserNotificationService', () => {\n  it('should send email notification', async () => {\n    const mockEmailService = {\n      sendEmail: jest.fn().mockResolvedValue(undefined),\n    };\n\n    const TestModule = ProviderModule.create({\n      id: 'TestModule',\n      providers: [{ provide: EmailService, useValue: mockEmailService }, UserNotificationService],\n    });\n\n    const notificationService = TestModule.get(UserNotificationService);\n    await notificationService.notifyUser('123', 'Test message');\n\n    expect(mockEmailService.sendEmail).toHaveBeenCalledWith('user123@example.com', 'Notification', 'Test message');\n  });\n});\n```\n\n**Testing with Multiple Module Layers:**\n\n```ts\n// Create mock blueprint\nconst MockDataModuleBp = ProviderModule.blueprint({\n  id: 'MockDataModule',\n  providers: [\n    { provide: DatabaseService, useClass: MockDatabaseService },\n    { provide: CacheService, useClass: MockCacheService },\n  ],\n  exports: [DatabaseService, CacheService],\n});\n\n// Use mock in feature module tests\nconst FeatureModuleTest = ProviderModule.create({\n  id: 'FeatureModuleTest',\n  imports: [MockDataModuleBp],\n  providers: [FeatureService],\n});\n\nconst featureService = FeatureModuleTest.get(FeatureService);\n// FeatureService receives mock dependencies\n```\n\n> [!TIP]\n> Testing strategies:\n>\n> - Use `blueprint.clone()` to create test variations without modifying originals\n> - Use `useValue` for simple mocks\n> - Use `useClass` for class-based mocks with behavior\n> - Use `useFactory` for complex mock setup\n> - Test module isolation by mocking all external dependencies\n> - Verify mock calls with your test framework\n\n## OOP-Style Modules with ProviderModuleClass\n\nFor developers who prefer class-based architecture, xInjection provides `ProviderModuleClass` — a composition-based wrapper that prevents naming conflicts between your custom methods and the DI container methods.\n\n### Basic OOP Module\n\n```ts\nimport { Injectable, ProviderModuleClass } from '@adimm/x-injection';\n\n@Injectable()\nclass UserService {\n  get(id: string) {\n    return { id, name: 'John Doe' };\n  }\n}\n\n@Injectable()\nclass AuthService {\n  constructor(private readonly userService: UserService) {}\n\n  login(userId: string) {\n    const user = this.userService.get(userId);\n    return `Logged in as ${user.name}`;\n  }\n}\n\nclass AuthModule extends ProviderModuleClass {\n  constructor() {\n    super({\n      id: 'AuthModule',\n      providers: [UserService, AuthService],\n      exports: [AuthService],\n    });\n  }\n\n  authenticateUser(userId: string): string {\n    return this.module.get(AuthService).login(userId);\n  }\n\n  // Custom method named 'get' - no conflict with module.get()!\n  get(): string {\n    return 'custom-get-value';\n  }\n}\n\nconst authModule = new AuthModule();\nconsole.log(authModule.authenticateUser('123')); // \"Logged in as John Doe\"\nconsole.log(authModule.get()); // \"custom-get-value\"\n\n// DI container always accessible via .module\nauthModule.module.update.addProvider(NewService);\n```\n\n> [!IMPORTANT]\n> All `ProviderModule` methods are available through the `.module` property to prevent naming conflicts with your custom methods.\n\n### When to Use OOP vs Functional\n\n**OOP-style (`extends ProviderModuleClass`):** when you need custom business logic methods, computed getters, initialization state, or want to prevent naming conflicts with the DI API.\n\n**Functional-style (`ProviderModule.create()`):** when you only need a provider container with no extra behavior — simpler and more concise.\n\nBoth styles are fully compatible and can be mixed in the same application.\n\n## Advanced Module API\n\n### Query Methods\n\nCheck module state and relationships.\n\n```ts\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  imports: [DatabaseModule, ConfigModule],\n  providers: [ServiceA, ServiceB],\n  exports: [ServiceA, DatabaseModule],\n});\n\n// Provider queries\nMyModule.hasProvider(ServiceA); // true\nMyModule.hasProvider(ServiceC); // false\nMyModule.hasProvider(DatabaseService); // true (from import)\n\n// Import queries\nMyModule.isImportingModule('DatabaseModule'); // true\nMyModule.isImportingModule(ConfigModule); // true (by reference)\nMyModule.isImportingModule('NonExistent'); // false\n\n// Export queries\nMyModule.isExportingProvider(ServiceA); // true\nMyModule.isExportingProvider(ServiceB); // false\nMyModule.isExportingModule('DatabaseModule'); // true\nMyModule.isExportingModule(ConfigModule); // false\n\n// State queries\nMyModule.isDisposed; // false\nMyModule.id; // 'MyModule'\n```\n\n**Using Symbol Identifiers:**\n\n```ts\nconst MODULE_ID = Symbol('FeatureModule');\n\nconst FeatureModule = ProviderModule.create({\n  id: MODULE_ID,\n  providers: [FeatureService],\n  exports: [FeatureService],\n});\n\nconst AppModule = ProviderModule.create({\n  id: 'AppModule',\n  imports: [FeatureModule],\n});\n\n// Query using Symbol\nconsole.log(AppModule.isImportingModule(MODULE_ID)); // true\n```\n\n### Batch Resolution with getMany()\n\nResolve multiple providers in a single call.\n\n```ts\n@Injectable()\nclass ServiceA {\n  name = 'A';\n}\n\n@Injectable()\nclass ServiceB {\n  name = 'B';\n}\n\n@Injectable()\nclass ServiceC {\n  name = 'C';\n}\n\nconst MyModule = ProviderModule.create({\n  id: 'MyModule',\n  providers: [\n    ServiceA,\n    ServiceB,\n    ServiceC,\n    { provide: 'CONFIG_A', useValue: 'config-a' },\n    { provide: 'CONFIG_B', useValue: 'config-b' },\n  ],\n});\n\n// Simple getMany\nconst [serviceA, serviceB, configA] = MyModule.getMany(ServiceA, ServiceB, 'CONFIG_A');\n\nconsole.log(serviceA.name); // 'A'\nconsole.log(serviceB.name); // 'B'\nconsole.log(configA); // 'config-a'\n```\n\n**With Options:**\n\n```ts\n// Optional providers\nconst [serviceA, missing, serviceC] = MyModule.getMany(\n  ServiceA,\n  { provider: 'NON_EXISTENT', isOptional: true },\n  ServiceC\n);\n\nconsole.log(serviceA); // ServiceA instance\nconsole.log(missing); // undefined (no error)\nconsole.log(serviceC); // ServiceC instance\n\n// Get as list (multiple bindings)\nconst HandlerModule = ProviderModule.create({\n  id: 'HandlerModule',\n  providers: [\n    { provide: 'Handler', useValue: 'H1' },\n    { provide: 'Handler', useValue: 'H2' },\n    { provide: 'Handler', useValue: 'H3' },\n  ],\n});\n\nconst [handlers] = HandlerModule.getMany({\n  provider: 'Handler',\n  asList: true,\n});\n\nconsole.log(handlers); // ['H1', 'H2', 'H3']\n```\n\n**Complex Example:**\n\n```ts\nconst [database, cache, optionalLogger, allPlugins, config] = MyModule.getMany(\n  DatabaseService,\n  CacheService,\n  { provider: LoggerService, isOptional: true },\n  { provider: Plugin, asList: true },\n  'APP_CONFIG'\n);\n\n// All providers resolved in one call\n// optionalLogger is undefined if not available\n// allPlugins is an array of all Plugin bindings\n```\n\n> [!IMPORTANT] > `getMany()` parameter types:\n>\n> - **Simple**: Just pass the token directly\n> - **With options**: Use object with `provider`, `isOptional`, and/or `asList`\n\n## Hierarchical Dependency Injection\n\nWhen a module resolves a provider via `module.get()`, xInjection walks up a well-defined lookup chain until it finds a binding or throws.\n\n**Resolution order (highest to lowest priority):**\n\n1. **Own container** — providers declared directly in this module\n2. **Imported modules** — exported providers from each module in the `imports` array (in order)\n3. **AppModule** — globally available providers (from `isGlobal: true` modules)\n\n```\nmodule.get(SomeService)\n       │\n       ▼\n┌──────────────────────┐\n│   Own container      │  ← providers: [SomeService, ...]\n│   (highest priority) │\n└──────────┬───────────┘\n           │ not found\n           ▼\n┌──────────────────────┐\n│  Imported modules    │  ← imports: [DatabaseModule, ConfigModule]\n│  (exported only)     │     DatabaseModule.exports: [DatabaseService]\n└──────────┬───────────┘     ConfigModule.exports:   [ConfigService]\n           │ not found\n           ▼\n┌──────────────────────┐\n│     AppModule        │  ← AppBootstrapModule { isGlobal: true }\n│  (lowest priority)   │     exports: [LoggerService, ...]\n└──────────┬───────────┘\n           │ not found\n           ▼\n  InjectionProviderModuleMissingProviderError\n```\n\n**Resolution in practice** — given the modules set up in [Import/Export Pattern](#importexport-pattern) and [Global Modules](#global-modules):\n\n```ts\nApiModule.get(ApiService); // ✅ ① own container\nApiModule.get(ConfigService); // ✅ ② ConfigModule export\nApiModule.get(DatabaseService); // ✅ ② DatabaseModule export\nApiModule.get(LoggerService); // ✅ ③ AppModule (via AppBootstrapModule)\nApiModule.get(InternalCache); // ❌ not exported → MissingProviderError\n```\n\n> [!TIP]\n> A provider that isn't in a module's `exports` is completely invisible to any importer — it's a private implementation detail. Think of `exports` as the public API of a module.\n\n## Resources\n\n📚 **[Full API Documentation](https://adimarianmutu.github.io/x-injection/index.html)** - Complete TypeDoc reference\n\n⚛️ **[React Integration](https://github.com/AdiMarianMutu/x-injection-reactjs)** - Official React hooks and providers\n\n💡 **[GitHub Issues](https://github.com/AdiMarianMutu/x-injection/issues)** - Bug reports and feature requests\n\n🌟 **[GitHub Repository](https://github.com/AdiMarianMutu/x-injection)** - Source code and examples\n\n## Contributing\n\nContributions are welcome! Please ensure code follows the project style guidelines and includes appropriate tests.\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes with tests\n4. Submit a pull request\n\n## Credits\n\n**Author:** [Adi-Marian Mutu](https://www.linkedin.com/in/mutu-adi-marian/)\n\n**Built on:** [InversifyJS](https://github.com/inversify/monorepo)\n\n**Logo:** [Alexandru Turica](https://www.linkedin.com/in/alexandru-turica-82215522b/)\n\n## License\n\nMIT © Adi-Marian Mutu\n","readmeFilename":"README.md"}